Функционалдық программалау тілдердің мүмкіндіктерін талдау



Жұмыс түрі:  Дипломдық жұмыс
Тегін:  Антиплагиат
Көлемі: 49 бет
Таңдаулыға:   
ӘЛ-ФAРAБИ AТЫНДAҒЫ ҚAЗAҚ ҰЛТТЫҚ УНИВЕРСИТЕТІ

МЕХAНИКA-МAТЕМAТИКA ФAКУЛЬТЕТІ

ИНФОРМАТИКА КAФЕДРAСЫ

Тақырыбы: Функционалдық программалау тілдердің мүмкіндіктерін талдау

ДИПЛОМДЫҚ ЖҰМЫС

Орындaғaн:
____________________
(қолы)
Әбдісамат.Б.Ә.

Ғылыми жетекші:
п.ғ.к., доцентм.а.
____________________
(қолы)
Тұрғанбаева.А.Р.

Нормa бaқылaушы:
____________________
(қолы)

Қорғaуғa жіберілді:
Кaфедрa меңгерушісі,
ф.-м.ғ.к., доцент

____________________
(қолы)

Урмашев.Б.А.

Aлмaты 2016

Әл-Фараби атындағы Қазақ ұлттық университетінің
Механика-математика факультетінің 4 курс студенті
Әбдісамат Бахыттың
ФУНКЦИОНАЛДЫҚ ПРОГРАММАЛАУ ТІЛДЕРІНІҢ МҮМКІНДІКТЕРДІ ТАЛДАУ
атты жазылған дипломдық жұмысына
С Ы Н П І К І Р

Қазіргі заманда функционалды тілдер программисттердің жұмысын жеңілдетеді. Функционалды программалау тілдерінің көмегімен әмбебап, оңай өзгерілетін және кеңейтілген программалар жазылады. Сондықтан дипломдық жұмыстың тақырыбы заманауи талаптарға сай, өзекті болып табылады.
Дипломдық жұмыста Әбдісамат Б. функционалды программмалау тілдерін зерттеп, олардың мүмкіндіктерін талдаған. Ол үшін функционалды программалау тілдерінің классификациясын құрды. Қарапайым факториал есебін шығару арқылы барлық функционалды тілдерді бір-бірімен салыстырған.
Функционалды программалау тіліне байланысты сайт құрылған. Оны Yii Framework 2.0 ортасында жасаған. Дипломдық жұмысты орындау барысында Yii Framework 2.0 мүмкіндіктерімен танысып, оны толығымен меңгергенін байқауға болады. Haskell тілін игеріп, күрделі Хоара алгоритімін іске асырған.
Болашақта осы құрылған сайт функционалды бағдарламау тілдерін меңгерем деушілерге жақсы әдістемелік нұсқау болып табылады.
Әбдісамат Бахыттың дипломдық жұмысы 5B060200 - Информатика мамандығы бойынша информатика бакалавры академиялық дәрежесін алуға лайықты және бұл еңбекті А (97) деп бағалаймын.

Сын пікір беруші
Нархоз университеті,
Қолданбалы информатика
кафедрасының доценті, ф.-м.ғ.к. Тукенова Л.М.

РЕФЕРAТ

Жұмыстың көлемі: Бітіру жұмысы 50 беттен тұрaды. Ол, өз кезегінде, бөлімшелерден құрaлғaн 2 бөлімнен тұрaды. Жұмыстың бөлімдерінде 1 сурет бaр.
Кілттік сөздер: Scala, Ocaml, Haskell, Miranda, SQL, F#, Go, сaйт.
Жұмыстың мaқсaты:
Функционалдық программалау тілдерінің біреуін игеріп және соның ішінде мәселен Haskell функционалды программалау тілінде бағдарлама жазу.
Міндеттері:
1. Шетелдік және отандық әдебиеттерді оқып зерттеу.
2. Функционалды бағдарламалау тілдерінің классификациясын құру.
3. Haskell тілін зерттеп , бағдарлама жазу.
4. Функционалдық программалау тілдеріне қатысты электронды қосымша құру.

Жұмыстың дұрыстығы:
Жұмыс, көптеген кітaптaрғa, мaтериaлдaрғa және интернеттік ресурстaрғa сүйеніп құрылғaн.

РЕФЕРAТ

Обьем работы: Дипломная работа состоит из 50 страниц. Он свою очередь состоит из 2-ух частей. В рабочей части есть 1 рисунок.
Ключевые слова: Scala, Ocaml, Haskell, Miranda, SQL, F#, Go, сaйт.
Цель дипломной работы:
Освоить один из языков функциональных языков программирования и написать программу.
Задачи:
1. Внешняя и внутренняя изучение литературы.
2. Создание классификации функциональных языков программирования.
3. Изучить Haskell и написать программу.
4. Создание электронный поддержки к функциональным языкам программирования.

Точность работы:
Работа написана на оснавании многих книг,материалов и интернет ресурсов.

PAPER

Volume of work: The thesis consists of 50 pages. It the turn consists of 2 parts. In working part there is 1 drawing.
Keywords: Scala, Ocaml, Haskell, Miranda, SQL, F#, Go, site.
Thesis purpose:
To master one of languages of functional programming languages and to write the program.
Tasks:
1. External and internal studying of literature.
2. Creation of classification of functional programming languages.
3. To study Haskell and to write the program.
4. Creation electronic supports to functional programming languages.
Work accuracy:
Work is written on the basis of many books, materials and the Internet of resources.

Мазмұны

