Podstawowe funkcje podstawowego języka? Sugestie DSL?


9

W końcu zacząłem rozumieć złożoność tworzenia interpretera i kompilatora. Zbudowałem kilka wersji TinyBasic, 1964 (Dartmouth) Basic, i moje własne rozszerzenia na te języki, zanim przejdę do tego punktu. Najnowszy projekt nazywam Open Source Basic ... ponieważ nie mogłem wymyślić żadnych innych cech języka, które zainteresowałyby ludzi. Aby móc otworzyć źródło języka i zrozumieć, jak wykonywane są niektóre skomplikowane rzeczy (w jaki sposób wykonuje się skanowanie, analizę, interpretację i kompilację)

Open Source Basic jest najpierw tłumaczony na język oparty na stosie. Ten język oparty na stosie jest następnie interpretowany i wykonywany natychmiast lub zamieniany w plik wykonywalny CLR.

Moje pytania sprowadzają się do tego:

  • Jakie są podstawowe cechy / konstrukcje języka opartego na języku podstawowym? Mam już te podstawowe konstrukcje: Przydziały, Wyrażenia, Zmienne, niektóre funkcje (Losowe, ToUpper, ToLower), Pętle (dla i do-while / till), If (blok i jednowierszowe) Inne decyzje, dane wejściowe na konsoli (dane wejściowe ) i danych wyjściowych (Drukuj) oraz podprogramów (jeszcze bez parametrów).
  • Kiedy „skończę” dodawanie podstawowych konstrukcji do mojego języka - jak mam się rozwijać? W jakich domenach? Innymi słowy, w jakim kierunku powinien podążać mój podstawowy język open source po uruchomieniu wszystkich ogólnych konstruktów?

Dziękuję za Twój czas,

Dominick


3
Zawsze chciałem mieć miernik, który ma wbudowaną funkcjonalność AOP obsługiwaną przez składnię.
FrustratedWithFormsDesigner

@Dominick: A co z funkcjonalnością LINQ?
Predator

@Frustrated ... AOP - funkcjonalność programowania zorientowanego na aspekty? Czy możesz podać przykład?
Dominick

5
Nie należy zaczynać wymyślać języka specyficznego dla domeny na podstawie podstawowych funkcji imperatywnych. Najpierw sformalizuj swoją domenę, zmień tę wiedzę na język, a dopiero potem dodaj podstawowe funkcje, jeśli w ogóle są konieczne. Prawdopodobnie skończyłbyś z doskonałym DSL, który nie jest kompletny z Turinga i jest to jedna z najlepszych właściwości DSL.
SK-logic

1
Z pewnością „goto” jest obowiązkową funkcją każdego języka BASIC?
Perry

Odpowiedzi:


1

Moje doświadczenia z wczesnym BASICem na Commodore [Vic-20, C-64] dały mi wrażenie, że numery linii były podstawową „cechą” BASIC. Wygląda na to, że nie są już używane w nowoczesnych implementacjach, co jest dla mnie trochę szkodliwe, ponieważ moim podstawowym poglądem na BASIC jest język uczenia się, z którego można przejść do czegoś innego.


1

Zdecydowanie szlachetne przedsięwzięcie, ale myślę, że odwróciłeś swoje priorytety.

Pierwszą troską powinny być problemy z „domeną”, którymi powinien zająć się Twój język. Dlatego nazywa się go „językiem specyficznym dla domeny”. DSL jest tolerowany tylko wtedy, gdy jest mały, prosty i bardzo wąsko skoncentrowany, aby rozwiązać określony zestaw problemów, takich jak nóż przez masło.

Po zidentyfikowaniu domeny i sposobie działania języka w domenie możesz określić konkretne konstrukcje lub funkcje.

Wreszcie pomocne może być rozważenie, czy chcesz mieć DSL wewnętrzny czy zewnętrzny .


0

Opracowuję język skryptowy dla aplikacji CAE / FEA, a niektóre funkcje, które uznałem za przydatne dla użytkowników końcowych, to: Zmienne lokalne i globalne Matryce z dynamicznym przydzielaniem i rozszerzaniem Funkcje z argumentami i przekazywaniem referencji Struktury (typy zdefiniowane przez użytkownika) Wraz z funkcje, o których wspomniałeś, powinny na początek stanowić dość mocny język. Następnie będziesz rozwijać zgodnie z życzeniem użytkownika.


To interesujący i bardzo specyficzny dla danej domeny język (inżynieria wspomagana komputerowo / analiza elementów skończonych). Rozumiem, dlaczego potrzebujesz matryc. Wszystkie twoje sugestie są całkiem dobre i będę o nich pamiętać. Dzięki.
Dominick

0

Istnieje kilka funkcji, które można dodać lub rozszerzyć, jeśli już istnieją, ale ...

... Podstawowe języki programowania są bardzo podobne do języków skryptowych, a funkcją, której wielu później brakowało lub które zawierało, była przestrzeń nazw lub moduły.

C, C ++, PHP, Visual Basic, uruchomiono bez modułów / przestrzeni nazw i gdzie dodano później.

Następne mogą być podprogramy (procedury lub funkcje, które nie zwracają wartości) oraz funkcje (podprogramy, które zwracają specjalną wartość).


0

zrozumieć, jak wykonywane są niektóre złożone rzeczy (w jaki sposób skanowane, analizowane, interpretowane i kompilowane)

Na stronie stosu przepełnienia stosu znajduje się ładne pytanie dotyczące zasobów pozwalających zrozumieć kompilatory. Możesz także zajrzeć na stronę mojej klasy Kompilatory .

Kiedy „skończę” dodawanie podstawowych konstrukcji do mojego języka - jak mam się rozwijać?

Biorąc pod uwagę funkcje, które już zbudowałeś, sugeruję dodanie trzech typów danych: int, string, boolean. Musisz zrobić trzy rzeczy, każda nieco trudniejsza niż wcześniej:

  1. Zmodyfikuj gramatykę, aby można było analizować te słowa kluczowe. Test.
  2. Utwórz (lub dodaj do istniejącej) tabelę symboli, abyś mógł dołączyć typ danych wraz z nazwą zmiennej i innymi właściwościami. Następnie wykonaj przełącznik debugowania, abyś mógł to przetestować i zobaczyć tabelę symboli.
  3. Sprawdź kompatybilne typy przed wygenerowaniem kodu do MsIL lub podczas interpretacji. Testuj zarówno przypadki błędów, jak i inne niż błędy w każdym trybie wykonywania dla wszystkich typów.

Jeśli wszystko pójdzie dobrze, sugeruję pracę nad zasięgiem (lokalnie w podprogramach vs. globalnie). Daj mi znać, jeśli potrzebujesz porady na ten temat.

Powodzenia. I baw się dobrze!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.