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
pl:miw:miw08_ruleruntimeo [2008/03/18 16:25]
gjn
pl:miw:miw08_ruleruntimeo [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
 ====== Opis ====== ====== Opis ======
 +__**Projekt zakończony**__
 +
 **Grzegorz Caban**, <​grzegorz.caban@gmail.com>​ **Grzegorz Caban**, <​grzegorz.caban@gmail.com>​
  
Linia 7: Linia 9:
 Feasibility study, a prototype. ​ Feasibility study, a prototype. ​
  
-====== Spotkania ===========  +[[pl:​miw:​miw08_ruleruntimeo:​spotkania | Historia spotkań ]]
-==== 08.03.04 ==== +
- +
  
-==== 080318 ==== 
-  * integr LogTalk+Java 
-  * porówn Sicstus LT 
-  * zbadać http://​www.ncc.up.pt/​yap/​documentation.html http://​amzi.com/​ 
  
-===== 080401 ===== 
  
 ====== Projekt ====== ====== Projekt ======
-==== Integracja LogTalk'​a z Java ==== +  * {{:​pl:​miw:​mvceditorlogtalk.zip|Edytor Tekstu oparty o MVC}} -  View i Controller w J2SE, Model w Logtalk, modyfikacja istniejącej aplikacji napisanej w całości w J2SE, podmiana Model na Logtalk + implementacja integracji Java <-> Logtalk w Controller 
-Opierając się na przykładzie znalezionym ​na [[https://​dev.crazydwarves.org/​ProjetM1TER|stronie]] jednym z sposobów integracji obiektów LogTalk z Java jest użycie jednego z pakietów SWI_Prolog, JPL : Java to Prolog Interface.+  * {{:​pl:​miw:​thermostatlogtalk.zip|Termostat oparty o MVC}} -  View i Controller w J2SE, Model w Logtalk, ​przykład termostatu zaimplementowanego od podstaw w Javie i Logtalk'​u ​na podstawie  ​[[hekate:hekate_case_thermostat|modelu reguł]].
  
-[[http://​www.swi-prolog.org/​packages/​jpl/​|JPL]] który oferuje dwustronny interface pomiędzy Prologiem a Java. 
-Probując wywołać predykat Prologa z kodu Javy posługujemy się następującą składnią : 
-<code java> 
-Query q2 = 
-      new Query( 
-        "​child_of",​ 
-        new Term[] {new Atom("​joe"​),​new Atom("​ralf"​)} 
-        ); 
  
-System.out.println( +==== Uruchomienie ==== 
-     "​child_of(joe,ralf) is " + +Oba powyższe projekty to skompresowane projekty Eclipseaby je uruchomić należy ​
-      ( q2.query() ? "​provable" ​"not provable"​ ) +  - Rozpakować zawartość archiwum do wybranego przez siebie folderu, ​ 
-    ); +  - Uruchomić Ecplipse IDE i jako Workspace wybrać folder wybrany w punkcie pierwszym 
-</code+  - Nastepnie z menu kontekstowego Eclipse wybieramy **File -New Project** ​ 
-Przykład pokazuje przesłanie zapytania do bazy wiedzy prologa. Można ten mechanizm wykorzystać do wywoływania predykatów wewnątrz obiektów LogTalkczyli de facto do wywoływania metod na obiektach LogTalk z obiektów Java'​y.+  - W oknie dialogowym wybieramy :  **Java Project -> Next** 
 +  - Zaznaczamy radiobutton : **Create project from existing source** i klikając ​ browse wybieramy folder zawierający rozpakowane źródła projektu z punktu 1 
 +  - Wpisujemy nazwe projektu (musi być zgodna z nazwa folderu wybranego w poprzednim punkcie)klikamy **Next** 
 +  - wybieramy finish ​na ostatniej stronie okna dialogowego 
 +  - prawdopodobnie konieczne będzie [[pl:​miw:​miw08_ruleruntimeo:​howto|skonfigurowanie JPL i logtalk]] 
 +  - projekt jest gotowy do uruchomienia
  
-Gdy konieczne jest wysłanie komunikatu do obiektu Java'y z poziomu Prologa, JPL oferuje następujące rozwiązanie : 
  
-Predykat **jpl_new/​3** pozwala na utworzenie instancji obiektu klasy z Javy : 
-<code prolog> ​ 
-jpl_new( '​javax.swing.JFrame',​ ['​frame with dialog'​],​ F) 
-</​code>​ 
-Natomiast predykat ​ **jpl_call/​4** pozwala wywołać metodę na utworzonym powyżej obiekcie: 
-<code prolog> 
-jpl_call( F, setVisible, [@(true)], _) 
-</​code>​ 
  
-Jak widać JPL umożliwia obustronne wywoływanie metod pomiędzy obiektami klas zdefiniowanych w Javie i w Prologu. Jeżeli dodać do tego obiektowość oferowaną przez LogTalk to wydaje się, że jest to zestaw spełniający dane wymagania. Przykład całej klasy napisanej w Javie, służącej do komunikacji z obiektami LogTalk znajduje się tutaj [[https://​dev.crazydwarves.org/​ProjetM1TER/​browser/​trunk/​src/​fr/​up5/​mi/​etu/​vnfc/​argumentation/​engine/​LogtalkEngine.java|LogTalkEngine]] 
  
  
-==== Analiza istniejących rozwiązań==== 
-  * [[http://​www.ncc.up.pt/​yap/​documentation.html|yap]] - yap jako wysoko wydajny kompilator Prologa, wzbogacony o takie funkcjonalności jak : strumienie We/Wy, socket'​y,​ moduły wyjątki, debugger itp. nie wydaje się być narzędziem przydatnym w tym projekcie, zwłaszcza że gdy w jego dokumentacji pojawia się temat obiektowości polecane jest użycie LogTalk'​a,​ który swoją drogą podobno dość dobrze się integruje z yap'​em. 
-  * [[http://​amzi.com/​|amzi]] - narzędzie płatne, choć można wykorzystywać do celów akademickich za darmo, niestety bez źródeł. Bardzo dobrze udokumentowane. Posiada interface do używania prologa z Javy, poprzez obiekt klasy LogicServer możemy się łatwo odwoływać do bazy wiedzy Prologa, w sposób przypominający przesyłanie zapytań do bazy danych.Natomiast dokładna dokumentacja : [[http://​www.amzi.com/​manuals/​amzi7/​ls/​lsfrtop.htm|LogicServer API]]. Rozwiązanie wydaje się być zbliżone do SICStus'​a. Wygląda na brak wsparcia dla obiektowości. ​ 
-  * [[http://​www.sics.se/​isl/​sicstuswww/​site/​index.html|SICStus Prolog]] - umożliwia integracje aplikacji napisanej w Prologu z inna napisana ​ w Java/.NET poprzez **PrologBeans**. Klient, aplikacja JAVA'​owowa przesyła komunikaty, które są odpowiednio oceniane przez server-Prolog'​a,​ obie aplikacje są osobnymi procesami, komunikują się przez sockety TCP, czyli w architekturze klient-serwer. SICStus Prolog wspiera także obiektowość poprzez moduł "The Objects Package—library(objects)",​ czyli zapewnia enkapsulacje,​ dziedziczenie itp. 
  
-  * [[http://​www.logtalk.org|LogTalk]] - własne wsparcie dla obiektowości,​ poprzez LogTalk objects, zapewnia wszystkie podstawowe wymagania. Nie znalazłem bezpośredniego wsparcia dla integracji z innymi platformami,​ natomiast dokumentacja wspomina o takich możliwościach,​ dzięki [[http://​logtalk.org/​manuals/​userman/​programming.html#​programming_portability|"​wysoko poziomowemu mapowaniu obiektów LogTalk"​]].. Szczegóły na razie nie znane, ale przykład integracji Javy z LogTalk [[https://​dev.crazydwarves.org/​ProjetM1TER|tutaj]] 
  
  
-  * [[http://​www.prologonlinereference.org/​oop.psp|Prolog OOP]] - umożliwia stosowanie prolog'​owych modułów do za modelowania obiektowości,​ umożliwia wykorzystywanie wiekszości podstawowych predykatów obiektowości takich jak: 
-     ​* ​    ​dziedziczenie modułów 
-     ​* ​    ​enkapsulacje predykatów 
-     ​* ​    ​abstrakcyjne definiowanie modułów 
  
 +====== Sprawozdanie ======
  
-Natomiast ​nie ma w nim mowy o możliwościach integracji Prologa ​innym obiektowym ​zykiem, ​to jest tylko próba wprowadzenia obiektowości do samego Prologa.+===== Cel projektu ===== 
 +Celem projektu było przetestowanie możliwości budowy aplikacji wielowarstwowych opartych o wzorzec projektowy MVC przy użyciu Javy oraz Prologa. Zakładając,​ że aplikacja jest projektowana zgodnie z metodologia programowania obiektowego i na etapie projektowania aplikacji ​nie decydujemy, który moduł, czy wręcz obiekt której klasy ma zostać zaimplementowany przy użyciu Javy, a który ​Prologu. Dopiero osoba implementująca ten projekt powinna mieć możliwość teoretycznie dowolnego wyboru jednej ​tych technologii,​ w zależności od tego jak wygodniej będzie zaimplementować dany obiekt.  
 +Tak postawione założenia wymuszają znalezienie technologi/​framework'​a umożliwiającego:​ 
 +  * Tworzenie kodu w zyku Prolog z wykorzystaniem wszystkich dobrodziejstw programowania obiektowego. Jest to warunek konieczny, aby zapewnić pełną dowolność implementowania poszczególnych klas modelu w Prologu lub Javie, musimy zapewnić, że Prolog będzie zapewniał te same możliwości abstrakcji danych, enkapsulacji,​ dziedziczenia itp co Java.
  
 +   * Wygodną integracje kodu Prolog'​a z kodem w Javie, w ideale bez tworzenia dodatkowego kodu służącego tylko do komunikacji pomiędzy obiektami napisanymi w różnych językach, a w praktyce minimalizujących ilość takiego kodu. Zwłaszcza istotne wydaje się aby implementacja tej warstwy komunikacyjnej dała się łatwo odseparować od logiki samej aplikacji, tak aby minimalnie zaburzyć projekt wejściowy.
 +  * Warte podkreślenia jest też wymóg integracji obiektów Prologa i Javy dopiero na etapie runtime'​u,​ nie chodzi tutaj o wygenerowanie kodu Javy na podstawie kodu Prologa i poźniejsze uruchomienie aplikacji w samej Javie.
  
  
-  * [[http://​www.trinc-prolog.com/​doc/​pl_obj.htm|TrincProlog]] - oferuje właściwie analogiczny pomysł, czyli rozszerzenie prologa o obiektowość. Tyleże tym razem dodatkowe słowa kluczowe pozwalają na deklarowanie klas niezależnie od modułów (czyli np kilka klas jednym moduleitp ). Tyle, żniestety ​ znowu brak możliwości integracji z innymi językami. ​Obiecująco wyglądała część do [[http://​www.trinc-prolog.com/doc/pl_win.htm|tworzenia aplikacji Windows]], ale okazało ​się że jest już gotowe API pozwalające odwoływać się do obiektów GUI (Window, Buttonitp.) poprzez predykaty prologaByć może można by wykorzystać to API od odwoływania się do dowolnych obiektówzbudować analogiczne?​+Pierwszym zatem zadaniem było znalezienie odpowiedniego framework'​a umożliwiającego tworzenie obiektów w Prologu oraz integracje tych obiektów z obiektami zaimplementowanymi w Javie. 
 + 
 + 
 +===== Obiektowy Prolog ===== 
 +Poniżej znajduje się lista framework'​ów,​ które zostały w ramach tego projektu przetestowane w nadziei znalezienia spełniającego wyżej postawione zadania : 
 + 
 + ​[[pl:​miw:​miw08_ruleruntimeo:​oopframeworks|Analiza istniejących rozwiązań]] 
 + 
 +===== Wybrane rozwiązanie ===== 
 + 
 +Jako docelowa platforma realizacji projektu został wybrany ​[[http://​www.logtalk.org|LogTalk]] ze względu na fakt że zapewnia on pełne wsparcie dla obiektowości w Prologuoraz jest w przeciwieństwie do [[http://​www.sics.se/​isl/​sicstuswww/​site/​index.html|SICStus Prolog]] i [[http://​www.sics.se/​isl/​sicstuswww/​site/​index.html|SICStus Prolog]] technologią w pełni Open Sourcepodczas gdy pozostałdające praktycznie podobne ​możliwości ​są niestety technologiami komercyjnymi.  
 + 
 +===== Integracja LogTalk'​a z Java ===== 
 +Niestety sam Logtalk nie wspiera w żaden sposób ​integracji ​obiektów tworzonych przy jego pomocy ​z innymi językami ​obiektowymiDlatego kolejnym krokiem jest było znalezienie narzędzia umożliwiającego integracje Logtalk'​a z Java. Ponieważ docelowym kompilatorem Prologa używanym w tym projekcie jest SWI Prolog, naturalna wydała się próba użycia ​do tego celu jedno z pakietów standardowych dołączanych do tej dysytrybucji,​ czyli [[http://​www.swi-prolog.org/packages/​jpl/|JPL]] który oferuje dwustronny interface pomiędzy Prologiem a Java.Jeżeli dodać do tego obiektowość oferowaną przez LogTalk to wydaje ​sięże jest to zestaw spełniający dane wymagania.  
 +[[pl:​miw:​miw08_ruleruntimeo:​jpljava | Przykład użycia JPL do komunikacji Prolog'​a z Java]]. 
 + 
 + 
 +Przykład całej klasy napisanej w Javiesłużącej do komunikacji z obiektami LogTalk znajduje się tutaj [[https://​dev.crazydwarves.org/​ProjetM1TER/​browser/​trunk/​src/​fr/​up5/​mi/​etu/​vnfc/​argumentation/​engine/​LogtalkEngine.java|LogTalkEngine]] 
 + 
 +== Napotkane problemy i rozwiazania == 
 + 
 +Podczas realizacji tego projektu natrafiono na sporo problemów natury konfiguracyjnej,​ co wydaje się dość naturalne jako że używamy kilka niezależnie tworzonych bibliotek. Oto lista ważniejszych problemów wraz z opisem ich rozwiązania : 
 +  * [[pl:​miw:​miw08_ruleruntimeo:​prologmodules | Używanie modułów zewnętrznych modułów Prologa z obiektów Logtalk]] 
 +  * [[pl:​miw:​miw08_ruleruntimeo:​swiconfig | Konfiguracja SWI-Prolog do współpracy z  Logtalk]] 
 + 
 +[[pl:​miw::​miw08_ruleruntimeo:​howto | Jak skonfigurować JPL i Logtalk ]] - uwagi na temat użycia i konfiguracji JPL i Logtalk do współpracy z Java. 
 + 
 + 
 + 
 + 
 +Celem przetestowania znalezionych rozwiązań na przykładzie prostej aplikacji opartej o wzorzec MVC, powstały dwie aplikacje opisane poniżej. Inne brane pod uwagę przykłady prostych projektów [[pl:​miw::​miw08_ruleruntimeo:​mvcexamples|aplikacji opartych o MVC]] 
 + 
 +===== Edytor Tekstu ===== 
 + 
 +Celem tego przykładu ​była próba zmiany gotowej aplikacji napisanej w [[http://​java.sun.com/​developer/​technicalArticles/​javase/​mvc/​| Javie opartej o wzorzec MVC]], na aplikacje której część logiki jest zaimplementowana poprzez obiekty Logtalk. 
 + 
 + 
 +[[pl:​miw::​miw08_ruleruntimeo:​mvceditor | Jak zaimplementować model w Logtalku, w gotowej aplikacji J2SE opartej o MVC]] 
 + 
 + 
 +===== Termostat ===== 
 +W odróżnieniu ​od poprzedniego przykładu temu przyświecał cel próby implementacji całej aplikacjimając na starcie tylko [[hekate:​hekate_case_thermostat|model]] w formie diagramów ARD, XTT. Model ma zostać zaimplementowany w Logtalk'​u,​ reszta w Javie. 
 + 
 + 
 +[[pl:​miw::​miw08_ruleruntimeo:​mvcthermostate | Jak zaimplementować MVC w Javie i Logtalku na podstawie diagramów ARD, XTT]] 
  
  
  
  
-====== Sprawozdanie ====== 
 ====== Materiały ====== ====== Materiały ======
 +  * [[http://​java.sun.com/​developer/​technicalArticles/​javase/​mvc/​|Opis edytora tekstu z strony Sun'​a]] oraz  {{:​pl:​miw:​mvceditordescription.zip|kod tej strony}}
 +  * {{:​pl:​miw:​mvcexample.zip|źródła edytora dokumentów w oryginale (bez Logtalk)}} ​
 +  * [[https://​dev.crazydwarves.org/​ProjetM1TER/​wiki|Projekt wykorzystujący Logtalk i JPL do integracji z Java]]
 +  * [[http://​logtalk.org/​|Logtalk - strona główna ]]
 +  * [[http://​www.swi-prolog.org/​packages/​jpl/​| Dokumentacja do JPL ]]
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
  
pl/miw/miw08_ruleruntimeo.1205853928.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