Кіріспе 6
I. Функционалдық программалау болашағы бар программалаудың парадигмасы 7
1.1 ФПТ даму тарихы.ФПТ классификациясы 7
1.2 ФПТ функционалдық мүмкіндіктер 13
1.3 Haskell-функционалды программалау тілі 30
II. YI framework-те ФПТ байланысты электрондық қосымшаны құру 32
2.1. Сайттың сценариясы 32
2.2. YI framework 2.0мүмкіндіктері 33
2.3. Электронды қосымшаны іске асыру 36
Қорытынды 49
Пайдаланған әдебиеттер 50
А Қосымшасы
Б Қосымшасы

Кіріспе

Функционалды программалау дегеніміз- бұл дискретті математиканың бір бөлігі және программалаудың парадигмасы , есептеу процессі мұнда математикалық функциялардың көмегімен жүзеге асырылады.
Императивті программалауға қарсы қойылатын парадигма , есептеу процессі күйлердің ауысуымен анықталады. Функционалды бағдарламалауда есептеу процессінің дәйекті күйлері қажет болған жағдайда тізім ретінде көрсетіледі.
Функционалдық бағдарламалау бастапқы деректер және басқа да функциялардың нәтижелері және нақты бағдарлама сақтау мәртебесін тарту емес, өзіндік құнын есептеу функцияларын қамтиды.Тиісінше, ол арналған , сондай-ақ ( негізгі ұғымдардың бірі , оның мәні және өткізеді алгоритм ретінде өзгертуге мүмкіндік береді айнымалы болып табылады міндетті түрде қарағанда ) осы жай- өзгергіштік емес.
Іс жүзінде математикалық функцияның функция түсінігінен императивті программалауда айырмашылығы , императивті функциялар тек аргументтерге ғана емес , оның сыртқы күйлеріне де және сыртқы айнымалы жай-күйін өзгертуге мүмкін емес болып табылады .Осылайша, императивті бағдарламалауды шақырған кезде бірдей параметрлері бар бірдей функцияларды , бірақ алгоритм әр түрлі кезеңдерінде , әр түрлі деректер есебінен айнымалылардың функциясын әсер ете алуға болады .Ал функционалды тілде аргументі бір функцияны шақырған кезде бірдей жауапты қабылдаймыз. Шығатын деректер енетін деректерге байланысты.
Бұл функционалдық тілдерінде орындалу уақыты бағдарламасы функциялардың нәтижелері кэштеу және алгоритмі көрсетілген емес тәртіппен оларды шақыру және бағдарламашы тарапынан кез келген қосымша шараларды , оларды қатарластыра мүмкіндік береді.

Жұмыстың өзектілігі:

Функционалдық программалау тілдерін таңдаған себебім , біріншіден , функционалдық программалау есептің шешуін жеңілдетеді және есеп шығару жылдамдығы императивті тілдерге қарағанда әлдеқайда жоғары.

Жұмыстың мақсаты:

Функционалдық программалау тілдерінің біреуін игеріп және соның ішінде мәселен Haskell функционалды программалау тілінде бағдарлама жазу.

Жұмысқа қойылған міндеттер:

5. Шетелдік және отандық әдебиеттерді оқып зерттеу.
6. Функционалды бағдарламалау тілдерінің классификациясын құру.
7. Haskell тілін зерттеп , бағдарлама жазу.
8. Функционалдық программалау тілдеріне қатысты электронды қосымша құру.

I. Функционалдық программалау болашағы бар программалаудың парадигмасы.

1.1 ФПТ даму тарихы және классификациясы.

Лямбда есептеу сипаттамасы және есептеу функцияларын теориялық негіз болды . Математикалық абстракцияның емес, бағдарламалау тілі ретінде , ол бүгін барлық дерлік функционалдық программалау тілдері негіздері болды .Осыған ұқсас теориялық тұжырымдамасы , комбинаторлық логика λ - есептеу артық бағзы болып табылады және бұрын құрылды. Бұл логикалық сияқты Unlambda сияқты кейбір эзотерикалықтар тілдерінде , қолданылады. Ал λ - есептеу және комбинаторлық математика логикалық принциптері мен негіздерін неғұрлым айқын және дәл сипаттау үшін әзірленген.

Бірінші функционалдық тілі Lisp Елуінші жылдардың соңында Джон Маккарти өзінің жұмыс барысында MIT-да құрылған және IBM 7007000 үшін бастапқыда жүзеге асырылды. LISP тілінде алғаш рет функционалды ұғымдар жиынтығы енгізілді , сондықтан тілде функционалды программалау парадигмасы ғана қолданылмайды.Lisp одан әрі дамыту сызбасы және Дилан сияқты тілдерін бастады. Тіл туралы ақпарат өңдеу , кейде бірінші функционалдықмашина тілі ретінде анықталады. Символдар тізімімен жұмыс істеу үшін бұл тіл ассемблерлік тип болып табылады. Алайда, тұтастай алғанда , IPL императивті түсініктерді қолдануға акценттеліп отыр.

Кеннет Е.Айверсон APL тілін 60 жылдардың басында ойлап шығарды, оны құжаттап Programming Language кітабында шығарды.APL FP тіліне елеулі әсер етті. 90-шы жылдардың басында Айверсон және Роджер Хуэй APL тілінің ізбасарын құрды оны J тілі деп атады. Тоқсаныншы жылдардың ортасында Артур Уитни Айверсонмен бұрын жұмыс істеген , K тілін құрды , кейінірек коммерциялық негізде қаржы саласында қолданылатын болды.

