Autor Wątek: Pisanie kompilatorów  (Przeczytany 5013 razy)

agent_J

  • Gość
# Marzec 01, 2006, 22:16:17
Czy wie ktoś może coś na temat pisania kompilatorów ?? Jakie materiały (książki, tutory) polecilibyście dla newbie w tym dziale.

Z góry dzięki

PS. Tylko nie mówcie żebym poszukał w googlach ;)

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline migajek

  • Użytkownik

# Marzec 01, 2006, 23:17:52
Czy wie ktoś może coś na temat pisania kompilatorów ?? Jakie materiały (książki, tutory) polecilibyście dla newbie w tym dziale.

Z góry dzięki

PS. Tylko nie mówcie żebym poszukał w googlach ;)
proponuje zaczac od nauki asm'a :) jesli potem sie nie zniechecisz to napisz wlasny jezyk skryptowy i jego parser ... jesli i po tym bedziesz mial dosyc motywacji -> spojrz na to http://www.michzimny.prv.pl/ :) source mozna pobrac tylko trzeba mailem poprosic o nie :)

Offline maxbog

  • Użytkownik

# Marzec 01, 2006, 23:19:23
Polecam książkę "Kompilatory.  Reguły, metody i narzędzia." A. V. Aho, R. Sethi, J. D. Ullman z wydawnictwa WNT. Co prawda cena troche odstrasza (160zł), ale jest na prawde świetne źródło wiedzy. Masz tu opisane chyba wszystko co trzeba -analizatory leksykalne, składniowe, generowanie kodu, optymalizacja kodu itd. Do tego jeszcze wprowadza do tematu leksa i yacc'a.

Ogólnie POLECAM.

dopisane do postu powyżej:

Wbrew pozorom znajomość asm'a to jedna z najmniej potrzebnych umiejętności :)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Marzec 01, 2006, 23:28:06
Cytuj
jesli potem sie nie zniechecisz to napisz wlasny jezyk skryptowy i jego parser
Polecam bison'a/yacc'a do tej roboty. :)

Cytuj
Wbrew pozorom znajomość asm'a to jedna z najmniej potrzebnych umiejętności
Jeżeli kompilator ma kompilować do asma (albo tym bardziej kodu maszynowego), to znajomość asma może się nieco przydać. :)

Offline maxbog

  • Użytkownik

# Marzec 01, 2006, 23:35:20
Cytuj
Wbrew pozorom znajomość asm'a to jedna z najmniej potrzebnych umiejętności
Jeżeli kompilator ma kompilować do asma (albo tym bardziej kodu maszynowego), to znajomość asma może się nieco przydać. :)

Hmm... Napisałem "najmniej potrzebnych", a nie "niepotrzebnych" :) O wiele więcej roboty jest przy tworzeniu samego języka, gramatyki, reguł dla poszczególnych symboli, obsługi tablicy symboli czy optymalizacji kodu napisanego przez użytkownika.

Poza tym krychakoder sam stwierdził ze jest newbie więc raczej nie jest polecane tworzenie, jako pierwszego projektu tego typu, kompilatora. O wiele łatwiejsze jest napisanie interpretera, a tu już nie trzeba asm'a.

Offline Liosan

  • Redaktor

# Marzec 02, 2006, 00:25:46
ksiazka, o ktorej wspomnial mj przedmowca znana jest ogolniej jako Dragon Book ze wzgledu na fajnego smoka na okladce anglojezycznej. wydanie polskie jest smoka pozbawione. Tak czy siak, jest to ogolnie uznana ksiazka, ktora jest konieczna i wystarczajaca do napisania sensownego kompilatora (pytanie tylko, jak sobie ludzie radzili zanim ta ksiazka powstala...no i dlatego C++ ma taka obrzydliwa skladnie :>)

co do asma, to rowniez popieram - jakiego kompilatora bys nie pisal, i tak zawsze kod wynikowy jest na pewna maszyne wirtualna (np. szybka maszyne rejestrowa realizowana przez OS z drobna pomoca CPU). Zasadniczym celem kompilacji jest nie generowanie execa ale analizowanie kodu pod katem bledow, naciagniec, umozliwienie sensownego debugowania etc. asm to male piwo.

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Marzec 02, 2006, 16:40:52
Co do tej składni C++ to jest kwestia gustu (jak wszystko co oceniamy jako piękne albo brzydkie) i wg mnie uroda tego języka jest bliska ideału. Nie bez powodu coraz więcej różnych języków, np. skryptowych, się na nim wzoruje, a coraz mniej ma jakieś własne wymyślne konstrukcje. Ładniejszy jest tylko C# :D

Dobra, koniec offtopica. Pisanie kompilatora to nie jest zadanie proste ani też bardzo pożyteczne (bo i języki programowania kompilowane i skryptowe są już napisane, jest ich dużo i są dobre), ale na pewno sprawia dużo frajdy. Do nauki polecam wspomniane wyżej "Kompilatory" (książka z WNT zwana też Dragon Book), a także "Parsing Book".

