Jest to część serii pytań, które koncentrują się na projekcie o nazwie Projekt abstrakcji, którego celem jest wyodrębnienie pojęć używanych w projektowaniu języka w formie frameworka.
Kolejną związaną z tym stronę związaną z typowaniem strukturalnym można obejrzeć tutaj . Meta-temat związany z zapytaniem dotyczącym frameworka i odpowiedniego miejsca do opublikowania można znaleźć tutaj .
Jak łatwo powinno być korzystać z ram rozwoju języka?
Napisałem frameworki do generowania kodu na dużą skalę, które zawierały również możliwość wysłania wyniku do kompilatora specyficznego dla języka. Temat łatwości użycia pochodzi z jednego z takich ramowych przykładów: CodeDOM lub Code Document Object Model.
Jest to framework napisany przez Microsoft, który opisuje typowe struktury kodu, ale generalnie pozostawiał wiele (koercje wyrażeń) i miał tendencję do nieco abstrakcyjnej reprezentacji niektórych konstrukcji, do wręcz emitowania złego kodu w oparciu o to, co robiłeś: wcześniej CodeDOM słabo emitujący obsługiwane PrivateImplementationType
na CodeMemberMethod
przy typu użyto ogólnego interfejsu. CodeDOM był moim pierwotnym powodem do napisania mojego pierwszego generatora kodu.
Jedną rzeczą, którą próbuję zrobić, aby uprościć strukturę, jest zmniejszenie ilości pracy, którą musisz zrobić, i skupienie się na działaniach w porównaniu do konkretnych typów, które składają się na te działania.
Oto porównanie obok tego, jak działa framework, który piszę:
//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));
Kontra 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));
Głównym celem frameworka są entuzjaści języków, a także osoby zainteresowane generowaniem kodu lub aplikacji. Biorąc pod uwagę skupienie się na kompilacji, generowaniu kodu i rozwoju języka, czy ramy powinny skupiać się na łatwości użycia lub czystej mocy?
Moim głównym celem jest zwiększenie dostępności takich narzędzi, aby osoby zainteresowane domeną nie wymagały dużego doświadczenia w dziedzinie teorii języków, zanim będą mogły rozpocząć pracę nad własnymi projektami zorientowanymi na język.
Biorąc pod uwagę, że jestem autorem frameworka, mój pogląd na „użyteczność” jest stronniczy. Dlatego muszę zapytać kogoś innego, czy koncentracja i cel mają sens dla osób niezwiązanych z projektem.