Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
Nowa wersja
Both sides next revision
|
pl:miw:miw08_ruleruntimel [2008/05/20 13:52] gjn |
pl:miw:miw08_ruleruntimel [2008/05/26 22:17] miw |
| |
| |
====== Sprawozdanie ====== | |
-Czym jest HLVM, cele, założenia. | |
HLVM jest(będzie) zestawem narzędzi do tworzenia języków programowania. Głównymi celami autorów HLVM jest zajęcie się aspektami kompilacji, optymalizacji oraz uruchamiania programów napisanych w tworzonym języku. HLVM jest osadzone na wierzchu LLVM (Low Level Virtual Mashine) która zajmuje się generacją kodu, optymalizacją, kompilacją JIT itp. HLVM obsługuje języki dynamiczne tj. takie które wymagają kompilacji w locie bądź umożliwiają interpretację. HLVM jest oparty o system wtyczek co zwiększa elastyczność. Zadaniem wtyczki jest przekształcenie kodu źródłowego tworzonego języka do postaci drzewa AST a pozostałymi czynnościami (kompilacja, uruchomienie) zajmuje się HLVM. Ponieważ jest wspólne środowisko uruchomieniowe dla wszystkich języków daje to możliwość współdziałania programów napisanych w różnych językach (choć nie ma na to gwarancji). | |
-Stan faktyczny na kwiecień. | |
W chwili obecnej HLVM wydaje się być martwy – ostatnie wpisy na listach dyskusyjnych oraz ostatnie aktualizacje CVS są z ubiegłego roku. Dokumentacja jest w stanie szczątkowym. Wszystko to powoduje, że HLVM nie jest jeszcze gotowy do użycia. | |
-Jak teoretycznie uruchomić prolog na HLVM. | |
Twórcy HLVM twierdzą, że będzie możliwość uruchamiania programów napisanych w Prologu. Język definiuje się w postaci pliku XML np: | |
http://hlvm.org/src/test/return0/helloworld.hlx | |
Ponieważ dokumentacja jest bardzo szczątkowa i nie opisuje praktycznie nic ponad powyższe helloworld trudno jest mówić "jak" można uruchomić prologa w HLVM. | |
W chwili obecnej analizuję możliwość uruchamiania Prolog-a na LLVM, prawdopodobnie wymagałoby to napisania programu w C/C++ (LLVM obsługuje tylko źródła w języku C o C++ oraz niekompletnie Javę). | |
-Prolog można uruchamiać na wirtualnej maszynie Javy na dwa sposoby: | |
-Wykonać translację kodu Prolog-a do Javy a następnie taki kod Javy skompilować i uruchomić (Prolog Cafe: http://kaminari.istc.kobe-u.ac.jp/PrologCafe/) | |
-Dokonać translacji wprost do bytecode zrozumiałego dla JVM a następnie za pomocą własnych class loaderów załadowanie takiego bytecodu i uruchomienie go (unika się kodu pośredniego javy) | |
-Istnieją programy umożliwiające translację (kompilację) kodu Prolog-a do bytecode np JINNI | |
JINNI posiada napisaną w Javie implementację WAM. Kod źródłowy prolog-a kompiluje się w interpreterze JINNI (ucompile(InFiles,BasicFile,OutFile)). Jako rezultat otrzymuje się bytcode który następnie można uruchomić przez komendę : java -cp ".;prolog.zip" prolog.kernel.Main <plik.bp> gdzie prolog.zip jest archiwum dostarczonym z JINNI. Istnieje również MINERVA (też komercyjna), która posiada własną maszynę wirtualną i kompiluje kod prolog-a do bytecodu a następnie sama uruchamia w Javie. | |
| |
- LLVM a Prolog - z przeczytanej dokumentacji oraz wikipedii (http://en.wikipedia.org/wiki/Low_Level_Virtual_Machine) wynika, że LLVM ma zastosowanie do języków proceduralnych. Stąd odpada możliwość napisania wprost kompilatora dla Prologa przy użyciu LLVM. Możliwe natomiast wydaje się napisanie iterpretera w C/C++ (czyli praktycznie napisanie czegoś na kształt SWI-Prolog) a następnie dopiero poddanie takiego programu do obróbki w LLVM. | |
EDIT: Przyglądając się podstawowym strukturom danych oraz dostępnym funkcjom LLVM wydaje się możliwa translacja kodu WAM do postaci LLVM (opieram się tutaj na dokumentacji LLVM oraz opisie WAM z dokumentu "Warren's Abstract Machine: A Tutorial Reconstruction". <del>LLVM umożliwia tworzenie własnych rejestrów poprzez pliki (opis : http://llvm.org/docs/CodeGenerator.html#regalloc ). Nie ma problemu jeżeli maszyna docelowa nie posiada odpowiednich rejsetrów gdyż zostaną one zaalakowane w pamięci komputera.</del> Powyższe tyczy się budowania backendów tzn tłumaczenia kodu LLVM na kod maszyny docelowej. Tłumaczenie kodu Prologu na w czyste LLVM wydaje się bardzo kłopotliwe. Pomimo, że Prolog rozkłada się na kod WAM który można łatwiej przekształcać, to korzysta bardzo intensywnie z rejestrów (nawroty, punkty wyboru itp) przez co tłumaczenie do LLVM może być skomplikowane. Być może dałoby się to zrealizować przez dodanie do wywołań funkcji dodatkowego parametru z opisem stanu funkcji. Bardziej realne wydaje się zaimplementowanie maszyny WAM przy pomocy LLVM a następnie interpretacja kodu WAM przy użyciu tejże maszyny. Rejestry można zasymulować przez globalne tablice. | |
| |
- Prolog a bytecode. Z przeczytanej dokumentacji oraz wpisów w grupach dyskusyjnych wynika, że wszystko sprowadza się do wygenerowania bytecode wirtualnej maszyny prologu (WAM) a następnie interpretacja programów. Ciekawe są natmiomiast rozwiazania takie jak Prova (http://www.prova.ws/) które łączą składnię Javy i Prologa. Pewnej analizy można dokonać na podstawie działania programy GNU Prolog umożliwiającego generowanie kolejno kodu WAM, kodu mini-assemblera a następnie kodu assemblera dla maszyny docelowej. np: dla predykatu ''student(lisa, 5).'' otrzymamy reprezentację WAM [[http://jasiu.tuxpowered.net/miw/program.wam]] następnie kod mini-assembly [[http://jasiu.tuxpowered.net/miw/program.ma]] oraz kod assemblera maszyny docelowej [[http://jasiu.tuxpowered.net/miw/program.s]]. Możliwe jest również generowanie bytecodu [[http://jasiu.tuxpowered.net/miw/program.wbc]] który można wczytać predykatem load/1 | |
| |
| ====== Sprawozdanie ====== |
| ==1. Cel projektu == |
| Celem projektu było zbadanie możliwości użycia maszyn wirtualny do uruchamiania programów napisanych w Prologu. Szczególnie należało przeanalizować możliwości wirtualnej maszyny Javy (JVM) oraz tzw. HLVM (High Level Virtual Machine) oraz LLVM (Low Level Virtual Machine). Należało sprawdzić jakie są możliwosci translacji i uruchomienia kodu Prologa (a dokładniej reprezentacji WAM) na wyżej wymienionych maszynach. |
| |
| ==2. Sprawozdanie == |
| 1. WAM (WarrenAbstract Machine) |
| WAM jest abstrakcyjną maszyną wirtualną opracowaną przez Davia H. D. Warrena w 1983r. WAM służy do wykonywania programów napisanych w języku Prolog. Składa się z pamięci oraz zestawu instrukcji. Głównym celem jest umożliwienie łatwiejszej translacji kodu napisanego w Prologu na kod maszynowy. Jest to możliwe, dzięki temu, że reprezentacja WAM jest niższego poziomu niż Prolog, i jest łatwiejsza do interpretacji. |
| Model pamięci WAM jest dość skomplikowany: |
| -sterta (stos globalny): do przechowywania złożonych term |
| -stos lokalny (przechowuje punkty nawrotu i ramki “środowiska” (enviroment frame)) |
| -trail (wykorszystywany do usuwania zmiennych przy nawrotach) |
| 2. Możliwości uruchamiania programów Prologa w innych maszynach wirtualnych |
| 2.1 JVM |
| Prolog można uruchamiać na wirtualnej maszynie Javy na dwa sposoby: |
| *wykonać translację kodu Prolog-a do Javy a następnie taki kod Javy skompilować i uruchomić (Prolog Cafe: http://kaminari.istc.kobe-u.ac.jp/PrologCafe/) |
| *Dokonać translacji wprost do bytecode zrozumiałego dla JVM a następnie za pomocą własnych class loaderów załadowanie takiego bytecodu i uruchomienie go (unika się kodu pośredniego javy) Istnieją programy umożliwiające translację (kompilację) kodu Prolog-a do bytecode np JINNI JINNI posiada napisaną w Javie implementację WAM. Kod źródłowy prolog-a kompiluje się w interpreterze JINNI (ucompile(InFiles,BasicFile,OutFile)). Jako rezultat otrzymuje się bytcode który następnie można uruchomić przez komendę : java -cp “.;prolog.zip” prolog.kernel.Main <plik.bp> gdzie prolog.zip jest archiwum dostarczonym z JINNI. Istnieje również MINERVA (też komercyjna), która posiada własną maszynę wirtualną i kompiluje kod prolog-a do bytecodu a następnie sama uruchamia w Javie. |
| 2.2 HLVM |
| HLVM jest(będzie) zestawem narzędzi do tworzenia języków programowania. Głównymi celami autorów HLVM jest zajęcie się aspektami kompilacji, optymalizacji oraz uruchamiania programów napisanych w tworzonym języku. HLVM jest osadzone na wierzchu LLVM (Low Level Virtual Mashine) która zajmuje się generacją kodu, optymalizacją, kompilacją JIT itp. HLVM obsługuje języki dynamiczne tj. takie które wymagają kompilacji w locie bądź umożliwiają interpretację. HLVM jest oparty o system wtyczek co zwiększa elastyczność. Zadaniem wtyczki jest przekształcenie kodu źródłowego tworzonego języka do postaci drzewa AST a pozostałymi czynnościami (kompilacja, uruchomienie) zajmuje się HLVM. Ponieważ jest wspólne środowisko uruchomieniowe dla wszystkich języków daje to możliwość współdziałania programów napisanych w różnych językach (choć nie ma na to gwarancji). |
| *Stan faktyczny na kwiecień. |
| W chwili obecnej HLVM wydaje się być martwy – ostatnie wpisy na listach dyskusyjnych oraz ostatnie aktualizacje CVS są z ubiegłego roku. Dokumentacja jest w stanie szczątkowym. Wszystko to powoduje, że HLVM nie jest jeszcze gotowy do użycia. |
| *Jak teoretycznie uruchomić prolog na HLVM. |
| Twórcy HLVM twierdzą, że będzie możliwość uruchamiania programów napisanych w Prologu. Język definiuje się w postaci pliku XML np: http://hlvm.org/src/test/return0/helloworld.hlx Ponieważ dokumentacja jest bardzo szczątkowa i nie opisuje praktycznie nic ponad powyższe helloworld trudno jest mówić “jak” można uruchomić prologa w HLVM. |
| 2.3 LLVM |
| Z przeczytanej dokumentacji oraz wikipedii (http://en.wikipedia.org/wiki/Low_Level_Virtual_Machine) wynika, że LLVM ma zastosowanie do języków proceduralnych. Stąd odpada możliwość napisania wprost kompilatora dla Prologa przy użyciu LLVM. Możliwe natomiast wydaje się napisanie iterpretera w C/C++ (czyli praktycznie napisanie czegoś na kształt SWI-Prolog) a następnie dopiero poddanie takiego programu do obróbki w LLVM. Tłumaczenie kodu Prologu na w czyste LLVM wydaje się bardzo kłopotliwe. Pomimo, że Prolog rozkłada się na kod WAM który można łatwiej przekształcać, to korzysta bardzo intensywnie z rejestrów (nawroty, punkty wyboru itp) przez co tłumaczenie do LLVM może być skomplikowane. Być może dałoby się to zrealizować przez dodanie do wywołań funkcji dodatkowego parametru z opisem stanu funkcji. Bardziej realne wydaje się zaimplementowanie maszyny WAM przy pomocy LLVM a następnie interpretacja kodu WAM przy użyciu tejże maszyny. Rejestry można zasymulować przez globalne tablice. |
| 3. Inne uwagi |
| Można wykonać kompilację programu napisane w Prologu do postaci WAM albo tzw MiniAssembly (pseudo-asembler) a następnie taki kod połączyć z biliboteką dostarczoną przez GNUProlog i otrzymać program który można uruchamiać bezpośrednio (nie trzeba żadnej wirtualnej maszyny). |
| ==3. Wnioski== |
| Z analizy wynika, że uruchamianie kodu Progolga sprowadza się do przetłumaczenia poleceń WAM do postaci zgodnej z daną maszyną wirtualną, a następnie interpretacja tychże poleceń przez zaimplementowaną w danym jezyku maszyną WAM. Bezpośrednia translacja wydaje się cięzka (albo wręcz niemożliwa) głównie ze względu na skomplikowane opracje na rejestrach i pamięci wykonywane przez WAM. Opisane maszyny wirtutalne (poza HLVM, która jest martwa) nadają się do języków proceduralnych takich jak Java czy C++. |
| |
| |