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.

Filosofía

ml - las idiomas derivadas son las más conocidas para su tipo estático sistemas y los recopiladores de tipo-deducción . OCaml unifica la programación funcional, imprescindible, y orientada al objeto debajo de Ml-como el tipo sistema.

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).

Características

Características de OCaml: un estático Tipo sistema, tipo inferencia, polimorfismo paramétrico, repetición de la cola, Adaptación de modelos, encierros léxicos de la primera clase, functors (módulos paramétricos), dirección de excepción, y colección de basura automática generacional incremental .

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 ningú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.

Cifrar los ejemplos

Los recortes del código de OCaml son estudiados lo más fácilmente posible entrándolos en en el " tapa-level". Ésta es una sesión interactiva de OCaml que imprime los tipos deducidos de resultar o definió expresiones. El OCaml a nivel superior es comenzado simplemente ejecutando el " ocaml" programa:

$ 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".

Hola mundo

El " siguiente del programa; hello.ml":

lang=" del " del print_endline; ¡Hola mundo! " ; ;

puede ser compilado al bytecode:

$ de ocamlc hello.ml - o hola

y ejecutado:

$ ./hello ¡Hola mundo! $

Quicksort

Ocaml se presta a la expresión sucinta de algoritmos recurrentes. El ejemplo siguiente del código ejecuta el algoritmo de Quicksort para clasificar una lista en orden cada vez mayor.

lang=" del dejar el quicksort = la función del rec | - > | pivote:: resto - > dejar is_less x = x < pivote adentro dejar a la izquierda, a la derecha = resto is_less de List.partition adentro @ @ la derecha dejada quicksort del quicksort

Paradoja de cumpleaños

El programa siguiente calcula el número de gente más pequeño en un cuarto para el cual la probabilidad de cumpleaños totalmente únicos sea menos de el 50% (la paradoja de cumpleaños supuesta, donde para 1 persona está obviamente 100% la probabilidad, porque 2 es 364/365, etc.

lang=" del dejado year_size = 365. ; ; dejar a gente del prob del birthday_paradox del rec = dejar el prob = (year_size -. prob adentro si prob < 0.5 entonces " de Printf.printf; respuesta = %d \ n" (people+1) prob del birthday_paradox (people+1); ; birthday_paradox 1.0 1; ;

Números de la iglesia

El código siguiente define una codificación de la iglesia de números naturales, con el sucesor (succ) y la adición (agregar). Un número 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 dejar f cero x = x dejar el succ N-F x = f (N-F x) dejar uno = el succ cero dejar dos = succ (succ cero) dejar para agregar n1 el n2 f x = n1 f (n2 f x) dejar to_string n = n (diversión k - > " S" " del ^ k); 0" dejar el _ = la impresión (agregar (succ dos) dos)

Función factorial Arbitrary-precision (bibliotecas)

Una variedad de bibliotecas son directo accesibles de OCaml. Por ejemplo, OCaml tiene una biblioteca incorporada para la aritmética arbitraria de la precisión. Mientras que la función factorial crece muy rápido, desborda rápidamente los números de la máquina-precisión (típicamente 32 - o 64 pedacitos). Así, factorial es un candidato conveniente a aritmética arbitrary-precision.

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"

Triángulo (gráficos)

El " siguiente del programa; simple.ml" rinde un triángulo giratorio en 2.o usar OpenGL:

lang=" del dejar el _ = no hacer caso (Glut.argv); ~double_buffer de Glut.initDisplayMode: verdad (); no hacer caso (~title de Glut.createWindow: " OpenGL Demo"); dejar el ángulo t = 10. t adentro dejado rendir () = Color del `de GlClear.load_identity (); ~angle de GlMat.rotate: (ángulo (Sys. (); Triángulos del `de GlDraw.swapBuffers () adentro Modelview del `de GlMat.displayFunc: rendir; ~cb de Glut.idleFunc: (Algún Glut.mainLoop ()

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.

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.

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 dejar la energía n x del rec = si n = 0 entonces. si incluso n entonces sqr (energía (n/2) x) . ~ x)> (de la energía (n-1). ; ;

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 diversión x_1 - > (x_1 * dejar y_3 = dejar y_2 = (x_1 * 1) en (y_2 * y_2) en (y_3 * y_3))

La nueva función se compila automáticamente.

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

.

  • Zenithic
  • Stephen Curry
    Random links:Catacumbas | Río del este de Pecatonica de la rama | Igualdades del estabilizador | Paul Belien

  • © 2007-2008 enciclopediaespana.com; article text available under the terms of GFDL, from en.wikipedia.org
    ="http://pagead2.googlesyndication.com/pagead/show_ads.js">