¿Puede un lenguaje de programa ser lo suficientemente maleable como para permitir que los programas extiendan la semántica del lenguaje?


15

Con referencia a características en lenguajes como ruby ​​(y javascript), que permiten a un programador extender / anular clases en cualquier momento después de definirlo (incluidas clases como String), es teóricamente factible diseñar un lenguaje que permita que los programas se extiendan más adelante. su semántica

Ej: Ruby no permite la herencia múltiple, pero puedo extender / anular el comportamiento del idioma predeterminado para permitir una implementación de herencia múltiple.

¿Hay otros idiomas que permitan esto? ¿Es esto realmente un tema de preocupación para los diseñadores de idiomas? En cuanto a la elección de usar ruby ​​para construir un marco de rieles para el desarrollo de aplicaciones web, dichos lenguajes pueden ser muy potentes para permitir el diseño de marcos (o DSL) para una amplia variedad de aplicaciones.


2
¿Cuentan como extensiones semánticas las macros higiénicas de Scheme o el reflejo de newspeak que permiten implementar excepciones como código de biblioteca? ¿Qué pasa con las extensiones sintácticas como Perligata: Romana ?

Esta parece ser una pregunta que pide una lista de idiomas en lugar de conceptos. Las ediciones pendientes que cambian la dirección de la pregunta, virtualmente voto para cerrar como fuera de tema.
Raphael

Si no recuerdo mal, incluso Java obtendrá características que permitirán que los programas extiendan el sistema de tipos.
Rafael

1
@ Raphael, ¿estás pensando en JSR 305 ? Las anotaciones de Java fueron diseñadas (en parte) por Gilad Bracha, quien diseñó Newspeak, que vinculé en mi respuesta a continuación y también defendió los sistemas de tipo conectable . JSR 305 proporciona anotaciones de sistema de tipo como @Nullabley @NonNullque utilizan los verificadores externos como findbugs.
Mike Samuel

No está claro qué significa "extender su semántica". Si miro Boost.Spirit , eso ya está cruzando mi umbral personal de "extender la semántica": los operadores matemáticos de C ++ se usan para describir una sintaxis de lenguaje, que el compilador luego convierte en un analizador para dicho lenguaje. Sé que esto no es lo que se entiende por "extender la semántica del lenguaje" por las ratas de laboratorio, pero creo que es bastante impresionante.
DevSolar

Respuestas:


12

Converge tiene algunas instalaciones de metaprogramación bastante impresionantes.

En un nivel simple, esto puede verse como una instalación tipo macro, aunque es más potente que la mayoría de las instalaciones macro existentes, ya que el código arbitrario se puede ejecutar en tiempo de compilación. Con esto, uno puede interactuar con el compilador y generar código de manera segura y fácil como ITrees (también conocido como árboles de sintaxis abstracta).

que es un paso adelante de las macros higiénicas de Scheme que permiten definiciones de macro referencialmente transparentes.

Mecanismos como los cuasiliterales han permitido la construcción y la desestructuración de los árboles de análisis en otros idiomas, pero se utilizan con mayor frecuencia para interactuar con lenguajes específicos de dominio (DSL) en lugar de auto-modificación.


El reflejo de Newspeak permite implementar excepciones como código de biblioteca.

7.6 Manejo de excepciones

Debido a que Newspeak proporciona acceso reflexivo (7.2) a los registros de activación (3.6), el manejo de excepciones es puramente un problema de biblioteca. La plataforma proporcionará una biblioteca estándar que admite excepciones de lanzamiento, captura y reanudación, al igual que en Smalltalk.


Perligata: Romana demuestra cómo se puede aplicar una sintaxis completamente nueva a un idioma.

Este artículo describe un módulo Perl - Lingua :: Romana :: Perligata - que hace posible escribir programas Perl en latín.


Podría decirse que no es semánticamente significativo, PyPy es un generador de intérpretes para lenguajes cuya semántica se especifica en un subconjunto altamente analizable estáticamente de Python, y lo usan para experimentar con nuevas construcciones de lenguaje en Python como agregar thunks al lenguaje.


También de interés podría ser Ometa .

