Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
400
Entity Systems
jaz303
2
220
Ruby by the River
jaz303
1
1.2k
Other Decks in Programming
See All in Programming
初心者DevRelとして参加者だった私が、DevRel Talks!#2に登壇するまでにしてきたこと
sokohirai
0
370
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.1k
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
230
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
100
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
170
アクセシビリティから考える情報設計
high_g_engineer
0
370
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
450
thread_parallel_with_free-threaded_Python_and_NumPy.pdf
riku_sakamoto
0
320
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
230
20260828_品質と開発生産性を両立させる、AI時代のE2Eテストの考え方
magicpod
0
200
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
110
Swift愛好会と私(ウホーイ) / Swift Fan Club and Uhooi
uhooi
0
150
Featured
See All Featured
Side Projects
sachag
456
43k
How STYLIGHT went responsive
nonsquared
100
6.3k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
660
Practical Orchestrator
shlominoach
191
12k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
400
Why Our Code Smells
bkeepers
PRO
340
58k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
280
Claude Code のすすめ
schroneko
67
230k
The browser strikes back
jonoalderson
0
1.7k
The World Runs on Bad Software
bkeepers
PRO
72
12k
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