Articulo de referencia

Oz (lenguaje de programación)

{{cite web |url=https://mozart.github.io/license-info/ |title=Mozart Oz License Info |date=16 January 2014 |access-date=16 January 2014}} "},"dialects":{"wt":"Oz, Mozart"},"infl...

Oz es un lenguaje de programación multiparadigma , desarrollado en el Programming Systems Lab de la Université catholique de Louvain , para la enseñanza de lenguajes de programación. Cuenta con un libro de texto canónico: Concepts, Techniques, and Models of Computer Programming .

Oz fue diseñado por primera vez por Gert Smolka y sus estudiantes en 1991. En 1996, el desarrollo de Oz continuó en colaboració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 Universidad Católica de Lovaina . En 2005, la responsabilidad de gestionar el desarrollo de Mozart se transfirió a un grupo central, el Consejo Mozart, con el propósito expreso de abrir el desarrollo de Mozart a una comunidad más amplia.

El sistema de programación Mozart es la implementación principal de Oz. Se distribuye bajo una licencia de código abierto por el Consorcio Mozart. Mozart ha sido adaptado 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 , incluyendo lógica, programación funcional (tanto evaluación perezosa como evaluación estricta ), imperativa, orientada a objetos, con restricciones, distribuida y concurrente. Oz posee una semántica formal sencilla (véase el capítulo 13 del libro mencionado más adelante) y una implementación eficiente. Oz es un lenguaje orientado a la concurrencia , término introducido por Joe Armstrong, el principal diseñador del lenguaje Erlang . Un lenguaje orientado a la concurrencia facilita y optimiza el uso de la concurrencia. Oz admite el lenguaje de interfaz gráfica de usuario (GUI) QTk, un lenguaje canónico. [ 3 ]

Además de la programación multiparadigma, las principales fortalezas de Oz residen en la programación con restricciones y la programación distribuida . Gracias a su diseño factorizado, Oz implementa 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 con restricciones, Oz introduce el concepto de espacios de computación , que permiten definir estrategias de búsqueda y distribución ortogonales al dominio de restricciones.

Descripción general del idioma

Estructuras de datos

Oz se basa en un lenguaje central con muy pocos tipos de datos que se pueden extender a otros más prácticos mediante azúcar sintáctico .

Estructuras de datos básicas:

  • Números: de punto flotante o enteros (entero real)
  • Registros: para agrupar 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 a las características (en este caso 0, 1, 3, etc.) son los valores.
  • Tuplas: Registros con características enteras 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 un 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 con comprobación de tipo dinámica . Los nombres de las variables en Oz comienzan con una letra mayúscula para distinguirlas de los literales [ 4 ] , que siempre comienzan con una letra minúscula.

Funciones

Las funciones [ 5 ] son ​​valores de primera clase, lo que permite la programación funcional de orden superior :

fun { Hecho N } si N =< 0 entonces 1 sino N * { Hecho N - 1 } fin fin
fun { Comb N K } { Fact N } div ({ Fact K } * { Fact N - K }) % los enteros no pueden desbordarse en Oz (a menos que no quede memoria) endfun { SumList List } case List of nil then 0 [] H | T then H + { SumList T } % coincidencia de patrones en listas end end

Las funciones pueden utilizarse tanto con variables libres como con variables ligadas. Los valores de las variables libres se obtienen mediante el ámbito léxico estático . [ 6 ]

Programación de orden superior

Las funciones son como otros objetos de Oz. Una función puede pasarse como atributo a otras funciones o puede devolverse dentro de una función.

fun { Cuadrado N } % Una función general N * N finfun { Map F Xs } % F es una función aquí - programación de orden superior case Xs of nil then nil [] X | Xr then { F X }|{ Map F Xr } end end%usage { Browse { Map Square [ 1 2 3 ]}} %browses [1 4 9]

Funciones anónimas

Al igual que muchos otros lenguajes funcionales, Oz admite el uso de funciones anónimas (es decir, funciones que no tienen nombre) en la programación de orden superior. El símbolo $ se utiliza para representarlas.

A continuación, la función de cuadrado se define de forma anónima y se pasa, lo que provoca [1 4 9]que se explore.

{ Explorar { Mapa divertido { $ N } N * N fin [ 1 2 3 ]}}

Dado que las funciones anónimas no tienen nombre, no es posible definir funciones anónimas recursivas.

Procedimientos

En Oz, las funciones deben devolver un valor en la última instrucción encontrada en el cuerpo de la función durante su ejecución. En el ejemplo siguiente, la función Ret devuelve 5 si X > 0 y -5 en caso contrario.

declarar fun { Ret X } si X > 0 entonces 5 sino ~ 5 fin fin

Pero Oz también proporciona una opción en caso de que una función no deba devolver valores. Dichas funciones se denominan procedimientos. [ 7 ] Los procedimientos se definen utilizando la construcción "proc" de la siguiente manera:

declare proc { Ret X } if X > 0 then { Browse 5 } else { Browse ~ 5 } end end

El ejemplo anterior no devuelve ningún valor, simplemente imprime 5 o -5 en el navegador Oz dependiendo del signo de X.

Variables de flujo de datos y concurrencia declarativa

Cuando el programa encuentra una variable sin asignar, espera a que se le asigne un valor. Por ejemplo, a continuación, el hilo esperará hasta que tanto X como Y tengan un valor asignado antes de mostrar el valor de Z.

hilo Z = X + Y { Explorar Z } fin hilo X = 40 fin hilo Y = 2 fin

El valor de una variable de flujo de datos no se puede cambiar una vez que se ha vinculado:

X = 1 X = 2 % de error

Las variables de flujo de datos facilitan la creación de agentes de flujo concurrentes:

fun { Ints N Max } if N == Max then nil else { Delay 1000 } N |{ Ints N + 1 Max } end endfun { Suma S Stream } case Stream of nil then S [] H | T then S |{ Suma H + S T } end endlocal X Y en hilo X = { Ints 0 1000 } fin hilo Y = { Suma 0 X } fin { Explorar Y } fin

Debido a la forma en que funcionan las variables de flujo de datos, es posible colocar hilos en cualquier parte de un programa y garantizar que tendrán el mismo resultado. Esto facilita enormemente la programación concurrente. Los hilos son muy económicos: es posible tener 100 000 hilos ejecutándose simultáneamente. [ 8 ]

Ejemplo: Tamiz de división de prueba

Este ejemplo calcula una secuencia de números primos utilizando el algoritmo de división por ensayo y error , creando recursivamente agentes de flujo concurrentes que filtran los números no primos:

fun { Sieve Xs } case Xs of nil then nil [] X | Xr then Ys in thread Ys = { Filter Xr fun { $ Y } Y mod X \ = 0 end } end X |{ Sieve Ys } end end

Pereza

Oz utiliza la evaluación estricta por defecto, pero es posible la evaluación diferida [ 9 ] . A continuación, el hecho se calcula solo cuando se necesita el valor de X para calcular el valor de Y.

fun lazy { Hecho N } si N =< 0 entonces 1 sino N * { Hecho N - 1 } fin fin local X Y en X = { Hecho 100 } Y = X + 1 fin

La evaluación perezosa permite almacenar estructuras de datos verdaderamente infinitas en Oz. El poder de la evaluación perezosa se puede apreciar en el siguiente ejemplo de código:

declare fun lazy { Fusionar Xs Ys } case Xs # Ys of ( X | Xr ) # ( Y | Yr ) then if X < Y then X |{ Fusionar Xr Ys } elseif X > Y then Y |{ Fusionar Xs Yr } else X |{ Fusionar Xr Yr } end end endfun lazy { Times N Xs } case Xs of nil then nil [] X | Xr then N * X |{ Times N Xr } end enddeclarar H H = 1 | { Combinar { Veces 2 H } { Combinar { Veces 3 H } { Veces 5 H }}} { Explorar { 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 son necesarios.

concurrencia mediante paso de mensajes

El modelo concurrente declarativo se puede extender con el paso de mensajes mediante una semántica simple:

declare local Stream Port in Port = { NewPort Stream } { Send Port 1 } % Stream ahora es 1|_ ('_' indica una variable no definida y sin nombre) { Send Port 2 } % Stream ahora es 1|2|_ ... { Send Port n } % Stream ahora es 1|2| .. |n|_ end

Mediante un puerto y un hilo, se pueden definir agentes asíncronos:

fun { NewAgent Init Fun } Msg Salida en hilo { FoldL Msg Fun Init Salida } fin { NewPort Msg } fin

Estado y objetos

Es posible extender nuevamente el modelo declarativo para admitir programación orientada a objetos y con estados , con una semántica muy simple. Para crear una nueva estructura de datos mutable llamada Cells:

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 end

Con estos sencillos cambios semánticos, se puede dar soporte a todo el paradigma orientado a objetos. Con un poco de azúcar sintáctico , la POO se integra perfectamente en Oz.

clase Contador attr val meth init ( Valor ) val := Valor end meth browse { Browse @val } end meth inc ( Valor ) val := @val + Valor end endlocal C en C = { Nuevo contador init ( 0 )} { C inc ( 6 )} { C browse } fin

Velocidad de ejecución

La velocidad de ejecución de un programa producido por el compilador Mozart (versión 1.4.0 que implementa Oz 3) es muy lenta. En un conjunto de pruebas de rendimiento de 2012 , fue en promedio unas 50 veces más lento que el de la Colección de Compiladores GNU (GCC) para el lenguaje C. [ 11 ]

Véase también

Referencias

  1. "Información sobre la licencia de Mozart Oz" . 16 de enero de 2014. Consultado el 16 de enero de 2014 .
  2. Gert Smolka (1995). "El modelo de programación Oz" (PDF) . Computer Science Today . Lecture Notes in Computer Science. Vol. 1000. pp. 324–343 . doi : 10.1007/BFb0015252 . ISBN   978-3-540-60105-0.
  3. "QTk" . Archivado del original el 20 de mayo de 2013. Consultado el 6 de abril de 2009 .
  4. "3 conceptos básicos" .
  5. Leif Grönqvist. "Funciones de orden superior". Programación funcional avanzada en Oz . Archivado del original el 3 de marzo de 2016. Consultado el 3 de noviembre de 2014 .
  6. Robert Gentleman; Ross Ihaka (septiembre de 2000). "Alcance léxico en computación estadística" (PDF) . Journal of Computational and Graphical Statistics . 9 (3, Sistemas y lenguajes): 491–508 . doi : 10.1080/10618600.2000.10474895 .
  7. "5 Estructuras de Control Básicas" .
  8. "Tutorial de Oz — 8 Concurrencia" . Archivado del original el 14 de agosto de 2013. Recuperado el 29 de noviembre de 2008 .
  9. Paul Hudak (1989). "Concepción, evolución y aplicación de lenguajes de programación funcional". ACM Computing Surveys . 21 (3): 359– 411. doi : 10.1145/72551.72554 . S2CID 207637854 . 
  10. Rao, AC y Varada Raju, D (1991). "Aplicación de la técnica del número de Hamming para detectar isomorfismo entre cadenas cinemáticas e inversiones". Mechanism and Machine Theory . 26 (1): 55– 75. doi : 10.1016/0094-114x(91)90022-v .
  11. El juego de evaluación comparativa de lenguajes de programación
  • Sitio web oficial
  • Tutorial de Oz
  • Investigación de lenguajes de programación en la UCL : Uno de los desarrolladores principales de Mozart/Oz, este grupo realiza investigaciones utilizando Mozart/Oz como vehículo.
  • Programación multiparadigma en Mozart/Oz: Actas de MOZ 2004 : Conferencia que ofrece una visión general del trabajo que se está realizando con Mozart/Oz.
  • Programación en Oz
  • Conceptos básicos de Oz