Cela fait partie d'une série de questions qui se concentre sur un projet appelé le projet d'abstraction, qui vise à résumer les concepts utilisés dans la conception de langage sous la forme d'un cadre.
Une autre page qui lui est associée concernant le typage structurel peut être consultée ici . Le méta-sujet associé à une enquête sur le cadre et le bon endroit pour publier peut être trouvé ici .
Dans quelle mesure devrait-il être facile d'utiliser un framework de développement de langage?
J'ai écrit des cadres de génération de code à grande échelle qui comprenaient également la possibilité d'envoyer le résultat au compilateur spécifique au langage. Le sujet de la facilité d'utilisation provient d'un exemple de cadre de ce type: CodeDOM ou le modèle d'objet de document de code.
Il s'agit d'un framework écrit par Microsoft qui décrit des structures de code communes, mais généralement omis (coercitions d'expression) et avait tendance à être un peu abstrait dans sa représentation de certaines constructions, à émettre carrément du mauvais code en fonction de ce que vous faisiez: plus tôt CodeDOM mal traité émettant PrivateImplementationType
sur CodeMemberMethod
, lorsque le type utilisé était une interface générique. CodeDOM était ma raison d'origine pour écrire mon premier générateur de code.
Une chose que j'essaie de faire, pour simplifier le cadre, est de réduire la quantité de travail dont vous avez besoin pour faire quelque chose, et de vous concentrer sur les actions par rapport aux types spécifiques qui composent ces actions.
Voici une comparaison côte à côte du fonctionnement du framework que j'écris:
//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));
L'objectif du cadre est les passionnés de langage, ainsi que ceux intéressés par la génération de code ou d'applications. Compte tenu de son accent sur la compilation, la génération de code et le développement du langage, le cadre devrait-il se concentrer sur la facilité d'utilisation ou la puissance brute?
Mon objectif principal est d'augmenter la disponibilité de ces outils, afin que ceux qui s'intéressent au domaine n'aient pas besoin de beaucoup d'expérience dans le domaine de la théorie des langues avant de pouvoir commencer à travailler sur leurs propres projets axés sur les langues.
Étant donné que je suis l'auteur du cadre, ma vision de "l'utilisabilité" est biaisée. Ainsi, je dois demander à un autre si la focalisation et l'objectif ont du sens pour ceux qui ne sont pas associés au projet.