Oz es un lenguaje de programación multiparadigma , desarrollado en el Laboratorio de Sistemas de Programación de la Université catholique de Louvain , para la educación de lenguajes de programación. Tiene un libro de texto canónico: Conceptos, técnicas y modelos de programación informática .
Paradigma | multi-paradigma : lógico , funcional , imperativo , orientado a objetos , restricción , distribuido , concurrente |
---|---|
Diseñada por | Gert Smolka, sus alumnos |
Desarrollador | Consorcio Mozart |
Apareció por primera vez | 1991 |
Lanzamiento estable | Oz 1.4.0 (final), Mozart 2.0.1 / 5 de septiembre de 2018 |
Disciplina de mecanografía | dinámica |
Licencia | MIT X11 [1] |
Sitio web | mozart |
Implementaciones importantes | |
Sistema de programación Mozart | |
Dialectos | |
Oz, Mozart | |
Influenciado por | |
Erlang , Lisp , Prolog | |
Influenciado | |
Alice , Scala |
Oz fue diseñado por primera vez por Gert Smolka y sus estudiantes en 1991. En 1996, el desarrollo de Oz continuó en cooperación con el grupo de investigación de Seif Haridi y Peter Van Roy en el Instituto Sueco de Ciencias de la Computación . Desde 1999, Oz ha sido desarrollado continuamente por un grupo internacional, el Consorcio Mozart, que originalmente estaba formado por la Universidad de Saarland , el Instituto Sueco de Ciencias de la Computación y la Université catholique de Louvain . En 2005, la responsabilidad de gestionar el desarrollo de Mozart se transfirió a un grupo central, la Junta de Mozart, con el propósito expreso de abrir el desarrollo de Mozart a una comunidad más amplia.
El sistema de programación de Mozart es la implementación principal de Oz. Se publica con una licencia de código abierto por el Consorcio Mozart. Mozart se ha portado a Unix , FreeBSD , Linux , Windows y macOS .
Características del idioma
Oz [2] contiene la mayoría de los conceptos de los principales paradigmas de programación , incluida la programación lógica, funcional ( evaluación perezosa y evaluación ansiosa ), imperativa, orientada a objetos, restringida, distribuida y concurrente. Oz tiene una semántica formal simple (ver el capítulo 13 del libro mencionado a continuación) y una implementación eficiente. [ cita requerida ] Oz es un lenguaje orientado a la concurrencia , ya que el término fue introducido por Joe Armstrong, el principal diseñador del lenguaje Erlang . Un lenguaje orientado a la concurrencia hace que la concurrencia sea fácil de usar y eficiente. Oz admite una interfaz gráfica de usuario (GUI) canónica en lenguaje QTk. [3]
Además de la programación de múltiples paradigmas, las principales fortalezas de Oz se encuentran en la programación restringida y la programación distribuida . Debido a su diseño factorizado, Oz puede implementar con éxito un modelo de programación distribuida transparente a la red. Este modelo facilita la programación de aplicaciones abiertas y tolerantes a fallos dentro del lenguaje. Para la programación de restricciones, Oz introduce la idea de espacios de cálculo , que permiten estrategias de distribución y búsqueda definidas por el usuario ortogonales al dominio de restricción.
Descripción general del idioma
Estructuras de datos
Oz se basa en un lenguaje central con muy pocos tipos de datos que pueden extenderse a otros más prácticos a través del azúcar sintáctico .
Estructuras de datos básicas:
- Números: coma flotante o entero (entero real)
- Registros: para agrupar los datos:
circle(x:0 y:1 radius:3 color:blue style:dots)
. Aquí los términos x, y, radio, etc. se denominan características y los datos asociados con las características (en este caso 0,1,3, etc.) son los valores. - Tuplas: Los registros con número entero características en orden ascendente:
circle(1:0 2:1 3:3 4:blue 5:dots)
. - Listas: una estructura lineal simple
'|' ( 2 '|' ( 4 '|' ( 6 '|' ( 8 nil )))) % como registro. 2 | ( 4 | ( 6 | ( 8 | nil ))) % con algo de azúcar sintáctico 2 | 4 | 6 | 8 | nil % más azúcar sintáctico [ 2 4 6 8 ] % aún más azúcar sintáctico
Esas estructuras de datos son valores (constantes), de primera clase y de tipo verificado dinámicamente . Los nombres de las variables en Oz comienzan con una letra mayúscula para distinguirlos de los literales [4] que siempre comienzan con una letra minúscula.
Funciones
Las funciones [5] son valores de primera clase, lo que permite una programación funcional de orden superior :
fun { Fact N } if N = < 0 then 1 else N * { Fact N - 1 } end end
fun { Comb N K } { Fact N } div ({ Fact K } * { Fact N - K }) % de enteros no pueden desbordarse en Oz (a menos que no quede memoria) endfun { SumList List } case Lista de cero y luego 0 [] H | T luego H + { SumList T } % de coincidencia de patrones en el extremo final de la lista
Las funciones se pueden utilizar tanto con variables libres como vinculadas. Los valores de las variables libres se encuentran utilizando un alcance léxico estático . [6]
Programación de orden superior
Las funciones son como otros objetos de Oz. Una función se puede pasar como atributo a otras funciones o se puede devolver en una función.
fun { Cuadrado N } % A función general N * N finalfun { Map F Xs } % F es una función aquí - caso de programación de orden superior Xs de nil luego nil [] X | Xr luego { F X } | { Map F Xr } end end% de uso { Explorar { Map Square [ 1 2 3 ]}} % de exploraciones [1 4 9]
Funciones anónimas
Como muchos otros lenguajes funcionales, Oz admite el uso de funciones anónimas (es decir, funciones que no tienen nombre) con programación de orden superior. El símbolo $ se usa para denotarlos.
A continuación, la función cuadrada se define de forma anónima y se pasa, lo [1 4 9]
que hace que se navegue.
{ Explore { Map fun { $ N } N * N end [ 1 2 3 ]}}
Dado que las funciones anónimas no tienen nombres, no es posible definir funciones anónimas recursivas.
Procedimientos
Se supone que las funciones en Oz devuelven un valor en la última instrucción encontrada en el cuerpo de la función durante su ejecución. En el siguiente ejemplo, la función Ret devuelve 5 si X> 0 y -5 en caso contrario.
declarar divertido { Ret X } si X > 0 luego 5 else ~ 5 end end
Pero Oz también proporciona una facilidad en caso de que una función no deba devolver valores. Estas funciones se denominan procedimientos. [7] Los procedimientos se definen utilizando el constructo "proc" de la siguiente manera
declare proc { Ret X } si X > 0 luego { Browse 5 } else { Browse ~ 5 } end end
El ejemplo anterior no devuelve ningún valor, solo imprime 5 o -5 en el navegador Oz dependiendo del signo de X.
Variables de flujo de datos y simultaneidad declarativa
Cuando el programa encuentra una variable no vinculada, espera un valor. Por ejemplo, a continuación, el hilo esperará hasta que tanto X como Y estén vinculados a un valor antes de mostrar el valor de Z.
hilo Z = X + Y { Examinar Z } hilo final X = 40 hilo final Y = 2 final
El valor de una variable de flujo de datos no se puede cambiar una vez que está vinculada:
X = 1 X = 2 % de error
Las variables de flujo de datos facilitan la creación de agentes de transmisión simultáneos:
fun { Ints N Max } if N == Max then nil else { Delay 1000 } N | { Ints N + 1 Max } end endfun { Sum S Stream } case Stream of nil then S [] H | T luego S | { Sum H + S T } end endlocal X Y en el subproceso X = { Ints 0 1000 } end thread Y = { Sum 0 X } end { Browse Y } end
Debido a la forma en que funcionan las variables de flujo de datos, es posible colocar subprocesos en cualquier lugar de un programa y se garantiza que tendrá el mismo resultado. Esto hace que la programación concurrente sea muy sencilla. Los subprocesos son muy baratos: es posible tener 100.000 subprocesos ejecutándose a la vez. [8]
Ejemplo: tamiz de división de prueba
Este ejemplo calcula un flujo de números primos utilizando el algoritmo de división de prueba creando de forma recursiva agentes de flujo concurrentes que filtran los números no primos:
fun { Sieve Xs } caso X de cero y luego cero [] X | Xr luego Ys en el hilo Ys = { Filter Xr fun { $ Y } Y mod X \ = 0 end } end X | { Sieve Ys } end end
pereza
Oz usa la evaluación ansiosa por defecto, pero la evaluación perezosa [9] es posible. A continuación, el hecho solo se calcula cuando se necesita el valor de X para calcular el valor de Y.
divertido perezoso { Hecho N } si N = < 0 entonces 1 más N * { Hecho N - 1 } end end local X Y en X = { Fact 100 } Y = X + 1 end
La evaluación perezosa brinda la posibilidad de almacenar estructuras de datos verdaderamente infinitas en Oz. El poder de la evaluación perezosa se puede ver en el siguiente ejemplo de código:
declarar divertido perezoso { Fusionar Xs Ys } caso Xs # Ys de ( X | Xr ) # ( Y | Yr ) luego si X < Y luego X | { Combinar Xr Ys } elseif X > Y luego Y | { Combinar Xs Yr } else X | { Merge Xr Yr } end end enddivertido perezoso { Times N Xs } caso X de cero y luego cero [] X | Xr luego N * X | { Times N Xr } end enddeclarar H H = 1 | { Combinar { Veces 2 H } { Combinar { Veces 3 H } { Veces 5 H }}} { Examinar { Lista . tomar H 6 }}
El código anterior calcula elegantemente todos los Números Regulares [10] en una lista infinita. Los números reales se calculan solo cuando se necesitan.
Simultaneidad de paso de mensajes
El modelo declarativo concurrente se puede ampliar con el paso de mensajes mediante semántica simple:
declare el puerto de transmisión local en el puerto = { NewPort Stream } { Send Port 1 } % Stream es ahora 1 | _ ('_' indica una variable no vinculada y sin nombre) { Send Port 2 } % Stream es ahora 1 | 2 | _ .. . { Send Port n } % Stream es ahora 1 | 2 | .. | n | _ final
Con un puerto y un hilo, se pueden definir agentes asíncronos:
fun { NewAgent Init Fun } Msg Out in thread { FoldL Msg Fun Init Out } end { NewPort Msg } end
Estado y objetos
De nuevo, es posible extender el modelo declarativo para admitir la programación orientada a objetos y de estado con una semántica muy simple. Para crear una nueva estructura de datos mutable llamada Celdas:
local A X en A = { NewCell 0 } A : = 1 % cambia el valor de A a 1 X = @ A % @ se usa para acceder al valor de A final
Con estos simples cambios semánticos, se puede soportar todo el paradigma orientado a objetos. Con un poco de azúcar sintáctico, OOP se integra bien en Oz.
class Counter attr val meth init ( Value ) val : = Value end meth navegar { Browse @ val } end meth inc ( Value ) val : = @ val + Value end endlocal C en C = { New Counter init ( 0 )} { C inc ( 6 )} { C navegar } end
Velocidad de ejecución
La velocidad de ejecución de un programa producido por el compilador de Mozart (versión 1.4.0 que implementa Oz 3) es muy lenta. En un conjunto de puntos de referencia, en promedio es unas 50 veces más lento que el de GNU Compiler Collection (GCC) para el lenguaje C, resolviendo las tareas de los puntos de referencia. [ cuando? ] [11] [ verificación fallida ]
Ver también
- Alice (lenguaje de programación) , un lenguaje de restricción funcional concurrente de la Universidad de Saarland
- Programación de flujo de datos
- Lenguajes de programación lógica funcional
- Curry (lenguaje de programación)
- Mercury (lenguaje de programación)
- Visual Prolog , un lenguaje lógico funcional y orientado a objetos
Referencias
- Peter Van Roy y Seif Haridi (2004). Conceptos, técnicas y modelos de programación informática . Prensa del MIT. Hay material de apoyo en línea para este libro. El libro, una introducción a los principios de los lenguajes de programación, utiliza Oz como su idioma preferido para los ejemplos.
- ^ "Información de licencia de Mozart Oz" . 16 de enero de 2014 . Consultado el 16 de enero de 2014 .
- ^ Gert Smolka (1995). "El modelo de programación de Oz" (PDF) . Apuntes de conferencias en informática . 1000 : 324–343. doi : 10.1007 / BFb0015252 . ISBN 978-3-540-60105-0.
- ^ "QTk" . Archivado desde el original el 20 de mayo de 2013 . Consultado el 6 de abril de 2009 .
- ^ https://mozart.github.io/mozart-v1/doc-1.4.0/tutorial/node3.html#label18
- ^ Leif Grönqvist. "Funciones de orden superior". Programación funcional avanzada en Oz . Archivado desde el original el 3 de marzo de 2016 . Consultado el 3 de noviembre de 2014 .
- ^ Robert Gentleman; Ross Ihaka (septiembre de 2000). "Alcance léxico en la informática estadística" (PDF) . Revista de Estadística Computacional y Gráfica . 9 (3, Sistemas e idiomas): 491–508.
- ^ https://mozart.github.io/mozart-v1/doc-1.4.0/tutorial/node5.html#control.procedure
- ^ "Copia archivada" . Archivado desde el original el 24 de febrero de 2015 . Consultado el 29 de noviembre de 2008 .CS1 maint: copia archivada como título ( enlace )
- ^ Paul Hudak (1989). "Concepción, evolución y aplicación de lenguajes de programación funcional". Encuestas de computación ACM . 21 (3): 359–411. doi : 10.1145 / 72551.72554 . S2CID 207637854 .
- ^ Rao, AC y Varada Raju, D (1991). "Aplicación de la técnica del número de Hamming para detectar isomorfismo entre cadenas e inversiones cinemáticas". Teoría de Mecanismos y Máquinas . 26 (1): 55–75. doi : 10.1016 / 0094-114x (91) 90022-v .
- ^ El juego de puntos de referencia del lenguaje informático
enlaces externos
- Página web oficial
- Tutorial de Oz
- Investigación de lenguajes de programación en UCL : uno de los principales desarrolladores de Mozart / Oz, este grupo investiga utilizando Mozart / Oz como vehículo.
- Programación multiparadigma en Mozart / Oz: Actas de MOZ 2004 : Conferencia que ofrece una instantánea del trabajo que se está realizando con Mozart / Oz
- Programación en Oz
- Conceptos básicos de Oz