Spis treści

Opis

Projekt zakończony

Andrzej, Jasiński, jasiu@tuxpowered.net

Investigate runtime integration aspects, mainly virtual machine runtimes

Spotkania

spotkania

Projekt

Większość z dostępnych implementacji polega na interpretowaniu przez program napisany w Javie kodu pisanego w Prolog-u. Istnieją implementacje np http://www.binnetcorp.com/Jinni/ umożliwiające skopilowanie programu prologa do bytecodu a następnie uruchomienie w javie ( przez dodatkowe klasy uruchamiające(własne class loadery?))

Co do list HLVM to wyglądają na martwe (o ile dobrze patrze do ostatni wpis jest z 2007 roku) i brak jest informacji odnośnie tworzenia pluginów do HLVM.

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:

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).

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.

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++.

Materiały

See WAM links

Different languages on JVM including Prolog.

http://www.artima.com/insidejvm/ed2/ - książka traktująca o budowie JVM

http://www.eecs.umich.edu/gasm/papers/wam.html - opis WAM

http://www.gprolog.org/manual/html_node/gprolog008.html