{"id":5,"date":"2008-06-06T13:20:09","date_gmt":"2008-06-06T20:20:09","guid":{"rendered":"http:\/\/cogblog.mirandabanda.org\/?p=3"},"modified":"2010-09-30T19:30:37","modified_gmt":"2010-10-01T03:30:37","slug":"cog","status":"publish","type":"post","link":"http:\/\/www.mirandabanda.org\/cogblog\/2008\/06\/06\/cog\/","title":{"rendered":"Cog"},"content":{"rendered":"<p>So Hi!<\/p>\n<p>I&#8217;m delighted to say that <a href=\"http:\/\/www.qwaq.com\">Qwaq<\/a> has taken me on to write a fast\u00c2\u00a0Croquet\u00c2\u00a0VM and that the VM is to be released under the Qwaq open source licence (<a href=\"http:\/\/www.opensource.org\/licenses\/mit-license.php\">an MIT license<\/a>).\u00c2\u00a0 I&#8217;m going to blog about the VM here as I implement it.\u00c2\u00a0 The blog is a chance for me to record design decisions as I go along, receive better ideas from you, dear reader, and to <a href=\"http:\/\/www.pbs.org\/marktwain\/learnmore\/writings_tom.html\">hand out the whitewash<\/a>.<\/p>\n<p>This VM will have a dynamic translator, or JIT for short.\u00c2\u00a0 It will dynamically compile Smalltalk bytecodes to machine code transparently to the programmer, and execute this machine code instead of interpreting bytecode. Initially I&#8217;m aiming at performance equivalent to the VisualWorks VM, hps.\u00c2\u00a0 This VM should execute pure Smalltalk code some 10 to 20 times faster than the current Squeak VM.\u00c2\u00a0 Subsequently I hope to do adaptive optimization and exceed VisualWorks&#8217; performance significantly.\u00c2\u00a0 I expect to be able to release the first fast version within a year.<\/p>\n<p>The VM is called Cog after the <a href=\"http:\/\/www.youtube.com\/watch?v=rYabfifhEPE\">Honda advert<\/a>.\u00c2\u00a0 Fast VMs tend to have something of the <a href=\"http:\/\/en.wikipedia.org\/wiki\/Heath_Robinson\">Heath Robinson<\/a> or <a href=\"http:\/\/en.wikipedia.org\/wiki\/Rube_goldberg\">Rube Goldberg<\/a> about them.\u00c2\u00a0 But one of my rules in Cog (rules are meant to be broken) is to <a href=\"http:\/\/c2.com\/xp\/DoTheSimplestThingThatCouldPossiblyWork.html\">do the simplest thing that could possibly work<\/a> (TSTTCPW).\u00c2\u00a0 My principles for Cog, in the sense of fundamental propositions governing my behaviour, are that<\/p>\n<p>&#8211; any changes in the image to accomodate the fast VM will not slow down the standard\u00c2\u00a0Croquet\u00c2\u00a0VM (the interpreter)<\/p>\n<p>&#8211; any changes in the image to accomodate the fast VM will not increase overall footprint<\/p>\n<p>&#8211; the fast VM will be compatible with the <a href=\"http:\/\/www.qwaq.com\/HydraVM\">Hydra VM<\/a><\/p>\n<p>&#8211; there will be some form of source code compatibility for Slang plugins so they can function both in the interpreter and in\u00c2\u00a0the fast VM<\/p>\n<p>I want the Cog to be used by as many people as possible, but I realise there are those interested in small machines or in VM experimentation for whom the interpreter will still be a better choice.\u00c2\u00a0 I hope the principles above will avoid schism and mean the Squeak community can still use a common image format and preserve image portability.<\/p>\n<p>That said I do intend to change the image format somewhat.\u00c2\u00a0\u00c2\u00a0I&#8217;ve already implemented closures.\u00c2\u00a0\u00c2\u00a0These, when\u00c2\u00a0<a href=\"http:\/\/citeseer.ist.psu.edu\/288980.html\">implemented appropriately<\/a>, have a significant impact on the performance of a JIT VM.\u00c2\u00a0\u00c2\u00a0This has meant a slight change in the bytecode set; gone are the 6 experimental bytecodes 139 through 143.\u00c2\u00a0\u00c2\u00a0I&#8217;ll blog on closures in a subsequent post quite soon.<\/p>\n<p>Hydra is an interesting approach to concurrency, and something Qwaq is interested in.\u00c2\u00a0 BTW, I think Hydra would better be called String, strings being composed of threads or fibers.\u00c2\u00a0 <a href=\"http:\/\/www.google.com\/search?q=origin+of+Smalltalk+programming+language+greek+gods\">String, like a cog, is typically a small part of a larger whole<\/a>.<\/p>\n<p>\u00c2\u00a0<\/p>\n<p>For the detail-oriented let me dive down a level and say a little more about the project, especially preparatory changes that pave the way for a fast VM.\u00c2\u00a0 I apologize for the density.\u00c2\u00a0 I&#8217;m interested in knowing what level of detail I should go into.\u00c2\u00a0 Obviously people who want to collaborate on Cog will want a high level of detail.\u00c2\u00a0 But if the architecture of a fast VM is of more general interest then I need plenty of feedback to help me explain things at the right level of detail.\u00c2\u00a0 Please feel free to comment on this!<\/p>\n<p>OK then, some details.\u00c2\u00a0 Both TSTTCPW and the Principles imply keeping the existing CompiledMethod format.\u00c2\u00a0 In <a href=\"http:\/\/www.mirandabanda.org\/files\/BttF.html\">Squeak<\/a>, as in <a href=\"http:\/\/www.mirandabanda.org\/bluebook\/bluebook_imp_toc.html\">Blue Book Smalltalk-80<\/a> <a href=\"http:\/\/www.mirandabanda.org\/bluebook\/bluebook_chapter27.html#Figure_27.1\">CompiledMethod is an anomalous hybrid<\/a>, its first part being object references used mainly for literals, and its second part being raw bytes used mainly for bytecodes. This is a good choice for an interpreter since both literals and bytecodes can be fetched from the same object, but it causes minor complications in the garbage collector and gets in the way of adding instance variables to CompiledMethod and hence subclassing.\u00c2\u00a0 I&#8217;ll blog on why I&#8217;m keeping the format and how to get round its limitations soon.<\/p>\n<p>The existing bytecode set is all very well but inflexible.\u00c2\u00a0 It has pressing limits on the size of blocks (1023 bytes of bytecode) and the number of literals (255).\u00c2\u00a0 Being designed for a 16-bit system it misses some compact encoding opportunities, such as a bytecode that pushes a given SmallInteger other than -1, 0, 1 &amp; 2.\u00c2\u00a0\u00c2\u00a0Pushing 3 requires a minimum of 1 byte for the push literal bytecode plus 4 bytes for the literal slot holding the object 3. \u00c2\u00a0A two byte bytecode could push -128 to 127 but take only 2 bytes and be faster. \u00c2\u00a0Luckily migrating to a new bytecode encoding is quite easy.\u00c2\u00a0 Most opcodes &#8211; a name I&#8217;ll use for an abstract operation such as pushInstVar: &#8211; occur in multiple bytecodes &#8211; a name I&#8217;ll use for a specific encoding such as <span><a href=\"http:\/\/users.ipa.net\/~dwighth\/smalltalk\/bluebook\/bluebook_chapter28.html#st80_bytecodes_table\">0-15<\/a><\/span><span><a href=\"http:\/\/users.ipa.net\/~dwighth\/smalltalk\/bluebook\/bluebook_chapter28.html#st80_bytecodes_table\">, <\/a><\/span><span><a href=\"http:\/\/users.ipa.net\/~dwighth\/smalltalk\/bluebook\/bluebook_chapter28.html#st80_bytecodes_table\">0000iiii<\/a><\/span><span><a href=\"http:\/\/users.ipa.net\/~dwighth\/smalltalk\/bluebook\/bluebook_chapter28.html#st80_bytecodes_table\">, Push Receiver Variable <\/a><\/span><span><a href=\"http:\/\/users.ipa.net\/~dwighth\/smalltalk\/bluebook\/bluebook_chapter28.html#st80_bytecodes_table\">#iiii<\/a><\/span>.\u00c2\u00a0 For all short-form encodings there is an equivalent long-form, and one can modify the compiler to generate only the long forms, allowing the ranges allocated to short-form encodings to be reused.\u00c2\u00a0 I&#8217;ve already recompiled a 3.8 image to long-form.<\/p>\n<p>One of the most important optimizations in a fast VM is that of <a href=\"http:\/\/citeseer.ist.psu.edu\/deutsch84efficient.html\">context-to-stack mapping<\/a>.\u00c2\u00a0 Conceptually every method or block activation in Smalltalk is represented by a context object, each of which has its own small stack holding its temporaries and intermediate results.\u00c2\u00a0 Each context points to its caller via a sender slot.\u00c2\u00a0 This has lots of advantages, such as ease of implementing the debugger, implementing an exception system, being able to implement &#8220;exotic&#8221; control structures such as coroutines and backtracking, and persisting processes, all with no VM support beyond unwind-protect.\u00c2\u00a0 The downsides are that a naive implementation incurs considerable overhead.\u00c2\u00a0 Each send involves allocating a new context and the moving of receiver and arguments from the caller to the callee context.\u00c2\u00a0 Each return involves (eventually) reclaiming the returned-from context, <em>unless<\/em> of course something has kept a reference to it.\u00c2\u00a0 Compared to stack organization in conventional languages, contexts are sloooow.<\/p>\n<p>The idea in context-to-stack-mapping (you&#8217;ve guessed it, details in a <a href=\"http:\/\/en.wikipedia.org\/wiki\/Sheherazad\">subsequent post<\/a>) is to house method and block activations on a conventional stack, hidden in the VM and invisible to the Smalltalk programmer.\u00c2\u00a0 Sends look more like conventional calls, passing arguments in the stack in the conventional way, the callee directly accessing the arguments pushed by the caller on to the stack. \u00c2\u00a0The VM then creates contexts only when needed.\u00c2\u00a0 To the Smalltalk programmer contexts still exist, and have the same useful semantics as ever, but the overheads for the common case (send and return) are much reduced.\u00c2\u00a0 While context-to-stack mapping is essential to a fast VM that still provides contexts, it is also useful in an interpreter.\u00c2\u00a0 Andreas Raab suggested I implement context-to-stack mapping in the interpreter as a milestone on the way to the JIT VM.\u00c2\u00a0 I think this is a great idea.\u00c2\u00a0 It should provide a decent speed-up to the Squeak interpreter and help motivate things like the closure implementation.<\/p>\n<p>I think that&#8217;s enough for a first post.\u00c2\u00a0 Let me wrap up with a road map of the project <a href=\"http:\/\/news.cnet.com\/8301-10784_3-5873552-7.html\">&#8220;going forward&#8221;<\/a>.\u00c2\u00a0 None of this is set in stone, but it&#8217;s a <a href=\"http:\/\/www.google.com\/search?rls=en&amp;q=If+you+want+to+make+God+laugh,+tell+him+your+plans\">plan<\/a>.<\/p>\n<p>Main line:<\/p>\n<p>&#8211; restructure the bytecode compiler to decouple parse nodes from specific bytecode encodings (complete)<\/p>\n<p>&#8211; replace non-reentrant BlueBook blocks with closures using the restructured compiler (~ 75% complete, currently working on temp names in the debugger)<\/p>\n<p>&#8211; implement context-to-stack mapping in the interpreter (to be released Septemberish)<\/p>\n<p>&#8211; implement a JIT to replace the interpreter on x86 (to be released Aprilish)<\/p>\n<p>\u00c2\u00a0<\/p>\n<p>In parallel:<\/p>\n<p>&#8211; design a bytecode set that uses prefix bytecodes to eliminate limits and provides encodings that provide benefits for 32 and 64-bit images<\/p>\n<p>&#8211; provide the ability to subclass and add\/remove instance variables to CompiledMethod and subclasses while retaining the compact interpreter-friendly hybrid format<\/p>\n<p>&#8211; target the JIT to other ISAs such as ARM, THUMB, PowerPC and x86-64<\/p>\n<p>&#8211; general VM improvements such as<\/p>\n<p><span> <\/span>&#8211; add per-object immutability support, work I&#8217;ve already done for Squeak at Cadence, and previously for the VisualWorks VM<\/p>\n<p><span> <\/span>&#8211; move garbage collection out of allocation and into the primitive failure code for new, new: basicNew basicNew: et al so that the VM doesn&#8217;t have to deal with moving pointers all over the place.<span> <\/span>&#8211; add primitive error codes so the reason for a primitive&#8217;s failure is communicated<\/p>\n<div class=\"pdf24Plugin-cp\"> \t<form name=\"pdf24Form0\" method=\"post\" action=\"https:\/\/doc2pdf.pdf24.org\/wordpress.php\" target=\"pdf24PopWin\" onsubmit=\"var pdf24Win = window.open('about:blank', 'pdf24PopWin', 'resizable=yes,scrollbars=yes,width=600,height=250,left='+(screen.width\/2-300)+',top='+(screen.height\/3-125)+''); pdf24Win.focus(); if(typeof pdf24OnCreatePDF === 'function'){void(pdf24OnCreatePDF(this,pdf24Win));}\"> \t\t<input type=\"hidden\" name=\"blogCharset\" value=\"Cw1x07UAAA==\" \/><input type=\"hidden\" name=\"blogPosts\" value=\"MwQA\" \/><input type=\"hidden\" name=\"blogUrl\" value=\"yygpKbDS1y8vL9fLzSxKzEtJTAIRevlF6frJ+elJOfnpAA==\" \/><input type=\"hidden\" name=\"blogName\" value=\"c85PV3DKyU8HAA==\" \/><input type=\"hidden\" name=\"blogValueEncoding\" value=\"gzdeflate base64\" \/><input type=\"hidden\" name=\"postId_0\" value=\"MwUA\" \/><input type=\"hidden\" name=\"postTitle_0\" value=\"c85PBwA=\" \/><input type=\"hidden\" name=\"postLink_0\" value=\"yygpKbDS1y8vL9fLzSxKzEtJTAIRevlF6frJ+elJOfnp+kYGBhb6BmYgBBTSBwA=\" \/><input type=\"hidden\" name=\"postAuthor_0\" value=\"S0zJzcwDAA==\" \/><input type=\"hidden\" name=\"postDateTime_0\" value=\"MzIwsNA1MAMiBUNjKwMzKwNLAA==\" \/><input type=\"hidden\" name=\"postContent_0\" value=\"xVrbctxIcn33V5Q54Q0q2M2rLlyNRIckz6xoL3dkkdaEnxTVQHWjTAAFoQps9Tzsg7\/E32L\/mM\/JqkKjSc6EYsPhUcQMG91AVVZeTp7MxKvu4tqp9\/bvXx11F3\/3qru4\/MN356cnL75vVGlqu6qCKVVwyuuNCpUO6pVWVW+Wr\/eqELqXR0fr9frwy1p\/OSxcs3fxr\/j06khfqEp7FfStaVVjlGu5xLq3wSitltqH\/\/nP\/\/6vd737Mhj5+OlK6baMG4TKKFxbz2cWRvWmNtpDiqEtTS8\/cxflOizu3dAXRtW2MC3+7j8mHW+M9x26fnUk93rjjxob5unisKu6vQvdqqvLG5W+4zGeHFI6tdXJytl2JYLVbqX0wg2jwJXpcTqvLpVtuto0pg3KhrjADW6RJ3AqrYpKU9il66kcLNabwvUlFO7tqsWfwnrrWh9XWzmla9euZrzN2DusZEKAJmwJvahl7xq1ccMMz+ke92hoaRbV6R61VrfwoohG97dhrW17BAX3beN6c0Qb4YT+c3DNYRWaeu+i4lL5nOsKNlxrX1E7h9lnbiqcCypY27qG5e9o5XLT6sYWKvS69bUODkLhwP8MBfPgvnJ9Us5liA+mJ3RdbxScqbO1UdcNLoOub9ViE6AlqIjHanRR2dYofhF36HQPheNJ\/EpBu96tet00WRfmqykGuF+gqDuP29YHKE25JT5Cr11vqIJxw0N12UIpItbWEbRteBP8tTM9DtSISc2Xwd7pmqZPcnyyftD1z66\/pYZmqup8domoMyhiqLfydUM\/PbVI6B3c5OSYS57i\/7aBEhhEEg1wWu5TDD0VoK4RUvoWC8ddroeFh1BRNZeqQixwmRI+Veou0Jsc\/jT2Fx3gcklVhUG4TSRPp945Kl3VLmEuLp0MiUc7U4QUuHpRJ++WABYxl7b3QYRXd6anl8P2sAl2Vht44cSlMgrQISDOO8bbMiQEeMyvEQRhWBgC0dFah6L6x7vX\/b\/rxdIuqx8+\/LB38d61pcbBsXMQ\/xWpf6Qwn67gVybGjDgwdU65VvSLx3Y07eHa3trOlFZLOPHq6L3Rofr80S3gVa7FlrxW+VqQEc7\/bWt9xGE+r1xdLky\/2rvgpfpTupSVRvhp4kne4srBrSFxs1H9UMNPoFlqbj9eIUgAObrNJlr0DhD9JIHtfbGKU9Hl1+7onxzscS245sMN1XIDqH5Hz\/3gvLeLekNHSYhRRtf36X4V9SjgXoizd+kZtcZDcpT9m+ubm3cffk6Ae7VBANu2sFxA8AKHmPEwsjDhmadcIiVoAq2uGfBY1gYBzpWDjVvuCkUsDCxqkQBmcn7Kkb1MHPvke7j9RlB5FTXGTWyjV+K+uoASXKlD8uDoLhGyWheUr90aAbVOsgWEkO7LhwluX1bNCGP6J\/+XQkBXvQQZD46Agc5coAofHPXB4wsjaIv4Z7wyGn81wnKeP3q\/KXv96Qr+zQ9YikZ8ZKfejHsIiBE9aLiUtgXd8ua2tmEjtr6uoQTV1cMKUYN7uRJUA6SDwQvBqYWDmFlJW50KftmWGp+cc6Q2ai2uj18YEzEEBlKLxYa5tqEFOuPgdLxMXmpmaoHAumRqrW3EMWZ6cSXn0\/7wc8OtlSd25wzjGe34EromNPZWnFVOwIOuK+Tu+0cQhfmQ1KZzti8qB16SgTYCueS5MUwAB3dJ3\/rO2VJ5yOAb0QmDXu5P+QFKb4aWCqda427QBMkJfoF40fME7YOsAOm86e+yT3ZI3zrabILZuNdr7HzJDMNDRUSNXj3x6LQufWKNh+RU\/C\/nVzKImlRmsyVTUG9RO4\/86Mf7gUoe9llXRmz+AMBAVrwx\/aH14bDzw6Eph6PT8\/M\/nh8nqJqurjtiSG8RZPWGDj3LXGaS6yiPLoJQWqp\/khHh11r4TUq+UUBAK7lwRF0sJZw6ayR5cKYaQLbwPcCrze5l1POp49QTFnRy9kfc0LthVamTp2cPVEj3IeOEoFltStKsHykBPTwoUJbA8HTtaMgY1eSq7ejdwnaoIXi22NS1kXMUm8iwthlT6Ln1u4GRUtTNzzN4B++7VXGbtaSE5OUEo5jvrwM8G5jv5a\/HL1yaYOEYsZKV6SESYkuLpJiI1WPAtXJuVUdm4MEyQA2+vHa9Bb4cuOXBSLcOMmvEVgcEoQHOerDqjbk9WLnS711kqWp7G4OFWQnJc9Ml4qoTAICPhugRte5XRmK9NjusWTw2ff7RRV5TmqBtPYds0SdrE1gjlCRqkmOwnrkzddS45n4IwQDAIn2fFCQ4yX+Ais2U8aBkkb0ihCEWqfg20UhW7ujmQu91RGCdoTPjje4cnMn+EquWKGnrGfz3CqRdMLxt3ZpmY5AnwaGTeEismrjvSrDCxaV+WjBX+3pEYigu4Tadrq5xxp550EVmI3i3jsFVIbbub7OlRjYSOZofHl8EMm2xUE6HMCSpExW5Mi3z6HgcPtlC4pbMuCPB3wgBweVCF7dCG03d0VaI11pLYIvfpoq2l7B\/VLYPkR5jLaRt+Fo8aCMFpMCM9WN1\/tO\/iCSzmE7jKsnv3zIlJhqVqmmjPmzTA6Fuo26N6SIbo6Q2xvW7WG2VVwhgVyZ0TpZtHw2oxvbkOQv+TxjrEs\/7o7ch\/JiQNSaaCKNaoOeb1lnUg1k4dzt++Ay5UY0Wadm3+BpHdbfbIml+fiwc8m9cH5HQwcinL2SH7360KzjGZ1ye7F3cU0xERN06bA0fVdVm0dsyntEGn6obCf0IV27BIARzWBoiJawgdKOBf9Qx0hC9dDQfMZSLeAA88+12lV6vBfgfPj2mg8NYT0p7AWBXJroQg7nd4RfeMlkJgcqby97b1EJKsKBDoobCftJhEG6r2ctZRFwhJ7JIZBoyIb3ZFjsRnWsAYSThKbmtdL9gzmfs4kkXSdrKhPEOog4DsSx5Wtbjkk\/vNHLxoo4V\/z1LcIlKWj5IZ0WtwdTa1S4WTRLgupqW7tMQmBCcCjQeG0EwhayajFGjNA7pPDsp8mYaP9P8LTbA3uDhqG8MpaCm2mWN23GasedBVkBSRcnjPj6zCk+ghUYgf3Hr1f7J8elZ8gB+m3Z7MkZ5OzTIf\/xttOj+6bNnqZh6K04Um0umTPh+8ny+gPn8BlDd0JCN9TSk4IpQcvgtFOzEJq4j3yNhtAau6gdwAE1fG08e88jgKyMuiHzVxgi9hOsx\/znS5tivmJ\/M1PFMnag\/6Kb7Xp2O3OUDnud2Z4gY0JJe1oJr2WaQsuFE9htTELfLJ95KgrrBq6dJXfnWfBeKNWgeRXR2gBShZ4eKArxRYe3iJuN6qWTlXvOT03P6yMnpC7EqG5ywGYLxNO0ngWRSdyau+eehuLW4pbGgFiG1DzUyyXq7x6hoOE\/kY0gJKbdekaS5LobmWCuqlsE48XWy9xTtegHSJCQVzDFWG9liPMYlAuyT7l+Oi7kCTI7B2Ax1YLKYYME3bKiEYYAeb4+Rt3vlO91e3AdmPAmyZjt92Jpw9NdyzdxYHfkM6L8B0ucRpH04P\/48Cvk5ECb2Lo7nJ89iIRq3\/X\/dfKZ+t62P8c\/i3+94dkau+hj70736lJD791PJd\/f0kVp9dFdW12w+z6UZkV3Wp7I+pvhJH5etd7k1ZmjWZsyPDZ5abmLrNaamPmYP8saQUEGQB89LmmGKr+vIh4URRgLO75Ax05TlUcHSGITJfzfFTcpkjhBihkRAnh2eb1tH4wHG3PVT7BFSiIbgAobFap50c9ILTuXihBwLxuPBbyqzSzMEX1TnT80S0MByJjE4sJtgvoZ5cHMkenDnBmUlDrrtyL5DaWm6MEjRYiSRNjHtk\/IwJyqgGwwk0GbbSb8cUqLIYatCyif2dVTacGQuhhUsjrGuLD4wDUvqXefeTZQqJwn+hhQJDcGpE8ILnWrYrQ00jAdsJhL+A9fOG3YON4r9uIjUtb26s5qQaWSYxXQ0GQdQFnzjIxu6g0Vgw0m+jR2+5bYnkn2pNIthteKsY+cnevJXqlJSgKT6WeKUuTm\/nVXRp06PvzdfXbCFXAD2eZTeUSf9IBWTH4UpHGhSkCaXZD0ojVnnVupj6RixwR8JEqpRkF9vYgzEJmPrZPwxCLWAVBuy3qFFfJRz3M8KbTs8Y+3rbZla2OKIzEhW+lHpBNkdkMwondzfyznZFK0QJhMb0QC4987Vd9sgFMVIZs4mzAyrcXdpFtBnkONPKO0Hbu23JDmZOY1\/5Mrk5Sb7g4sPfbuVYB9+3kaXf8I96jRgEqSQe005l03SWsg3prkYWvBj\/+oIHykcuErvp8MLetQtHADHGouQ6JA51BpOziL4iN+jSNJtHgchtrAdJcMV6FPuicCOSYxoEPgx\/q132DHHk2mBnXifp3hX+xs3bIFsNdBByLpnua6NAPRtw5LrygC\/9S+63Lu41+GSQW4acVSOtKXZFhH34UQ4uN49tYg9U5UtS9PmoiWNrGFAK13ibPEtFm1HkGkWB5djfKN2lR6D9JB2NqK3QLVdLGcm3mXH4QKETRc7T6KEmk0drgR5Ljjz00WRSozY+8grClUXgJw4bZzTjztF\/pomcdIA4ZCBNHc0vqQ5tl+lM5Lz082vq2L7aGw6Sw0V8aLKXSipM2Gn5QDdmwYwaAsZhjMXxMpTqHuK6i3LT73rgjC5LxHOdWP4PInDr0FirxyKLOvPFefMv5aU6Db0y5YD4Ejcc0IUEIqHwPHuBJzy4dgOiIWgd\/kkdOadSjzu\/6YtOblRH7VeAA2B4tI8m75F8OvCPTIAiSUT524yCtxW2Mmykwb12IgN294BDSyhO9apqUmXzsjJPhAQUoH1A5KGbnT8OFm4P42JbTEn8WVyU0xcXywWW9P3QPxwO7HJAuqQoAL2aKXpnfqUseWCMI8C\/zk2TNe97hRkk0wD7HOafZMu057UHX2ALYB+f1iAikqr+Pzs+GR+cvzi\/Onns\/mz8xdnz56dzl8kGpPSZXwhBLKsdV+mrLllMn9xmWpFBUt\/gPMWfJ9bKOO59De2rvvavzat1M5fXl8uDwCjB2yAHgR30KAiPfiTKw9qDR3NDoKp64PKNrypP+iA337vgn92OtFX7FfWSOUv78\/w2PtMmX93UjElvXAIN7BsRCpB5LVSOEquGivDB5UuMp50i+AnTx5uCgkLLtTOewOn6MlN2fmTxl\/qiohpx9HG4LfZchS53Iq5\/1f14tk\/qLznLL8wkYbQktxbIXpS6I6Qm5nVAyH\/tvDcv\/dO0zVys2HzxvrqN7aIcyV5lyKq5v66kP3r+fMHy7\/peltPl57OHC5bGozIXz+we3oVSe+2tgTypN+HbZf26+5LOYZNrJZRnrpZcWyYoHFaaLFVlOBkgYJpKb1ThPPZqTzz\/Kn0pqSC8fclyw9KOktDY5KX1AaMtKwsj3rTcBz6zd3EvABuWEtK6ElC2uxVuSU2UTroGMqaEh4U+8CpmfhgDM75TxixF7vHVtjl9ZstmX7z8Wqmbt7\/29Vb1NJubfoP70QqGHX+\/On9JfN0gmVZQ4WYmNTTavn2WHKrVAKPnZxSqPk8db5s0wx5kpvZ+Exi4rEysySgyYw+oj0s+U6XZJWzPCXO45uclHffgPpt2cRk9xrG5KGcarEmSjQ9vajEoVEegsPhWAwswRuJVeKylACIPuP\/XqJA8bb4C7tu6cNLBbOQ3rmdFw9LZ3ybTh4SKSHG6VS3pFJAijtUOFLQkIpESRidh7+h+FFS0\/fSMS9NfsWBLxj49GaA3t455od8Nr4TFcf30jcQjf4v\" \/> \t\t<a href=\"https:\/\/www.pdf24.org\" target=\"_blank\" title=\"www.pdf24.org\" rel=\"nofollow\"><img src=\"http:\/\/www.mirandabanda.org\/cogblog\/wp-content\/plugins\/pdf24-post-to-pdf\/img\/pdf_32x32.png\" alt=\"\" border=\"0\" height=\"32\" \/><\/a> \t\t<span class=\"pdf24Plugin-cp-space\">&nbsp;&nbsp;<\/span> \t\t<span class=\"pdf24Plugin-cp-text\">Send article as PDF<\/span> \t\t<span class=\"pdf24Plugin-cp-space\">&nbsp;&nbsp;<\/span> \t\t<input class=\"pdf24Plugin-cp-input\" style=\"margin: 0px;\" type=\"text\" name=\"sendEmailTo\" placeholder=\"Enter email address\" \/> \t\t<input class=\"pdf24Plugin-cp-submit\" style=\"margin: 0px;\" type=\"submit\" value=\"Send\" \/> \t<\/form> <\/div>","protected":false},"excerpt":{"rendered":"<p>So Hi! I&#8217;m delighted to say that Qwaq has taken me on to write a fast\u00c2\u00a0Croquet\u00c2\u00a0VM and that the VM is to be released under the Qwaq open source licence (an MIT license).\u00c2\u00a0 I&#8217;m going to blog about the VM here as I implement it.\u00c2\u00a0 The blog is a chance for me to record design [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"_links":{"self":[{"href":"http:\/\/www.mirandabanda.org\/cogblog\/wp-json\/wp\/v2\/posts\/5"}],"collection":[{"href":"http:\/\/www.mirandabanda.org\/cogblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.mirandabanda.org\/cogblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.mirandabanda.org\/cogblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.mirandabanda.org\/cogblog\/wp-json\/wp\/v2\/comments?post=5"}],"version-history":[{"count":2,"href":"http:\/\/www.mirandabanda.org\/cogblog\/wp-json\/wp\/v2\/posts\/5\/revisions"}],"predecessor-version":[{"id":54,"href":"http:\/\/www.mirandabanda.org\/cogblog\/wp-json\/wp\/v2\/posts\/5\/revisions\/54"}],"wp:attachment":[{"href":"http:\/\/www.mirandabanda.org\/cogblog\/wp-json\/wp\/v2\/media?parent=5"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.mirandabanda.org\/cogblog\/wp-json\/wp\/v2\/categories?post=5"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.mirandabanda.org\/cogblog\/wp-json\/wp\/v2\/tags?post=5"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}