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.
fuente
@Nullable
y@NonNull
que utilizan los verificadores externos como findbugs.Respuestas:
Converge tiene algunas instalaciones de metaprogramación bastante impresionantes.
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.
Perligata: Romana demuestra cómo se puede aplicar una sintaxis completamente nueva a un idioma.
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 .
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.
fuente
"¿Es teóricamente factible? *
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.
fuente
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).
fuente
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. ...
fuente