To jest stara wersja strony!


Opis

Andrzej, Jasiński, jasiu@tuxpowered.net

Investigate runtime integration aspects, mainly virtual machine runtimes

  • input: WAM, and it implementation, can it be somehow related with existing VMs
  • output: LLVM/HLVM, WAM, JVM

Spotkania

08.03.04

TODO:

  • arch komp, ew. zgodność arch wam z hlvm, jvm
  • czy są/były bezp. impl. prologu na JVM
   .NET
   http://www.dcs.ed.ac.uk/home/stg/Psharp/
   http://hodroj.net/cs/files/3/default.aspx
   
   JAVA VM
   http://www.binnetcorp.com/OpenCode/free_prolog.html
   http://sourceforge.net/projects/prologpluscg  (ale chyba to niezupełnie to)
   http://alice.unibo.it/xwiki/bin/view/Tuprolog/
   Z tym, że są to raczej parsery prolog->java i dopiero uruchomienie
  • możliwość translacji, implementacji WAM na HLVM/JVM

translacja kodu Prolog → Java → ByteCode jak najbardziej, z tego co jest napisane w internecie Prolog → uruchomienie na JVM już raczej nie (inne języki niż Java podobno ciężko uruchuchomić). Co do HLVM to twórcy piszą na stronie, że ich celem jest umożliwienie uruchamiania na HLVM programów pisanych m.in. w Prolog-u.

080318

080408

  • zarys sprawozdania, na razie w wiki:
    • co to jest hlvm, założenia, cele
    • stan faktyczny na 03.2008
    • czy (i jak?) teoretycznie dałoby się uruchomić prolog na hlvm (na podst. ich dokum)
    • podejścia do urucham prologu na JVM
    • podejścia Prolog→bytecode…
      • 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

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

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

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

  1. Prolog można uruchamiać na wirtualnej maszynie Javy na dwa sposoby:
    1. 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/)
    2. 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)
  2. 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.

  1. 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”. 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. 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.

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

Materiały

pl/miw/miw08_ruleruntimel.1211284373.txt.gz · ostatnio zmienione: 2019/06/27 15:58 (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