Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
Nowa wersja Both sides next revision
pl:miw:miw08_ruleruntimel [2008/04/07 21:19]
miw
pl:miw:miw08_ruleruntimel [2008/05/26 22:17]
miw
Linia 32: Linia 32:
   * przegląd http://​www.robert-tolksdorf.de/​vmlanguages.html   * przegląd http://​www.robert-tolksdorf.de/​vmlanguages.html
   * listy dyskusyjne hlvm   * listy dyskusyjne hlvm
 +
  
 ===== 080408 ===== ===== 080408 =====
Linia 41: Linia 42:
     * podejścia Prolog->​bytecode...     * podejścia Prolog->​bytecode...
       * jinni, etc       * jinni, etc
 +
 +
 +
 +===== 080422 =====
 +  * możliwe scenariusze uruch prologu na h/llvm
 +  * generowanie bytecode z prologu, np. dla jvm, pośrednia reprezentacja WAM (assembler)
 +
 +===== 080429 =====
 +  * możliwośc reprezentacji jmasz WAM na LLVM
 +
 +
 +
 +===== 080520 =====
 +  * repr. wam dla llvm, rejestry wam?
 +
 +===== 080527 =====
 +  * sprawozd. co to wam, jakie podejścia do impl. na llvm
  
 ====== Projekt ====== ====== Projekt ======
Linia 48: Linia 66:
  
 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. 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 ====== ====== Sprawozdanie ======
-  -Czym jest HLVM, celezałożenia.  +==1. Cel projektu == 
-    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). +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. 
-  -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. +==2. Sprawozdanie == 
-  -Jak teoretycznie uruchomić prolog na HLVM. +1. WAM (WarrenAbstract Machine) 
-Twórcy HLVM twierdzą, że będzie możliwość uruchamiania programów napisanych w Prologu. Język definiuje się w postaci pliku XML np: +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żliwedzięki temuże reprezentacja WAM jest niższego poziomu niż Prolog, i jest łatwiejsza do interpretacji. 
-http://​hlvm.org/​src/​test/​return0/​helloworld.hlx +Model pamięci WAM jest dość skomplikowany:​  
-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ę). +-sterta (stos globalny): do przechowywania złożonych term 
-  -Prolog można ​uruchamiać na wirtualnej maszynie Javy na dwa sposoby: +-stos lokalny (przechowuje punkty nawrotu i ramki “środowiska” (enviroment frame)) 
-    -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/​) +-trail (wykorszystywany do usuwania zmiennych przy nawrotach) 
-    ​-Dokonać translacji wprost ​do bytecode zrozumiałego dla JVM a następnie ​za pomocą własnych class loaderów załadowanie takiego bytecodu ​uruchomienie go (unika się kodu pośredniego javy+2Możliwości uruchamiania programów Prologa w innych maszynach wirtualnych 
-  ​-Istnieją programy umożliwiające translację (kompilację) kodu Prolog-a ​do bytecode np JINNI +    ​2.1 JVM 
-JINNI posiada napisaną w Javie implementację WAM. Kod źródłowy prolog-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+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) ​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 maszynyRejestry 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 ​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ą, ​następnie interpretacja tychże poleceń przez zaimplementowaną ​danym jezyku maszyną WAMBezpoś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 WAMOpisane maszyny wirtutalne ​(poza HLVM, która ​jest martwa) nadają się do języków proceduralnych takich jak Java czy C++. 
  
 ====== Materiały ====== ====== Materiały ======
Linia 72: Linia 115:
 http://​www.artima.com/​insidejvm/​ed2/​ - książka traktująca o budowie JVM 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
pl/miw/miw08_ruleruntimel.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0