Эдинбург университетінде жетпісінші жылдарыРобин Милнер ML тілін құрды , және Дэвид ТернерСанкт -Эндрюс университетінде SASL тілін дамыта бастады, Кент университетінің қаласында Миранда тілін дамыта бастады. Соныңда ML негізінде бірнеше тіл құрылды , оның ішінде ең танымалы Objective Caml және Standard ML. Тағы да жетпісінші жылдары программалау тілі Scheme принципі бойынша құрылып жатты, атақты жұмыс Лямбда Баяндамалар , сондай- ақ функционалдық бағдарламалау принциптері кең аудитория назарына отырған , сексен бес жыл
Компьютерлік бағдарламалар құрылымы мен түсіндіру кітабында сипаттамасын алды.

Сексенінші жылдары Пер Мартин Леф интуционистикалық теориялар типін құрды.Бұл теория бойынша, функционалдықбағдарламалаубұрынтәуе лдітүріретіндебелгіліболды,сындарлы дәлелалды.Ол теория тілқатысу дәлелдемелер дамыту және көптеген функционалдық тілдерді кейіннен құру үшін қуатты серпін берді.Haskell функционалдық бағдарламалау зерттеулер арқылы алынған идеялар көп біріктіруге әрекет сексенінші жылдардың соңына құрылды.

Миранда функционалдық программалау тілі.

Miranda функционалдық программалау тілі стандартты функционалды тіл ретінде 1985 жылы Дэвид Тернердің арқасында құрылды. Оның қатан полиморфты жүйелер типі бар және қолданушы типін қолдайды. ML секілді барлық университет қабырғасында пән ретінде оқытылады. Функционалдық нысандар карринг көмегімен құрылады. Жалқау семантикасы бар. Бағдарлама анықтамаларының жинағынан тұрады.SASL және KRC тілдерінің ізбасарлары ML мен HOPE концепциясын пайдаланады.
Код үлгісі:
Map функциясын анықтау және оны 2-ге арттыру
map f[] = []
map f(x:s) = (f x):(map f s)
L = [1..6]
map((+)2) L
-- [3, 4, 5, 6, 7, 8]

Miranda тілінің даму тарихы

Miranda Роланд Рэбиеннің атынан 02.02.00 жылы іске қосылды. Бұл ICQ-дің қысқартылған нұсқасы болып табылады, ол Miranda ICQ деп аталады. Ресми релизі 06.02.00 жылы іске қосылды, бұл нұсқасы 0.0.1 болды және осы уақыттан оның дамуы басталды.

Нұсқасы 0.1.x
Miranda әзірлеуші Ричард Hughes (Richard Hughes) болды. Бұл нұсқа өзінің алғашқы релизі болды. Бірінші қосылмалы модульді бірге берілген тілқатысу терезесінде бірлігі сплит болды. MSN хаттама плагин нұсқасы 0.1.1.0 шығару кезінде пайда болды, ол Miranda қолдауымен екінші хаттама болды. Бұл нұсқа тұңғыш рет тіл бумаларын қолдана бастады және бірнеше желілерде жұмыс істей алады. Нұсқасы 0.1.0.0 шығарғаннан кейін, қосылатын модульдердің белсенді дамуын бастады. Нұсқасы 0.1.2.1 шыққаннан кейін, шамамен 50 жалғамалы бағдарлама қол жетімді болды.

Нұсқасы 0.2.x
Жобаның әзірлеушілер Мартин Оберг, Роберт Рэйнвотер , Сэм K және Лион Лим болып табылады. MSN хаттама қайта өңделіп, хаттаманың Yahoo! Messenger бірінші нұсқасын әзірленді. Онда жылдам хабар, RSS жаңалықтар мен ауа райы үшін байланысы жоқ плагиндер, Миранда байланыс үшін ғана емес, қолданыла бастады. Бағдарламасының ICQ-хаттама өзегі бағдарламасын және жоюды атын өзгерту туралы әңгіме бастау. 17.12.02 жоба Миранда атына өзгертілді. Модульдердің саны ~ 140 дана.

Нұсқасы 0.3.x
Хаттама-ICQ тиісті бағдарламалық қосылатын модулі үшін өзегі шығарылды нұсқасы 0,3 жылы. Миранда ICQ қолдау орнатпастан ақ іске қосыла алды. Қосылатын модульдердің саны Miranda нұсқасында 0,3 айтарлықтай өсті, ол ICQ, MSN, AIM және Jabber қосылатын модульдер болды. Кейінірек, Иорген Persson IRC қолдау қосты. Қабылдау және хабар алмасу бағдарламасы SRMM плагиннің ядросының шығарылды. Нұсқасы 0.3.3 шығару кезінде қосылатын модульдерің саны 250 данаға жетті.

Нұсқасы 0.4.x
Нұсқа 0.4 07.04.05 жылы шығарылды. Оның жиынтығы Yahoo плагин хаттама қосулуы болды. Ядросының контактілер тізімі және дерекқор модуль жіберілді. Контактілер тізімі тегжейлі теңшелетін классикалық clist_classic, көп clist_mw, қазіргі заманғы clist_modern және clist_nicer: байланыс парақ 4 түрлі нұсқалары болды. Осы сәтте, қосылатын модульдердің саны 400-ден астам дана болды.

Нұсқасы 0.5.x
Miranda (0,5) 28.07.06 шығарылды және Unicode қолдайтын алғашқы нұсқасы болды. AIM Оскар қолдауы іске асырылды. Miranda-ның бұл нұсқасы аватарларды кең басқару мүмкіндіктері қамтамасыз етеді.

Нұсқасы 0.6.x
29.12.06 жылы 0.6нұсқасы шығарылды. Бұл нұсқа UPnP (Universal Plug және Play) қолдайды. Көптеген қателер түзетілді және Unicode қолдау жақсарды.

