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 PrivateImplementationType
el 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.