Jak przejść do pisania specyfikacji języka programowania?

16

Naprawdę lubię projektowanie języka programowania. Czasami myślę, że moje projekty językowe i ich potencjalni użytkownicy skorzystaliby z kompleksowego dokumentu normalizacyjnego. Przyjrzałem się wielu standardom językowym, od bardzo formalnego (C ++) do raczej nieformalnego (ECMAScript), ale tak naprawdę nie mogę zrozumieć, w jaki sposób powinienem rozwiązać problemy i zorganizować taki dokument, mimo że myślę, że jestem ogólnie dobry w pisaniu artykułów technicznych.

Czy powinienem napisać to jak długi samouczek, czy bardziej formalny artykuł matematyczny? Jak mogę go aktualizować, jeśli rozwijam go wraz z implementacją referencyjną? Czy powinienem po prostu zrezygnować i traktować wdrożenie i dokumentację jako de facto standard? Ponadto, czy naprawdę jest jakaś znacząca korzyść z posiadania standardu? Czy wymaganie standardu oznacza, że ​​język jest niepotrzebnie złożony?

Jon Purdy
źródło
1
Czy czytałeś już języki specyficzne dla domeny autorstwa Martina Fowlera? amazon.com/...
Gary Rowe,
@Gary Rowe: Nie mam. Wygląda na przyzwoitą lekturę, choć może nie do końca to, czego szukam.
Jon Purdy,
Zaletą standardu nad implementacją referencyjną jest to, że można zdefiniować, gdzie inne implementacje mogą różnić się od tego, co robi twoja implementacja.
Bart van Ingen Schenau

Odpowiedzi:

3

Uważam, że specyfikacja języka Java jest zarówno formalna, jak i czytelna, i myślę, że ma rozsądną strukturę. Niektóre specyfikacje W3C mogą być również dobrym przykładem.

Wykonanie formalnej pracy może pomóc Ci zmniejszyć złożoność języka i zobaczyć przypadki narożne.

Nagłówki zrzut mózgu: kodowanie źródła, leksykacja, podstawowe typy, literały, operatory, wyrażenia, proste instrukcje, warunki, pętle, funkcje (definicje i wywołania), deklaracje typów, moduły, jednostki kompilacyjne, zakres zmiennych, różne rodzaje rozpoznawania nazw (np. import, metody), model pamięci, efekty uboczne, pisanie, współbieżność…

Tobu
źródło
Twoja lista sugestii jest bardzo pomocna. Myślę, że zamierzam zrobić burzę mózgów podobnej listy, posortować ją w formacie samouczka i napisać krótką nieformalną specyfikację z kilkoma formalnymi dodatkami, takimi jak gramatyka EBNF. Na pewno jeszcze raz przyjrzę się specyfikacjom, o których wspomniałeś w sprawie pomysłów.
Jon Purdy,
7

Czytaj dużo i upraszczaj

Opracowanie nowego języka jest trudne. Naprawdę trudny. Ale ostatecznie bardzo satysfakcjonujące, jeśli stanie się popularne i naprawdę rozwiąże problem, którego ludzie doświadczają w elegancki sposób.

Jak wspomniałem w komentarzach, radzę przeczytać Języki specyficzne dla domeny autorstwa Martina Fowlera z następujących powodów:

  1. Zagłębia się w wiele praktycznych pytań na temat tego, dlaczego powinieneś zaprojektować język
  2. Istnieją szczegółowe informacje na temat tego, jak to zrobić (parsery, analizatory leksykalne, stoły robocze języka itp.)
  3. Istnieją szczegółowe instrukcje dotyczące implementacji, w jaki sposób można wybrać wybraną składnię do obsługi pojęć takich jak zamknięcia, adnotacje, listy dosłowne, dynamiczny odbiór itp.

Jeśli chodzi o pisanie specyfikacji, pomyśl o swoich odbiorcach. Oczywiście, zanim przyłożysz palec do klawiatury, aby zaprojektować swój język, musisz dokładnie przemyśleć, co ma robić.

Jeśli jest to nowy, zinterpretowany język, który zastąpi JavaScript, będziesz potrzebować bardzo uczciwego podejścia, aby dotrzeć do twórców stron internetowych z ograniczonym czasem uwagi i chęcią uzyskania natychmiastowych rezultatów - lub szybciej, jeśli to możliwe.