Нұсқасы 0.7.х
0.7 нұсқа тестілеу стадиясынан шығып , ресми статусты бар. Бұл нұсқада программаларды өңдейтін, плагиндер, шрифттер, белгілер байланысты өзгертулер енгізілген. Қазіргі уақытта қосылатын модульдердің саны үлкен және қиын сансыз.

Нұсқасы 0.8.x
0.8 нұсқасы 0.7 нұсқасымен салыстырғанда айтарлықтай функция қолдау жақсарту және кеңейту, толық дамуына ресми мәртебесі бар, қауіпсіздік проблемалары жөнделген.

Нұсқасы 0.9.х
0.9 нұсқасы әлі өнделуде және оның альфа мәртебесі бар бірақ ол тиімді және жүктеуге қол жетімді. 9.0 нұсқасында 64 биттік операциялық жүйелерді қолдау басталды, осы серия үшін қосымша MS Visual Studio 2008 кітапханасы қажет.

Scala - оңай және жылдам құру компоненті бағдарламалық қамтамасыз ету үшін қысқа және қауіпсіз жобаланған көп парадигмалы программалау тілі, функционалдық және объектілі-бағдарланған бағдарламалау мүмкіндігін үйлестіре алатын тіл.Мартин Одерски басшылығымен бағдарламалау политехникалық мектеп Федералде Лозанна зертханалық әдістер арқылы 2003 жылы құрылған тілдің алғашқы нұсқасы, бұл тіл Java және .NET платформалар үшін жүзеге асырылады. Джеймс Строон (Eng. Джеймс Строон), Groovy программалау тілін құрушының айтуынша, Scala Java тілінің мұрагері болуы мүмкін.

Даму тарихы.

Тіл EPFL бағдарламалау әдістерін зертханасында 2001-2004 жылы құрылды. Ол жақсартылған тілді қолдау компоненті бағдарламалық құралын дамытуға бағытталған ғылыми-зерттеу нәтижесі болып табылады. Тілдің дамуына 2 идея негізі қабылданды:
Тіл компонент бағдарламалау ол шағын және ірі екі бөлігінде сипаттау сол ұғымдарды пайдалана мүмкін болуы тиіс деген мағынада масштабталатын болуы тиіс. Сондықтан, көңіл абстракцияның тетігін, орнына тек кейбір масштабтау деңгейде пайдалы болуы мүмкін примитивтер үлкен санын енгізу құрамы мен ыдырау бағытталған болатын.
Масштабталатын компоненті қолдау бағдарламалау тілінде берілуі мүмкін, біріктіреді және нысанды-бағытталған және функционалдық бағдарламалау қорытады. бағдарламалау парадигмалар қоспасы болып табылатын ұғым, - негізгі техникалық инновацияларды Scala Кейбір. Scala-ның қамтиды статикалық типтеу тілдерінде, қатар бұл парадигмалары әзірге толықтай дерлік бөлінген болатын.

Common Lisp.

Common Lisp (CL abbr.) - Lisp тілінің диалекті ANSI стандартталған. Лисп диалектілерін біріктіру мақсатында әзірленген. Common Lisp коммерциялық және ашық түрдегі асырулары бар.

Common Lisp - көп парадигмасы жалпы мақсаттағы бағдарламалау тілі. Ол, процедуралық функционалдық және объектілі-бағдарланған бағдарламалау тіркесімін қолдайды.

Common Lisp Clos қамтиды; Lisp макро жүйесі мета-бағдарламалау әдістерін және жалпы бағдарламалау пайдалансаңыз, жаңа тіл синтаксисі енгізуге мүмкіндік береді.

Синтаксис
Common Lisp кодын және деректерді екеуін белгілеу үшін S-өрнектерді пайдаланады. Функциялар мен макростарды шақыру тізім болып табылады,
Мұнда бірінші элемент тізімнің басы немесе функция аты , ал қалған бөлігі құйрығы болып табылады.

F#- ол .NET FRAMEWORK отбасысының мультипарадигмалы тілі , ол функционалды программалауды қосымша ретінде императивті программалауға және обьектілі-бағытталған бағдарламалауға пайдаланылады. F# құрылымы жағынан Ocaml-ға ұқсайды тек F# кітапхананың жоғарғысынан және .NET орындалуы жүзеге асырылады. Тілдің негізін қалаушы Дон Сайман, Кембрижде Microsoft Research-те қаланған. Қазіргі уақытта тілдің өңдеуін Microsoft Developer Division жүргізіп жатыр. F # Visual Studio әзірлеу ортамен өте тығыз біріктіріледі және Visual Studio 2010201220132015 жеткізу енгізілген. Сондай-ақ, Mac және Linux үшін құрастырушылар әзірледі. Microsoft Visual Studio 2010 және жаңа нұсқаларында дамыту ортасын F # интеграцияланған. Қарашаның 4-інде, 2010 F # компилятор және негізгі кітапхана коды оған Apache License 2.0 астында жарияланады.

Ерекшеліктері.

Тіл коды F # жиі жинақы сол C # коды байланысты шығыс түрлеріне қарағанда түрлері үшін қарсы қауіпсіз. F # қатаң типтендіру жылы имплицитной қайта Айырбастау түріне байланысты қателерді болдырмайды, ол толығымен жоқ.Мұндай рулық бағдарламалау сияқты ерекшеліктері, сондай-ақ жоғары ретті функциялар параметрленген деректер құрылымдардың бақылауға жалпылама алгоритмдерін жазуға мүмкіндік береді.
Көптеген тілдерде, құндылықтардың ең айнымалы болып табылады. Мысалы, айнымалы х С ++ келесі кодты орындауға нәтижесінде 3 мәні сақталады:
intx=2;
x++;

