Up to Main Index Up to Journal for January, 2023
JOURNAL FOR SUNDAY 22ND JANUARY, 2023
______________________________________________________________________________
SUBJECT: Another belated status update
DATE:
Another long pause since I last wrote anything here. I seem to be spending all
my waking hours working as of late…
Over the holiday period I took the opportunity to catch up on some conferences
and talks on YouTube: Donald Knuth’s Christmas lecture, some NDC talks (Dylan
Beattie’s Plain Text one is very good), some GopherFest and dotGo talks.
In doing so I started to conceive the germ of an idea. I scraped together my
ideas and wrote a little code. Hrm, the results looked quite promising. In an
afternoon I managed to write, from scratch, the guts of a new implementation
of my programming language Mere. Within a few days I had something that worked
really well and was quite performant.
This was all rather annoying! I’d just spent months on v0.0.5 of Mere and was
getting nowhere fast. I could now throw all of that work away for this young
upstart :P
Using my previous counter.mr example the new Mere is more than twice as fast.
The code is much simpler and there is a lot less of it. Even better, the code
is much easier to dip in and out of as and when I get time.
Some early performance results using Go 1.19.5:
OLD NEW DIFFERENCE
------ ------ ---------------
Desktop: 3524ms 1494ms -2030ms (+135%)
RPi4 8Gb: 7777ms 3882ms -3895ms (+100%)
The Raspberry Pi 4 was running 64-bit RaspberryOS for the tests.
Currently I have working all of the variable storage, indexing arrays and maps,
assignment to variables and assignment to array and map elements. This was the
first thing I tackled as it’s proven to be the most problematic to get right.
Implemented and working so far:
Operators: (, [, ]=, +, -, *, /, ++, --, %, <, == and unary minus.
Types: int, []int, [int], float []float, [float],
string, []string, [string], bool, []bool, [bool]
Built-ins: dump, exit, if, gosub, goto, print, printf, println,
return, sprint, sprintf, sprintln, time, trace
Comments: “#” and “//” line comments, “/* */” block comments
Miscellaneous: labels, continuation lines, variadic functions
The tokenizer and interpreter are new implementations. The interpreter still
uses a modified shunting yard algorithm to turn tokens into RPN. The biggest
change is the implementation of the operators and built-ins. The executor is
now based on a kind of shift reduce parser over the RPN, but not quite…
The temptation to add all of the other operators and built-ins has been huge.
I just want to see my programming language working, damn it! However, I have
resisted doing that until I have tests written for everything implemented so
far. As an example, here are the tests for the negation / unary minus operator
“neg”:
// Testing for unary minus / negation "neg" operator.
// literal ints
assert -(-1), 1
assert -(0), 0
assert -(1), -1
// literal floats
assert -(-1.1), 1.1
assert -(-0.0), 0.0
assert -(1.1), -1.1
// variable ints
in = -1
iz = 0
ip = 1
assert -in, 1
assert -iz, 0
assert -ip, -1
// variable floats
fn = -1.1
fz = 0.0
fp = 1.1
assert -fn, 1.1
assert -fz, 0.0
assert -fp, -1.1
// int array
ia = []int(-1, 0, 1); assert ia []int(-1, 0, 1)
assert -ia[0], 1
assert -ia[1], 0
assert -ia[2], -1
// int map
im = [int](1, -1, 2, -1.1)
assert -im[1], 1
assert -im[2], 1.1
// int int map
iim = [int] 1 [int] 2 3
assert -iim[1][2], -3
// check for decrement confusion
x = 2
ia = []int 1 2 3
y = x - -1 ; assert y 3
y = x - -x ; assert y 4
y = x-- ; assert y 1
x = 2
y = ia[x--] ; assert y 2
y = -(1+1) - -(1+1); assert y 0
x = 5
y = (x--) -1 ; assert y 3
assert x 4
x = 5
y = (x--) - -1 ; assert y 5
assert x 4
Of course, once the holiday period was over I was drowning in work again :(
Whenever I get a few minutes I write a few more tests, fix a few more bugs.
Hopefully it won’t take another month of Sundays before I can release an
updated Mere ICE. I might even be able to publish Mere’s code without being
too embarrassed by it…
--
Diddymus
Up to Main Index Up to Journal for January, 2023