Hlavní navigace

Názor ke zprávičce Kolem 70 % vážných bezpečnostních chyb v Chromiu jsou chyby používání paměti od Vít Šesták - Ona AOT v prohlížečích by asi byla pekelně...

  • Aktualita je stará, nové názory již nelze přidávat.
  • 26. 5. 2020 21:07

    Vít Šesták

    Ona AOT v prohlížečích by asi byla pekelně nepraktická. Jako hlavní nevýhoda JIT se často udává rychlost startu. To je pravda, pokud to srovnáváme s již zkompilovaným kódem. Pokud to srovnáváme s AOT s ještě nezkompilovaným kódem, má zde JIT naopak výhodu. Nemusí kompilovat naspepo všechno. Typicky se zde začíná v interpretu a samotná JIT se ke slovy dostane až později, a to jen v částech, které se ukázaly jako často používané. JIT tak může udělat méně práce než AOT, ale důkladněji a bez potřeby zkompilovat na začátku úplně všechno, což by trvalo.

    AOT v GraalVM – to je (aspoň zatím) k dispozici jen pro JVM. Ono není až tak snadné udělat dobré AOT ani pro JVM. U jiných statických jazyků by to možná šlo podobně, ale byl by potřeba udělat frontend, který by umožňoval některé věci konfigurovat. U dynamických jazyků bude AOT ještě náročnější, protože zde nelze aplikovat closed-world-assumption. (Což je IMHO další důvod, proč prohlížeče nemají AOT.) JIT může optimisticky aplikovat CWA a v případě porušení předpokladu může kód překompilovat za běhu. U čistého AOT kód překompilovat nemůžete. A asi nechcete defenzivně zkompilovaný JavaScript, kde bude výsledný kód předpokládat různé edge cases jako změnu prototype za běhu nebo dokonce volání eval, které může změnit nebo dodefinovat i lokální proměnnou*.

    (Možnost použít ostatní jazyky v rámci native-image ještě neznamená, že jsou tyto jazyky zkompilovány ještě před spuštěním.)

    I já si myslím, že tudy vede cesta a jednoho dne bude stačit napsat interpret a dostaneme nejen JIT, ale s malým úsilím i použitelné AOT. Ještě tam ale nejsme.

    * Uvažte třeba kód function foo(x, y){x(y); return z;} a zkuste jej nějak rozumně ručně zkompilovat (klidně do céčka), aby fungovaly různé edge cases, bylo to rozumně ryché, a aby nebylo za žádných okolností překompilovávat. Obecně neznáte ani lokální proměnné. Jak to bude fungovat s voláním foo(eval, "var z = 1")? Nezapomeňte, že ne vždy budete při kompilaci vědět, že předáváte eval.

    =====

    Pracuju na GraalVM v Oracle Labs. Zde uvedené názory jsou moje vlastní a nemusejí se shodovat s oficiálním stanoviskem Oracle. Příspěvek ani nemusí být ve shodě s plány firmy Oracle.