Komentáře k článku

SquirrelFish: reprezentace hodnot JavaScriptu a virtuální stroj

Tímto dílem začínáme část seriálu o implementacích JavaScriptu, která se bude věnovat vnitřnostem konkrétních implementací. Začneme s popisem vybraných částí interpretu SquirrelFish – podíváme se, jak se v něm reprezentují hodnoty javascriptových proměnných a jak je navržen jeho virtuální stroj a bajtkód.

Zpět na článek

15 komentářů k článku SquirrelFish: reprezentace hodnot JavaScriptu a virtuální stroj:

  1. Jirka

    pochvala a dotaz na reprezentaci hodnot
    Pochvala: paradni serial, vazne
    Dotaz: nevite nekdo, jak reprezenruje hodnoty V8? Koukal jsem do zdrojaku, ale vycist se mi to nepodarilo

    1. Anonym

      Re: pochvala a dotaz na reprezentaci hodnot
      Děkuji za pochvalu.

      K reprezentace hodnot ve V8 se dostaneme při popisu tohoto interpretu, na který dojde prevděpodobně někdy v lednu.

  2. eee

    RE: SquirrelFish: reprezentace hodnot JavaScriptu a virtuální stroj
    Dekuji za hezky clanek. Uvital bych, kdybyste napsal clanek, v kterem byste vysvetlil, jak funguje uvnit interpret pythonu, dekuji.

    1. Martin Hassman

      RE: SquirrelFish: reprezentace hodnot JavaScriptu a virtuální stroj
      S autorem seriálu jsme dohodnuti pouze na interpretech JavaScriptu. Čímž nevylučuji, že bychom někdy v budoucnu na Zdrojáku nemohli něco podobného napsat i o Pythonu.

    2. David MajdaAutor příspěvku

      RE: SquirrelFish: reprezentace hodnot JavaScriptu a virtuální stroj
      Pythonu bohužel nerozumím do takové hloubky, abych si o něm troufnul cokoliv psát, natož pak popisovat jeho interpret.

    1. David MajdaAutor příspěvku

      Re: rozdiel

      Opdovídám trochu pozdě, ale přece…

      var str1 = new String("smt1");

      Tato konstrukce vytvoří objekt (hodnotu typu Object), jehož prototyp bude roven String.prototype. Tento objekt je zapouzdřením řetězce do objektu, samotnou hodnotu řetězce bude mít uložen ve svém interním atributu. Interně bude tento objekt reprezentován odkazem na instanci třídy StringObject, v jejímž atributu m_internalValue bude odkaz na instanci třídy JSString reprezentující hodnotu řetězce. Při následném přiřazení se odkaz na StringObject umístí do tabulky lokálních proměnných na místo indexované str1.

      var str2 = "smt2";

      Tato konstrukce vytvoří hodnotu (nikoliv objekt!) typu String, jejíž obsahem bude "smt2". Interně bude tato hodnota reprezentována odkazem na instanci třídy JSString, v jejímž atributu m_value bude uložen samotný řetězec. Při následném přiřazení se odkaz na JSString umístí do tabulky lokálních proměnných na místo indexované str2.

      Pokud bych to měl celé shrnout: Ve druhém případě vytváříme (v javovské terminologii) primitivní hodnotu, zatímco v prvním případě wrapper okolo ní. Interně to zanemná přidání jedné úrovně tříd a ukazatelů navíc.

      1. m.

        Re: rozdiel
        Takze som dobre pochopil, ze druhy sposob je rychlejsi. Potom vsak nevidim dovod pouzivat prvy sposob okrem pripadov, kedy je potrebne predefinovat/pridat nejake metody na triede String.

        1. David MajdaAutor příspěvku

          Re: rozdiel

          Ono to není potřeba používat v podstatě nikdy, protože v situaci, kdy se s řetězcovou hodnotou zachází jako s objektem, dojde k automatické konverzi této hodnoty na objekt (jakoby se obalí voláním new String(...)).

            1. David MajdaAutor příspěvku

              Re: rozdiel

              Volat prototype přímo na hodnotě řetězce nemá smysl, protože výsledek bude undefined (vlastnost prototype mají definovanou pouze funkce).

              Myslel jsem to takto:

              alert("abcd".toUpperCase() == new String("abcd").toUpperCase()); // vypíše "true"
  3. Pavel Tišnovský

    zásobník vs. registry
    Pěkný článek, gratuluji!

    Ten pomalý a stále více znatelný příklon spíše k registrovým VM (začalo to Parrotem, později Lua atd.) je také způsobený tím, že prakticky všechny moderní procesorové platformy jsou založené na registrech, takže se hoodně investovalo do kvalitních překladačů pro registrové mikroprocesory (a mnoho věcí z překladačů se dá použít při JIT kompilaci). Posun v oblasti zásobníkových strojů je poměrně malý, sice pár odborných článků na toto téma vyšlo (EuroForth apod.), ale oproti mainstreamu to je slabší, což je IMHO škoda.

    Mimochodem, například Javovský VM (JVM) se sice tváří, že je zásobníkový, ale jen pro vyhodnocování výrazů. Předávání parametrů je přes standardní rámce, což je odklon od klasického "dvouzásobníkového" VM, který například používá Forth.

  4. Jakub Vrána

    Datové typy
    Pokud vím, tak null není základní datový typ a je reprezentován objektem. Ve výčtu naopak chybí datový typ function. Možná to má SquirrelFish jinak, ale v článku je to napsáno jako kdyby to platilo pro celý JavaScript.

    1. David MajdaAutor příspěvku

      Re: Datové typy

      Podle specifikace ECMA-262 (konkrétně podle úvodu kapitoly 8) je to skutečně tak, jak píšu:

      A value is an entity that takes on one of nine types. There are nine types (Undefined, Null, Boolean, String, Number, Object, Reference, List, and Completion). Values of type Reference, List, and Completion are used only as intermediate results of expression evaluation and cannot be stored as properties of objects.

      Jiná věc je, co vrací operátor typeof. A zde je pravda, že pro typ Null vrací "object" a pro funkce vrací "function", byť jsou to formálně hodnoty typu Object. Toto chování je specifikováno v ECMA-262 v odstavci 11.4.3.

      Při popisu jazyka obecně vycházím ze specifikace ECMAScriptu, ne z konkrétních implementací a jejich reprezentací. Ve chvíli, kdy v sérii článků píšu o více implementacích, není myslím jiný přístup schůdný.

Napsat komentář

Tato diskuse je již příliš stará, pravděpodobně již vám nikdo neodpoví. Pokud se chcete na něco zeptat, použijte diskusní server Devel.cz

Zdroj: https://www.zdrojak.cz/?p=2887