Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Livecoding in Javascript
Search
Jason Frame
May 09, 2013
Programming
1.4k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Livecoding in Javascript
Jason Frame
May 09, 2013
More Decks by Jason Frame
See All by Jason Frame
How to fake it for 18 months and (almost) launch a hardware product
jaz303
0
390
Entity Systems
jaz303
2
210
Ruby by the River
jaz303
1
1.2k
Other Decks in Programming
See All in Programming
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
170
私のClaude Code活用法 (個人開発編) - PHPerKaigi mini #4(2026/08/24)
panda_program
1
150
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
600
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
2
990
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
350
不幸な GC
chencmd
0
700
Pythonの実行はどこまで賢くなったのか? CPythonとPyPyから見る最適化のしくみ
curekoshimizu
3
1.8k
引き算の組織 ― アウトカムとAIに全振りするために辞めたこと ― / Organization by Subtraction
hirokiyamamoto14
PRO
0
290
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
510
typoなんかねぇよ
raspython3
0
500
レビュー履歴をAIに食わせて、 Compose移行を加速するs
shihochan
0
200
AI Readyの正体はデータマネジメントだ メダリオン2.0の最前線
freee
PRO
0
360
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Design in an AI World
tapps
1
290
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
Making Projects Easy
brettharned
120
6.7k
What's in a price? How to price your products and services
michaelherold
247
13k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
57k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.5k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.1k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Producing Creativity
orderedlist
PRO
348
40k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.8k
Transcript
Livecoding in Javascript Jason Frame / @jaz303 Friday, 31 May
13
What is livecoding? By akirto. http://www.flickr.com/photos/30132612@N00/3840200923/in/photostream Friday, 31 May 13
Performance-Oriented Friday, 31 May 13
Node-based Friday, 31 May 13
Microworlds Paper - “Twenty Reasons Why You Should Use Boxer
(Instead of Logo)” Andrea A. diSessa Friday, 31 May 13
Smalltalk, Self Paper - “The Early History of Smalltalk” Alan
C. Kay Friday, 31 May 13
Why livecode? Friday, 31 May 13
Why Javascript? Friday, 31 May 13
Why Javascript? • Flexible language • Ecosystem - browser +
node.js = node- webkit • Single threaded • Event loop Friday, 31 May 13
Why Javascript? Describing Live programming using program transformations and a
callstack explicit interpreter Olov Johansson Friday, 31 May 13
Domain-Specific Livecoding • Generalised tools can be complex • May
also make unacceptable performance/ timing trade-offs • Evolve tools with your application Friday, 31 May 13
Demo Time Friday, 31 May 13
Friday, 31 May 13
Implementation Strategies Friday, 31 May 13
Implementation Strategies eval() is evil Friday, 31 May 13
Implementation Strategies eval() is evil Friday, 31 May 13
Implementation Strategies • Private State • Variable Injection • “Globals”
Preservation • Internal eval() • Blueprints • Snapshot • Clocksources Friday, 31 May 13
Private State Prevent pollution of global namespace Friday, 31 May
13
Private State function setup() { position = {x: 10, y:
20}; velocity = {x: 1, y: 1}; } function loop() { position.x += velocity.x; position.y += velocity.y; } Friday, 31 May 13
Private State (function() { “use strict”; var position; var velocity;
function setup() { position = {x: 10, y: 20}; velocity = {x: 1, y: 1}; } function loop() { position.x += velocity.x; position.y += velocity.y; } })(); Friday, 31 May 13
Private State (function() { “use strict”; var position; var velocity;
function setup() { position = {x: 10, y: 20}; velocity = {x: 1, y: 1}; } function loop() { position.x += velocity.x; position.y += velocity.y; } return { setup: setup, loop: loop }; })(); Friday, 31 May 13
Variable Injection Provide objects to user-code Friday, 31 May 13
Variable Injection function loop() { car.drawAt(0,0,50,50) } // ... //
... // ... Friday, 31 May 13
Variable Injection // Generate method signature from defined // objects
(function(car, trafficLights, background) { // Paste user code here function loop() { car.drawAt(0,0,50,50) } // ... // ... // ... }).apply(null, exposedObjects); Friday, 31 May 13
“Globals” Preservation Persist global values between code reloads Friday, 31
May 13
“Globals” Preservation var carX = 0; var carY = 0;
var speed = 5; function loop() { carY += speed; draw(); } Friday, 31 May 13
“Globals” Preservation var carX = 0; var carY = 0;
var speed = 5; function loop() { carY += speed; draw(); } Friday, 31 May 13
“Globals” Preservation (function() { "use strict"; var carX = 0;
var carY = 0; var speed = 5; function loop() { carY += speed; draw(); } return { loop: loop, getVars: function() { return {carX: carX, carY: carY, speed: speed}; }, setVars: function(vars) { carX = vars.carX; carY = vars.carY; speed = vars.speed; } }; })(); Friday, 31 May 13
Internal eval() Provide external (e.g. console) access to private state
Friday, 31 May 13
Internal eval() var car = {x: 20, y: 20} var
lightState = “red-amber” function setup() { // ... } function loop() { // ... } Friday, 31 May 13
Internal eval() (function() { "use strict"; var car = {x:
20, y: 20} var lightState = “red-amber” function setup() { // ... } function loop() { // ... } })(); Friday, 31 May 13
Internal eval() (function() { "use strict"; var car = {x:
20, y: 20} var lightState = “red-amber” function setup() { // ... } function loop() { // ... } function evaluate(code) { return eval(code); } return { __eval__: evaluate } })(); Friday, 31 May 13
Blueprints Augment a supplied object with user-code Friday, 31 May
13
Blueprints // Inside engine var blueprint = new SystemBlueprint(); blueprint.id
= oldSystem.id; blueprint.enabled = oldSystem.enabled; blueprint.update = function() { /* default impl */ } USERCODE = ‘(function(system) { // augment blueprint system.title = “foo”; system.update = function() { ... } })’; // Compile code systemBuilder = eval(USERCODE); systemBuilder(blueprint); // inspect user’s refinements to blueprint and // setup accordingly Friday, 31 May 13
Snapshots Save and restore entire application state Friday, 31 May
13
Snapshots system.snapshot = function() { return { entities: Object.keys(this.entities), lastShotTime:
this.lastShotTime } } system.restore = function(snapshot) { var self = this; this.entities = {}; snapshot.entities.forEach(function(eid) { self.entities[eid] = self.world.getEntityById(eid); } this.lastShotTime = snapshot.lastShotTime; } Friday, 31 May 13
Snapshots function updateSystem(registry, systemId, newSystem) { var existingSystem = registry.getSystemById(systemId);
var snapshot = existingSystem.snapshot(); try { newSystem.restore(snapshot); registry.setSystem(systemId, newSystem); } catch (e) { // Incompatible snapshot - restart app? } } Friday, 31 May 13
Clocksources Provide a consistent view of time when loading snapshots
Friday, 31 May 13
Clocksources Date.now() Friday, 31 May 13
Clocksources Date.now() function Clock() { this.time = 0; this.lastDelta =
null; } Clock.prototype.tick = function(delta) { this.time += delta; this.lastDelta = delta; } function tick() { var wallclockDelta = Date.now() - lastTick; clock.tick(wallclockDelta); } Friday, 31 May 13
Escaping the Walled Garden Friday, 31 May 13
Escaping the Walled Garden Friday, 31 May 13
Escaping the Walled Garden Friday, 31 May 13
Demo Time Friday, 31 May 13