F #, керісінше, барлық әдепкі мәндер тұрақты болып табылады. F # сөз отыратын пайдаланып айнымалы ретінде арнайы тег мәнін талап ететін, айнымалылар мүмкіндік береді:
letx=2 түрақты айнымалы
letmutabley=2 айнымалы
x-3 қате
y-3 Ok. y = 3

F # Сонымен қатар, сондай-ақ, айнымалы мәндер болуы мүмкін қол түрлері мен объектілері бар. Алайда, код ең көп қателерін болдырмайды және отладки жеңілдету тұрақты құндылықтар функциясы болып табылады. Сонымен қатар, қарапайым бағдарламаларды паралелдейді. Бұл код императивті тілдегі аналогты кодқа қарағанда сирек күрделі болады.

F # негізгі идеяларының бірі функционалдық бағдарламалау тілінде қолданыстағы коды мен түрі басқа .NET-тілдері оңай қол жетімді болуы мүмкін екенін көз болып табылады. F # Бағдарламаны .NET Framework қосымша орнату бумасы орындау ортасын талап оларды іске қосу үшін, алайда, ЖШС жиналыстар (ехе және .dll файлдар) ішіне жасалады.
Қызықты ерекшелігі (және OCaml айырмашылығы) кеңістіктер (және тек кеңістіктер) еркін санының түрінде үстеме есебінен логикалық салынған коды құрылымдар басқару болып табылады. Осы мақсат үшін қойындыларды қолдау көрсетілмейді.

Компилятор және интерпретатор.

F # - құрастырылған бағдарламалау тілі, мен Бірыңғай аралық тілі (ҚСС) пайдаланылатын тілді, сондай-ақ C # тілінде немесе VB.Net жазылған бағдарламалар ретінде аралық тілі.F # -компилятормен (FSC) бірге осы және интерактивті F # -кодты алады F # -интерпретатор (FSI) болып табылады.

Мысалдар:

F# синтаксисі математикалық белгілерге негізделген, ал программалау алгебраға ұқсайды , сондықтанда F# Haskell-ге ұқсатады. Мысалы, сіз жаңа типті анықтаған кезде, айнымалының не жол не бүтін болатынын көрсетіп кетуіңізге болады. Міне бұл көрінер әдісі:

typemyType=IntValofintStringValofs tring

Мұндай типтердің маңызды мысалы болып Option болып табылады, ол мұнда қайсібір типтің мәнін сақтайды не ештене сақтамайды.

typeOptiona=NoneSomeofa

Бұл стандартты түрі F # болып табылады және жиі (мысалы, деректер құрылымында іздеу) кодты пайдалануға нәтижесі алу мүмкін емес мән жағдайларда пайдаланылады.

Сондай-ақ, коды математикалық түсінігіндегі. Мынадай құрылыс F тең алгебра (х) = х + 1:

letfx=x+1

1.2 Функционалдық бағдарламалау мүмкіндіктері.

Сіз , бәлкім ойлап отырған шығарсыз , жоғарыда келтірілген функцияны ақтай айламаймын. Мен функционалдық бағдарламалау оқи бастағанда , мен де солай ойладым.Мен қателестім. Мұндай стильдің пайдасы туралы өте жақсы дәлелдер бар. Кейбіреулері субьективті. Мысалы программистер функционалдық программаларды түсіну оңай деп айтады.

Unit тестілеу

ФП әрбір символы өзгеріссіз болғандықтан , функцияларға жанама әсерлер жоқ .Сіз бір функцияға мәндерін айнымалы тыс аясынан мәнін өзгерте алмайсыз және осылайша, басқа функцияларға әсер ете алмайды. Бұл дегеніміз, жалғыз шешімі ол функцияның қайтаратын мәні. Қайтарылатын мәнге кері әсер ететін нәрсе ол функцияға берілетін аргументтер.

Сіз тек қана қажетті дәлелдер арқылы бағдарламада әрбір функцияны тексеруге болады . Функцияларды дұрыс ретпен шақырудың қажеті жоқ.
Cізге керек нәрсе тек аргументтерді шекаралық жағдайларға сәйкес етіп жіберу. Барлық функциялары сіздің бағдарламасы Unit - сынақтар болса, сіз аманатты программалау тілдері жағдайда қарағанда , сіздің бағдарламалық қамтамасыз ету сапасын әлдеқайда сенімді бола аламыз. Бұл функция сонымен қатар қайта қарауға жатады құрылымдық жағдайын , өзгертуге болады - Java немесе C ++ жылы қайтар- мағына жеткілікті емес тексереді.ФП мұндай кемшілік жоқ.

Отладка.

Егер функционалды программа сіз күткендей өзін басқара алмаса , онда отладка ол бос нәрсе. Сіз әрдайым мәселені қайта ойната аласыз , өйткені кодтың қателігі ол сыртқы кодқа тәуелді емес. ФП жағдай әлдеқайда оңай , егер қайтарылатын мән дұрыс болмаса , кодтың қай жері орындалса да әрқашан дұрыс болмайды. Сіз қатені жаңғыртқаннан кейін ,оның көзін табасыз. Ол тіпті жағымды болып табылады.

