ML (програмски језик)

ML (енг. MetaLanguage) је програмски језик који је развио Robin Milner 1970-их година на Универзитету у Единбургу. [1] Његова синтакса је инспирисана ISWIM-ом (ISWIM је апстрактни програмски језик смишљен од стране P.J.Landin; акроним представља "If You See What I Mean"). Припада функционалној и императивној програмској парадигми.

Преглед језика уреди

  • строго типизиран програмски језик - у основи ML језика је ламбда рачун којем је додата строга типизација. [2] Строги систем типова пружа могућност за оптимизацију, тако да се ускоро појављује компилатор језика.
  • позив по вредности (енг. call-by-value) - функцији се прослеђују вредности променљивих, које се користе у телу функције (резултат рада функције зависи од тих вредности), али оне саме не могу бити промењене
  • функције вишег реда - узима једну или више функција као аргументе (процесни параметри) и враћа функцију као резултат. У ламбда рачуну све функције су вишег реда.
  • аутоматско управљање меморијом - основна форма аутоматског управљања меморијом је сакупљач смећа (енг. garbage collection). Он функционише тако што покушава да покупи смеће или меморију окупирану објектима које програм више не користи.
  • параметарски полиморфизам - помоћу параметарског полиморфизма функције или типови података могу бити написани тако да се може преносити вредност. То су генеричке функције, односно типови података.
  • статички досег - то значи да не могу да се мењају вредности променљивих, већ може само да им се приступи.
  • употреба Хиндлеy Милнер алгоритма, који може закључивати типове већине вредности без захтевања исцрпних анотација.

Функција језика уреди

ML је скраћеница од метајезик: био је замишљен за развијање метода доказа теорема. Због дизајна и једноставног руковања подацима, користи се приликом програмирања преводиоца, анализатора, доказивача теорема. Као програмски језик опште намене, своју примену налази и у биоинформатици, финансијским системима итд. Има одличну подршку за алгебарске типове података (ADTs), што га, заједно са идејом о развијању метода доказа, чини веома погодним за програмирање неких математичких софтвера.

Веза са другим језицима уреди

Главни језици који припадају ML-у су Standard ML (SML) и Caml. Осим њих, постоје и други - попут језика F#, који се користи као подрска Microsoftovoj .NET platformi. Као што је поменуто на почетку, због особина које га карактеришу, ML не припада искључиво једној програмској парадигми. Припада првенствено функционалној парадигми, међутим, без обзира на то што охрабрује функционално програмирање – он није искључиво функционалан (попут језика као што је Haskell) јер он не дозвољава бочне ефекте. Осим функционалној, ML припада и императивној парадигми.

Као представник ове две парадигме, он има неке заједничке особине са њиховим осталим представницима:

  • језици на које је ML утицао: Haskell, Cyclone, Nemerle [3]
  • језици који су утицали на настанак и развој ML програмског језика: Lisp

Предности и мане уреди

Предности уреди

  • портабилност кода: програм написан на једној платформи може да се користи (преноси и извршава) било где – што је значајно због униформности писања кода (самим тим се и измене једноставно врше), али, са друге стране, архитектуру одређеног рачунара нећемо моћи максимално да искористимо овим униформним приступом
  • дизајн језика: иако је строго типизиран, програмери углавном не морају да експлицитно пишу декларације типова – што кодове писане у овом програмском језику чини компактним и веома читљивим (читљивијим од многих чија синтакса захтева експлицитну декларацију типова)
  • има одличну подршку за алгебарске типове података, што га чини веома погодним за рад са одговарајућим математичким изразима
  • омогућена је једноставна манипулација подацима

Мане уреди

  • мала база корисника
  • слаба програмска подршка (недостатак IDE-а, debugger-а итд.)

Типови података уреди

Основни типови података су integer (целобројни), real (реални), string (стринговни), boolean (логички). Од њих можемо конструисати објекте коришћењем торки, листа или функција, а можемо креирати и наше типове.

Торке уреди

Торка је низ објеката мешовитог типа. Пример торке:

 (true,3.5,"abc")[4]

Листе уреди

Листа мора имати компоненте истог типа и могу бити било које дужине. Постоје два конструктора листи: празна листа nil и оператор :: . Конструктор nil је листа која не садржи ништа, оператор :: узима ставку са леве стране и листу са десне да би вратио листу за један дужу од оригиналне. Примери:

 nil                              []  
 1::nil                          [1]  
 2::1::nil                     [2,1][4]

Оператор @ се користи за спајање две листе, на пример:

 [1,2,3] @ [4,5,6] = [1,2,3,4,5,6][4]

Функције уреди

Функције се дефинишу коришћењем кључне речи fun.

Дефиниција једноставне функције има форму:

 fun <ime_funkcije> <parametri> = <izraz>; 

Примери једноставних функција:

 fun double x = 2*x;  
 fun inc x = x+1; 
 fun adda s = s ^ "a";[4]  

За извршавање функције једноставно напишемо име функције и у наставку аргумент са којим позивамо функцију. На пример:

 double 6;  
 inc 100; 
 adda "tub";  

Систем враћа вредности:

 12 : int
 101 : int
 "tuba" : string 

Пример рекурентне функције:

 fun factorial 0 = 1  
 | factorial n = n * factorial(n-1);[4] 

Када је аргумент функције 0, она ће вратити број 1. За све остале случајеве се извршава друга линија. Ово је рекурзија, па се функција извршава поново све до базног случаја.

Референце уреди

  1. ^ Гордон, Мицхаел Ј. C. (1996). „Кратка историја - LCF - HOL”. Приступљено 11. 10. 2007. 
  2. ^ Митић, Ненад (2009). „Функционално програмирање - предности и недостаци” (ПДФ). [мртва веза]
  3. ^ Тате, Бруце А.; Даоуд, Фред; Деес, Иан; Моффитт, Јацк (2014). Опширније о језику Haskell (Верзија књиге: Новембар 2014 изд.). стр. 97. ИСБН 978-1-941222-15-7. 
  4. ^ а б в г д пример је писан синтаксом језика Standard ML

Спољашње везе уреди