Pregunta sobre la creación de un lenguaje de scripting

12

Digamos, por ejemplo, que quería pagarle a alguien para que creara un lenguaje de programación o lenguaje de script para mí. ¿Qué tipo de documento necesitarían para comprender completamente qué es exactamente lo que quiero?

Quiero decir, ¿hay documentos estándar que describan el nuevo lenguaje de programación / scripting en cuestión?

JTS
fuente
Como se trata de la programación, no de los programadores, probablemente sea mejor para StackOverflow.
Muad'Dib
14
No estoy de acuerdo con Muad'Dib. Creo que este es un buen lugar para esta pregunta.
Chris
55
Creo que, en lugar de inventar su propio lenguaje de secuencias de comandos, a costa de una gran cantidad de trabajo para que usted y su usuario tengan que aprender un nuevo idioma, será mejor que incorpore un lenguaje de secuencias de comandos existente. Algunos lenguajes, por ejemplo, Python, Javascript / ECMAScript, están diseñados para que puedan integrarse en un marco más grande. En resumen, solo necesitará diseñar la API y encontrar una manera de integrar el intérprete de script en su propio programa.
Lie Ryan
1
Es ventajoso hacer esto si el lenguaje va a ser un DSL. para un lenguaje general no tanto. Por supuesto, algunos lenguajes generales son bases muy buenas para DSL, por ejemplo, Lisp o TCL
jk.

Respuestas:

16

Lo que necesita escribir se llama especificación de idioma .

Debe contener una descripción de la gramática del lenguaje (preferiblemente en formato Backus-Naur-Extended ) y su semántica.

Para la última parte, puede escribir una descripción en sus propias palabras (pero tenga cuidado de ser preciso) o una semántica formal .

sepp2k
fuente
1
BNF solo es útil para gramáticas libres de contenido, los lenguajes de secuencias de comandos no siempre están libres de contexto, por ejemplo, TCL (aunque creo que todavía puede argumentar que es preferible tener un lenguaje libre de contexto en la mayoría de los casos)
jk.
@jk. No diría que BNF es completamente inútil para lenguajes libres de contexto. Dependiendo de cuán libre de contexto esté la sintaxis, aún puede tener sentido especificarla en EBNF y luego resolver las ambigüedades en las palabras. Eso es lo que hace el estándar C ++, por ejemplo. En la mayoría de los casos, imagino que es aún más claro que explicar todo en palabras o especificarlo usando una gramática sensible al contexto o sin restricciones.
sepp2k
Es cierto, mi punto era que hay lenguajes como lisp, tcl o adelante (que en realidad son muy buenos para definir DSL) que tienen sintaxis degeneradas y, por lo tanto, el BNF le dice muy poco
jk.
@jk. Claro, pero en ese caso, cualquier otro medio para describir la sintaxis le dirá igualmente poco, simplemente porque hay muy poco que contar. Eso solo significa que la parte de sintaxis de la especificación será muy corta.
sepp2k
13

Necesitará lo siguiente:

  • Una razón para crear un nuevo idioma.
  • Una filosofia
  • Una definición semántica
  • Una descripción léxica de tus tokens.
  • Una definición de análisis de sintaxis

¿Cómo será tu idioma diferente? ¿Cuál es su misión? ¿Es funcional? ¿Está orientado a objetos? ¿Es un metalenguaje? ¿Cuáles son sus características únicas? ¿Qué le dará al mundo que no existe (o que existe de una manera fea)? ¿Cómo quieres cambiar las cosas? ¿Se compila o se interpreta? ¿Un lenguaje DSL o de uso general? Esta es su filosofía y dicta mucho sobre el diseño de su idioma.

A continuación, trabaje para tachar sintaxis aproximada y semántica en papel. Esta será su definición semántica ... escribir código falso es una excelente manera de desarrollar sus pensamientos. Lea "El lenguaje de programación C" para obtener un excelente ejemplo de cómo se hace esto. Juega con ello.

Luego deberá definir sus tokens y sintaxis de alguna manera. Los programas luego los procesan en autómatas capaces de leer en cadenas y procesar la sintaxis. Yacc y Bison utilizan expresiones regulares y una sintaxis de estilo BNF para el análisis léxico y sintáctico, respectivamente. También hay herramientas similares a Yacc y Bison para otros idiomas.

También necesitará una base en la teoría del lenguaje / compiladores para saber qué NO hacer. Los ejemplos incluyen gramáticas ambiguas, problemas de generación y manipulación de AST y, en general, cómo simplificarse la vida. Conocer la teoría es muy importante. Consideraría obtener lo siguiente para comenzar:

Compiladores: Principios, Técnicas y Herramientas (Dragón libro)
Compilador moderna implementación en C o moderno compilador Implementación en Java

Aiden Bell
fuente
1
+1 para filosofía, para DSL claramente quieres identificar el dominio aquí
jk.
8

El 99.9% de las veces crear un nuevo idioma es completamente innecesario. Lo más probable es que el retorno de la inversión sea pequeño, y simplemente habría perdido su tiempo.

Lo más probable es que pueda usar Javascript como un lenguaje de programación susceptible, y ya hay analizadores disponibles para la mayoría de los idiomas. También puede usar otros lenguajes de secuencias de comandos que desee si puede encontrar un analizador adecuado para ellos. Implementarlos en su programa requeriría mucho menos trabajo y un mayor rendimiento. Las personas no tienen que aprender otro idioma, solo tienen que aprender su API. Es una solución mucho mejor.

Crear un nuevo idioma es casi siempre malo.

TheLQ
fuente
99
Excepto por la multitud de veces en que no está mal. Crear sus propios DSL simples puede ser muy útil. Ahora, crear su propio lenguaje de propósito general estaría más en línea con lo que dice su respuesta.
ChaosPandion
@ChaosPandion, pero muchos idiomas ya se destacan en la creación de un DSL que usa código de ese idioma (es decir, Ruby es bueno en esto)
alternativa
2
Estoy de acuerdo con su respuesta, pero creo que no es la respuesta correcta para esta pregunta. Creo que el autor de la pregunta está mirando las generalidades de la creación de un lenguaje de secuencias de comandos, no por los pros / contras de crear uno.
Tim Murphy
Crear un nuevo idioma es casi siempre la mejor solución. en.wikipedia.org/wiki/Language-oriented_programming
SK-logic
3

Puede describir la gramática de su idioma en BNF .

Por ejemplo, esta es la gramática de Python .

grokus
fuente
66
Sin embargo, la gramática en sí misma no es suficiente información para implementar un lenguaje. También tendrá que especificar la semántica de una forma u otra.
sepp2k
0

si está utilizando .NET, aquí hay algo con lo que me topé hace algún tiempo. Solo le di una mirada curiosa, pero tal vez te sería útil: ironía .

Irony es un kit de desarrollo para implementar lenguajes en la plataforma .NET.

DevSolo
fuente