[HN Gopher] SqueakJS - A Squeak (Smalltalk) VM in JavaScript ___________________________________________________________________ SqueakJS - A Squeak (Smalltalk) VM in JavaScript Author : gjvc Score : 57 points Date : 2021-10-27 20:08 UTC (2 hours ago) (HTM) web link (squeak.js.org) (TXT) w3m dump (squeak.js.org) | shaunxcode wrote: | this is super cool. The JS integration is very interesting. | vaughan wrote: | PS. Based on Smalltalk. | DonHopkins wrote: | One thing that's amazing about SqueakJS (and one reason this VM | inside another VM runs so fast) is the way Vanessa Freudenberg | elegantly and efficiently integrated the Smalltalk a hybrid | Smalltalk garbage collector that works with the JavaScript | garbage collector. | | SqueakJS: A Modern and Practical Smalltalk That Runs in Any | Browser | | http://www.freudenbergs.de/bert/publications/Freudenberg-201... | | >The fact that SqueakJS represents Squeak objects as plain | JavaScript objects and integrates with the JavaScript garbage | collection (GC) allows existing JavaScript code to interact with | Squeak objects. This has proven useful during development as we | could re-use existing JavaScript tools to inspect and manipulate | Squeak objects as they appear in the VM. This means that SqueakJS | is not only a "Squeak in the browser", but also that it provides | practical support for using Smalltalk in a JavaScript | environment. | | >[...] a hybrid garbage collection scheme to allow Squeak object | enumeration without a dedicated object table, while delegating as | much work as possible to the JavaScript GC, [...] | | >2.3 Cleaning up Garbage | | >Many core functions in Squeak depend on the ability to enumerate | objects of a specific class using the firstInstance and | nextInstance primitive methods. In Squeak, this is easily | implemented since all objects are contiguous in memory, so one | can simply scan from the beginning and return the next available | instance. This is not possible in a hosted implementation where | the host does not provide enumeration, as is the case for Java | and JavaScript. Potato used a weak-key object table to keep track | of objects to enumerate them. Other implementations, like the | R/SqueakVM, use the host garbage collector to trigger a full GC | and yield all objects of a certain type. These are then | temporarily kept in a list for enumeration. In JavaScript, | neither weak references, nor access to the GC is generally | available, so neither option was possible for SqueakJS. Instead, | we designed a hybrid GC scheme that provides enumeration while | not requiring weak pointer support, and still retaining the | benefit of the native host GC. | | >SqueakJS manages objects in an old and new space, akin to a | semi-space GC. When an image is loaded, all objects are created | in the old space. Because an image is just a snapshot of the | object memory when it was saved, all objects are consecutive in | the image. When we convert them into JavaScript objects, we | create a linked list of all objects. This means, that as long as | an object is in the SqueakJS old-space, it cannot be garbage | collected by the JavaScript VM. New objects are created in a | virtual new space. However, this space does not really exist for | the SqueakJS VM, because it simply consists of Squeak objects | that are not part of the old-space linked list. New objects that | are dereferenced are simply collected by the JavaScript GC. | | >When full GC is triggered in SqueakJS (for example because the | nextInstance primitive has been called on an object that does not | have a next link) a two-phase collection is started. In the first | pass, any new objects that are referenced from surviving objects | are added to the end of the linked list, and thus become part of | the old space. In a second pass, any objects that are already in | the linked list, but were not referenced from surviving objects | are removed from the list, and thus become eligible for ordinary | JavaScript GC. Note also, that we append objects to the old list | in the order of their creation, simply by ordering them by their | object identifiers (IDs). In Squeak, these are the memory offsets | of the object. To be able to save images that can again be opened | with the standard Squeak VM, we generate object IDs that | correspond to the offset the object would have in an image. This | way, we can serialize our old object space and thus save binary | compatible Squeak images from SqueakJS. | | >To implement Squeak's weak references, a similar scheme can be | employed: any weak container is simply added to a special list of | root objects that do not let their references survive. If, during | a full GC, a Squeak object is found to be only referenced from | one of those weak roots, that reference is removed, and the | Squeak object is again garbage collected by the JavaScript GC. | dang wrote: | Only one small past thread that I could find: | | _SqueakJS - A Squeak VM in JavaScript_ - | https://news.ycombinator.com/item?id=8982251 - Feb 2015 (10 | comments) | faraaz98 wrote: | So a VM inside the js VM? Should be fast | schpaencoder wrote: | it is actually suprisingly fast ___________________________________________________________________ (page generated 2021-10-27 23:00 UTC)