¿Existe un lenguaje de programación personalizable que pueda usar para convertir a otros?

13

¿Existe un lenguaje de programación en el que puede establecer sus propias configuraciones de sintaxis y convertiría el código al idioma que elija?

Por ejemplo, elegiría configuraciones específicas como "bloques indexados de Python", [a,b,c]inicializa matrices, ^para exponenciación y otras. Un script lo convertiría al equivalente de su idioma de elección.

Dokkat
fuente
1
Espero que no. TIMTOWTDI es posiblemente malo, pero "inventar tantas formas incompatibles como desee" definitivamente tendría las mismas desventajas multiplicadas por cien, y sería aún menos útil. DSL son a veces vale la pena, pero la redefinición de la mitad de la sintaxis (o peor - el canje de dos operadores, dando evidentes compability pero diferentes semánticas) sólo por el gusto de hacerlo ...
Pregunto esto porque específicamente estoy programando en javascript y realmente me gustaría poder configurar algunos azúcares de sintaxis en mi código, pero el lenguaje simplemente no lo permite. Ni siquiera es posible la sobrecarga del operador.
Dokkat
2
Hasta cierto punto, lo que estás describiendo suena como macros de preprocesador . Ahora, si tan solo pudiéramos tener una característica similar para Perl ...
Yannis
55
@Dokkat: Por favor, actualice la cuestión de estado concreto que se trata de JavaScript. La pregunta, como se hizo, es una pesadilla de mantenimiento y soporte. Agregar una nueva sintaxis a un idioma existente (o usar un preprocesador para cambiar su idioma privado a un idioma público) es realmente horrible. Sin embargo. Si enumera problemas específicos de azúcar de sintaxis de JavaScript, puede obtener ayuda específica .
S.Lott
3
Estos "lenguajes de programación personalizados" normalmente se denominan "lenguajes específicos de dominio" o DSL.
Michael Dillon el

Respuestas:

14

Sí, pero probablemente no en la forma en que piensas.

Lisp y sus parientes tienen potentes sistemas macro que le permiten realizar transformaciones arbitrarias en su fuente, por lo que, en principio, puede usar macros (y macros de lector, a nivel de caracteres) para hacer casi cualquier extensión que desee. Los lenguajes concatenativos (y los lenguajes de los autores en áreas relacionadas) tienen el potencial de un poder de metaprogramación similar . Un buen ejemplo de esto es Forth , en el que muchas construcciones sintácticas (como comentarios) pueden ser definidas por el usuario. Para un ejemplo contemporáneo, no esotérico, hay un esfuerzo por brindarle a Perl 6 un soporte mejorado sobre Perl 5 para la sintaxis definida por el usuario también.

Jon Purdy
fuente
8
De alguna manera sabía que Perl sería (parte de) la respuesta. Supongo que las macros del preprocesador C también se ajustan a la descripción, en pequeña medida.
Yannis
También la sobrecarga del operador en C ++ puede ser agradable. Me viene a la mente el ejemplo de hola mundo. cout << "Hola";
Lord Tydus
@ LordTydus: De hecho, e incluso la sobrecarga del operador le permite hacer un poco de magia detrás de una interfaz sana. Sería bueno que C ++ tuviera capacidades de sobrecarga más generales, por ejemplo, sobrecarga operator[]para múltiples argumentos o introducción de nuevos operadores como en Haskell; pero dudo que el comité vea más allá de los problemas de análisis.
Jon Purdy
3

Suena como programación conceptual .

No estoy familiarizado con él, pero XL es un lenguaje diseñado específicamente para ello.

XL presenta sintaxis y semántica reconfigurable por programador. Los complementos del compilador se pueden usar para agregar nuevas funciones al idioma.

Lisp y Forth también admiten programación de conceptos, aunque menos que XL. Sugiero Lisp ya que es muy práctico y efectivo. Lo más importante es una sintaxis clara y flexible, no una notación, que proporciona Lisp.


Por ejemplo, elegiría configuraciones específicas como "bloques indexados de Python", "[a, b, c]" inicializa matrices, "^" para exponenciación y otros.

Te puede interesar un idioma como Haskell que tiene una sintaxis muy flexible pero uniforme.

Pubby
fuente
Esto es lo que estaba buscando.
Dokkat
2

No que yo sepa.

Tampoco creo que sea una idea particularmente buena: uno de los principales beneficios de una sintaxis de lenguaje estándar es que muchas personas pueden leerla, y si todos inventaron su propia sintaxis, nadie podría entender el código de otra persona. .... por lo que este lenguaje puede ser divertido para un aficionado pero no es muy útil para nada práctico

Lo más cercano que existe probablemente sería Lisp, donde el sistema macro le permite escribir sus propias construcciones de lenguaje nuevo de una manera muy flexible. Normalmente todavía se mantendría con la sintaxis de Lisp, pero puede redefinir efectivamente todo si realmente lo desea.

Como resultado, Lisps tiende a ser particularmente popular para implementar DSL. Un buen ejemplo es este acceso a datos DSL en Clojure (Korma) que se encarga de todo el código repetitivo requerido para el acceso a la base de datos.

mikera
fuente
2

Scala se usa a menudo de esta manera para crear DSL, lenguajes específicos de dominio.

Esto se debe principalmente a que Scala no tiene operadores, y el método Scala que llama a la sintaxis se puede abreviar. Por ejemplo:

5 es un objeto entero. Para calcular 5 más 7 podrías escribir

val ans = 5.add (7) excepto que el método de suma en realidad se llama "+", por lo que escribiría:

