Vlákno názorů k článku Programovací jazyk Forth a zásobníkové procesory (19) od Pavel Křívánek - Není bez zajímavosti, že bytekód zmíněného Self potřebuje...

  • Článek je starý, nové názory již nelze přidávat.
  • 17. 5. 2005 7:40

    Pavel Křívánek
    Není bez zajímavosti, že bytekód zmíněného Self potřebuje vlastně jen pět instrukcí:
    - send
    - resend
    - pushLiteral
    - pop
    - returnTop

    a pushLiteral by šel taky vypustit :-)
  • 18. 5. 2005 7:55

    Pavel Tišnovský
    Zlatý podporovatel
    Ahoj Pavle,
    a čím se dá - pro zajímavost - pushLiteral nahradit? Přece musí existovat možnost, jak do zásobníku dostat konstantu (a třeba ji potom použít pro výpočty či skok).
  • 18. 5. 2005 9:58

    Pavel Křívánek
    Omlouvám se, trochu jsem se nachal unést a opomněl pushSelf, který se nedá nahradit pouhým "send self", protože bychom pak nemohli volat objekty z vrcholu zásobníku.

    K těm literálum:

    Vtip je v tom, že v Selfu jsou i metody celkem běžné objekty se sloty. Když se začne provádět metoda, tak se ve skutečnosti provádí kód v kontextu aktivačního objektu metody, jehož součástí by mohly být právě sloty pro literály.

    Takže bychom měli třeba objekt obj1, jehož sloty by vypadaly takto:
    x = 3
    y = 4

    a v jeho kontextu bychom volali metodu s kódem:
    ^ x + y + 7

    tak by aktivační objekt metody vypadal nějak takhle:
    :self* = obj1
    literal1 = 7

    a vrámci tohoto aktivačního objektu bychom provedli bytekód:
    pushSelf
    send x
    pushSelf
    send y
    send +
    pushSelf
    send literal1
    send +
    returnTop

    :self* je rodičovský slot, takže se zprávy x a y delegují na objekt obj1, v jehož kontextu chceme ve skutečnosti kód provádět.

    pushSelf vloží na vrchol zásobníku přímo aktivační objekt metody. Kdyby kód metody obsahoval "self", tak se to samozjřejmě přeloží jako:
    pushSelf
    send self
    a ne jen jako pouhé pushSelf. Je to vlasntě explicitní přístup k rodiči.

    Je to jen teoretická konstrukce, protože v reálu to Self takhle čistě nedělá a i já ho implementuji zcela jinak. Ale jako demostrace čistoty jeho návrhu je to vynikající.
  • 18. 5. 2005 10:12

    Pavel Tišnovský
    Zlatý podporovatel
    Aha, to vypadá zajímavě. Je vůbec Self kompilovatelný do nějaké rozumné binární podoby (bytekódu)? U Lispu se například opravdová kompilace nedá provést a Self mi v některých ohledech Lisp dost připomíná (to není výtka, právě naopak :-)))
  • 18. 5. 2005 11:40

    Pavel Křívánek
    Self postupuje podobně jako Smalltalk. Tedy, pokud jde o to vzít vygenerovaný bytekód a přenést ho jinam, to jednoduše nejde (netvrdím, že to nejde vůbec). Přenáší se celé snapshoty, což je obdoba smalltalkovské image, kde bytekód binární podobu samozřejmě má.

    Bytekód se na cílové platformě překládá do strojového kódu a ukládá do cache. Podobně to dělá Java, která od Selfu technologii HotSpot převzala.

    Podobně jako v Lispu lze každý selfovský objekt vyjádřit literálem. Osobně bych Self a Lisp řadil do stejné roviny. Dají se těžko porovnávat, protože oba pracují na zcela jiných čistých základech.

    Lisp je syntakticky čistší a více matematicky orientovaný.
    Self má syntaktického cukru kolem sebe víc a je (hlavně ve své grafické podobně - ftp://comtalk.net/Self/self.avi) podstatně lidštější.

    Prakticky je jedno, z čeho se výsledný bytekód nakonec vygeneruje. Důležitý je základ - objekty jako množiny slotů, delegace. Například moje varianta Selfu se syntakticky vrací blíže k původnímu Smalltalku, aby se dal snadno integrovat do Squeaku, protože překlad provádím přímo do squeakovského bytekódu. Nejedná se tedy o interpret Selfu nad Smalltalkem.

    Na zdrojových prakticky nezáleží a jako přirozená podoba Selfu by se mohla brát i jeho grafická reprezentace, což už je světu C/C++, Javy apod. značně vzádlené :-)

    Taková volnost u Lispu není. Mimochodem, neobjevily se nějaké pokusy přenést Lisp do grafického prostředí podobného Selfu?
  • 19. 5. 2005 15:43

    Pavel Tišnovský
    Zlatý podporovatel
    Jediné rozumné prostředí pro LISP jsem viděl v AutoCADu. Ale srovnávat to například se Smalltalkovským Sqeakem to samozřejmě není možné, jedná se o zcela odlišné systémy s jinými cíli.