Caml objectif

Le Caml objectif ( OCaml ) est l'exécution principale du langage de programmation de de Caml , créée par le Xavier Leroy , le Jérôme Vouillon , le Damien Doligez , le Didier Rémy et d'autres en 1996. OCaml est un projet de la source ouverte contrôlé et principalement maintenu par INRIA .

OCaml prolonge la langue de Caml de noyau avec les constructions orientées objectivement du .

La panoplie d'outils d'OCaml inclut un interprète supérieur interactif , un compilateur de Bytecode , et un compilateur de linéarisation du code indigène . Elle a une grande bibliothèque standard qui le rend utile pour plusieurs des mêmes applications que le python ou le Perl , comme les constructions robustes de programmation modulaire et orientée objectivement qui le rendent applicable pour la technologie de la programmation à grande échelle.

OCaml est le successeur au Caml léger. L'acronyme CAML a à l'origine représenté le de langage machine abstrait catégorique, bien qu'OCaml abandonne cette machine abstraite.

Philosophie

ml - les langues dérivées sont les plus connues pour leur type statique les systèmes et compilateurs type-impliquants du . OCaml unifie la programmation fonctionnelle, impérative, et orientée objectivement sous Ml-comme le type système.

Le système statique d'OCaml élimine une grande classe des erreurs de programmeur qui peuvent poser des problèmes au temps d'exécution. Cependant, il force également le programmeur à se conformer aux contraintes du type système, qui peut exiger la pensée attentionnée et l'grande attention. Un compilateur type-impliquant réduit considérablement le besoin de type manuel annotations (par exemple, le type de données de variables et la signature des fonctions habituellement n'ont pas besoin d'être expressément déclarés, comme ils font dans le Java ). Néanmoins, l'utilisation efficace du type système d'OCaml peut exiger de la sophistication de la part du programmeur.