val ans = 5. + (7) pero en Scala, no necesita incluir el "." en las llamadas al método o los paréntesis "()" alrededor de los argumentos, para llamar al método + en el objeto 5, escribiría

val ans = 5 + 7 que funciona perfectamente porque Scala no tiene operadores que interfieran con su ingenioso esquema de nombres de métodos. ¡Ahora extienda esa idea a sus propias clases y objetos, incluido el hecho de que puede "anular" métodos como +, así como crear sus propios métodos llamados >>> o ::! o @ * @ o simplemente nombres de texto sin formato como fancify.

Michael Dillon
fuente
Esto es asombroso Echaré un vistazo a scala.
Dokkat
1

No digo que deba usarlo, ya que todavía es en su mayoría experimental, pero un paradigma de programación reciente interesante es la programación orientada al lenguaje (LOP).

El concepto de programación orientada al lenguaje adopta el enfoque de capturar los requisitos en los términos del usuario y luego tratar de crear un lenguaje de implementación lo más isomórfico posible para las descripciones del usuario, de modo que el mapeo entre los requisitos y la implementación sea lo más directo posible.

Sergey Dmitriev lo explica con más detalle .

Esa es su ideología, pero prácticamente se reduce a que respalda el comportamiento que está pidiendo. Usted puede:

  • Ampliar un idioma existente.
  • Componer diferentes idiomas.
  • Utilice un 'lenguaje de transformación' existente para convertir sus palabras clave recién definidas a un idioma base.

El entorno de programación más activo que conozco para seguir este paradigma es el Sistema de Programación Meta (MPS) gratuito de JetBrains.

De hecho, también está comenzando a usarse en software comercial, por lo que tal vez esté comenzando a salir de su fase 'experimental':

  • Realaxy es un editor de ActionScript construido completamente sobre MPS. Utilizando el poder de LOP, pudieron implementar, por ejemplo, cierres para AS3.
  • mbeddr C es un lenguaje C extensible basado en MPS.
Steven Jeuris
fuente
1

Los lenguajes específicos de dominio se usan con bastante frecuencia en la comunidad Tcl. Por ejemplo, no es raro ver un programa Tcl que contiene C y SQL como DSL incrustados (a través de los paquetes Critcl y Sqlite). ¡La única restricción en un DSL incrustado es que es mucho mejor si el lenguaje incrustado equilibra sus llaves, y eso resulta ser un requisito realmente no oneroso en la práctica!

Otro lenguaje que facilita las DSL es Standard ML, que le permite tener acceso a tokens sin procesar desde el tokenizador genérico del sistema (desde antes del punto donde los identificadores se convierten en palabras clave). Esto facilita la realización de una amplia clase de DSL, siempre que cumplan algunas de las reglas básicas de sintaxis de SML, especialmente en relación con los comentarios, cadenas y límites de token, y de hecho se usa mucho en una serie de aplicaciones clave de manejo del idioma (demostradores de teoremas, etc.)

No todos los idiomas hacen esto tan fácil. En particular, los lenguajes que analizan automáticamente el contenido de los términos entre paréntesis (¡muchos, muchos de ellos!) No pueden hacer esto, por lo que requieren que el DSL sea construido por operadores primarios, colocando el sub-idioma dentro de una cadena, o mediante el uso de un preprocesador que reescribe el DSL en algo que puede manejarse dentro del lenguaje host.

Compañeros de Donal
fuente
0

AFAIU está buscando idiomas que puedan ayudarlo a escribir su propio DSL (Idioma específico del dominio). Hay muchos buenos candidatos. Personalmente, recomendaría Ruby o Io, porque ofrecen 1) sobrecarga fácil del operador, 2) metaprogramación y 3) mecanismos alternativos como los method_missingque puede usar para crear su propia API. Por ejemplo, eche un vistazo en sqldsl , un DSL escrito en Ruby que genera SQL leyendo el código Ruby.

sakisk
fuente
0

Realmente no lo he usado per se, pero si recuerdo bien, TXL está específicamente diseñado para traducir el código fuente. Como tal, debería poder usarlo para especificar cómo traducir desde su idioma y / o extensiones de idioma a cualquier idioma real de destino.

Parece tener una gramática disponible para Javascript. Pero, al no haberlo usado antes, no estoy seguro exactamente cómo eso podría ayudarlo.

mootinator
fuente
0

Existe un buen preprocesador llamado PPWizard, bastante potente. Una vez que aprendió su sintaxis, podría crear macro defs para apuntar a diferentes idiomas, no es que fuera infalible o divertido, pero es una herramienta útil.

marca
fuente
aquí algunos enlaces: CONTENIDO PPWIZARD (documentos oficiales), PPWizard - EDM2 (una referencia externa). La herramienta es poderosa, pero su documentación no es fácil de leer (quizás debido a su poder).
Wolf
0

Puede ser lo que estás buscando es como compilador compilador. Un compilador compilador toma una definición de lenguaje escrita en un lenguaje formal y crea un compilador para este idioma.

Echa un vistazo a http://en.wikipedia.org/wiki/Compiler-compiler

Olivier Jacot-Descombes
fuente
0

Una forma común de personalizar parcialmente un lenguaje de programación es usar un preprocesador de macro. Por ejemplo, podría ejecutar "dokkat-lang" a través del preprocesador C antes de colocar el resultado donde algún entorno de JavaScript lo descargaría.

Cuánto puede hacer depende de la sofisticación de su preprocesador. Tenga en cuenta que las primeras versiones de C ++, Objective C y varios lenguajes experimentales se realizaron preprocesando el código fuente antes de alimentar a una cadena de herramientas de compilación de C en stock.

hotpaw2
fuente