Mine sisu juurde

Kasutaja:M8iffy/OCaml

Allikas: Vikipeedia

OCaml ehk objektorienteeritud Caml on programmeerimiskeel, mille lõid 1996. aastal programmeerimiskeelt Caml täiendades Xavier Leroy, Jérôme Vouillon, Damien Doligez, Didier Rémy, Ascánder Suárez ja nende abilised. OCaml kuulub ML keelte perekonda ning on tugevalt ja staatiliselt tüübitud funktsionaalse paradigma keel, mis võimaldab ka objektorienteeritud lähenemist.

OCaml avatud lähtekoodiga tarkvaraprojekt, mida tohib tasuta kasutada. OCamlit haldab peamiselt Prantsuse teaduse ja infotehnoloogia instituut (INRIA). 2000. aastate alguses võtsid paljud uued keeled (näiteks F# ja Scala) kasutusele erinevaid elemente OCamlist.

Üldprintsiibid[muuda | muuda lähteteksti]

Sarnaselt kõigi ML perekonna keeltele iseloomustab OCamlit tuletatud staatiline tüüpimine ning suutlikkus tüüpe kompileerimise ajal tuletada. OCaml ühendab endas funktsionaalset keelt ning kasulikku objektorienteeritud programmeerimisest. Sel viisil ei pea programmeerijad OCamli kasutamiseks tundma puhta funktsionaalse keele paradigmat.

OCamli staatiline tüüpimine aitab vähendada käivitusaegseid vigu. Kompileerimisaegne tüüpide tuletamine vähendab oluliselt manuaalse tüüpide märkimise vajadust. Näiteks muutujate ja funktsioonide tüüpe ei pea tavaliselt OCamlis välja kirjutama, seevastu näiteks keeltes Java, C++ ning C# on see vajalik.

Isegi arvestamata tüübikontrollile kuluvat ressurssi, on funktsionaalsete keelte kompileerimine üldiselt kulukam kui iteratiivsete keelte kompileerimine. Selle probleemiga võitlemiseks on OCamlil optimeeriv kompilaator.

Ajalugu[muuda | muuda lähteteksti]

Camli keel arenes välja ML-i programmeerimiskeelest, millega INRIA ametlik meeskond tegeles alates 1980-ndate aastate algusest. 1984. aastal loodi kategooriline abstraktne masin CAM, mis avaldati 1987. aastal. CAM erines järkjärgult rohkem oma eellasest, ML-st, sest INRIA meeskond soovis keelt kohaneda oma vajadustega ja seda edasi areneda. See aga oli vastuolus ML standardiseerimise ja ühtlustamise plaanidega.

CAM-i edasi arendanud INRIA meeskonna liige Xavier Leroy avaldas selle 1990. aastal nime all Caml Light. 1995. aastal avaldas Xavier Leroy Caml Special Light versiooni, kus hakati tähelepanu pöörama koodi optimeerimisele.

OCaml ilmus esmakordselt 1996. aastal, mil Didier Rémy ja Jérôme Vouilloni lisasid senisesse Camlisse objektid. Jacques Garrigue võttis 2000. aastal kasutusele mõned täiustatud funktsioonid, näiteks polümorfsed variandid või etiketid.

Koodinäited[muuda | muuda lähteteksti]

Tere, maailm[muuda | muuda lähteteksti]

Järgneva programmi „tere.ml“

print_endline "Tere, maailm!"

saab kompileerida käivitatavaks baitkoodiks

$ ocamlc -o tere tere.ml

või optimeeritud algkoodiks

$ ocamlopt -o tere tere.ml

ning käivitada

$ ./tere
Tere, maailm!
$

või

$ ocamlrun tere
Tere, maailm!
$

Muutujate defineerimine[muuda | muuda lähteteksti]

Järgnevalt näide OCamli interpretaatoril muutuja defineerimisest:

$ ocaml
# let x = 4 + 2 * 3;;

Interaktiivset interpretaatorit kasutades (read algusega #) tuleb käsud lõpetada sümbolitega ;;, mis ei ole keele enda osad. Selle käsu sisestamise järel tuletab OCaml loodud väärtuse tüübi ning näitab arvutatud väärtust.

val x : int = 10

Funktsioonide defineerimine[muuda | muuda lähteteksti]

Saame defineerida funktsioone, kasutades märksõna function või fun

# function x -> x;;
- : 'a -> 'a = <fun>

ning kui anname defineerimisel funktsioonile nime, saame defineeritud funktsiooni rakendada antud argumendil:

# let liidaKaks = function x -> x + 2;;
val liidaKaks : int -> int = <fun>
# liidaKaks 4;;
- : int = 6

Mustrite sobitamine[muuda | muuda lähteteksti]

OCamlis saab funktsioone defineerida ka mustrisobituse abil:

# let onNull x =
#   match x with
#   | 0 -> true
#   | _ -> false;;
val onNull : int -> bool = <fun>

Siin reaga match x with näitame, et sobitame argumenti x, sümbolitega -> ridadel on kirjeldatud mustrid, mille hulgast esimene sobiv valitakse. Tihti kasutatakse viimase mustri juures sümbolit _, mis sobitub kõigega.

Rekursiivsete funktsioonide defineerimine[muuda | muuda lähteteksti]

Rekursiivsete funktsioonide defineerimiseks tuleb lisada märksõna rec, näiteks naturaalarvu faktoriaali arvutava funktsiooni saame defineerida järgnevalt:

# let rec faktoriaal n =
#   match n with
#   | 0 -> 1
#   | _ -> n * faktoriaal (n - 1);;
val faktoriaal : int -> int = <fun>

Listid[muuda | muuda lähteteksti]

Listide konstrueerimiseks kaks võimalust. Saab kasutada operaatorit :: või operaatorit ;:

# 1 :: 2 :: 3 :: [];;
- : int list = [1; 2; 3]
# [1; 2; 3];;
- : int list = [1; 2; 3]

Esimene võimalus osutub väga kasulikuks mustrisobitusel. Näiteks võime defineerida rekursiivse funktsiooni, mis leiab, mitu nulli on etteantud listis:

# let rec nullideArv l =
#   match l with
#   | []     -> 0
#   | 0 :: saba -> 1 + nullideArv saba
#   | _ :: saba -> nullideArv saba;;
val nullideArv : 'a list -> int = <fun>

Viited[muuda | muuda lähteteksti]

  1. Real World OCaml https://v1.realworldocaml.org/v1/en/html/index.html
  2. OCamli ajalugu https://ocaml.org/learn/history.html