¿Cómo hago para escribir una especificación de lenguaje de programación?

16

Realmente disfruto el diseño del lenguaje de programación. A veces pienso que mis proyectos de idiomas y sus usuarios potenciales se beneficiarían de un documento completo de estándares. He examinado muchos estándares de lenguaje, desde el muy formal (C ++) hasta el bastante informal (ECMAScript), pero realmente no puedo entender cómo debo desglosar y organizar dicho documento, aunque Creo que soy bastante bueno en la escritura técnica en general.

¿Debería escribirlo como un tutorial largo o más como un trabajo formal de matemáticas? ¿Cómo lo mantengo actualizado si lo estoy desarrollando junto con una implementación de referencia? ¿Debo renunciar y tratar la implementación y la documentación como el estándar de facto? Además, ¿hay realmente algún beneficio significativo al tener un estándar? ¿ Requerir un estándar significa que el lenguaje es innecesariamente complejo?

Jon Purdy
fuente
1
¿Ya has leído los Idiomas específicos de dominio de Martin Fowler? amazon.com/…
Gary Rowe
@Gary Rowe: no lo he hecho. Parece ser una lectura decente, aunque quizás no sea exactamente lo que estoy buscando.
Jon Purdy
La ventaja de un estándar sobre una implementación de referencia es que puede definir dónde otras implementaciones pueden desviarse de lo que hace su implementación.
Bart van Ingen Schenau

Respuestas:

3

Encontré la especificación del lenguaje Java formal y legible, y creo que tiene una estructura sensible. Algunas de las especificaciones del W3C también podrían ser buenos ejemplos.

Hacer el trabajo formal podría ayudarlo a mantener baja la complejidad del lenguaje y ver los casos de esquina.

Volcado de encabezados: codificación de origen, lexing, tipos fundamentales, literales, operadores, expresiones, declaraciones simples, condicionales, bucles, funciones (definiciones y llamadas), declaraciones de tipo, módulos, unidades de compilación, alcance variable, varios tipos de resolución de nombres (p. Ej. importaciones, métodos), modelo de memoria, efectos secundarios, mecanografía, concurrencia ...

Tobu
fuente
Su lista de sugerencias es muy útil. Creo que lo que voy a hacer es hacer una lluvia de ideas sobre una lista similar, ordenarla en un formato similar a un tutorial y escribir una breve especificación informal con algunas adiciones formales, como una gramática EBNF. Definitivamente también echaré otro vistazo a las especificaciones que mencionaste para ideas.
Jon Purdy
7

Lee mucho y hazlo simple

Diseñar un nuevo idioma es difícil. Realmente difícil. Pero en última instancia, es muy satisfactorio si se vuelve popular y realmente resuelve un problema que las personas experimentan de una manera elegante.

Como mencioné en los comentarios, le aconsejo que lea los Idiomas específicos de dominio de Martin Fowler por las siguientes razones:

  1. Entra en mucha profundidad práctica sobre por qué debes diseñar un lenguaje
  2. Hay detalles sobre cómo hacerlo (analizadores, analizadores léxicos, bancos de trabajo de idiomas, etc.)
  3. Hay instrucciones detalladas de implementación sobre cómo se puede hacer la sintaxis elegida para manejar conceptos como cierres, anotaciones, listas literales, recepción dinámica, etc.

En cuanto a cómo escribir su especificación, piense en su audiencia. Obviamente, antes de poner el dedo en el teclado para diseñar su idioma, habrá pensado cuidadosamente sobre lo que se pretende hacer.

Si se trata de un lenguaje nuevo e interpretado para reemplazar JavaScript, querrá un enfoque muy laissez faire para llegar a los desarrolladores web con una capacidad de atención limitada y un deseo de resultados inmediatos, o más rápido si es posible.

Si se va a usar en la próxima misión a Titán, las especificaciones extremadamente detalladas que muestren pruebas formales exactas del comportamiento de cada componente serán el nivel de entrada mínimo.

Entonces, no es algo sencillo. Para acercarse a la especificación, probablemente sea mejor que gane mucha experiencia en la creación de sus idiomas y también que trabaje con aquellos que realmente los usan a diario. Si tiene víctimas dispuestas ... er ... desarrolladores, en el trabajo que pueden tomarse un tiempo para aprender su idioma, entonces pueden brindarle comentarios sobre lo que se necesita para que lo usen.

En resumen, manténgalo simple y más personas lo usarán.

Gary Rowe
fuente
Gracias por esto. Tengo mucha experiencia en el desarrollo de lenguajes, e incluso en documentarlos bastante a fondo, pero es la idea de un estándar lo que me atrae constantemente. Puede que solo tenga que recoger la lectura recomendada y experimentar un poco.
Jon Purdy
@ Jon Purdy ¿Tiene algún ejemplo de los idiomas en línea que podría incluir en la pregunta?
Gary Rowe
Todavía no tengo ejemplos de mi proyecto actual. El único ejemplo público realmente completo de un lenguaje que he hecho (¡que realmente uso!) Está en vision-language.sourceforge.net/cgi-bin/Home
Jon Purdy
@Jon Purdy Vision se ve interesante, una especie de velocidad mejorada. Por otro lado, es posible que desee considerar un screencast de YouTube que muestra cómo instalarlo y escribir un pequeño sitio web de ejemplo (digamos para un plomero local). Esto facilitaría mucho la curva de aprendizaje, ya que las personas pueden verla en acción e inmediatamente asumir los beneficios. Puede hablar sobre los beneficios en comparación con JSP, Velocity, ASP.Net, Freemarker, etc.
Gary Rowe
Es una buena idea; He estado haciendo videos de YouTube mucho últimamente (alrededor de tres por semana), así que creo que definitivamente podría encajar uno.
Jon Purdy
3

Wirth diseñó e implementó muchos lenguajes de programación: de estos, las especificaciones para los lenguajes Oberon y Oberon2 son notables por su integridad, concisión y legibilidad.

grussel
fuente
2

Common Lisp y Haskell tienen estándares de idioma. Ruby y Python tienen implementaciones y documentación. Por lo tanto, diría que no es necesario un estándar de idioma, pero podría ser útil si espera que haya más de una implementación del lenguaje que está diseñando. Por otro lado, un estándar es prematuro si espera cambios significativos en la definición de su idioma.

Larry Coleman
fuente
En realidad, Ruby tiene dos cosas que podrían considerarse "especificaciones". Existe la Especificación ISO Ruby, que actualmente está en su estado de Borrador Final y que está siendo escrita por algunas personas que tienen experiencia con las especificaciones del lenguaje (después de haber trabajado en ANSI Common Lisp e ISO C ++). Y está el proyecto RubySpec, que es un conjunto de ejemplos ejecutables de estilo RSpec que forman una especificación legible por humanos y un conjunto de pruebas de conformidad ejecutables por máquina para esa especificación.
Jörg W Mittag
1

cualquier especificación debe ser breve y capaz de resistir la prueba del tiempo

esta es la razón por la que ve una abstracción como BNF utilizada para muchos estándares de lenguaje ... es breve y aún se entenderá mucho después de que muchas de nuestras herramientas actuales se hayan quedado atrás.

por supuesto, hay más que solo una gramática. miren lo que otros han hecho ... perl6, esquema, C ... abordan cuestiones que al implementador también les interesan.

Brad Clawsie
fuente