Esta disertación se centra en la experimentación en informática. En particular, mostraré que los nuevos lenguajes de programación y construcciones diseñadas específicamente para apoyar la experimentación pueden simplificar sustancialmente los trabajos de investigadores y programadores por igual.

Presento un trabajo que aborda dos tipos muy diferentes de experimentación. El primer objetivo es ayudar a los investigadores del lenguaje de programación a experimentar con sus ideas, al facilitarles la creación de prototipos de nuevos lenguajes de programación y extensiones a los lenguajes existentes. El otro investiga la experimentación como un paradigma de programación, al permitir que los propios programas experimenten con diferentes acciones y posibilidades; en otras palabras, es un intento de proporcionar soporte de lenguaje para ¿qué pasaría si ...? o posibles razonamientos de mundos.

La disertación de Alex Warth demuestra el uso de un Ometa para definir una semántica significativamente nueva (semántica transaccional a través de mundos) en JavaScript + Ometa.


8

"¿Es teóricamente factible? *

LS

L puede diseñarse con potentes funciones de metaprogramación para que sea fácil implementar intérpretes. Idiomas como Scheme tienen esto.

SL ). Entonces no obtienes el impacto de rendimiento porque se elimina la capa de interpretación adicional.

El nuevo lenguaje aún podría ejecutarse lentamente si su modelo de tiempo de ejecución es significativamente diferente del lenguaje de implementación. En ese caso, los bits del intérprete aparecerán en el código traducido y continuará funcionando lentamente. Sin embargo, si el nuevo idioma es casi el mismo que el idioma original, con solo unos pocos ajustes, entonces debería ser posible eliminar la mayoría de los bits del intérprete en el código objetivo mediante un ajuste cuidadoso de la evaluación parcial. Luego, el éxito en el rendimiento estará allí solo para las nuevas características.

En efecto, esta es la tecnología de "virtualización" para lenguajes de programación.


6

Históricamente, Lisp fue el primer lenguaje de programación importante en introducir servicios de metaprogramación. El sistema de macros de Lisp permite al programador definir nuevas estructuras de control, nuevas plantillas de datos, etc. Por ejemplo, el sistema de objetos Common Lisp se puede definir completamente con macros sobre un lenguaje central que no sabe nada sobre objetos o clases. El sistema macro también permite la definición de lenguajes específicos de dominio .

Ruby se inspiró mucho en Lisp, incluida su capacidad de reflexividad y metaprogramación. Muchos lenguajes de tipo dinámico se han inspirado en Lisp a este respecto. (La escritura estática complica las cosas, porque muchas extensiones no caben en el sistema de escritura original).


4

Aún no se menciona en las respuestas / comentarios:

la encuesta:

Resumen: lenguajes extensibles son lenguajes de programación que permiten al usuario modificar o agregar sintaxis y asociar las nuevas formas sintácticas con la semántica. ¿Para qué sirven estos idiomas? ¿Qué tipos de características son fáciles de agregar y cuáles no? ¿Son lo suficientemente poderosos como para ser tomados en serio? En esta encuesta intentaremos responder a esas preguntas a medida que consideremos lenguajes extensibles de procedimiento, orientados a objetos, funcionales y de propósito general. Estamos principalmente interesados ​​en el poder expresivo (regular, sin contexto), las advertencias asociadas (antihigiénico, la ambigüedad) y la facilidad de uso de los diversos mecanismos.

y

Resumen: La capacidad de extender un lenguaje con nuevas formas sintácticas es una herramienta poderosa. Un sistema macro lo suficientemente flexible permite a los programadores construir desde una base común hacia un lenguaje diseñado específicamente para su dominio problemático. Sin embargo, las instalaciones macro que están integradas, son capaces y al mismo tiempo lo suficientemente simples como para ser ampliamente utilizadas se han limitado a la familia de idiomas Lisp hasta la fecha. En este artículo presentamos una instalación de macros, llamada Java Syntactic Extender (JSE), con el poder superior y la facilidad de uso de los sistemas macro Lisp, pero para Java, un lenguaje con una sintaxis algebraica más convencional. ...


1
Escriba una o dos oraciones de resumen para cada referencia; Las colecciones de enlaces puros casi nunca son respuestas "buenas".
Raphael
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.