Jak łatwe powinno być korzystanie z ram rozwoju języka?

11

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 PrivateImplementationTypena CodeMemberMethodprzy 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.

Allen Clark Copeland Jr
źródło
1
Powinieneś zadać to pytanie na codereview.stackexchange.com .
Robert Harvey
6
Pytanie, czy framework powinien być łatwy w użyciu kosztem czystej mocy, nie wydaje się w ogóle nadawać się do Code Review.SE, w którym „architektura wyższego poziomu i projektowanie systemów oprogramowania” nie jest na temat tam, i jest na temat tutaj. Przegląd kodu jest przeznaczony dla osób, które mają działający kod i chcą krytyki.
Wejście do generatora kodu to po prostu kolejny język programowania. Pragnienie generowania kodu oznacza, że ​​generowany język jest niewystarczająco mocny. Lepsze języki mają wbudowane generatory kodu.
kevin cline
@kevincline Typowym przypadkiem użycia generatora kodu jest język specyficzny dla domeny, który wykorzystuje ogólne ramy generowania kodu. Nie jest to tak naprawdę duży wybór, alternatywą byłoby skompilowanie do własnego wewnętrznego języka pośredniego i zinterpretowanie go za pomocą maszyny wirtualnej lub przetłumaczenie go na konstrukcję niższego poziomu, ale ostatecznie robisz to samo . Właśnie to ma na celu ten framework, kiedy trzeba wykonać pracę, aby wygenerować kod dynamicznie, użyłbyś tego w przeciwieństwie do tworzenia własnych implementacji tego samego.
Allen Clark Copeland Jr
Nie jest tak bardzo, że język źródłowy jest niewystarczający, ale to, że gramatyka języka jest tylko tekstem, dopóki nie zostanie napisane oprogramowanie pośredniczące do tłumaczenia z tekstu źródłowego na platformę docelową. W tym przypadku to CLI (Common Language Infrastructure) lub kod w językach ogólnego przeznaczenia jest ukierunkowany na CLI. Struktura ma na celu poradzenie sobie z cholerną pracą polegającą na pobieraniu reprezentacji wysokiego poziomu i przekładaniu ich na konstrukcje wystarczająco niskiego poziomu do generowania IL. tzn. kompilator, tylko dlatego, że potrzebujesz kompilatora, nie oznacza, że ​​Twój język jest niewystarczająco wydajny. Jest wymagane.
Allen Clark Copeland Jr

Odpowiedzi:

2

Trudno jest zbudować ramy rozwoju języka. Musisz zdecydować, jakie rzeczy chcesz wspierać, a następnie zdecydować, które z nich wiesz, jak to zrobić i jak zintegrować je ze sobą w spójną całość. Wreszcie, masz wystarczająco dużo inwestycji, więc działa z prawdziwymi językami (np. Typowymi językami komputerowymi oraz DSL) i faktycznie robi coś pożytecznego. Mój kapelusz jest dla ciebie za próbę.

Możesz porównać swój wysiłek z tym, który zacząłem 15 lat temu, DMS Software Reengineering Toolkit . DMS ma na celu zapewnienie parsowania, analizy i transformacji kodu ogólnego przeznaczenia. Biorąc pod uwagę wyraźną specyfikację języka, będzie analizował kod, budował AST, regenerował kod z AST (ładny odcisk), przekształcał kod za pomocą wzorców zapisanych w docelowym języku programowania, budował tablice symboli, sterował obliczeniami i przepływem danych itp. Dodając niestandardowy kod, jeden sprawia, że ​​DMS wywołuje szeroką gamę efektów. (Zobacz narzędzia na stronie; wszystkie są DMS w takiej czy innej formie).

Oto dokument techniczny na temat DMS, tak jak kilka lat temu. (Ciągle go ulepszamy)

Chociaż sam DMS był trudny do zbudowania, okazało się, że zdefiniowanie prawdziwych języków do DMS wymagało odpowiednio dużego kawałka inżynierii, w tym IBM COBOL, C # 4.0, Java 1.7, C ++ 11 (i wielu innych).

To, co naszym zdaniem robi (dość dobrze): obniżenie kosztów budowy narzędzi o 1-2 rzędy wielkości. Oznacza to, że zadania, które w innym przypadku mogłyby zająć 1-10 lat, mogą być rozważani przez zwykłych śmiertelników jako projekty trwające 1 miesiąc-1 rok. Co wciąż nie jest łatwe:

  • Definiowanie nowych języków
  • Obsługa wszystkich idioci obecnych języków
  • Ułatwienie pisania niestandardowego kodu specyficznego dla zadania
  • Definiowanie nowych, złożonych analiz
  • Obsługa programów częściowych lub programów zawierających błędy
  • (Do twojego początkowego punktu) Ułatw innym osobom korzystanie z tych narzędzi

Jest więc dużo miejsca na ulepszenia. Niech kwitnie wiele kwiatów.

Ira Baxter
źródło
0

Na to pytanie można było odpowiedzieć w The Mythical Man Month, w sekcji „Conceptual Integrity”. Jeśli nie, jest to co najmniej bardzo istotne dla twojego pytania. Chociaż Brooks opisuje architekturę całego systemu komputerowego, esej doskonale pasuje do frameworków i nowych języków.

Uważam, że istnieje pozytywna korelacja między tempem wdrożenia dowolnej technologii a jej integralnością koncepcyjną i łatwością użycia. Powinno być studium przypadku najnowszych technologii, takich jak języki, frameworki i systemy operacyjne, aby udowodnić tę korelację, ale jeszcze o niej nie wiemy.

maxpolk
źródło
Moim jedynym problemem z tą odpowiedzią jest to, że nie zapewnia ona żadnej rzeczywistej wartości. Odwołuje się do części książki i z twojego opisu miałoby zastosowanie tylko po wydaniu pakietu oprogramowania. Nie udziela mi odpowiedzi przed wydaniem, ponieważ w zasadzie mówi „zrobi dobrze, jeśli będzie łatwy w użyciu i odpowiedni dla domeny”. Nie mogę powiedzieć, jak dobrze sobie poradzi, ponieważ nie jest jeszcze do tego stopnia, aby można było z niego korzystać. W kompilatorach chodzi o to, że wykonujesz mnóstwo pracy, tylko po to, aby zdać sobie sprawę, że jesteś w połowie drogi na górę, i to jest łatwa część.
Allen Clark Copeland Jr