¿Qué tan fácil debe ser un marco de desarrollo del lenguaje?

11

Esto es parte de una serie de preguntas que se centran en un proyecto llamado Proyecto de abstracción, que tiene como objetivo abstraer los conceptos utilizados en el diseño del lenguaje en forma de marco.

Aquí se puede ver otra página asociada a ella relacionada con la tipificación estructural . El metatema asociado a una consulta sobre el marco y el lugar adecuado para publicar se puede encontrar aquí .

¿Qué tan fácil debería ser usar un marco de desarrollo del lenguaje?

He escrito marcos de generación de código a gran escala que también incluyen la capacidad de enviar el resultado al compilador específico del idioma. El tema de la facilidad de uso surge de un ejemplo de marco de este tipo: CodeDOM o el Modelo de objetos de documento de código.

Es un marco escrito por Microsoft que describe estructuras de código comunes, pero generalmente dejaba mucho de lado (coacciones de expresión) y tendía a ser un poco abstracto en su representación de ciertas construcciones, a emitir francamente código incorrecto basado en lo que estaba haciendo: antes CodeDOM mal manejado que emite PrivateImplementationTypeel CodeMemberMethod, cuando el tipo usado fue una interfaz genérica. CodeDOM fue mi razón original para escribir mi primer generador de código.

Una cosa que estoy tratando de hacer, para simplificar el marco, es reducir la cantidad de trabajo que necesita para hacer algo, y centrarme en acciones versus los tipos específicos que componen esas acciones.

Aquí hay una comparación lado a lado de cómo funciona el marco que estoy escribiendo:

//Truncated...
/* *
 * From a project that generates a lexer, this is the 
 * state->state transition character range selection logic.
 * */
var nextChar = nextMethod.Parameters.Add(new TypedName("currentChar", typeof(char).GetTypeReference()));
//...
char start = rangeElement.B.Value.Start;
char end = rangeElement.B.Value.End;
/* *
 * 'start' <= nextChar && nextChar <= 'end'
 * */
currentExpression = start.LessThanOrEqualTo(nextChar).LogicalAnd(nextChar.LessThanOrEqualTo(end));

Versus CodeDOM:

//Truncated...
var nextChar = new CodeVariableReferenceExpression("nextChar");
//...
var start = new CodePrimitiveExpression(rangeElement.B.Value.Start);
var end = new CodePrimitiveExpression(rangeElement.B.Value.End);
currentExpression = new CodeBinaryOperatorExpression(new CodeBinaryOperatorExpression(start, CodeBinaryOperatorType.LessThanOrEqual, nextChar), CodeBinaryOperatorType.BooleanAnd, new CodeBinaryOperatorExpression(nextChar, CodeBinaryOperatorType.LessThanOrEqual, end));

El enfoque del marco son los entusiastas del lenguaje, así como aquellos interesados ​​en generar código o aplicaciones. Dado su enfoque en la compilación, la generación de código y el desarrollo del lenguaje, ¿debería el marco centrarse en la facilidad de uso o la potencia bruta?

Mi objetivo principal es aumentar la disponibilidad de tales herramientas, por lo que aquellos interesados ​​en el dominio no requieren mucha experiencia en el dominio de la teoría del lenguaje antes de que puedan comenzar a trabajar en sus propios proyectos centrados en el lenguaje.

Dado que soy el autor del marco, mi visión de "usabilidad" es parcial. Por lo tanto, debo preguntarle a otro si el enfoque y la meta tienen sentido para otros que no están asociados al proyecto.