Cіз бағдарламаның орындалуын тоқтатсаңыз , сіздің алдыңызда шақырулар стекі тұрады. Сіз императивті тілдегідей сияқты , әрбір функцияның шақыруын көре аласыз. Императивті тілде бұл жеткіліксіз , өйткені функция ұяшықтар мәніне байланысты және басқа класстардың күйлеріне. ФП функция тек өз аргументтеріне ғана байланысты , бұл ақпарат сіздің көз алдыңызда тұрды. Тіпті одан да көп ,императивті программада қайтарылатын мәнді тексеру жеткіліксіз , оған қарап кодтың дұрыс әлде бұрыс жұмыс жасап жатқандығын айту киын. Кодтың дұрыстығын тексеру үшін , сізге ондаған обьектілерді тексеру қажет. Функционалдық программалауда бар нәрсе ол қайтарылатын мәнге қарау керек. Стекке көз жүгіртіп шыққанда , берілетін және қайтарылатын аргументке назар аудару қажет. Қайтарылатын мән нормаға сай келмесе сіз ары қарай функцияға теренделіп ары қарай жылжисыз. Сіз қате көзін таппағанша бұл бірнеше рет қайталанады.

Көпағымдылық.

Функционалдық бағдарлама кез келген өзгеріссіз параллелдеуге дайын. Cізге deadlock туралы аландаудың қажеті жоқ өйткені сізге құлыпталу керек жоқ. Функционалды бағдарламада деректердің бір бөлігі әр түрлі толқында өзгермейді. Бұл Сізге оңай тіпті аманатты тілдерінде тән проблемалар туралы ойланбастан сіздің бағдарлама ағындары қосуға болады дегенді білдіреді.
Осы сияқты нәрселер болса, неге бірнеше функционалдық бағдарламалау тілдері көп ағымдыбағдарламаларда пайдаланылады ?Шын мәнінде , сіз ойлағаннан жиі. Ericsson ақаулық төзімді және масштабталатын телекоммуникациялық ажыратқыштар пайдалану үшін Эрланг деп аталатын функционалдық тілін әзірледі. Көптеген Эрланг - ұңғыманы артықшылықтарын атап өтті және оны пайдалана бастады.Біз Уолл-стрит жобаланған ретінде типтік жүйелерді масштабын оңай емес телекоммуникация және қозғалысын басқару жүйелері туралы айтып отырмыз.Шын мәнінде Erlang жазылған жүйелер, Java жүйесі сияқты ауқымды және сенімді емес.Erlang жүйесі өте қарапайым.

Көпағымдылықтың тарихы мұнымен бітпейді. Егер сіз бірағымды қосымша жазсаныз , онда компилятор функционалды программаны оптималдап бірнеше CPU пайдаланатындай етіп оңтайландырып береді. Келесі кодтың бөлігіне қарайық.
String s1 = somewhatLongOperation1();
String s2 = somewhatLongOperation2();
String s3 = concatenate(s1, s2);
Функционалды тілдің компиляторы кодты анализдеп , функцияларды классификациялап оларды паралельді түрде іске қосады. Императивті тілде мұны жасау мүмкін емес , өйткені әр функция ішкі күйін өзгерте алады . ФП функцияларды автоматты талдау және параллелдеу үшін жарамды кандидаттар іздеу тривиалды міндет. Осы мағынада, бағдарламалау функционалдық стиль ертеңгі талаптарына сәйкес келеді. Өңдеушілер CPU
Одан артық жұмыс істеткізе алмайды. Оның орнына, олар ядролардың санын ұлғайту және төрт көп бұрандалы есептеу жылдамдығын артып, мәлімдеп жатыр.
Әрине ,олар жай ғана сіздің жаңа процессордың параллелдеу арқылы ескере әзірленген бағдарламаларға өседі деп айтуға ұмытып отыр . Императивті программалық жабдықтамада бұл өте аз. Бірақ 100% функционалдық программалар көпағымдылыққа дайын.
Развёртывание по горячему.
Windows жаңартуларын орнату үшін ескі күндері компьютерді қайта іске қосу қажет. Көп рет. Медиа ойнатқыш жаңа нұсқасын орнатқаннан кейін . Айтарлықтай Windows XP өзгерістер енгізді , бірақ жағдай әлі идеалдан алыс. Unix жүйелерінде моделі жақсы болды. Жаңартуларды орнату үшін кейбір компоненттерін тоқтатуға тура келді, бірақ барлық операциялық жүйелердіемес.
Дегенмен жағдай жақсы , бірақ ол сервер қосымшалар үлкен класы үшін әлі де қолайлы емес. Телекоммуникациялық жүйелер100%уақыт енгізілуі тиіс , өйткені, , содан кейін жедел жәрдем шақыру мүмкін емес жаңарту салдарынан болса, адам өмірі жоғалуы мүмкін. WallStreet көшелер компаниялар , тым жаңартуларды орнату үшін демалыс күндері серверін тоқтатып алғысы келмейді . Ең дұрысы , жүйенің жұмысын тоқтапай-ақ , кодтын керек бөлігін жаңартып алу керек. Императивті әлемде бұл мүмкін емес. Жазуға арналған Java сыныбын жүктеу елестетіп көріңізші , және жаңа нұсқасын қайта іске қосыңыз. Егер біз солай істесек, класстың барлық экземплярлары жұмыссыз күйде қалушы еді өйткені , олар сақтайтын күйлер жоғалушы еді. Біз оны бақылау үшін қиын код жазуға тура керек еді. Ал көші-қон коды , сонымен қатар сіз қолмен жазу керек.
Ал көші-қон әлі коды объектілері арасындағы байланысты сақтауға тиіс .
Теориясы бойынша әлі күнге дейін барлық оң , бірақ іс жүзінде ол жұмыс істемейді

