El Caml objetivo ( OCaml ) es la puesta en práctica principal del lenguaje de programación de Caml, creada por el Javier Leroy, el Jérôme Vouillon, el Damián Doligez, el Desiderio Rémy y los otros en 1996. OCaml es un proyecto de la fuente abierta manejado y mantenido principalmente por INRIA .
OCaml amplía la lengua de Caml de la base con las construcciones orientadas al objeto .
El juego de herramientas de OCaml incluye un intérprete a nivel superior interactivo, un recopilador de Bytecode, y un recopilador óptimo del código nativo . Tiene una biblioteca estándar grande que haga útil para muchos de los mismos usos que el pitón o Perl, tan bien como las construcciones robustas de la programación modular y orientada al objeto que hacen aplicable para la ingeniería de programas informáticos en grande.
OCaml es el sucesor al Caml ligero. Las siglas CAML representaban original el en lenguaje de máquina abstracto categórico, aunque OCaml abandone esta máquina abstracta.
El sistema de tipo estático de OCaml elimina una clase grande de errores del programador que puedan causar problemas en el tiempo de pasada. Sin embargo, también fuerza a programador a ajustarse a los apremios del tipo sistema, que puede requerir pensamiento cuidadoso y la mucha atención. Un recopilador de tipo-deducción reduce grandemente la necesidad del tipo manual anotaciones (por ejemplo, el tipo de datos de variables y la firma de funciones no necesitan generalmente expreso ser declarados, como hacen en el Java ). No obstante, el uso eficaz del tipo sistema de OCaml puede requerir una cierta sofisticación de parte del programador.
OCaml es quizás el más distinguido de otras idiomas con orígenes en academia por su énfasis en funcionamiento. En primer lugar, su sistema de tipo estático hace el tipo runtime las uniones mal hechas imposible, y evita así el tipo y los cheques de seguridad runtime que cargan el funcionamiento de idiomas dinámicamente mecanografiadas, mientras que todavía garantiza seguridad runtime (excepto cuando se apaga la comprobación de los límites de arsenal, o cuando ciertas características tipo-inseguras como la serialización se utilizan; éstos son bastante raros que evitarlos son prácticamente posibles).
Aparte de gastos indirectos de tipo-comprobación, las idiomas de la programación funcional están, generalmente desafiando para compilar al código en lenguaje de máquina eficiente, debido a las ediciones tales como el problema de Funarg. Además de lazo estándar, el registro, y las optimizaciones, recopilador de la instrucción de optimización de OCaml emplea técnicas estáticas del análisis de programa para optimizar el boxeo del valor y la asignación del encierro, ayudando a maximizar el funcionamiento del código resultante incluso si hace uso extenso de construcciones de la programación funcional.
Javier Leroy ha indicado cautelosomente ese " OCaml entrega por lo menos el 50% del funcionamiento de un " decente del compilador C;, y las pruebas patrones han demostrado que éste es generalmente el caso. Algunas funciones en la biblioteca estándar de OCaml se ejecutan con algoritmos más rápidos que funciones equivalentes en las bibliotecas estándar de otras idiomas. Por ejemplo, la puesta en práctica de la unión del sistema en la biblioteca estándar de OCaml es asintótico más rápida que la función equivalente en las bibliotecas estándar de las idiomas imprescindible (e. C++, Java) porque la puesta en práctica de OCaml explota la inmutabilidad de sistemas para reutilizar partes de sistemas de la entrada en la salida (persistencia).
OCaml es particularmente notable para el tipo inferencia del Ml-estilo que extiende a un sistema del objeto en una lengua de fines generales. Esto permite el subtyping estructural, donde están compatibles los tipos de objeto si sus firmas del método son compatibles, sin importar su herencia declarada; una característica inusual en idiomas estático-mecanografiadas.
Un interfaz extranjero de la función para el que liga a los primitivos C se proporciona, incluyendo la ayuda de la lengua para los órdenes numéricos eficientes en los formatos compatibles C y FORTRAN . OCaml también apoya la creación de bibliotecas de las funciones de OCaml que se pueden ligar a un " main" programa en C, de modo que una pudiera distribuir una biblioteca de OCaml a los programador de lenguaje-c que no tienen ninguÌn conocimiento ni instalación de OCaml.
La distribución de OCaml contiene:
Un macro-lenguaje extensible del programa de análisis y nombrado Camlp4, que permite que substituyen el sintaxis de OCaml sea ampliado o aún
Lexer y herramientas del programa de análisis llamadas ocamllex y ocamlyacc
Depuración que apoya el escalonamiento al revés para investigar errores
Generador de la documentación
Profiler - para el funcionamiento de medición
Bibliotecas de fines generales numerosas
El recopilador del código nativo está disponible para muchas plataformas, incluyendo el Unix, el Microsoft Windows, y el mac de Apple OS x . La portabilidad excelente se asegura a través de la ayuda de la generación del código nativo para las arquitecturas importantes: IA-32 , IA-64 , AMD64 , HP/PA ; PowerPC, SPARC, alfa, MIPS, y severo.
Los programas del bytecode de OCaml y del código nativo se pueden escribir en un estilo con hilos múltiples, con la conmutación de contexto con derecho preferente. Sin embargo, porque el colector de basura no se diseña para la concurrencia, el multiprocesamiento simétrico no se apoya. OCaml rosca en el mismo proceso ejecuta compartiendo el tiempo solamente.
$ de ocaml Versión objetiva 3.0 de Caml #
El código se puede entonces introducir en el " #" aviso. Por ejemplo, calcular 1+2*3:
# 1 + 2 * 3; ; -: internacional = 7
OCaml deduce el tipo de la expresión para ser " int" (un número entero de la máquina-precisión) y da el " del resultado; 7".
lang=" del
puede ser compilado al bytecode:
$ de ocamlc hello.ml - o hola
y ejecutado:
$ ./hello ¡Hola mundo! $
lang=" del
lang=" del
n de la iglesia es una función higher-order que acepta una función f y un valor x y aplica f a los tiempos de x exactamente n. Para convertir un número de la iglesia de un valor funcional a una secuencia, le pasamos una función que prepends el " de la secuencia; S" a su entrada y al " constante de la secuencia; 0" . lang=" del
En OCaml, el módulo numérico proporciona aritmético arbitrary-precision y se puede cargar en usar a nivel superior del funcionamiento:
# " del #load; nums.cma" ; ; # numérico abierto; ;
Factorial función puede entonces estar escrito usar arbitrary-precision número operador =, * y -/:
# dejar el hecho del rec n = si n = internacional 0 entonces internacional 1 otro n * hecho (- de n/internacional 1); ; hecho val: Num.num = Esta función puede computar factorials mucho más grandes, tales como 120!: # string_of_num (hecho (internacional 120)); ; -: secuencia = " 6689502913449127057588118054090372586752746333138029810295671352301633 55724496298936687416527198498130815763789321409055253440858940812185989 8481114389650005964960521256960000000000000000000000000000" lang=" del Los atascamientos de LablGL a OpenGL se requieren. El programa se puede entonces compilar al bytecode con: $ de ocamlc - I +lablGL lablglut.ml - o simple o al nativecode con: $ de ocamlopt - I +lablGL lablglut.ml - o simple y funcionamiento: $ .os lejos más sofisticados, más de alto rendimiento y los programas gráficos 3D se desarrollan fácilmente en OCaml. Los gracias al uso de OpenGL, los programas resultantes son no sólo sucintos y eficientes pero también cruz-plataforma, compilando sin ningunos cambios en todas las plataformas importantes. Como ejemplo: si en de tiempo de compilación se sabe que cierta función de energía x - > el x^n se necesita muy con frecuencia, pero el valor de n se sabe solamente en el tiempo de pasada, usted puede utilizar una función de energía de dos etapas en MetaOCaml: lang=" del Tan pronto como usted sepa n en el tiempo de pasada, usted puede crear una función de energía especializada y muy rápida: . ; ; El resultado es: lang=" del La nueva función se compila automáticamente. .
Triángulo (gráficos)
El " siguiente del programa; simple.ml" rinde un triángulo giratorio en 2.o usar OpenGL: Idiomas derivadas
MetaOCaml
MetaOCaml es una extensión programada gradual de OCaml permitiendo la compilación incremental del nuevo código automático durante tiempo de pasada. Bajo ciertas circunstancias, los speedups significativos son posibles usar la programación gradual, porque una información más detallada sobre los datos al proceso está disponible en el tiempo de pasada que en el de tiempo de compilación regular, así que el compilador incremental puede optimizar lejos muchos casos de la condición que comprueban el etc. Otras idiomas derivadas
AtomCaml proporciona un primitivo de la sincronización para la ejecución (transaccional) atómica del código.
El F# es una lengua de Microsoft .
OCaml fresco que facilitan la manipulación de nombres y de carpetas,
GCaml que agrega polimorfismo extensional a OCaml, así permitiendo sobrecargar y formar tipo-seguro,
JoCaml que integra las construcciones para desarrollar programas concurrentes y distribuidos,
OCamlDuce amplía OCaml con las características tales como expresiones de XML y tipos de la regular-expresión.
OCamlP3l es un sistema de programación paralelo basado en OCaml y la lengua de P3L Ver también
Caml y Caml ligero, las idiomas de el cual OCaml se desarrollaron
ml estándar, otro dialecto popular del ml
ml extensible, otro dialecto orientado al objeto del ml
O'Haskell, una extensión orientada al objeto al funcional Haskell de la lengua Random links: Catacumbas | Río del este de Pecatonica de la rama | Igualdades del estabilizador | Paul Belien