agent_J

  • Gość
# Marzec 02, 2006, 22:18:49
Tu jest link do mojego pierwszego kompilatora (dialekt basica)

http://agentj.kewlnet.int.pl/downloads/basic.zip

licencja Public Domain

Offline parmezan

  • Użytkownik

# Marzec 02, 2006, 23:43:22
Co do tej składni C++ to jest kwestia gustu (jak wszystko co oceniamy jako piękne albo brzydkie) i wg mnie uroda tego języka jest bliska ideału. Nie bez powodu coraz więcej różnych języków, np. skryptowych, się na nim wzoruje, a coraz mniej ma jakieś własne wymyślne konstrukcje. Ładniejszy jest tylko C# :D

To waść pythona nie widziałeś, to jest dopiero ,,ładny'' język. Że tak jeszcze chwilę ów offtopic pociągnę.

agent_J

  • Gość
# Marzec 03, 2006, 14:13:47
Dzięki za odpowiedzi :). Co do książeczek to zdobyłem już "Kompilatory. Reguły, metody i narzędzia", mam nadzieję że zabiorę się za nią niedługo. Nie chcę pisać swojego kompilatora (sam się jeszcze uczę innych języków), tylko zawsze zadawałem sobie pytanie jak ktoś zrobił coś takiego jak VC++ czy Turbo Pascal - czyli jak ktoś zrobił program który robi programy. Mam nadzieję że się to szybko rozjaśni  ;)

Jeszcze raz dzięki

Offline migajek

  • Użytkownik

# Marzec 03, 2006, 20:31:12
Hmm IMO znajomosc asm jest dosyc potrzebna; jesli chcesz kompilowac do kodu maszynowego musisz wiedziec jak to wszystko dziala ;) a asm jest chyba najblizej tego :) W kazdym razie dla mnie jest to chyba najtrudniejsza rzecz (czyt: taka ktorej nigdy nie probowalem ugryzc) wiec wymienilem na poczatku ;)

agent_J

  • Gość
# Marzec 04, 2006, 10:48:47
Hmm IMO znajomosc asm jest dosyc potrzebna; jesli chcesz kompilowac do kodu maszynowego musisz wiedziec jak to wszystko dziala ;) a asm jest chyba najblizej tego :) W kazdym razie dla mnie jest to chyba najtrudniejsza rzecz (czyt: taka ktorej nigdy nie probowalem ugryzc) wiec wymienilem na poczatku ;)

Znajomość asemblera jest konieczna. Budowanie kompilatora można podzielić na 2 części: zależna i niezależna od procesora. Przykładowo gcc najpierw generuje drzewo instrukcji w kodzie RTL (Register Transfer Language), który zawiera ogólny zbiór operacji (np. movsi, addhi3). Każdy procesor jest opisany w języku RTL, instrukcje są opisane za pomocą wzorców w języku LISP-opodobnym. Przykładowo:
(define_insn "*xorsi_1"
  [(set (match_operand:SI 0 "nonimmediate_operand" "=rm,r")
(xor:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0")
(match_operand:SI 2 "general_operand" "ri,rm")))
   (clobber (reg:CC FLAGS_REG))]
  "ix86_binary_operator_ok (XOR, SImode, operands)"
  "xor{l}\t{%2, %0|%0, %2}"
  [(set_attr "type" "alu")
   (set_attr "mode" "SI")])

To jest przykład definicji instrukcji. Instrukcja ma nazwę xorsi_1, nazwy instrukcji przeważnie nie są potrzebne. (match_operand definiuje sprawdzenie, czy typ operandu jest poprawny. Typ SI to jest typ Single czyli o rozmiarze rejestru (przeważnie 4 bajty), 0 to numer operandu, "nonimmediate_operand" to jest predykat operandu czyli funkcja napisana w C, która sprawdza poprawność operandu i obsługiwane zestawy trybów czyli rm=rejestr lub pamięć, r=rejestr. (xor to wiadomo - definiuje typ operacji. (clobber "przykrywa" rejestry, definiuje skutki uboczne wykonania instrukcji, przykładowo div modyfikuje eax i edx na x86 (wynik dzielenia i reszta).
Następnie jest warunek poprawności wykonania wzorca (ix86_binary_operator_ok (XOR, SImode, operands) i na końcu tekst instrukcji w asemblerze, lub kod w C. (set_attr są używane przy definiowaniu atrybutów instrukcji dla analizatora hazardu jednostek wykonawczych, które również można zdefiniować, przykładowo ile procesor może wykonać dodawań w jednym cyklu rozkazowym. Instnieją również inne wzorce niż instrukcje, ale nie ma sensu ich opisywać. Generator kodu szuka odpowiedniego wzorca i na jego podstawie generuje kod w asemblerze (na końcu). Wcześniej wykonywane są różne analizy i optymalizacje.