Jeśli zostanie on wykorzystany podczas następnej misji do Titan, wówczas bardzo szczegółowe specyfikacje pokazujące dokładne formalne dowody zachowania każdego elementu będą stanowić minimalny poziom początkowy.

To nie jest prosta rzecz. Aby zbliżyć się do specyfikacji, lepiej byłoby, gdybyś miał dużo doświadczenia w tworzeniu swoich języków, a także w pracy z tymi, którzy faktycznie z nich korzystają na co dzień. Jeśli masz chętne ofiary ... eee ... programiści, w pracy, którzy mogą poświęcić trochę czasu na naukę języka, mogą udzielić informacji zwrotnych na temat tego, co jest potrzebne, aby mogli z niego korzystać.

Krótko mówiąc, zachowaj prostotę, a więcej osób będzie z niego korzystać.

Gary Rowe
źródło
Dzięki za to. Mam duże doświadczenie w rozwijaniu języków, a nawet ich dokładnej dokumentacji, ale to idea standardu stale mnie dopada. Być może będę musiał wybrać zalecaną lekturę i trochę poeksperymentować.
Jon Purdy,
@Jon Purdy Czy masz jakieś przykłady języków online, które możesz uwzględnić w pytaniu?
Gary Rowe,
Nie mam jeszcze przykładów mojego obecnego projektu. Jedyny naprawdę kompletny publiczny przykład języka, który stworzyłem (którego faktycznie używam!) To vision-language.sourceforge.net/cgi-bin/Home
Jon Purdy
@Jon Purdy Vision wygląda interesująco - rodzaj oszałamiającej prędkości. Nawiasem mówiąc, możesz rozważyć zrzut ekranu YouTube pokazujący, jak go zainstalować i napisać przykładową małą stronę internetową (powiedzmy dla lokalnego hydraulika). Ułatwi to krzywą uczenia się, ponieważ ludzie zobaczą ją w działaniu i od razu zaczną czerpać korzyści. Możesz porozmawiać o korzyściach w porównaniu do JSP, Velocity, ASP.Net, Freemarker itp.
Gary Rowe
To jest dobry pomysł; Ostatnio robię filmy na YouTubie (około trzy razy w tygodniu), więc myślę, że zdecydowanie mogę się w to wpasować.
Jon Purdy
3

Wirth zaprojektował i wdrożył wiele języków programowania: spośród nich specyfikacje języków Oberon i Oberon2 wyróżniają się kompletnością, zwięzłością i czytelnością.

Grrussel
źródło
2

Common Lisp i Haskell mają standardy językowe. Ruby i Python mają implementacje i dokumentację. Powiedziałbym więc, że standard językowy nie jest konieczny, ale może być pomocny, jeśli spodziewasz się, że będzie więcej niż jedna implementacja projektowanego języka. Z drugiej strony standard jest przedwczesny, jeśli oczekujesz znacznych zmian w definicji języka.

Larry Coleman
źródło
W rzeczywistości Ruby ma dwie rzeczy, które można by uznać za „specyfikacje”. Istnieje specyfikacja ISO Ruby, która jest obecnie w stanie ostatecznego szkicu i jest pisana przez niektóre osoby, które mają doświadczenie ze specyfikacjami językowymi (pracując nad ANSI Common Lisp i ISO C ++). Istnieje także projekt RubySpec, który jest zestawem wykonywalnych przykładów w stylu RSpec, tworzących zarówno specyfikację czytelną dla człowieka, jak i pakiet testowy zgodności wykonywalnej maszynowo dla tej specyfikacji.
Jörg W Mittag
1

każda specyfikacja powinna być zwięzła i wytrzymać próbę czasu

dlatego widzisz abstrakcję taką jak BNF używaną w wielu standardach językowych ... jej zwięzłość i nadal będzie zrozumiała długo po tym, jak wiele naszych obecnych narzędzi pozostanie w tyle.

oczywiście jest w tym coś więcej niż tylko gramatyka. spójrz na to, co zrobili inni ... perl6, schemat, C ... zajmują się problemami, na których implementator również zależy.

Brad Clawsie
źródło