Функционалды программада барлық күй стекте функциялардың аргументі ретінде сақталады. Бұл айтарлықтай ыстық бойынша жаю жеңілдетеді !Шын мәнінде , сіз істеу керек барлық нәрсе ол - өндірістік сервер коды және жаңа нұсқасы арасындағы айырмашылықты есептеу және код өзгерістер орнату болып табылады .Қалғандары автоматты түрде тілдік құралдар арқылы жүзеге асырылатын болады ! Егер сіз мұны ғылыми фантазия деп ойласаңыз , сізге 2 рет ойлану қажет. Erlang пен жұмыс істейтін инженерлер жүйелерінің жұмысын үзбей , оларды жаңартып отырады.

Дәлелдемелер есептеу және оңтайландыру
Функционалдық бағдарламалау тілдері тағы бір қызықты ерекшелігі, олар мақсатында математикалық тұрғысынан зерттелген болады.Функционалдық тілі ретінде - ресми жүйесін енгізу болып табылады , қағаз пайдаланылатын барлық математикалық операциялар , функционалдық бағдарламалар қолданылуы мүмкін . Компилятор мысалы, код балама орына , математикалық олардың дәлелдеуге баламалыққа, бірақ неғұрлым тиімді орнына айналдыруға болады. Жыл бойы реляциялық деректер базасын осындай оңтайландыруды өндірді .Ешнәрсе дәстүрлі бағдарламаларға ұқсас әдісті пайдалануға бөгет бермейді.
Сонымен қатар, сіз өз бағдарламасы бағыттарының дұрыстығын дәлелдеу үшін математикалық құралдарын пайдалануға болады.Сіз кодты талдау, құралдарын жазып, автоматты түрде уақыт шекарасында арналған Unit - тесттер жасау қажет болуы мүмкін !Бұл функция жоғары сенімді жүйелер үшін баға жетпес болып табылады. Кардиостимуляторлар немесе әуе қозғалысын басқару басқару жүйелері сияқты құралдарын әзірлеуге қажет.
Егер жобалық - миссиясы сыни қосымшалар саласындағы болмаса, автоматты тестілеу құралдары әлі де сіздің бәсекелестеріне үлкен артықшылық береді.

Жоғары тәртіптегі функциялар.

Естерініздіме , мен функционалды программалаудың артықшылықтары туралы айтқанда , final сөзін жазуға тура келеді бұның бәрі әдемі көрінгенімен тектен тек. Бұл адасу еді. Final қолдану императивті тілдерде қисық болып көрінеді , мысалы Java. Функционалды программалауда абстракцияның басқа түрлерін қолданады , сіз айнымалы туралы ұмытып кетесіз. Соның айқын мысалы ол - жоғары тәртіптегі функция.

Функционалды программалауда функция Java C++ тілдеріндегідей сияқты функция емес. Бұл жиынның сырты , ол да Java функциясы сияқты қызмет атқара алады және оның мүмкіншілігі оданда зор. Айталық , бізде С++ функция бар дерлік:

intadd(int i, int j) {
return i + j;}

Функционалды программалауда С тіліндегідей сияқты функция емес. Java компиляторымзды кеңейтейік , осындай жазбаларды қабылдайтын. Компилятор хабарландыруды келесі Java кодқа ауыстыру керек:

classadd_function_t{
intadd(inti, int j) {
returni + j; }}
add_function_t add = newadd_function_t();

Addсимволы толығымен функция емес. Бұл 1 әдісі бар класс. Енді біз add-ны аргумент ретінде басқа функцияға беруге болады. Біз оны басқа символға жазуға болады. Біз add_function_t runtime-ға экземплярларын құрсақ болады, егер олар керек болмаған жағдайда , мусор жинауыштың көмегімен жойылады. Функциялар цифрлар , қатарлар сияқты негізгі обьектіге айналады. Функцияларды аргумент ретінде қабылдайтын функциялар жоғары тәртіпті функциялар деп аталады. Бұл сіздерді қорқытпасын. Жоғарыт тәртіптегі функциялар түсінігі JAVA класстарынан айырмашылығы жоқ. Біз оларды жоғары тәртіптегі класстар деп атасақ болады.

Қалай және қашан жоғары тәртіптегі функцияларды қолдану керек ? Сіз сұрағанынызға мен ризамын. Сіз өз программанызды үлкен монолитті бөлшек ретінде класстарға мән бермей жазасыз. Егер сіз кодтың бір бөлігі қайталанып кетсе , сіз оны бөлек функция ретінде жазасыз. Егер сіз программа кодының логикасы әр жағдайда әр түрлі іс-әрекет істеу керек болса , онда сіз оны жоғары тәртіптегі функция ретінде жазасыз. Шатастыңызба ? Сізге таза мысал:

voidhandleMessage(Message msg) {.
msg.setClientCode("ABCD_123")
sendMessage(msg);
}}

Енді елестетіп көріңіз , сізге хабарламаны 2 сервер арасында бөлу керек 1 сервердің орнына. Бәрі де өзгеріссіз қалады , клиенттің кодынан басқа , 2 сервер осы коды басқа форматта алғысы келеді. Бұл жағдайды қалай түзетсек болады? Біз хабарламаның қайда баратынын кодқа қарап тексере аламыз және соған қарап дұрыс кодты жаза аламыз. Мысалы:

