Up to Main Index                           Up to Journal for October, 2022

                   JOURNAL FOR SATURDAY 22ND OCTOBER, 2022
______________________________________________________________________________

SUBJECT: Falling down a mere rabbit hole…
   DATE: Sat 22 Oct 17:27:54 BST 2022

Forgive me, for it has been nearly three weeks since my last update…

While working on Mere I found I’d coded myself into a corner. I had nearly 90%
of the core language implemented. There was but a single major issue left to
resolve. Try as I might, addressing entries in nested maps just didn’t work
properly. I came up with hacks which nearly worked, these ideas quickly died.
They didn’t fit the rest of the language. I also didn’t want to have to use
built-ins and temporary variables just to manipulate maps. I wanted to write:


    M:[int] = [int](
      1 [int](
        2 [int] 3 3, 5 6,
      ),
      7 8,
    )
    M[1][2][3]++
    M[1][2][5] = "six"
    println M


And have it print “1 2 3 4 5 six 7 8” dammit!

Eventually, with Mere executing programs ever slower, the situation snowballed
into a rewrite of the Mere internals. Having 90% of the core implemented and
working, the mere thought of a rewrite was very demoralising.

It isn’t a complete rewrite. The tokeniser only needed a minor addition. The
actual compiler and execution engine only required minor tweaks. However, I
had to rework the main variable heap storage and all of the runtime code for
the language’s operators and built-ins. Which I am still rewriting.

One good result is that performance has improved overall. The counter example
I use for benchmarking has improved at least:


    # A mere counting example...
    #
    # Useful for benchmarking.
    #
    end:int; start:int = time
    loop:int = 0
    println "123456789%"
    next:
      if loop++ % 1000000 == 0; print "."
      if loop < 10000000; goto next

    println "✓"
    end = time; printf "Out: %dμs\n", (end-start)/1000


Running this a couple of times produces:


    >mere count
    123456789%
    ..........✓
    Out: 3038ms
    >mere count
    123456789%
    ..........✓
    Out: 3057ms
    >


Still can’t quite break the 3 second mark, yet! :( The last version of Mere,
before the rewrite, took four seconds to run the same program and was getting
slower. A difference of only one second may not seem like a lot, however the
performance of other examples I’ve written suffered a lot worse.

Having said that, I’ve just managed to get the bubble sort running again:

    /*
    A mere bubble sort…

    This program generates an array of integers and
    then sorts the array element values from smallest
    to largest.
    */

    maxN:int = 15  // numer of ints to sort
    s:[]int        // array to be sorted

    // fill array with random ints
    f:int
    fill:
      s = []int s rnd (maxN * 10)
      if f++ < maxN; goto "fill"

    println " In: " s

    // some additional initialisation
        l:int = len(s) - 1
      end:int
    start:int = time

    // main bubble sort
    swapped:
      swap:bool = false

      x:int = 0
      xloop:
        if s[x]  <= s[x+1]; goto "next"
           s[x]  += s[x+1]
           s[x+1] = s[x] - s[x+1]
           s[x]  -= s[x+1]
        swap = true
      next:
        if x++ < l; goto "xloop"
        l--
    if swap; goto "swapped"

    end = time
    printf "Out: %v %dμs\n" s end-start


Five random runs produces:


    >mere bubble
     In: 9 74 20 99 110 9 43 72 79 70 69 27 31 121 54
    Out: [9 9 20 27 31 43 54 69 70 72 74 79 99 110 121] 91μs
    >mere bubble
     In: 52 128 108 50 42 41 8 15 29 35 14 10 51 126 74
    Out: [8 10 14 15 29 35 41 42 50 51 52 74 108 126 128] 103μs
    >mere bubble
     In: 58 31 11 99 79 98 37 83 144 22 37 100 149 132 128
    Out: [11 22 31 37 37 58 79 83 98 99 100 128 132 144 149] 74μs
    >mere bubble
     In: 73 75 146 134 111 85 83 60 127 118 69 67 65 92 51
    Out: [51 60 65 67 69 73 75 83 85 92 111 118 127 134 146] 214μs
    >mere bubble
     In: 27 16 68 67 123 16 143 80 4 87 113 24 125 89 78
    Out: [4 16 16 24 27 67 68 78 80 87 89 113 123 125 143] 84μs
    >


Previously, five runs produced: 103, 150, 166, 275 and 223. Admittedly this is
a tiny sample size, but an average of 113μs compared to 183μs isn’t bad.

The initial code snippet I showed now runs and prints “1 2 3 4 5 six 7 8” :P

I’ve still got a ways to go before Mere v0.0.5. But! I’m not giving up. I know
people want me working on WolfMUD, but I want my own programming language…

--
Diddymus


  Up to Main Index                           Up to Journal for October, 2022