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