classMessageHandler{
voidhandleMessage(Message msg) {
if(msg.getDestination().equals("ser ver1") {
msg.setClientCode("ABCD_123");
} else {
msg.setClientCode("123_ABC");
}

sendMessage(msg);
}}

Бірақ мұндай подход дұрыс масштабталмайды. Жаңа серверлер қосылған сайын функция сызықты түрде өседі және өзгерістер енгізу сұмдық болады. Обьектілі-бағытталған жол жалпы суперклассты MessageHandler-ға арналған.

abstractclassMessageHandler{
voidhandleMessage(Message msg) {
msg.setClientCode(getClientCode());

sendMessage(msg); }
abstract String getClientCode();}
classMessageHandlerOneextendsMessag eHandler{
String getClientCode() {
return"ABCD_123"; }}
classMessageHandlerTwoextendsMessag eHandler{
String getClientCode() {
return"123_ABCD"; }}
Енді біз әрбір серверге біз оған сай класстың көшірмесін құра аламыз. Жаңа сервер қосу өте ыңғайлы. Бірақ мұндай кішігірім өзгертуге текст көп.
Клиенттің кодың қолдау үшін мұндай 2 жаңа типті құруға тура келді. Енді тура осындай нәрсені өз кодымызға жасайық.

classMessageHandler{
voidhandleMessage(Message msg, Function getClientCode) {
Message msg1 = msg.setClientCode(getClientCode());
sendMessage(msg1);
}}
String getClientCodeOne() {
return"ABCD_123";}
String getClientCodeTwo() {
return"123_ABCD";}
MessageHandler handler = newMessageHandler();
handler.handleMessage(someMsg, getClientCodeOne);

Біз жаңа түрлерін және күрделі сынып иерархиясын жасаған жоқпыз. Біз тек функцияны параметр ретінде бердік. Біз обьектілі-бағытталған бағдарламалаудағы сияқты жетістікке жеттік , тек кішігірім артықшылықпен. Біз класс иерархиясын өзімізге байлап қойған жоқпыз: модульдік кем код жоғары деңгейін сақтай отырып , біз орындалу кез келген басқа да функцияларды өтеді , және кез келген уақытта оларды өзгертуге болады . Шын мәнінде , компилятор біз үшін объектілі-бағытталған желім құрды !
Бұл ФП барлық басқа артықшылықтарын сақтайды.
Функционалдық тілдерді ұсынған, әрине абстракцияның барлығы аяқталмайды.Жоғары тәртібі функциялары басы ғана болып табылады.

Каррирлеу

Мен кездестірген көптеген адамдар , Design Patterns Төрттік Gang кітабын оқыды. Кез келген өзін құрметтейтін программист кітапты кез келген нақты бағдарламалау тіліне байланысты емес деп айтуға болады және паттерн заңдылықтары жалпы бағдарламалық қамтамасыз етуді әзірлеу үшін қолданылады. Бұл асыл хабарландыру. Өкінішке орай , ол ақиқаттан алыс.

Функционалдық тілдері өте мәнерлі болып табылады .
Тіл оңай барлық белгілі бағдарламалау үлгілерін жоюға ұғымдар бағдарламалау бастауға болады , сондықтан жоғары деңгейі болып табылады , өйткені функционалдық тілінде , сіз жобалау үлгілерін қажеті жоқ. Мұндай паттерннің бірі болып Адаптер болып табылады(Фасадтан не айырмашылығы бар? Меніңше , біреу келісімді орындау үшін көбірек бетті штампавать еткен сияқты).
Тіл каррированиены қолдауы бар болса, бұл үлгі қажет емес. Адаптер паттеры Java класс абстракциясының негізгі бірлігі ретінде кең қолданылады. Функцияналды тілдерде паттерн функцияларға қолданылады. Үлгі интерфейс алады және белгілі бір талаптарға сәйкес әртүрлі интерфейске оны түрлендіреді.

intpow(inti, int j);
intsquare(inti){
return pow(i, 2);}

Бұл код кез келген дәрежеге шығаратың функция интерфейсін , санды квадраттайтын функция мен теңестіреді. Академиялық ортада бұл жай әдіс каррирование деп аталады(
Бұл барлық анықтамаларды формалдау үшін математикалық трюктер арқылы бірқатар жұмсалған логикалық Haskell карри ( Haskell Curry ) , маман құрметіне аталған).
Функционалды программалауда функция аргументтер ретінде барлық жерде қолданылады болғандықтан, белгілі бір жерде Каррирование қажетті интерфейстерге функциясын алып өте жиі қолданылады. Функция интерфейсі - ол оның аргументі , каррирование оның аргументтер саның азайту үшін қолданылады.
Бұл құрал функционалдық тілдерінде біріктірілген.Сіз қолмен түпнұсқаны орайтын функцияны жасау қажет емес. Функционалдық тілі сіз үшін бәрін жасайды. Әдеттегідей , каррирование қосу арқылы , біз өз тілімізді кеңейтіп алайық.
square = intpow(inti, 2);

Осы жолмен , біз автоматты түрде еселейтін функциясын жасаймыз . Жаңа функция pow функциясын шақыратын болады , 2 ші тұрған санды аргумент ретінде жібереді. Java тұрғысынан қарағанда бұл былай болады:

classsquare_function_t{
intsquare(inti) {
return pow(i, 2); }}
square_function_t square = newsquare_function_t();

Көргенініздей , біз тек негізгі функцияның сыртын ғана жаздық. ФП каррирование ғана болып табылады және қабықтың жасау үшін қарапайым және ыңғайлы жолы болып табылады. Сіз тапсырмаға баса ... жалғасы

Сіз бұл жұмысты біздің қосымшамыз арқылы толығымен тегін көре аласыз.
Ұқсас жұмыстар
Миранда функционалдық программалау тілі
Функционалдық программалау тілдерінің мүмкіндіктерді талдау
Программалау тілдерінің классификациясы
Мәліметтер базасымен жұмыс істеуге арналған компоненттер
Алгоритмдеу және программалау
«Санды тап» ойыны
Delphi программалау ортасы және мәліметтер қоры
Программалау тілдеріне жалпы шолу
Web- программалау тілдері
Си бағдарламалау тілі
Пәндер