Pytanie o tworzenie języka skryptowego

12

Powiedzmy na przykład, że chcę zapłacić komuś za stworzenie języka programowania lub języka skryptowego dla mnie. Jakiego rodzaju dokumentów będą potrzebować, aby w pełni zrozumieć, czego dokładnie chcę.

Mam na myśli, czy istnieją standardowe dokumenty opisujące nowy język programowania / skryptów?

JTS
źródło
ponieważ chodzi o programowanie, a nie programistów, jest to prawdopodobnie lepsze rozwiązanie dla StackOverflow.
Muad'Dib,
14
Nie zgadzam się z Muad'Dibem. Myślę, że to dobre miejsce na to pytanie.
Chris
5
Myślę, że zamiast wymyślać własny język skryptowy, kosztem ogromnej ilości pracy dla Ciebie i Twojego użytkownika, musisz nauczyć się nowego języka, lepiej osadzisz istniejący język skryptowy. Niektóre języki, np. Python, JavaScript / ECMAScript, są zaprojektowane tak, aby można je było osadzić w większym frameworku. Krótko mówiąc, wystarczy zaprojektować interfejs API i znaleźć sposób na osadzenie interpretera skryptów we własnym programie.
Lie Ryan
1
Zaletą tego jest posiadanie języka DSL. dla ogólnego języka nie tak bardzo. Oczywiście niektóre ogólne języki są bardzo dobrą bazą dla DSL, np. Lisp lub TCL
jk.

Odpowiedzi:

16

To, co musisz napisać, nazywa się specyfikacją języka .

Powinien zawierać opis gramatyki języka (najlepiej w formularzu Extended Backus-Naur-Form ) i jego semantykę.

W drugiej części możesz albo napisać opis własnymi słowami (ale bądź dokładny), albo formalną semantykę .

sepp2k
źródło
1
BNF jest użyteczny tylko w gramatyce bez zawartości, języki skryptowe nie zawsze są pozbawione kontekstu, np. TCL (choć myślę, że nadal można argumentować, że lepiej jest mieć język bezkontekstowy w większości przypadków)
jk.
@jk. Nie powiedziałbym, że BNF jest całkowicie bezużyteczny dla języków bezkontekstowych. W zależności od tego, jak składnia jest pozbawiona kontekstu, nadal może być sensowne określenie jej w EBNF, a następnie rozwiązanie dwuznaczności w słowach. Tak właśnie robi na przykład standard C ++. W większości przypadków wyobrażam sobie, że jest to jeszcze bardziej zrozumiałe niż wyjaśnianie wszystkiego słowami lub określanie go za pomocą gramatyki kontekstowej lub nieograniczonej.
sepp2k
prawda, moja uwaga była bardziej, że istnieją języki takie jak lisp, tcl lub dalej (które są naprawdę bardzo dobre do definiowania DSL), które mają zdegenerowane składnie, a więc BNF mówi bardzo mało
jk.
@jk. Jasne, ale w takim przypadku każdy inny sposób opisu składni powie ci równie mało, po prostu dlatego, że tak mało jest do powiedzenia. Oznacza to po prostu, że część składniowa specyfikacji będzie bardzo krótka.
sepp2k
13

Potrzebne będą:

  • Powód utworzenia nowego języka
  • Filozofia
  • Definicja semantyczna
  • Leksykalny opis twoich tokenów
  • Definicja analizy składni

Jak Twój język będzie inny? Jaka jest jego misja? Czy to działa? Czy jest zorientowany obiektowo? Czy to jest metajęzyk? Jakie są jego unikalne cechy? Co da światu, który nie istnieje (lub istnieje w brzydki sposób)? Jak chcesz to zmienić? Czy to jest kompilowane lub interpretowane? DSL czy język ogólnego przeznaczenia? To jest twoja filozofia i dyktuje wiele na temat projektu twojego języka.

Następnie pracuj nad zarysowaniem szorstkiej składni i semantyki na papierze. To będzie twoja semantyczna definicja ... pisanie fałszywego kodu to świetny sposób na rozwinięcie myśli. Przeczytaj „Język programowania C”, aby uzyskać doskonały przykład tego, jak to się robi. Baw się tym.

Następnie będziesz musiał w jakiś sposób zdefiniować swoje tokeny i składnię. Programy przetwarzają je następnie na automaty zdolne do odczytu ciągów i przetwarzania składni. Yacc i Bison używają wyrażeń regularnych i składni w stylu BNF odpowiednio do analizy leksykalnej i składni. Istnieją również narzędzia podobne do Yacc i Bison w innych językach.

Będziesz także potrzebował podstaw w teorii / kompilatorach języka, aby wiedzieć, czego NIE robić. Przykłady obejmują niejednoznaczne gramatyki, problemy z generowaniem i manipulowaniem AST oraz ogólnie, jak uprościć sobie życie. Znajomość teorii jest bardzo ważna. Rozważałbym, aby zacząć od następujących rzeczy:

Kompilatory: zasady, techniki i narzędzia (Dragon Book)
Nowoczesne wdrożenie kompilatora w C lub Nowoczesne wdrożenie kompilatora w Javie

Aiden Bell
źródło
1
+1 za filozofię, w przypadku DSL wyraźnie chcesz tutaj zidentyfikować domenę
jk.
8

99,9% czasu na tworzenie nowego języka jest całkowicie niepotrzebne. Zwrot z inwestycji byłby najprawdopodobniej niewielki i po prostu zmarnowałbyś swój czas.

Najprawdopodobniej możesz używać Javascript jako podatnego języka skryptowego, a dla większości języków dostępne są już parsery. Możesz także użyć innych języków skryptowych, które ci się podobają, jeśli znajdziesz dla nich odpowiedni parser. Wdrożenie ich do programu wymagałoby znacznie mniej pracy i przyniosłoby większe zyski. Ludzie nie muszą uczyć się innego języka, muszą tylko nauczyć się interfejsu API. To znacznie lepsze rozwiązanie.

Tworzenie nowego języka jest prawie zawsze złe.

TheLQ
źródło
9
Z wyjątkiem wielu razy, kiedy nie jest źle. Tworzenie własnych prostych DSL może być bardzo przydatne. Teraz tworzenie własnego języka ogólnego przeznaczenia będzie bardziej zgodne z tym, co mówi twoja odpowiedź.
ChaosPandion
@ChaosPandion, ale wiele języków już przoduje w tworzeniu DSL, który używa kodu z tego języka (tj. Ruby jest w tym dobry)
alternatywnie
2
Zgadzam się z twoją odpowiedzią, ale uważam, że nie jest to odpowiednia odpowiedź na to pytanie. Wierzę, że pytający patrzy na ogólne zasady tworzenia języka skryptowego, a nie na zalety / wady tworzenia takiego języka.
Tim Murphy
Stworzenie nowego języka jest prawie zawsze najlepszym rozwiązaniem. en.wikipedia.org/wiki/Language-oriented_programming
SK-logic
3

Możesz opisać gramatykę swojego języka w BNF .

Na przykład jest to gramatyka Pythona .

grokus
źródło
6
Gramatyka sama w sobie nie wystarcza jednak do zaimplementowania języka. Będzie musiał również określić semantykę w taki czy inny sposób.
sepp2k
0

jeśli używasz platformy .NET, natknąłem się na coś, z czym się kiedyś spotkałem. Rzuciłem mu tylko dziwne spojrzenie, ale może przydałoby ci się: ironia .

Irony to zestaw programistyczny do implementacji języków na platformie .NET.

DevSolo
źródło