2009-08-22 15 views
5

Proszę, potrzebuję trochę zasobów, aby rozpocząć (jestem studentem cs)jaki jest najlepszy język programowania do tworzenia analizatorów i kompilatorów?

+1

Dupe z http://stackoverflow.com/questions/1669/learning-to-write-a-compiler wśród wielu, wielu innych –

+0

Jeśli jest to otwarte zapytanie o zasoby, to Neil ma rację. Jeśli wymaga porównania i kontrastu, graniczy z "subiektywnym i kłótliwym" – dmckee

+0

Zobacz [co jest najlepszym-językiem do napisania-a-kompilacji-w] (http://stackoverflow.com/ pytania/809710/what-is-the-best-language-to-write-a-compiler-in) – nawfal

Odpowiedz

9

Odpowiedź może być bardzo subiektywna. Ale polecam użycie ANTLR, jeśli chcesz napisać parser. Obecnie ANTLR obsługuje cele C, C#, ActionScript, JavaScript i Java. Z mojego doświadczenia wynika, że ​​wersja Java jest bardzo stabilna w użyciu i została wykorzystana w wielu potężnych projektach open source, mianowicie Drools i Hibernate.

2

Lisp/Scheme było tym, do czego nam zlecono używanie z powrotem w uni.

Służą sobie całkiem dobrze do tego zadania.

Dan

2

Chociaż kiedyś książkę tekst zatytułowany „Wdrożenie nowoczesnych kompilator Java” Myślę, że specjaliści nadal korzystać C.POZOSTAŁE niż udowodnić, że ich język może się skompilować.

6

Czy trzeba napisać w języku programowania? Lub możesz użyć Flex i Bison?

+1

Chciałem również zaproponować Flex i Bison. :-) –

+4

Generatory analizatorów nie usuwają potrzeby używania języka programowania. Generują one analizator składni w określonym języku. Tradycyjnym językiem Flex/Bison (LEX/YACC) jest C. – Brannon

+0

@Brannon +1 za komentarz; nadal potrzebujesz języka programowania. Jednak chciałbym dodać, że Flex/Bison lub Lex/Yacc są dość nieaktualne. Jeśli używałeś czegoś podobnego do Coco/R i idziesz do Lex/Yacc, znajdziesz się w rozpaczliwym poszukiwaniu funkcji, z których żadna nie jest wcześniejsza niż jedna. – Imagist

0

Czy chcesz napisać parser dla języka ogólnego przeznaczenia? W tym przypadku wyraźnie zaleca się pisanie (i ładowanie) w języku docelowym. Powinieneś jeść swój własny pies.

+1

Powiedziałbym: "zalecane w wielu przypadkach", a nie "wyraźnie zalecane". "Język ogólnego przeznaczenia" jest w pewnym sensie mylący, ponieważ nie ma żadnego języka, który byłby odpowiedni dla * wszystkich * zadań. Nie napisałbym aplikacji WWW w C i nie napisałbym systemu operacyjnego w Pythonie. Nie chodzi o to, że nie możesz zrobić żadnej z tych rzeczy; po prostu nie byłoby to właściwe. Jeśli akceptujesz tę logikę, to sensowne jest pisanie języka ogólnego przeznaczenia, który nie jest odpowiedni do analizowania i dlatego nie powinien być używany do parsowania samego siebie. – Imagist

+1

Oto ładny przykład: * cały * interpretator JavaScript projektu STEPS to tylko 170 wierszy kodu źródłowego OMeta i zabrał jedną osobę na popołudnie, aby napisać. W interpretatorze JavaScript Narcissus sam analizator składni * zawiera więcej niż 1000 wierszy kodu JavaScript, a kolejne 1000 wierszy dla gościa AST. Używanie JavaScriptu do implementacji JavaScript jest 10 razy bardziej szczegółowe niż użycie OMeta. –

+0

Ale spłukujesz zgromadzone błędy, jeśli naprawdę używasz parsera/kompilatora. I naprawdę używasz go, implementując go w tym języku. – Mnementh

1

Jeśli wdrażasz kompilator od podstaw, większość języków programowania spełnia wymagania. (Nawet znam kompilatory/parsery napisane w Fortran IV i COBOL, chociaż nie polecałbym tego!)

Ale jeśli język, który próbujesz wdrożyć, ma nawet nietrywialną gramatykę, lepiej za pomocą generatora lexera i/lub generatora analizatora do implementacji przedniego końca. Otrzymasz znacznie szybszy i bardziej niezawodny analizator składni.

Na tej podstawie odpowiednie języki programowania, dla których dostępny jest przyzwoity generator parsera. Na stronie Wikipedia znajduje się strona, która porównuje dużą liczbę generatorów analizatorów składni. Nie zdawałem sobie sprawy, że jest ich tak wiele!

1

Jeśli twoim celem jest poznanie technik stojących za parserami (i tokenizerami), to może lepiej napisać je samemu od podstaw. Możesz to zrobić w większości języków programowania, dzięki czemu możesz wybrać ten, który Ci odpowiada.

Jakiś czas temu napisałem serię wpisów na blogu, które pokazują, jak łatwo jest napisać parser dla małego fikcyjnego języka programowania podobnego do języka BASIC, w języku C#. Nie chcę tutaj spamować, więc nie podam bezpośredniego linku, ale jeśli odwiedzasz blog (zobacz mój profil) i przejdź do dołu, możesz znaleźć link "Pisanie parsera" w "moje posty "-Sekcja.

3

Będziesz chciał przejrzeć generatory analizatora składni. Jeśli jesteś uczniem CS, prawdopodobnie zechcesz rzucić okiem na Dragon Book: http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools.

Najprawdopodobniej najłatwiej byłoby zbudować parser przy użyciu języka C# lub Java, ponieważ nie musisz się martwić takimi kwestiami, jak zarządzanie pamięcią itp., I można skupić się na gramatyce.

Dobry generator par C# to GPPG: http://plas.fit.qut.edu.au/gppg/.

+0

Czy ktoś może wyjaśnić, dlaczego zostało to odrzucone? Dragon Book to doskonały zasób, a C#/java podąża za słowem pytania. Chociaż myślę, że samo pytanie jest głupie. – gimpf

4

Parser i kompilatory to dwa osobne problemy. Na przykład mógłbym napisać kompilator w C, ale nigdy nie napisałbym parsera w C (użyłbym generatora parsera).W przypadku bardzo prostych analizatorów, w których prędkość nie jest priorytetem, mogę ręcznie zakodować parser w Perlu lub Pythonie, które mają dobre możliwości manipulowania tekstem. Ale dla czegoś poza bardzo prostym parserem użyłbym jakiegoś narzędzia do generowania parsera. Najczęściej używane to: ANTLR, Coco/R i Lex/Yacc oraz implementacja GNU Flex/Bison. Moje osobiste preferencje to Coco/R, ale ANTLR wydaje się obecnie bardziej popularny.

Jeśli piszesz język programowania ogólnego przeznaczenia, możesz rozważyć zapisanie go w sobie. Jest wiele korzyści, w tym przenośność (ludzie muszą tylko portować pierwszą wersję języka) i demonstrację możliwości (parsowanie jest trudnym problemem, więc jeśli można to zrobić w twoim języku, jest to dowodem na twój język). Jeśli twój język zostanie zinterpretowany, może to nie być odpowiednie ze względu na wydajność.

Powiązane problemy