Allen Clark Copeland Jr
fuente
1
Debe hacer esta pregunta en codereview.stackexchange.com .
Robert Harvey
66
La pregunta, si un marco debería ser fácil de usar a expensas de la energía bruta, no parece ser adecuado para Code Review.SE, donde "Arquitectura y diseño de sistemas de software de nivel superior" no está tema allí, y está en el tema aquí. La revisión de código es para cuando tienes un código de trabajo y quieres una crítica.
La entrada a un generador de código es solo otro lenguaje de programación. El deseo de generar código significa que el lenguaje que está generando es insuficientemente poderoso. Mejores idiomas tienen generadores de código incorporados.
kevin cline
@kevincline El caso de uso típico para un generador de código es un lenguaje específico de dominio que utiliza un marco de generación de código de propósito general. Esto no es realmente una elección, la alternativa sería compilar en su propio lenguaje intermedio interno e interpretarlo a través de una máquina virtual, o traducirlo usted mismo en una construcción de nivel inferior, pero al final está haciendo lo mismo . Eso es lo que pretende hacer este marco, cuando necesita hacer el trabajo para generar código dinámicamente, usaría esto en lugar de crear su propia implementación de lo mismo.
Allen Clark Copeland Jr
No es tanto que el idioma de origen sea insuficiente, es que una gramática del lenguaje es solo texto hasta que se escribe un software intermediario para traducir del texto de origen a la plataforma de destino. En este caso, es la Infraestructura de Lenguaje Común (CLI), o código en lenguajes de propósito general que se dirigen a la CLI. El marco tiene como objetivo manejar el trabajo duro de tomar representaciones de alto nivel y traducirlas en construcciones de nivel suficientemente bajo para la generación de IL. es decir, un compilador, solo porque necesite un compilador no significa que su idioma no sea lo suficientemente potente. Es necesario.
Allen Clark Copeland Jr

Respuestas:

2

Es difícil construir un marco de desarrollo del lenguaje. Debe decidir qué tipo de cosas le gustaría que respaldara, luego debe decidir qué tipo de cosas sabe hacer y cómo integrarlas juntas en un todo coherente. Finalmente, ha realizado una inversión suficiente para que funcione con lenguajes reales (p. Ej., Lenguajes informáticos típicos y DSL), y en realidad hace algo útil. Me quito el sombrero por intentarlo.

Puede comparar su esfuerzo con el que comencé hace 15 años, el DMS Software Reengineering Toolkit . DMS está destinado a proporcionar análisis, análisis y transformación de código de propósito general. Dada una especificación de lenguaje explícito, analizará el código, creará AST, regenerará el código a partir de AST (prettyprint), transformará el código utilizando patrones escritos en el lenguaje de programación específico, creará tablas de símbolos, control de cómputo y flujo de datos, etc. Al agregar código personalizado, uno hace que DMS lleve a cabo una amplia variedad de efectos. (Vea las herramientas en el sitio; todas son DMS de una forma u otra).

Aquí hay un documento técnico sobre DMS como lo fue hace varios años. (Seguimos mejorando)

Si bien el DMS en sí ha sido difícil de construir, descubrimos que se necesitó una gran cantidad de ingeniería correspondiente para definir idiomas reales para DMS, incluidos IBM COBOL, C # 4.0, Java 1.7, C ++ 11 (y muchos otros).

Lo que creemos que hace (razonablemente bien): reduce el costo de construcción de herramientas en 1-2 órdenes de magnitud. Lo que esto significa es que las tareas que de otro modo podrían tomar de 1 a 10 años pueden ser contempladas por simples mortales como proyectos de 1 mes a 1 año. Lo que aún no es fácil:

  • Definiendo nuevos idiomas
  • Manejo de todas las idioteces de los idiomas actuales.
  • Facilitando la escritura del código personalizado específico para su tarea
  • Definición de análisis nuevos y complejos.
  • Manejo de programas parciales o programas que contienen errores.
  • (Para su punto inicial) Facilite a los no expertos el uso de estas herramientas

Por lo tanto, hay mucho margen de mejora. Deje florecer muchas flores.

Ira Baxter
fuente
0

Esta pregunta puede haber sido respondida en The Mythical Man Month, la sección "Integridad conceptual". Si no, es al menos altamente relevante para su pregunta. Aunque Brooks describe la arquitectura de un sistema informático completo, el ensayo se aplica perfectamente a marcos y nuevos lenguajes.

Creo que existe una correlación positiva entre la tasa de adopción de cualquier tecnología y su integridad conceptual y facilidad de uso. Debería haber un estudio de caso de tecnologías recientes como lenguajes, marcos y sistemas operativos, para probar esta correlación, pero aún no se sabe nada.

maxpolk
fuente
Mi único problema con esta respuesta es que no proporciona ningún valor real. Sus referencias son una sección de un libro y, según su descripción, solo serían aplicables una vez que se haya lanzado el paquete de software. No me da una respuesta antes del lanzamiento, ya que básicamente dice 'funcionará bien si es fácil de usar y relevante para el dominio'. No puedo decir qué tan bien funcionará porque aún no está en un punto en el que puedas usarlo. Lo que ocurre con los compiladores es que haces mucho trabajo, solo para darte cuenta de que solo estás a mitad de camino de la montaña, y esa es la parte fácil.
Allen Clark Copeland Jr