xyzzyz/ZPP — Issue #1: Generowanie kodu wynikowego
Author: jaro3000
Created: 2011-10-08 15:20:47+00:00
State: open

Oglądałem w czwartek tego LLVMa, nauczyłem się tego ich pośredniego asemblera, napisałem prosty kompilator w OCAMLu, oto kilka luźnych myśli:

- Asembler jest bardzo przyjemny, oparty o SSA ( http://en.wikipedia.org/wiki/Static_single_assignment_form ). Pisze się w nim świetnie, kompiluje się do niego ładnie. Każdy kto miał w życiu do czynienia z asemblerem x86 będzie w siódmym niebie.

- Bindingi OCAMLowe - cudów nie ma, de facto sprowadzają się do funkcji pod tytułem "napisz wskazaną instrukcję asemblera we wskazane miejsce kodu".

- interpretowanie wygenerowanego bytecode'u z poziomu OCAMLa - ( przyda się nam do makr - chcemy w końcu część naszego kodu wykonywać na etapie kompilacji ) - z tego co widziałem w dwóch czy trzech instrukcjach, nic prostszego (!). Nie używałem tego sam, ale wydaje się używalne.

- Cuda na kiju: wbudowane w ten asembler jest jakieś rozwijanie stosu (wraz z komentarzem, że nie za bardzo działa, pracują nad tym i interfejs może się zmieniać), oraz jakieś GC (?!) --- nie wnikałem w szczegóły, zgaduję że GC będzie dla nas niewystarczający, trzeba będzie zrobić własny. Rozwijanie stosu może się przydać jak dorośniemy.

Dalej, co jak już się wygeneruje ten llvm-owy asembler? Ot, stąd już dwa kroki do sukcesu. Narzędzie llc robi z tego po prostu plik .s w assemblerze targeta, plik .s za pomocą narzędzia "as" kompilujemy do .o. Linkowanie proponuję robić, (przy najmniej na początku) za pomocą gcc - dolinkuje nam standardową bibliotekę C, może być użyteczna (w szczególności dolinkowuje crt1.o, w którym jest _start przygotowujący środowisko i wywołujący main).

Ogólnie będziemy chcieli zachować to, żeby przy minimalnej ilości pracy można było komunikować się z kodem napisanym w C. Startujemy z dobrej pozycji.

W niedzielę wieczorkiem wrzucę do repo kod źródłowy wynikły z mojej zabawy.