Haiku Monthly

August 22, 2015

Brad Nelson / @flagxor

Welcome

Tour

if

else

then

if ... else ... then

?

Optimizing a Haiku

  • Inline everything
  • Convert to Javascript
  • dstack.push(...), dstack.pop()
  • Replace each pop, with the nearest push
  • Repeat
x y * dup *
dstack.push(x); // x
dstack.push(y); // y
dstack.push(dstack.pop() * dstack.pop()); // *
var t = dstack.pop(); dstack.push(t); dstack.push(t); // dup
dstack.push(dstack.pop() * dstack.pop()); // *
var result = dstack.pop();
dstack.push(x); // x
dstack.push(y * dstack.pop()); // *
var t = dstack.pop(); dstack.push(t); dstack.push(t); // dup
dstack.push(dstack.pop() * dstack.pop()); // *
var result = dstack.pop();
dstack.push(y * x); // *
var t = dstack.pop(); dstack.push(t); dstack.push(t); // dup
dstack.push(dstack.pop() * dstack.pop()); // *
var result = dstack.pop();
var t = y * x; dstack.push(t); dstack.push(t); // dup
dstack.push(dstack.pop() * dstack.pop()); // *
var result = dstack.pop();
var t = y * x; dstack.push(t);
dstack.push(t * dstack.pop());
var result = dstack.pop();
var t = y * x;
dstack.push(t * t);
var result = dstack.pop();
var t = y * x;
var result = t * t;
aaaa if bbbb else cccc then dddd

Optimize Wisely

  • Keep a compile time dstack + rstack
  • Walk the Haiku in order
  • Push / pop whole expressions
  • Push dstack + rstack to a conditional stack
  • Require both branches match
  • Make each entry unique
[ ]

dstack.push(x); // x
dstack.push(y); // y
dstack.push(dstack.pop() * dstack.pop()); // *
var t = dstack.pop(); dstack.push(t); dstack.push(t); // dup
dstack.push(dstack.pop() * dstack.pop()); // *
var result = dstack.pop();
[ x ]

dstack.push(y); // y
dstack.push(dstack.pop() * dstack.pop()); // *
var t = dstack.pop(); dstack.push(t); dstack.push(t); // dup
dstack.push(dstack.pop() * dstack.pop()); // *
var result = dstack.pop();
[ x | y ]

dstack.push(dstack.pop() * dstack.pop()); // *
var t = dstack.pop(); dstack.push(t); dstack.push(t); // dup
dstack.push(dstack.pop() * dstack.pop()); // *
var result = dstack.pop();
[ x ]

dstack.push(y * dstack.pop()); // *
var t = dstack.pop(); dstack.push(t); dstack.push(t); // dup
dstack.push(dstack.pop() * dstack.pop()); // *
var result = dstack.pop();
[ ]

dstack.push(y * x); // *
var t = dstack.pop(); dstack.push(t); dstack.push(t); // dup
dstack.push(dstack.pop() * dstack.pop()); // *
var result = dstack.pop();
[ y * x ]

var t = dstack.pop(); dstack.push(t); dstack.push(t); // dup
dstack.push(dstack.pop() * dstack.pop()); // *
var result = dstack.pop();
[ ]

var t = y * x; dstack.push(t); dstack.push(t); // dup
dstack.push(dstack.pop() * dstack.pop()); // *
var result = dstack.pop();
[ t ]

var t = y * x; dstack.push(t);
dstack.push(dstack.pop() * dstack.pop()); // *
var result = dstack.pop();
[ t | t ]

var t = y * x;
dstack.push(dstack.pop() * dstack.pop()); // *
var result = dstack.pop();
[ t ]

var t = y * x;
dstack.push(t * dstack.pop()); // *
var result = dstack.pop();
[ ]

var t = y * x;
dstack.push(t * t); // *
var result = dstack.pop();
[ t * t ]

var t = y * x;
var result = dstack.pop();
[ ]

var t = y * x;
var result = t * t;

if ... else ... then

{ }
[ ]

aaaa if bbbb else cccc then dddd
{ }
[ aaaa ]

A if bbbb else cccc then dddd
{ [ aaaa ],orig }
[ ]

A if(x){ bbbb else cccc then dddd
{ [ aaaa ],orig }
[ bbbb ]

A if(x){ B else cccc then dddd
{ [ bbbb ],orig }
[ ]

A if(x){ B }else{ cccc then dddd
{ [ bbbb ],orig }
[ cccc ]

A if(x){ B }else{ C then dddd
{ }
[ ]

A VARS! if(x){ B }else{ C } VARS@ dddd
{ }
[ dddd ]

A VARS! if(x){ B }else{ C } VARS@ D

Possibilities

  • Support loops
  • Support function calls
  • Apply to registers

Thank you