OCaml est peut-être le plus distingué d'autres langues avec des origines dans le milieu universitaire par son emphase sur l'exécution. Premièrement, son système statique rend le type d'exécution les disparités impossible, et obvie ainsi au type et aux contrôles de sûreté d'exécution qui chargent l'exécution des langages opérant sur des objets de types déterminés dynamiquement, tout en garantissant toujours la sûreté d'exécution (excepté quand la vérification de bornes d'un tableau est arrêtée, ou quand certains dispositifs type-peu sûrs comme la fabrication en série sont employés ; ce sont assez rares que la prévention de elles est pratiquement possible).

Hormis des frais généraux de type-vérification, les langues de la programmation fonctionnelle sont, généralement contestant pour compiler au code de langage machine efficace, dû aux issues telles que le problème de Funarg de . En plus de la boucle standard, le registre, et les optimisations , compilateur de d'instruction de linéarisation d'OCaml utilise des techniques statiques de l'analyse de programme pour optimiser la boxe de valeur et l'attribution de la fermeture , aidant à maximiser l'exécution du code en résultant même si il fait l'utilisation étendue des constructions de programmation fonctionnelle.

Xavier Leroy a avec précaution déclaré ce " ; OCaml livre au moins 50% de l'exécution d'un " décent de compilateur C ; , et les repères ont prouvé que c'est généralement le cas. Quelques fonctions dans la bibliothèque standard d'OCaml sont mises en application avec des algorithmes plus rapides que des fonctions équivalentes dans les bibliothèques standard d'autres langues. Par exemple, l'exécution de l'union d'ensemble dans la bibliothèque standard d'OCaml est asymptotiquement plus rapide que la fonction équivalente dans les bibliothèques standard des langues impératives (par exemple C++, Java) parce que l'exécution d'OCaml exploite l'immuabilité des ensembles afin de réutiliser des parties d'ensembles d'entrée dans le rendement (persistance).

Dispositifs

Dispositifs d'OCaml : un statique Type système , type inférence de , polymorphisme paramétrique , récursion de queue de , Configuration avec un modèle , fermetures lexicologiques de première classe de , functors de (modules paramétriques) , manipulation d'exception , et collection d'ordures automatique de de generations par accroissement .

OCaml est particulièrement notable pour le type de élargissement inférence de Ml-modèle à un système d'objet dans une langue d'usage universel. Ceci permet le subtyping structural, où les types d'objet sont compatibles si leurs signatures de méthode sont compatibles, indépendamment de leur transmission avouée ; un dispositif peu commun dans des langues statique-dactylographiées.

Une interface étrangère de fonction de pour le liant aux primitifs du C est équipée, y compris l'appui de langue pour les rangées numériques efficaces dans les formats compatibles de C et de Fortran . OCaml soutient également la création des bibliothèques des fonctions d'OCaml qui peuvent être liées à un " ; main" ; programme dans C, de sorte qu'on ait pu distribuer une bibliothèque d'OCaml aux programmeurs en langage C qui n'ont l'aucune connaissance ni installation d'OCaml.

La distribution d'OCaml contient :
Un macro-langage extensible d'analyseur et de appelé Camlp4 , qui permet à la syntaxe d'OCaml d'être prolongée ou même remplacée
Lexer et outils d'analyseur appelés ocamllex et l'ocamlyacc
Programme de mise au point qui soutient la progression vers l'arrière pour étudier des erreurs
Générateur de documentation de
Profileur - pour l'exécution de mesure
Bibliothèques d'usage universel nombreuses

Le compilateur de code indigène est disponible pour beaucoup de plates-formes, y compris le Unix , le Microsoft Windows , et le Mac de d'Apple OS x . L'excellente portabilité est assurée par le soutien de génération de code indigène des architectures importantes : IA-32 , IA-64 , AMD64 , HP/PA ; PowerPC , SPARC , alpha , MIPS , et brutal.

Des programmes de bytecode d'OCaml et de code indigène peuvent être écrits dans un modèle multifil du , avec le transfert du contexte d'une transaction de préemption. Cependant, parce que le collecteur d'ordures n'est pas conçu pour la simultanéité, le multitraitement symétrique n'est pas soutenu. OCaml filète dans le même processus s'exécutent en divisant le temps seulement.

Coder les exemples

Des extraits du code d'OCaml le plus facilement sont étudiés en les entrant dans dans le " ; dessus-level" ;. C'est une session interactive d'OCaml qui imprime les types impliqués de résulter ou a défini des expressions. L'OCaml supérieur est commencé en exécutant simplement le " ; ocaml" ; programme :

$ d'ocaml Version objective 3.0 de Caml #

Le code peut alors être écrit au " ; #" ; message de sollicitation. Par exemple, pour calculer 1+2*3 :

# 1 + 2 * 3 ; ; - : international = 7

OCaml implique le type de l'expression pour être " ; int" ; (un nombre entier de machine-précision) et donne le " de résultat ; 7" ;.

Bonjour monde

Le " suivant de programme ; hello.ml" ; :

lang=" de " de print_endline ; Bonjour monde ! " ; ; ;

peut être compilé au bytecode :

$ d'ocamlc hello.ml - o bonjour

et exécuté :

$ ./hello Bonjour monde ! $

Quicksort

Ocaml se prête à l'expression concise des algorithmes récursifs. L'exemple suivant de code met en application l'algorithme de Quicksort pour assortir une liste dans l'ordre croissant.

lang=" de laisser le quicksort = la fonction de REC | - > | pivot : : repos - > laisser is_less x = x < pivot dedans laisser à gauche, bien = repos is_less de List.partition dedans @ @ droite laissée par quicksort de quicksort

Paradoxe de l'anniversaire

Le programme suivant calcule le plus petit nombre de personnes dans une chambre pour qui la probabilité des anniversaires complètement uniques est moins de 50% (le soi-disant paradoxe de l'anniversaire , où pour 1 personne la probabilité est évidemment 100%, parce que 2 c'est 364/365, etc.

lang=" de laissé year_size = 365. ; ; laisser les personnes de prob de birthday_paradox de REC = laisser le prob = (year_size -. flotter les personnes)/. prob dedans si prob < 0.5 puis " de Printf.printf ; réponse = %d \ n" ; (people+1) autrement prob de birthday_paradox (people+1) ; ; birthday_paradox 1.0 1 ; ;

Numéros d'église

Le code suivant définit un codage d'église de des nombres normaux, avec le successeur (succ) et l'addition (ajouter). Un numéro n d'église est une fonction évoluée qui accepte une fonction f et une valeur x et s'applique f aux temps de x exactement n. Pour convertir un numéro d'église d'une valeur fonctionnelle en corde, nous lui passons une fonction qui ajoute le " de corde ; S" ; à son entrée et au " constant de corde ; 0" ; .

lang=" de laisser f zéro X = x laisser le succ N-F X = f (N-F x) laisser un = le succ zéro laisser deux = succ (succ zéro) laisser ajouter n1 le N2 f X = n1 f (N2 f x) laisser to_string n = n (amusement k - > " ; S" ; " du ^ k) ; 0" ; laisser le _ = la copie (additionner (succ deux) deux)

Fonction factorielle Arbitrary-precision (bibliothèques)

Une série de bibliothèques sont directement accessibles d'OCaml. Par exemple, OCaml a une bibliothèque intégrée pour l'arithmétique arbitraire de précision. Pendant que la fonction factorielle se développe très rapidement, elle déborde rapidement des nombres de machine-précision (en général 32 - ou 64 bits). Ainsi, factoriel est un candidat approprié pour l'arithmétique arbitrary-precision.

Dans OCaml, le module numérique fournit arithmétique arbitrary-precision et peut être chargé dans une utilisation supérieure de fonctionnement :

# " de #load ; nums.cma" ; ; ; # numérique ouvert ; ;

Factoriel fonction peut puis être écrit using arbitrary-precision nombre opérateur =, * et -/:

# laisser le fait de REC n = si n = international 0 puis international 1 d'autre n * fait (- de n/international 1) ; ; fait val : Num.num =

Cette fonction peut calculer des factorials beaucoup plus grands, tels que 120 ! :

# string_of_num (fait (international 120)); ; - : corde = " ; 6689502913449127057588118054090372586752746333138029810295671352301633 55724496298936687416527198498130815763789321409055253440858940812185989 8481114389650005964960521256960000000000000000000000000000" ;

Triangle (graphiques)

Le " suivant de programme ; simple.ml" ; rend une triangle tournante dans la 2D using OpenGL :

lang=" de laisser le _ = ignorer (Glut.argv) ; ~double_buffer de Glut.initDisplayMode : rectifier () ; ignorer (~title de Glut.createWindow : " ; OpenGL Demo" ;); laisser l'angle t = 10. t dedans laissé rendre () = Couleur de `de GlClear.load_identity () ; ~angle de GlMat. () ; Triangles de `de GlDraw.swapBuffers () dedans Modelview de `de GlMat.displayFunc : rendre ; ~cb de Glut.idleFunc : (un certain Glut.postRedisplay) ; Glut.mainLoop ()

Les attaches de LablGL à OpenGL sont exigées. Le programme peut alors être compilé au bytecode avec :

$ d'ocamlc - I +lablGL lablglut.ml - o simple

ou au nativecode avec :

$ d'ocamlopt - I +lablGL lablglut.ml - o simple

et course :

$ ./simple

Des 2D bien plus sophistiqués et plus à rendement élevé et les programmes 3D graphiques sont facilement développés dans OCaml. Grâce à l'utilisation d'OpenGL, les programmes en résultant est non seulement succincte et efficace mais également croix-plate-forme, ne compilant sans aucun changement sur toutes les plates-formes importantes.

Langues dérivées

MetaOCaml

MetaOCaml est une prolongation de programmation à plusieurs étages du d'OCaml permettant la compilation par accroissement du nouveau code machine pendant le temps d'exécution. Dans certaines circonstances, les speedups significatifs sont possibles using la programmation à plusieurs étages, parce que plus d'informations détaillées au sujet des données au processus sont disponibles au temps d'exécution qu'à l'au moment de la compilation régulier, ainsi le compilateur incrémental peut optimiser loin beaucoup de cas de condition vérifiant etc.

Comme exemple : si à au moment de la compilation on le sait qu'une certaine fonction puissance X - > le x^n est nécessaire très fréquemment, mais la valeur de n est connue seulement au temps d'exécution, vous pouvez employer une fonction puissance à deux étages dans MetaOCaml :

lang=" de laisser la puissance n X de REC = si n = 0 puis. autrement si même n puis sqr (puissance (n/2) x) autrement. ~ x)> (de puissance (n-1). ; ;

Dès que vous saurez n au temps d'exécution, vous pouvez créer une fonction puissance spécialisée et très rapide :

. ; ;

Le résultat est :

lang=" de amusement x_1 - > (x_1 * laisser y_3 = laisser y_2 = (x_1 * 1) dans (y_2 * y_2) dans (y_3 * y_3))

La nouvelle fonction est automatiquement compilée.

D'autres langues dérivées

AtomCaml fournit un primitif de synchronisation pour l'exécution (transactionnelle) atomique du code.
Le F# est une langue de Microsoft .
OCaml frais qui facilitent la manipulation des noms et des reliures,
GCaml ajoutant le polymorphisme extensional à OCaml, de ce fait permettant la surcharge et le rassemblement type-sûr,
JoCaml qui intègre des constructions pour développer des programmes concourants et distribués,
OCamlDuce prolonge OCaml avec des configurations telles que des expressions de XML et des types de régulier-expression.
OCamlP3l est un système de programmation parallèle basé sur OCaml et la langue de P3L

Voir également

Caml et Caml dont léger, les langues OCaml ont évolué
ml standard , un autre dialecte populaire de ml
ml extensible , un autre dialecte orienté objectivement de ml
O'Haskell , une prolongation orientée objectivement au fonctionnel Haskell de langue

.

Random links:Municipalité de Lindesberg | Orage Constantine | Cinq manières, Birmingham | Kingston et Surbiton (collège électoral BRITANNIQUE du Parlement) | Caml_objetivo