F Sharp: відмінності між версіями

[перевірена версія][перевірена версія]
Вилучено вміст Додано вміст
Навка (обговорення | внесок)
м додана Категорія:.NET з допомогою HotCat
Немає опису редагування
Рядок 19:
== Історія ==
 
Історія F# почалася в 2002 році, коли команда розробників з Microsoft Research під керівництвом Don Syme вирішила, що мови сімейства ML цілком підходять для реалізації функціональної парадигми на платформі .NET. Ідея розробки нової мови з'явилася під час роботи над Generic'ами — реалізацією узагальненого програмування для Common Language Runtime. Відомо, що у свій час як прототип нової мови розглядалася Haskell, але через функціональну чистоту і складнішу систему типів потенційний Haskell .NET не міг би надати розробникам простого механізму роботи з бібліотекою класів .NET Framework, а значить, не давав би якихось додаткових переваг. Як би там не було, за основу був узятий OCaml, мова з сімейства ML, яка не є чисто функціональною і надає можливості для імперативного і об'єктно-орієнтованого програмування. Однак зауважте, що Haskell, хоч і не став безпосередньо батьком нової мови, тим не менше, справив на нього деякий вплив. Наприклад, концепція обчислювальних виразів (computation expressions або workflows), що грають важливу роль для асинхронного програмування та реалізації DSL на F#, запозичена з монад Haskell.
 
Наступним кроком у розвитку нової мови стала поява в 2005 році її першої версії. З тих пір навколо F# стало формуватися співтовариство. За рахунок підтримки функціональної парадигми мова виявилася потрібною в науковій сфері та фінансових організаціях. Багато в чому завдяки цьому Microsoft вирішила перевести F# зі статусу дослідницьких проектів у статус підтримуваних продуктів і поставити її в один ряд з основними мовами платформи .NET. І це попри те, що останнім часом все більшу активність проявляють динамічні мови, підтримка яких також присутня в .NET Framework. 12 квітня 2010 світ побачила нова версія флагманського продукту для розробників — Microsoft Visual Studio 2010, яка підтримує розробку на F # прямо з коробки.
 
== Основні можливості мови ==
Будь-яка вступна стаття про F# починається з розповіді про те, як вдало ця мова поєднує в собі якості, властиві різним парадигм програмування, не будемо робити винятки і ми. Отже, як було сказано у визначенні — F# є мультипарадигменною мовою, а це значить, що на ньому можна реалізовувати функції вищих порядків, усередині яких виконувати імперативний код і обгортати все це в класи для використання клієнтами, написаними на інших мовах на платформі. NET.
 
Будь-яка вступна стаття про F# починається з розповіді про те, як вдало ця мова поєднує в собі якості, властиві різним парадигм програмування, не будемо робити винятки і ми. Отже, як було сказано у визначенні — F# є мультипарадигменною мовою, а це значить, що на ньому можна реалізовувати функції вищих порядків, усередині яких виконувати імперативний код і обгортати все це в класи для використання клієнтами, написаними на інших мовах на платформі. NET.
 
===== F# функціональна =====
 
F#, будучи спадкоємцем славних традицій сімейства мов ML, надає повний набір інструментів функціонального програмування: тут є алгебраїчні типи даних і функції вищого порядку, кошти для композиції функцій і незмінні структури даних, а також часткове застосування на пару з каррірованіем[[каррування]]м. Зі слів експертів в OCaml, в F# не вистачає функторів.
 
Усі функціональні можливості F # реалізовані в кінцевому підсумку поверх загальної системи типів. NET Framework. Однак цей факт не забезпечує зручності використання таких конструкцій з інших мов платформи. При розробці власних бібліотек на F # слід передбачити створення об'єктно-орієнтованих обгорток, які буде простіше використовувати з C# або Visual Basic. NET.
 
===== F# імперативна =====
 
У випадках, коли багатих функціональних можливостей не вистачає, F # надає розробникові можливість використовувати в коді принади змінюваного стану. Це як безпосередньо змінювані змінні, підтримка полів і властивостей об'єктів стандартної бібліотеки, так і явні цикли, а також змінні колекції і типи даних.
 
===== F# об'єктно-орієнтована =====
 
Об'єктно-орієнтовані можливості F #, як і багато чого іншого в цій мові, обумовлені необхідністю надати розробникам можливість використовувати стандартну бібліотеку класів. NET Framework. З поставленим завданням мова цілком справляється: можна як використовувати бібліотеки класів, реалізовані на інших. NET мовах, так і розробляти свої власні. Слід зазначити, однак, що деякі можливості ГО мов реалізовані не самим звичним чином.
 
===== І не тільки … =====
 
Таке змішання парадигм, з одного боку, може привести до плачевних результатів, а з іншого — надає більше гнучкості і дозволяє писати простіший код. Так, наприклад, всередині стандартної бібліотеки F # деякі функції написані в імперативному стилі з метою оптимізації швидкості виконання.
 
Томаш Петрічек у своєму блозі згадує також про «мовно-орієнтоване» програмування. Ми теж торкнемося цієї теми нижче, а поки відзначимо лише, що F # відмінно підходить як для написання вбудованих DSL, тобто імітації мови предметної області засобами основного мови, так і для перетворення F # коду в конструкції, виконувані іншими засобами, наприклад в SQL-вирази або в послідовності інструкцій GPU. Крім того, в комплект постачання F # входять утиліти FsYacc і FsLex, які є аналогами таких же утиліт для OCaml, і які дозволяють генерувати синтаксичні та лексичні аналізатори, а значить на F # цілком можна розробити свій власний мова програмування.
 
== Розширені можливості ==
===== Обчислювальні вирази =====
 
Серед нововведень F # можна особливо виділити так звані обчислювальні виразу (computation expressions або workflows). Вони є узагальненням генераторів послідовності і, зокрема, дозволяють вбудовувати в F # такі обчислювальні структури, як монади і моноїд. Також вони можуть бути застосовані для асинхронного програмування та створення DSL.
 
Обчислювальний вираз має форму блоку, що містить певний код на F # у фігурних дужках. Цьому блоку повинен передувати спеціальний об'єкт, який називається ще построителем (builder). Загальна форма наступна: builder {comp-expr}.
Рядок 58 ⟶ 53:
У залежності від будівника всередині обчислювального коду можна також використовувати особливі конструкції let!, Use!, Return, return!, Yield і yield!. Якщо читач знайомий з мовою програмування Haskell, то можна помітити, що let! відповідає стрілкою з нотації do, а return має той же зміст, що і в Haskell.
 
За своєю суттю обчислювальне вираз є [[синтаксичний цукор|синтаксичним цукром]] навколо зазначеного будівника. Компілятор F # проходиться за кодом обчислення і замінює мовні конструкції викликами відповідних методів будівника b згідно з наступною таблицею, де лапки позначають оператор перетворення:
Конструкція Форма перетворення