Функционалдық программалау тілдерінің мүмкіндіктерді талдау
Қазақстан Республикасының ғылым және білім министрлігі
Әл-Фараби атындағы қазақ ұлттық университеті
________________
Қорғауға жіберілді
Кафедра меңгерушісі,ф.-м.ғ.к.,
доцент Урмашев Б.А. ___________
ДИПЛОМДЫҚ ЖҰМЫС
Тақырыбы: Функционалдық программалау тілдерінің мүмкіндіктерді талдау
5B060200 - Информатика мамандығы
Орындаған
____________________
Әбдісамат Б.Ә.
Ғылыми жетекші,
п. ғ.к.
____________________
Тұрғанбаева А.Р.
Норма бақылаушы
____________________
Кабдрахова С.С.
Алматы 2016
МАЗМҰНЫ
КІРІСПЕ
3
I
ФУНКЦИОНАЛДЫҚ ПРОГРАММАЛАУ БОЛАШАҒЫ БАР ПРОГРАММАЛАУДЫҢ ПАРАДИГМАСЫ
0.1 ФПТ даму тарихы. ФПТ классификациясы
4
1.2 ФПТ функционалдық мүмкіндіктер
10
0.1 Haskell-функционалды программалау тілі
23
II
YI FRAMEWORK-ТЕ ФПТ БАЙЛАНЫСТЫ ЭЛЕКТРОНДЫҚ ҚОСЫМШАНЫ ҚҰРУ
2.1 Сайттың сценариясы
26
2.2 YI framework 2.0 мүмкіндіктері
28
2.3 Электронды қосымшаны іске асыру
32
ҚОРЫТЫНДЫ
42
ПАЙДАЛАНЫЛҒАН ӘДЕБИЕТТЕР
43
ҚОСЫМШАЛАР
44
КІРІСПЕ
Функционалды программалау дегеніміз - бұл дискретті математиканың бір бөлігі және программалаудың парадигмасы, есептеу процессі мұнда математикалық функциялардың көмегімен жүзеге асырылады.
Императивті программалауға қарсы қойылатын парадигма, есептеу процессі күйлердің ауысуымен анықталады. Функционалды бағдарламалауда есептеу процессінің дәйекті күйлері қажет болған жағдайда тізім ретінде көрсетіледі.
Функционалдық бағдарламалау бастапқы деректер және басқа да функциялардың нәтижелері және нақты бағдарлама сақтау мәртебесін тарту емес, өзіндік құнын есептеу функцияларын қамтиды. Тиісінше, ол арналған, сондай-ақ ( негізгі ұғымдардың бірі, оның мәні және өткізеді алгоритм ретінде өзгертуге мүмкіндік береді айнымалы болып табылады міндетті түрде қарағанда ) осы жай - өзгергіштік емес.
Іс жүзінде математикалық функцияның функция түсінігінен императивті программалауда айырмашылығы, императивті функциялар тек аргументтерге ғана емес, оның сыртқы күйлеріне де және сыртқы айнымалы жай-күйін өзгертуге мүмкін емес болып табылады. Осылайша, императивті бағдарламалауды шақырған кезде бірдей параметрлері бар бірдей функцияларды, бірақ алгоритм әр түрлі кезеңдерінде, әр түрлі деректер есебінен айнымалылардың функциясын әсер ете алуға болады. Ал функционалды тілде аргументі бір функцияны шақырған кезде бірдей жауапты қабылдаймыз. Шығатын деректер енетін деректерге байланысты.
Бұл функционалдық тілдерінде орындалу уақыты бағдарламасы функциялардың нәтижелері кэштеу және алгоритмі көрсетілген емес тәртіппен оларды шақыру және бағдарламашы тарапынан кез келген қосымша шараларды, оларды қатарластыра мүмкіндік береді.
Жұмыстың өзектілігі:
Функционалдық программалау тілдерін таңдаған себебіміміз, функционалдық тілдер программистердің жұмысын жеңілдетеді. Функционалды программалау тілдерінің көмегімен әмбебап, оңай өзгерілетін және кеңейтілген программалар жазылады. Сондықтан дипломдық жұмыстың тақырыбы заманауи талаптарға сай, өзекті болып табылады.
Жұмыстың мақсаты: функционалдық программалау тілдерінің мүмкіндіктерді талдау, функционалдық программалау тілдерінің біреуін игеріп және соның ішінде Haskell функционалды программалау тілінде бағдарлама жазу.
Жұмысқа қойылған міндеттер:
1. Функционалды программалау тілдеріне байланысты шетелдік және отандық әдебиеттерді оқып зерттеу.
2. Функционалды бағдарламалау тілдерінің классификациясын құру.
3. Haskell тілін зерттеп, бағдарлама жазу.
4. Функционалдық программалау тілдеріне қатысты сайт құру.
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 функционалдық бағдарламалау зерттеулер арқылы алынған идеялар көп біріктіруге әрекет сексенінші жылдардың соңына құрылды.
1-кесте. Функционалды Программалау тілдеріне анықтама
Тіл
анықтама
Scheme
Lisp диалектісі, computer science облысында қолданатын ғылымы зерттеуге арналған. Осының арқасында Common Lisp қарағанда кішірек
Standard ML
Функционалды программалаудың қатаң типтелген тілі. Оның құрамында императивті қасиеттері, оның ішінде сілтемелер, т.с.с. , сондықтан ол тіз таза емес болып табылады. Модулділіктің қызық өнделеді.
Caml Light және Objective Caml
Standard ML секілді ML әулетіне тиесілі. Objective Caml Caml Ligth айырмашылығы біріншісі обьектілі бағдарланған программалауды қолданады. Standart ML сияқты қатан типтелген
Miranda
Дэвид Тернет негізін қалаған, жалқау бағалауды пайдаланған. Қатаң полиморфты жүйелер типі бар. ML сияқты көптеген университеттерде пән ретінде беріледі. Haskell тілінің құрылуына үлкен ықпалын тигізді
Haskell
Ең кең таралған қатан емес тіл. Өте дамыған жүйелер типі бар. Модульдер жүйесі дұрыс өңделмеген. Соңғы нұсқасы - Haskell 98
Gofer (Good For Equational Reasoning)
Haskell қысқа нұсқасы. Функционалды программалауды үйренуге арналған
Clean
Арнайы параллельді және бөлінген программалауға арналған. Синтаксис бойынша 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% уақыт енгізілуі тиіс , өйткені, содан кейін жедел жәрдем шақыру мүмкін емес жаңарту салдарынан болса, адам өмірі жоғалуы мүмкін. Wall Street көшелер компаниялар , тым жаңартуларды орнату үшін демалыс күндері серверін тоқтатып алғысы келмейді . Ең дұрысы, жүйенің жұмысын тоқтапай-ақ , кодтын керек бөлігін жаңартып алу керек. Императивті әлемде бұл мүмкін емес. Жазуға арналған Java сыныбын жүктеу елестетіп көріңізші, және жаңа нұсқасын қайта іске қосыңыз. Егер біз солай істесек, класстың барлық экземплярлары жұмыссыз күйде қалушы еді өйткені, олар сақтайтын күйлер жоғалушы еді. Біз оны бақылау үшін қиын код жазуға тура керек еді.
Ал көші-қон коды, сонымен қатар сіз қолмен жазу керек.
Ал көші-қон әлі коды объектілері арасындағы байланысты сақтауға тиіс.
Теориясы бойынша әлі күнге дейін барлық оң, бірақ іс жүзінде ол жұмыс істемейді.
Функционалды программада барлық күй стекте функциялардың аргументі ретінде сақталады. Бұл айтарлықтай ыстық бойынша жаю жеңілдетеді ! Шын мәнінде, сіз істеу керек барлық нәрсе ол - өндірістік сервер коды және жаңа нұсқасы арасындағы айырмашылықты есептеу және код өзгерістер орнату болып табылады . Қалғандары автоматты түрде тілдік құралдар арқылы жүзеге асырылатын болады ! Егер сіз мұны ғылыми фантазия деп ойласаңыз, сізге 2 рет ойлану қажет. Erlang пен жұмыс істейтін инженерлер жүйелерінің жұмысын үзбей, оларды жаңартып отырады.
Дәлелдемелер есептеу және оңтайландыру
Функционалдық бағдарламалау тілдері тағы бір қызықты ерекшелігі, олар мақсатында математикалық тұрғысынан зерттелген болады.Функционалдық тілі ретінде - ресми жүйесін енгізу болып табылады, қағаз пайдаланылатын барлық математикалық операциялар, функционалдық бағдарламалар қолданылуы мүмкін . Компилятор мысалы, код балама орына, математикалық олардың дәлелдеуге баламалыққа, бірақ неғұрлым тиімді орнына айналдыруға болады. Жыл бойы реляциялық деректер базасын осындай оңтайландыруды өндірді .Ешнәрсе дәстүрлі бағдарламаларға ұқсас әдісті пайдалануға бөгет бермейді.
Сонымен қатар, сіз өз бағдарламасы бағыттарының дұрыстығын дәлелдеу үшін математикалық құралдарын пайдалануға болады.Сіз кодты талдау, құралдарын жазып, автоматты түрде уақыт шекарасында арналған Unit - тесттер жасау қажет болуы мүмкін! Бұл функция жоғары сенімді жүйелер үшін баға жетпес болып табылады. Кардиостимуляторлар немесе әуе қозғалысын басқару басқару жүйелері сияқты құралдарын әзірлеуге қажет.
Егер жобалық - миссиясы сыни қосымшалар саласындағы болмаса, автоматты тестілеу құралдары әлі де сіздің бәсекелестеріне үлкен артықшылық береді.
Жоғары тәртіптегі функциялар
Естерініздіме, мен функционалды программалаудың артықшылықтары туралы айтқанда, final сөзін жазуға тура келеді бұның бәрі әдемі көрінгенімен тектен тек. Бұл адасу еді. Final қолдану императивті тілдерде қисық болып көрінеді, мысалы Java. Функционалды программалауда абстракцияның басқа түрлерін қолданады , сіз айнымалы туралы ұмытып кетесіз. Соның айқын мысалы ол - жоғары тәртіптегі функция.
Функционалды программалауда функция Java C++ тілдеріндегідей сияқты функция емес. Бұл жиынның сырты, ол да Java функциясы сияқты қызмет атқара алады және оның мүмкіншілігі оданда зор. Айталық, бізде С++ функция бар дерлік:
Int add(int I, int j){
Return i+j;
}
Функционалды программалауда С тіліндегідей сияқты функция емес. Java компиляторымзды кеңейтейік, осындай жазбаларды қабылдайтын. Компилятор хабарландыруды келесі Java кодқа ауыстыру керек:
Class add_function_t{
Int add(int I,int j){
Return i+j;}}
Add_function_t = new add_function_t();
Add символы толығымен функция емес. Бұл 1 әдісі бар класс. Енді біз add-ны аргумент ретінде басқа функцияға беруге болады. Біз оны басқа символға жазуға болады. Біз add_function_t runtime-ға экземплярларын құрсақ болады, егер олар керек болмаған жағдайда, мусор жинауыштың көмегімен жойылады. Функциялар цифрлар, қатарлар сияқты негізгі обьектіге айналады. Функцияларды аргумент ретінде қабылдайтын функциялар жоғары тәртіпті функциялар деп аталады. Бұл сіздерді қорқытпасын. Жоғары тәртіптегі функциялар түсінігі JAVA класстарынан айырмашылығы жоқ. Біз оларды жоғары тәртіптегі класстар деп атасақ болады.
Қалай және қашан жоғары тәртіптегі функцияларды қолдану керек ? Сіз сұрағанынызға мен ризамын. Сіз өз программанызды үлкен монолитті бөлшек ретінде класстарға мән бермей жазасыз. Егер сіз кодтың бір бөлігі қайталанып кетсе, сіз оны бөлек функция ретінде жазасыз. Егер сіз программа кодының логикасы әр жағдайда әр түрлі іс-әрекет істеу керек болса, онда сіз оны жоғары тәртіптегі функция ретінде жазасыз. Шатастыңызба ? Сізге таза мысал:
Void Handle Message(Message msg) {
Msg.setClientCode("ABCD_123")
sendMessage(msg);
}}
Енді елестетіп көріңіз, сізге хабарламаны 2 сервер арасында бөлу керек 1 сервердің орнына. Бәрі де өзгеріссіз қалады, клиенттің кодынан басқа, 2 сервер осы коды басқа форматта алғысы келеді. Бұл жағдайды қалай түзетсек болады? Біз хабарламаның қайда баратынын кодқа қарап тексере аламыз және соған қарап дұрыс кодты жаза аламыз. Мысалы:
Class MessageHandler{
voidhandleMessage(Message msg) {
if(msg.getDestination().equals("se rver1") {
msg.setClientCode("ABCD_123");}
else {
msg.setClientCode("123_ABC");
}
sendMessage(msg);
}}
Бірақ мұндай подход дұрыс масштабталмайды. Жаңа серверлер қосылған сайын функция сызықты түрде өседі және өзгерістер енгізу сұмдық болады. Обьектілі-бағытталған жол жалпы суперклассты MessageHandler-ға арналған.
Abstractclass MessageHandler {
voidhandleMessage(Message msg) {
msg.setClientCode(getClientCode() );
send Message(msg);}
abstract String getClientCode(); }
class MessageHandlerOne extends MessageHandler {
String getClientCode() {
Return "ABCD_123"; }}
classMessageHandlerTwo extends MessageHandler {
String getClientCode() {
Return "123_ABCD"; }}
Енді біз әрбір серверге біз оған сай класстың көшірмесін құра аламыз. Жаңа сервер қосу өте ыңғайлы. Бірақ мұндай кішігірім өзгертуге текст көп.
Клиенттің кодың қолдау үшін мұндай 2 жаңа типті құруға тура келді. Енді тура осындай нәрсені өз кодымызға жасайық.
Class MessageHandler {
Void handleMessage (Message msg,Function getClientCode) {
Message msg1=msg.setClientCode(getClientCod e());
sendMessage(msg1);
}}
String getClientCodeOne(){
Return "ABCD_123";}
String getClientCodeTwo(){
Return "123_ABCD";}
MessageHandler handler=new MessageHandler();
Handler.handleMessage(some Msg,getClientCodeOne);
Біз жаңа түрлерін және күрделі сынып иерархиясын жасаған жоқпыз. Біз тек функцияны параметр ретінде бердік. Біз обьектілі-бағытталған бағдарламалаудағы сияқты жетістікке жеттік, тек кішігірім артықшылықпен. Біз класс иерархиясын өзімізге байлап қойған жоқпыз: модульдік кем код жоғары деңгейін сақтай отырып, біз орындалу кез келген басқа да функцияларды өтеді, және кез келген уақытта оларды өзгертуге болады. Шын мәнінде, компилятор біз үшін объектілі-бағытталған желім құрды !
Бұл ФП барлық басқа артықшылықтарын сақтайды.
Функционалдық тілдерді ұсынған, әрине абстракцияның барлығы аяқталмайды. Жоғары тәртібі функциялары басы ғана болып табылады.
Каррирлеу
Мен кездестірген көптеген адамдар, Design Patterns Төрттік Gang кітабын оқыды. Кез келген өзін құрметтейтін программист кітапты кез келген нақты бағдарламалау тіліне байланысты емес деп айтуға болады және паттерн заңдылықтары жалпы бағдарламалық қамтамасыз етуді әзірлеу үшін қолданылады. Бұл асыл хабарландыру. Өкінішке орай, ол ақиқаттан алыс.
Функционалдық тілдері өте мәнерлі болып табылады.
Тіл оңай барлық белгілі бағдарламалау үлгілерін жоюға ұғымдар бағдарламалау бастауға болады, сондықтан жоғары деңгейі болып табылады, өйткені функционалдық тілінде, сіз жобалау үлгілерін қажеті жоқ. Мұндай паттерннің бірі болып Адаптер болып табылады(Фасадтан не айырмашылығы бар? Меніңше, біреу келісімді орындау үшін көбірек бетті штампавать еткен сияқты).
Тіл каррированиены қолдауы бар болса, бұл үлгі қажет емес. Адаптер паттеры Java класс абстракциясының негізгі бірлігі ретінде кең қолданылады. Функцияналды тілдерде паттерн функцияларға қолданылады. Үлгі интерфейс алады және белгілі бір талаптарға сәйкес әртүрлі интерфейске оны түрлендіреді.
Int pow(int I, int j);
Int square(int i){
Return pow(I,2);}
Бұл код кез келген дәрежеге шығаратың функция интерфейсін, санды квадраттайтын функция мен теңестіреді. Академиялық ортада бұл жай әдіс каррирование деп аталады (Бұл барлық анықтамаларды формалдау үшін математикалық трюктер арқылы бірқатар жұмсалған логикалық Haskell карри (Haskell Curry), маман құрметіне аталған).
Функционалды программалауда функция аргументтер ретінде барлық жерде қолданылады болғандықтан, белгілі бір жерде Каррирование қажетті интерфейстерге функциясын алып өте жиі қолданылады. Функция интерфейсі - ол оның аргументі, каррирование оның аргументтер саның азайту үшін қолданылады.
Бұл құрал функционалдық тілдерінде біріктірілген. Сіз қолмен түпнұсқаны орайтын функцияны жасау қажет емес. Функционалдық тілі сіз үшін бәрін жасайды. Әдеттегідей, каррирование қосу арқылы, біз өз тілімізді кеңейтіп алайық.
Square = int pow(int I,2);
Осы жолмен, біз автоматты түрде еселейтін функциясын жасаймыз. Жаңа функция pow функциясын шақыратын болады, 2 ші тұрған санды аргумент ретінде жібереді. Java тұрғысынан қарағанда бұл былай болады:
Class square_function_t{
Int square(int i) {
Return pow(I,2); }}
Square_function_t square = new square_function_t();
Көргенініздей, біз тек негізгі функцияның сыртын ғана жаздық. ФП каррирование ғана болып табылады және қабықтың жасау үшін қарапайым және ыңғайлы жолы болып табылады. Сіз тапсырмаға баса назар аударасыз және компилятор сіз үшін қажетті кодын жазады ! Ол өте қарапайым және сіз орын адаптері үлгісін ( орауыш ) пайдаланғыңыз келетін әр уақыт кетеді.
Жалқау бағалау
Жалқау (немесе кейінге қалдырылған ) есептеу - бұл , сіз тек функционалдық философиясын үйренуге мүмкін болады қызықты әдісі болып табылады.Көпағымдықты туралы әңгіме болғанда, біз қазірдің өзінде код мынадай бөлігін кездестірдік :
String s1 = someWhatLongOperation1();
String s2 = someWhatLongOperation2();
String s3 = someWhatLongOperation3();
Императивтік тілдерде, есептеулерді бағдарламалау қандай да бір проблемалар тудыруы емес. Әрбір функция әсерететін немесе сыртқы жағдайларына байланысты болуы мүмкін болғандықтан, қоңыраулар тәртібі сақталуға тиіс тастаңыз:бірінші somewhatLongOperation1, содан кейін some what Long Operation 2 және соңғы біріктіру. Бірақ функционалдық тілдерінде оңай емес. Біз бұрында көргендей somewhatLongOperation1 және somewhatLongOperation2 бір уақытта іске қоса аламыз, өйткені функциялар глобальды күйіне байланысты болмайды. Бірақ біз бір уақытта қосқымыз келмесе, бірінен соң іске қосамызба? Жауабы-жоқ. Бұл есептеулер кез келген басқа функцияларды S1 және S2 байланысты болған кезде ғана іске қосылуы тиіс. Біз тіпті олар CONCATENATE ішінде қажет болғанша оларды асыруға қажеті жоқ. Біз екі бір дәлел пайдалану жағдайларына байланысты, ол CONCATENATE функциясының орнына алмастыра алса, екінші аргумент есептелген болуы мүмкін емес! Haskell - жалқау бағалау бар тілдің үлгісі. Haskell-ақ қажетті кодты орындайды Себебі Haskell, ешқандай кепілдік бермейді(барлық!) Кез келген басым қоңыраулар бар.
Жалқау бағалаудың бірқатар артықшылықтары бар, сондай-ақ кейбір кемшіліктері бар. Келесі бөлімде біз артықшылықтарын талқылаймыз, мен кемшіліктерін бірге қалай алуға түсіндіремін.
Оңтайландыру.
Жалқау бағалау оңтайландыру үшін зор әлеуеті қамтамасыз етеді. Бағдарламаның тұтастығын қамтамасыз ету, ал бұл, кейбір заттар күшiн жоя алады код белгілі бір бөліктерінің орындалуын болдырмау үшін, үлкен тиімділігін қоңыраулардың ретін өзгертуге, қателерді азайту үшін, тіпті, мұндай жолмен код бар - Жалқау компилятор дәл алгебралық өрнек зерделеу математик ретінде кодын тексереді.Бұл бағдарлама қатаң формальды сипаттау примитивы ірі артықшылығы болып табылады - коды математикалық заңдарына бағынады және математикалық әдістермен зерттелген болады.
Басқару құрылымынабстракциялау.
Жалқау бағалау абстракцияның жоғары деңгейін қамтамасыз еткені сонша болады, соның әсерінен ғажайып нәрселер болады. Мысалы, келесі басқару құрылымын жүзеге асыру елестетейік:
Unless(stock.isEuropean()) {
sendToSEC(stock);}
Біз sendToSEC функциясы қоры (қор) Еуропалық емес жағдайда ғана жүзеге асырылады келеді. Қалай жүзеге асырсақ болады? Жалқау бағалау Онсыз біз макростар жүйесі қажет еді, бірақ Haskell ұқсас тілдерінде, қажет емес. Біз, unless-ты функция ретінде жариялауымызға болады!
Void unless(Boolean condition, List code) {
If(!condition)
Code;}
condition == true болса кодтың орындалмайтынын ескеріңіз.
Шексіз деректер құрылымы
Жалқау тілдер Шексіздік деректер құрылымдарын құруға мүмкіндік береді, қатаң тілінде құру әлдеқайда қиын. Мысалы, Фибоначчи қатарын еске түсіріңіз. Бұл біз соңғы уақытта шексіз ... жалғасы
Әл-Фараби атындағы қазақ ұлттық университеті
________________
Қорғауға жіберілді
Кафедра меңгерушісі,ф.-м.ғ.к.,
доцент Урмашев Б.А. ___________
ДИПЛОМДЫҚ ЖҰМЫС
Тақырыбы: Функционалдық программалау тілдерінің мүмкіндіктерді талдау
5B060200 - Информатика мамандығы
Орындаған
____________________
Әбдісамат Б.Ә.
Ғылыми жетекші,
п. ғ.к.
____________________
Тұрғанбаева А.Р.
Норма бақылаушы
____________________
Кабдрахова С.С.
Алматы 2016
МАЗМҰНЫ
КІРІСПЕ
3
I
ФУНКЦИОНАЛДЫҚ ПРОГРАММАЛАУ БОЛАШАҒЫ БАР ПРОГРАММАЛАУДЫҢ ПАРАДИГМАСЫ
0.1 ФПТ даму тарихы. ФПТ классификациясы
4
1.2 ФПТ функционалдық мүмкіндіктер
10
0.1 Haskell-функционалды программалау тілі
23
II
YI FRAMEWORK-ТЕ ФПТ БАЙЛАНЫСТЫ ЭЛЕКТРОНДЫҚ ҚОСЫМШАНЫ ҚҰРУ
2.1 Сайттың сценариясы
26
2.2 YI framework 2.0 мүмкіндіктері
28
2.3 Электронды қосымшаны іске асыру
32
ҚОРЫТЫНДЫ
42
ПАЙДАЛАНЫЛҒАН ӘДЕБИЕТТЕР
43
ҚОСЫМШАЛАР
44
КІРІСПЕ
Функционалды программалау дегеніміз - бұл дискретті математиканың бір бөлігі және программалаудың парадигмасы, есептеу процессі мұнда математикалық функциялардың көмегімен жүзеге асырылады.
Императивті программалауға қарсы қойылатын парадигма, есептеу процессі күйлердің ауысуымен анықталады. Функционалды бағдарламалауда есептеу процессінің дәйекті күйлері қажет болған жағдайда тізім ретінде көрсетіледі.
Функционалдық бағдарламалау бастапқы деректер және басқа да функциялардың нәтижелері және нақты бағдарлама сақтау мәртебесін тарту емес, өзіндік құнын есептеу функцияларын қамтиды. Тиісінше, ол арналған, сондай-ақ ( негізгі ұғымдардың бірі, оның мәні және өткізеді алгоритм ретінде өзгертуге мүмкіндік береді айнымалы болып табылады міндетті түрде қарағанда ) осы жай - өзгергіштік емес.
Іс жүзінде математикалық функцияның функция түсінігінен императивті программалауда айырмашылығы, императивті функциялар тек аргументтерге ғана емес, оның сыртқы күйлеріне де және сыртқы айнымалы жай-күйін өзгертуге мүмкін емес болып табылады. Осылайша, императивті бағдарламалауды шақырған кезде бірдей параметрлері бар бірдей функцияларды, бірақ алгоритм әр түрлі кезеңдерінде, әр түрлі деректер есебінен айнымалылардың функциясын әсер ете алуға болады. Ал функционалды тілде аргументі бір функцияны шақырған кезде бірдей жауапты қабылдаймыз. Шығатын деректер енетін деректерге байланысты.
Бұл функционалдық тілдерінде орындалу уақыты бағдарламасы функциялардың нәтижелері кэштеу және алгоритмі көрсетілген емес тәртіппен оларды шақыру және бағдарламашы тарапынан кез келген қосымша шараларды, оларды қатарластыра мүмкіндік береді.
Жұмыстың өзектілігі:
Функционалдық программалау тілдерін таңдаған себебіміміз, функционалдық тілдер программистердің жұмысын жеңілдетеді. Функционалды программалау тілдерінің көмегімен әмбебап, оңай өзгерілетін және кеңейтілген программалар жазылады. Сондықтан дипломдық жұмыстың тақырыбы заманауи талаптарға сай, өзекті болып табылады.
Жұмыстың мақсаты: функционалдық программалау тілдерінің мүмкіндіктерді талдау, функционалдық программалау тілдерінің біреуін игеріп және соның ішінде Haskell функционалды программалау тілінде бағдарлама жазу.
Жұмысқа қойылған міндеттер:
1. Функционалды программалау тілдеріне байланысты шетелдік және отандық әдебиеттерді оқып зерттеу.
2. Функционалды бағдарламалау тілдерінің классификациясын құру.
3. Haskell тілін зерттеп, бағдарлама жазу.
4. Функционалдық программалау тілдеріне қатысты сайт құру.
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 функционалдық бағдарламалау зерттеулер арқылы алынған идеялар көп біріктіруге әрекет сексенінші жылдардың соңына құрылды.
1-кесте. Функционалды Программалау тілдеріне анықтама
Тіл
анықтама
Scheme
Lisp диалектісі, computer science облысында қолданатын ғылымы зерттеуге арналған. Осының арқасында Common Lisp қарағанда кішірек
Standard ML
Функционалды программалаудың қатаң типтелген тілі. Оның құрамында императивті қасиеттері, оның ішінде сілтемелер, т.с.с. , сондықтан ол тіз таза емес болып табылады. Модулділіктің қызық өнделеді.
Caml Light және Objective Caml
Standard ML секілді ML әулетіне тиесілі. Objective Caml Caml Ligth айырмашылығы біріншісі обьектілі бағдарланған программалауды қолданады. Standart ML сияқты қатан типтелген
Miranda
Дэвид Тернет негізін қалаған, жалқау бағалауды пайдаланған. Қатаң полиморфты жүйелер типі бар. ML сияқты көптеген университеттерде пән ретінде беріледі. Haskell тілінің құрылуына үлкен ықпалын тигізді
Haskell
Ең кең таралған қатан емес тіл. Өте дамыған жүйелер типі бар. Модульдер жүйесі дұрыс өңделмеген. Соңғы нұсқасы - Haskell 98
Gofer (Good For Equational Reasoning)
Haskell қысқа нұсқасы. Функционалды программалауды үйренуге арналған
Clean
Арнайы параллельді және бөлінген программалауға арналған. Синтаксис бойынша 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% уақыт енгізілуі тиіс , өйткені, содан кейін жедел жәрдем шақыру мүмкін емес жаңарту салдарынан болса, адам өмірі жоғалуы мүмкін. Wall Street көшелер компаниялар , тым жаңартуларды орнату үшін демалыс күндері серверін тоқтатып алғысы келмейді . Ең дұрысы, жүйенің жұмысын тоқтапай-ақ , кодтын керек бөлігін жаңартып алу керек. Императивті әлемде бұл мүмкін емес. Жазуға арналған Java сыныбын жүктеу елестетіп көріңізші, және жаңа нұсқасын қайта іске қосыңыз. Егер біз солай істесек, класстың барлық экземплярлары жұмыссыз күйде қалушы еді өйткені, олар сақтайтын күйлер жоғалушы еді. Біз оны бақылау үшін қиын код жазуға тура керек еді.
Ал көші-қон коды, сонымен қатар сіз қолмен жазу керек.
Ал көші-қон әлі коды объектілері арасындағы байланысты сақтауға тиіс.
Теориясы бойынша әлі күнге дейін барлық оң, бірақ іс жүзінде ол жұмыс істемейді.
Функционалды программада барлық күй стекте функциялардың аргументі ретінде сақталады. Бұл айтарлықтай ыстық бойынша жаю жеңілдетеді ! Шын мәнінде, сіз істеу керек барлық нәрсе ол - өндірістік сервер коды және жаңа нұсқасы арасындағы айырмашылықты есептеу және код өзгерістер орнату болып табылады . Қалғандары автоматты түрде тілдік құралдар арқылы жүзеге асырылатын болады ! Егер сіз мұны ғылыми фантазия деп ойласаңыз, сізге 2 рет ойлану қажет. Erlang пен жұмыс істейтін инженерлер жүйелерінің жұмысын үзбей, оларды жаңартып отырады.
Дәлелдемелер есептеу және оңтайландыру
Функционалдық бағдарламалау тілдері тағы бір қызықты ерекшелігі, олар мақсатында математикалық тұрғысынан зерттелген болады.Функционалдық тілі ретінде - ресми жүйесін енгізу болып табылады, қағаз пайдаланылатын барлық математикалық операциялар, функционалдық бағдарламалар қолданылуы мүмкін . Компилятор мысалы, код балама орына, математикалық олардың дәлелдеуге баламалыққа, бірақ неғұрлым тиімді орнына айналдыруға болады. Жыл бойы реляциялық деректер базасын осындай оңтайландыруды өндірді .Ешнәрсе дәстүрлі бағдарламаларға ұқсас әдісті пайдалануға бөгет бермейді.
Сонымен қатар, сіз өз бағдарламасы бағыттарының дұрыстығын дәлелдеу үшін математикалық құралдарын пайдалануға болады.Сіз кодты талдау, құралдарын жазып, автоматты түрде уақыт шекарасында арналған Unit - тесттер жасау қажет болуы мүмкін! Бұл функция жоғары сенімді жүйелер үшін баға жетпес болып табылады. Кардиостимуляторлар немесе әуе қозғалысын басқару басқару жүйелері сияқты құралдарын әзірлеуге қажет.
Егер жобалық - миссиясы сыни қосымшалар саласындағы болмаса, автоматты тестілеу құралдары әлі де сіздің бәсекелестеріне үлкен артықшылық береді.
Жоғары тәртіптегі функциялар
Естерініздіме, мен функционалды программалаудың артықшылықтары туралы айтқанда, final сөзін жазуға тура келеді бұның бәрі әдемі көрінгенімен тектен тек. Бұл адасу еді. Final қолдану императивті тілдерде қисық болып көрінеді, мысалы Java. Функционалды программалауда абстракцияның басқа түрлерін қолданады , сіз айнымалы туралы ұмытып кетесіз. Соның айқын мысалы ол - жоғары тәртіптегі функция.
Функционалды программалауда функция Java C++ тілдеріндегідей сияқты функция емес. Бұл жиынның сырты, ол да Java функциясы сияқты қызмет атқара алады және оның мүмкіншілігі оданда зор. Айталық, бізде С++ функция бар дерлік:
Int add(int I, int j){
Return i+j;
}
Функционалды программалауда С тіліндегідей сияқты функция емес. Java компиляторымзды кеңейтейік, осындай жазбаларды қабылдайтын. Компилятор хабарландыруды келесі Java кодқа ауыстыру керек:
Class add_function_t{
Int add(int I,int j){
Return i+j;}}
Add_function_t = new add_function_t();
Add символы толығымен функция емес. Бұл 1 әдісі бар класс. Енді біз add-ны аргумент ретінде басқа функцияға беруге болады. Біз оны басқа символға жазуға болады. Біз add_function_t runtime-ға экземплярларын құрсақ болады, егер олар керек болмаған жағдайда, мусор жинауыштың көмегімен жойылады. Функциялар цифрлар, қатарлар сияқты негізгі обьектіге айналады. Функцияларды аргумент ретінде қабылдайтын функциялар жоғары тәртіпті функциялар деп аталады. Бұл сіздерді қорқытпасын. Жоғары тәртіптегі функциялар түсінігі JAVA класстарынан айырмашылығы жоқ. Біз оларды жоғары тәртіптегі класстар деп атасақ болады.
Қалай және қашан жоғары тәртіптегі функцияларды қолдану керек ? Сіз сұрағанынызға мен ризамын. Сіз өз программанызды үлкен монолитті бөлшек ретінде класстарға мән бермей жазасыз. Егер сіз кодтың бір бөлігі қайталанып кетсе, сіз оны бөлек функция ретінде жазасыз. Егер сіз программа кодының логикасы әр жағдайда әр түрлі іс-әрекет істеу керек болса, онда сіз оны жоғары тәртіптегі функция ретінде жазасыз. Шатастыңызба ? Сізге таза мысал:
Void Handle Message(Message msg) {
Msg.setClientCode("ABCD_123")
sendMessage(msg);
}}
Енді елестетіп көріңіз, сізге хабарламаны 2 сервер арасында бөлу керек 1 сервердің орнына. Бәрі де өзгеріссіз қалады, клиенттің кодынан басқа, 2 сервер осы коды басқа форматта алғысы келеді. Бұл жағдайды қалай түзетсек болады? Біз хабарламаның қайда баратынын кодқа қарап тексере аламыз және соған қарап дұрыс кодты жаза аламыз. Мысалы:
Class MessageHandler{
voidhandleMessage(Message msg) {
if(msg.getDestination().equals("se rver1") {
msg.setClientCode("ABCD_123");}
else {
msg.setClientCode("123_ABC");
}
sendMessage(msg);
}}
Бірақ мұндай подход дұрыс масштабталмайды. Жаңа серверлер қосылған сайын функция сызықты түрде өседі және өзгерістер енгізу сұмдық болады. Обьектілі-бағытталған жол жалпы суперклассты MessageHandler-ға арналған.
Abstractclass MessageHandler {
voidhandleMessage(Message msg) {
msg.setClientCode(getClientCode() );
send Message(msg);}
abstract String getClientCode(); }
class MessageHandlerOne extends MessageHandler {
String getClientCode() {
Return "ABCD_123"; }}
classMessageHandlerTwo extends MessageHandler {
String getClientCode() {
Return "123_ABCD"; }}
Енді біз әрбір серверге біз оған сай класстың көшірмесін құра аламыз. Жаңа сервер қосу өте ыңғайлы. Бірақ мұндай кішігірім өзгертуге текст көп.
Клиенттің кодың қолдау үшін мұндай 2 жаңа типті құруға тура келді. Енді тура осындай нәрсені өз кодымызға жасайық.
Class MessageHandler {
Void handleMessage (Message msg,Function getClientCode) {
Message msg1=msg.setClientCode(getClientCod e());
sendMessage(msg1);
}}
String getClientCodeOne(){
Return "ABCD_123";}
String getClientCodeTwo(){
Return "123_ABCD";}
MessageHandler handler=new MessageHandler();
Handler.handleMessage(some Msg,getClientCodeOne);
Біз жаңа түрлерін және күрделі сынып иерархиясын жасаған жоқпыз. Біз тек функцияны параметр ретінде бердік. Біз обьектілі-бағытталған бағдарламалаудағы сияқты жетістікке жеттік, тек кішігірім артықшылықпен. Біз класс иерархиясын өзімізге байлап қойған жоқпыз: модульдік кем код жоғары деңгейін сақтай отырып, біз орындалу кез келген басқа да функцияларды өтеді, және кез келген уақытта оларды өзгертуге болады. Шын мәнінде, компилятор біз үшін объектілі-бағытталған желім құрды !
Бұл ФП барлық басқа артықшылықтарын сақтайды.
Функционалдық тілдерді ұсынған, әрине абстракцияның барлығы аяқталмайды. Жоғары тәртібі функциялары басы ғана болып табылады.
Каррирлеу
Мен кездестірген көптеген адамдар, Design Patterns Төрттік Gang кітабын оқыды. Кез келген өзін құрметтейтін программист кітапты кез келген нақты бағдарламалау тіліне байланысты емес деп айтуға болады және паттерн заңдылықтары жалпы бағдарламалық қамтамасыз етуді әзірлеу үшін қолданылады. Бұл асыл хабарландыру. Өкінішке орай, ол ақиқаттан алыс.
Функционалдық тілдері өте мәнерлі болып табылады.
Тіл оңай барлық белгілі бағдарламалау үлгілерін жоюға ұғымдар бағдарламалау бастауға болады, сондықтан жоғары деңгейі болып табылады, өйткені функционалдық тілінде, сіз жобалау үлгілерін қажеті жоқ. Мұндай паттерннің бірі болып Адаптер болып табылады(Фасадтан не айырмашылығы бар? Меніңше, біреу келісімді орындау үшін көбірек бетті штампавать еткен сияқты).
Тіл каррированиены қолдауы бар болса, бұл үлгі қажет емес. Адаптер паттеры Java класс абстракциясының негізгі бірлігі ретінде кең қолданылады. Функцияналды тілдерде паттерн функцияларға қолданылады. Үлгі интерфейс алады және белгілі бір талаптарға сәйкес әртүрлі интерфейске оны түрлендіреді.
Int pow(int I, int j);
Int square(int i){
Return pow(I,2);}
Бұл код кез келген дәрежеге шығаратың функция интерфейсін, санды квадраттайтын функция мен теңестіреді. Академиялық ортада бұл жай әдіс каррирование деп аталады (Бұл барлық анықтамаларды формалдау үшін математикалық трюктер арқылы бірқатар жұмсалған логикалық Haskell карри (Haskell Curry), маман құрметіне аталған).
Функционалды программалауда функция аргументтер ретінде барлық жерде қолданылады болғандықтан, белгілі бір жерде Каррирование қажетті интерфейстерге функциясын алып өте жиі қолданылады. Функция интерфейсі - ол оның аргументі, каррирование оның аргументтер саның азайту үшін қолданылады.
Бұл құрал функционалдық тілдерінде біріктірілген. Сіз қолмен түпнұсқаны орайтын функцияны жасау қажет емес. Функционалдық тілі сіз үшін бәрін жасайды. Әдеттегідей, каррирование қосу арқылы, біз өз тілімізді кеңейтіп алайық.
Square = int pow(int I,2);
Осы жолмен, біз автоматты түрде еселейтін функциясын жасаймыз. Жаңа функция pow функциясын шақыратын болады, 2 ші тұрған санды аргумент ретінде жібереді. Java тұрғысынан қарағанда бұл былай болады:
Class square_function_t{
Int square(int i) {
Return pow(I,2); }}
Square_function_t square = new square_function_t();
Көргенініздей, біз тек негізгі функцияның сыртын ғана жаздық. ФП каррирование ғана болып табылады және қабықтың жасау үшін қарапайым және ыңғайлы жолы болып табылады. Сіз тапсырмаға баса назар аударасыз және компилятор сіз үшін қажетті кодын жазады ! Ол өте қарапайым және сіз орын адаптері үлгісін ( орауыш ) пайдаланғыңыз келетін әр уақыт кетеді.
Жалқау бағалау
Жалқау (немесе кейінге қалдырылған ) есептеу - бұл , сіз тек функционалдық философиясын үйренуге мүмкін болады қызықты әдісі болып табылады.Көпағымдықты туралы әңгіме болғанда, біз қазірдің өзінде код мынадай бөлігін кездестірдік :
String s1 = someWhatLongOperation1();
String s2 = someWhatLongOperation2();
String s3 = someWhatLongOperation3();
Императивтік тілдерде, есептеулерді бағдарламалау қандай да бір проблемалар тудыруы емес. Әрбір функция әсерететін немесе сыртқы жағдайларына байланысты болуы мүмкін болғандықтан, қоңыраулар тәртібі сақталуға тиіс тастаңыз:бірінші somewhatLongOperation1, содан кейін some what Long Operation 2 және соңғы біріктіру. Бірақ функционалдық тілдерінде оңай емес. Біз бұрында көргендей somewhatLongOperation1 және somewhatLongOperation2 бір уақытта іске қоса аламыз, өйткені функциялар глобальды күйіне байланысты болмайды. Бірақ біз бір уақытта қосқымыз келмесе, бірінен соң іске қосамызба? Жауабы-жоқ. Бұл есептеулер кез келген басқа функцияларды S1 және S2 байланысты болған кезде ғана іске қосылуы тиіс. Біз тіпті олар CONCATENATE ішінде қажет болғанша оларды асыруға қажеті жоқ. Біз екі бір дәлел пайдалану жағдайларына байланысты, ол CONCATENATE функциясының орнына алмастыра алса, екінші аргумент есептелген болуы мүмкін емес! Haskell - жалқау бағалау бар тілдің үлгісі. Haskell-ақ қажетті кодты орындайды Себебі Haskell, ешқандай кепілдік бермейді(барлық!) Кез келген басым қоңыраулар бар.
Жалқау бағалаудың бірқатар артықшылықтары бар, сондай-ақ кейбір кемшіліктері бар. Келесі бөлімде біз артықшылықтарын талқылаймыз, мен кемшіліктерін бірге қалай алуға түсіндіремін.
Оңтайландыру.
Жалқау бағалау оңтайландыру үшін зор әлеуеті қамтамасыз етеді. Бағдарламаның тұтастығын қамтамасыз ету, ал бұл, кейбір заттар күшiн жоя алады код белгілі бір бөліктерінің орындалуын болдырмау үшін, үлкен тиімділігін қоңыраулардың ретін өзгертуге, қателерді азайту үшін, тіпті, мұндай жолмен код бар - Жалқау компилятор дәл алгебралық өрнек зерделеу математик ретінде кодын тексереді.Бұл бағдарлама қатаң формальды сипаттау примитивы ірі артықшылығы болып табылады - коды математикалық заңдарына бағынады және математикалық әдістермен зерттелген болады.
Басқару құрылымынабстракциялау.
Жалқау бағалау абстракцияның жоғары деңгейін қамтамасыз еткені сонша болады, соның әсерінен ғажайып нәрселер болады. Мысалы, келесі басқару құрылымын жүзеге асыру елестетейік:
Unless(stock.isEuropean()) {
sendToSEC(stock);}
Біз sendToSEC функциясы қоры (қор) Еуропалық емес жағдайда ғана жүзеге асырылады келеді. Қалай жүзеге асырсақ болады? Жалқау бағалау Онсыз біз макростар жүйесі қажет еді, бірақ Haskell ұқсас тілдерінде, қажет емес. Біз, unless-ты функция ретінде жариялауымызға болады!
Void unless(Boolean condition, List code) {
If(!condition)
Code;}
condition == true болса кодтың орындалмайтынын ескеріңіз.
Шексіз деректер құрылымы
Жалқау тілдер Шексіздік деректер құрылымдарын құруға мүмкіндік береді, қатаң тілінде құру әлдеқайда қиын. Мысалы, Фибоначчи қатарын еске түсіріңіз. Бұл біз соңғы уақытта шексіз ... жалғасы
Ұқсас жұмыстар
Пәндер
- Іс жүргізу
- Автоматтандыру, Техника
- Алғашқы әскери дайындық
- Астрономия
- Ауыл шаруашылығы
- Банк ісі
- Бизнесті бағалау
- Биология
- Бухгалтерлік іс
- Валеология
- Ветеринария
- География
- Геология, Геофизика, Геодезия
- Дін
- Ет, сүт, шарап өнімдері
- Жалпы тарих
- Жер кадастрі, Жылжымайтын мүлік
- Журналистика
- Информатика
- Кеден ісі
- Маркетинг
- Математика, Геометрия
- Медицина
- Мемлекеттік басқару
- Менеджмент
- Мұнай, Газ
- Мұрағат ісі
- Мәдениеттану
- ОБЖ (Основы безопасности жизнедеятельности)
- Педагогика
- Полиграфия
- Психология
- Салық
- Саясаттану
- Сақтандыру
- Сертификаттау, стандарттау
- Социология, Демография
- Спорт
- Статистика
- Тілтану, Филология
- Тарихи тұлғалар
- Тау-кен ісі
- Транспорт
- Туризм
- Физика
- Философия
- Халықаралық қатынастар
- Химия
- Экология, Қоршаған ортаны қорғау
- Экономика
- Экономикалық география
- Электротехника
- Қазақстан тарихы
- Қаржы
- Құрылыс
- Құқық, Криминалистика
- Әдебиет
- Өнер, музыка
- Өнеркәсіп, Өндіріс
Қазақ тілінде жазылған рефераттар, курстық жұмыстар, дипломдық жұмыстар бойынша біздің қор #1 болып табылады.
Ақпарат
Қосымша
Email: info@stud.kz