Objective Caml | ||||
---|---|---|---|---|
Paradigma | functioneel programmeren, imperatief programmeren, objectgeoriënteerd programmeren, Modulair programmeren | |||
Verschenen | 1996 (27 jaar) | |||
Ontworpen door | Xavier Leroy en anderen | |||
Ontwikkeld door | Inria (Frankrijk) | |||
Huidige versie | 5.2.0[1] (13 mei 2024) | |||
Typesysteem | type-inferentie, statisch typesysteem, sterke typering, structurele typering | |||
Dialecten | F#, JoCaml, MetaOCaml, OcamlP3l | |||
Beïnvloed door | Caml Light, ML | |||
Invloed op | Scala | |||
Licentie | Q Public License, LGPL | |||
Bestandsextensies | ml, mli | |||
Website | (en) Projectpagina | |||
|
Ocaml (Objective CAML) is de belangrijkste implementatie van de programmeertaal Caml (Categorical Abstract Machine Language), een dialect van ML, ontwikkeld op het Inria[2] en de École normale supérieure.[3]
Geschiedenis
Caml is statisch getypeerd, strikt geëvalueerd, en maakt gebruik van automatisch geheugenbeheer door middel van garbage collection.
De eerste Caml-implementatie in de jaren 80 was geschreven in Lisp en had, vanwege zijn zware geheugen- en CPU-gebruik, de bijnaam Heavy Caml. Zijn opvolger, Caml Light, werd geïmplementeerd in C door Xavier Leroy en Damien Doligez. Ook voegden die een krachtig modulesysteem toe.
OCaml
OCaml is de belangrijkste implementatie van Caml. OCaml biedt een aantal extra mogelijkheden, zoals de mogelijkheid tot objectgeoriënteerd programmeren.
OCaml bestaat uit een interactieve interpreter, een bytecode compiler en een zogenaamde native compiler die geoptimaliseerde executables produceert. OCaml heeft een uitgebreide verzameling standaardbibliotheken die de taal geschikt maken voor dezelfde soort taken als bijvoorbeeld Python of Perl.
Kenmerken
Zoals alle van ML afgeleide talen maakt OCaml gebruik van type-inferentie. Dit houdt in dat de compiler automatisch het type afleidt van alle expressies. In combinatie met statische typering (Engels: static typing) zorgt type-inferentie ervoor dat bepaalde soorten fouten die normaal pas tijdens de uitvoering van het programma aan het licht komen al tijdens het compileren ontdekt worden. Ook is het niet nodig om datatypes expliciet te specificeren (in tegenstelling tot bijvoorbeeld Java).
In tegenstelling tot andere functionele programmeertalen is OCaml erg efficiënt. Dit komt onder andere doordat de combinatie van type-inferentie en statische typering het controleren van typen tijdens de uitvoering grotendeels overbodig maakt. Ook maakt de OCaml-compiler gebruik van codeanalyse om verregaande optimalisaties te maken, en zijn de standaardbibliotheken erg efficiënt geïmplementeerd.
Naast de traditionele functionele manier van programmeren ondersteunt OCaml ook imperatief programmeren (OCaml is niet strikt functioneel: het is mogelijk om side-effects te creëren) en objectgeoriënteerd programmeren.
Verdere kenmerken:
- Algebraïsche datatypen
- Geparameteriseerde polymorfie
- Functors (geparameteriseerde modules)
- Exception handling (het afhandelen van runtime fouten)
- Een lexer generator en een parser generator. Deze vertonen een sterke gelijkenis met respectievelijk Lex en Yacc
- Een macrotaal (Camlp4)
Voorbeelden
Hello World
Een programma met de volgende inhoud, opgeslagen als hello.ml:
print_endline "Hello world!";;
Dit kan als volgt gecompileerd worden:
$ ocamlc hello.ml -o hello
De opdracht om het uit te voeren luidt:
$ ./hello Hello world! $
Quicksort
Dit is een implementatie van quicksort:
let rec quicksort = function
| [] -> []
| pivot :: rest ->
let is_kleiner x = x < pivot in
let links, rechts = List.partition is_kleiner rest in
quicksort links @ [pivot] @ quicksort rechts
Zie ook
Externe links
- (en) Projectpagina
- ↑ OCaml 5.2.0 Release Notes. Geraadpleegd op 24 mei 2024.
- ↑ Institut national de recherche en informatique et en automatique
- ↑ École Normale Supérieure