Feb 15, 2020
My paper's been accepted!

permalink

* *
Feb 15, 2020
I'll be in Porto, Portugal on Mar 24 to present a paper on Mu at the Convivial Computing Salon.

permalink

* *
Feb 10, 2020
A brief timeline of the Mu computing stack

Jul 6, 2014: commit 0, tree-based interpreter for a statement-oriented language

Jul 19, 2017: commit 3930, start of SubX machine code

Sep 20, 2018: started building SubX in SubX

Jul 24, 2019: SubX in SubX done, commit 5461

Oct 2, 2019: started designing the Mu memory-safe language

Oct 29: started http://akkartik.github.io/mu/html/apps/mu.subx.html


Table of recent milestones with line counts and binary sizes
                                                      date    commit  mu.subx   -tests/cmts  binary (KB excl. dead code)
  parsing function headers                            Oct 30  5725      621         277         6.9
  function calls                                      Nov 10  5739     1202         346         7.2
  code-generating primitive instructions              Nov 17  5750     1923         363         7.3
  arguments                                           Nov 30  5785     4038        1330        13
  return values                                       Jan 1   5878     5432        1457        15
  compound types: `addr` and `array`                  Jan 20  5911     6023        1697        16
  local variables and their reclamation               Jan 27  5934     6340        1900        18
  register locals and shadowing                       Jan 27  5940     6498        1940        18
  blocks                                              Jan 29  5948     7455        2534        22
  break/continue instructions                         Jan 30  5964     7871        2558        22
  cleaning up locals in the presence of early exits   Feb 9   6000     8554        2918        26

permalink

* *
Feb 3, 2020
The Agaram Paradox: to get to better interfaces, expose your implementations.

permalink

* *
Jan 31, 2020
I just wrote up a cheatsheet of all the instructions supported by Mu (best on a wide screen/window):

https://raw.githubusercontent.com/akkartik/mu/master/mu_instructions

It's not clean. Mu isn't a clean, well-designed language. Because it's designed to map 1:1 with x86, and x86 is not a clean, well-designed instruction set.

But this sort of 1-page summary of a compiler is something I've always wished I had. Something that doesn't tell you what to type out and then pretend you understand compilers.

permalink

* *
Jan 30, 2020
Update on the Mu computer's memory-safe language

Basic language is done! Here's factorial. (Compare with SubX.)

Still todo:

  • user-defined types
  • type checking and memory-safety

In other words, I'm about a third of the way there 😂 More detailed todo list.

(More details on the Mu project. Repo)


I should probably highlight register names. Here's an updated screenshot.

(Yes, in Mu you manually allocate registers. Mu will eventually check your allocation.)

permalink

* *
Jan 27, 2020
Update on the Mu computer's memory-safe language

Still no type-checking or memory-safety, but we now have local variables.

http://akkartik.name/post/mu-2019-2
https://github.com/akkartik/mu

A simple program in Mu that gratuitously makes use of a temporary variable.

permalink

* *
Jan 16, 2020
As I continue building out a boring type system for Mu, I've been noodling on a more interesting one.

It would be really nice to be able to avoid null pointers by construction. But providing opt-in null pointers would require option types.

Option types can be seen as a special case of sum types (tagged unions) but without needing an explicit definition for each unique type. I like Ceylon's generalization, which lets one use types like int|bool.

One interesting idea here is that anonymous unions are to sum types as tuples are to product types. The only wrinkle: it seems natural to refer to the variants of an anonymous union by type (you can't have int|int), but tuples by position ((int, int) is a common use case).

I'm also thinking about Rich Hickey's criticism of Haskell, that it should be possible to pass in an int to a function that expects an int|bool. That requires checking types based on their structure rather than their names.

But I'm reluctant to permit passing in a type point3D to a function expecting a point2D just because the member names are a superset. Perhaps structure should only be checked for anonymous types.

Should we be able to pass in anonymous types anywhere the language expects a type? In members of user-defined types? Any constraints seem surprising.

By now we're well in the territory of features that I'm not sure will have much adoption. Just because I wanted to provide clean concepts without surprising limitations.

I'm curious to hear where others would draw the line. How much of this seems reasonable, and how much excessive architecture astronaut-ism?

permalink

* *
Jan 15, 2020
A couple of crazy ideas on types:

  1. The Right Way is for product types to be nominative and sum types to be structural.
  2. Maybe we need tags for product types as well? Then unify types on the names not of types but of their constituent tags, whether sums or products.

e.g. Foo and Bar can be automatically coerced in:

type Foo = A int * B boolean
type Bar = A int * B boolean

permalink

* *
Jan 1, 2020
Update on the Mu computer's memory-safe language

Still no type-checking or memory-safety, but we can now write any programs with int variables.

There's still no 'var' keyword, so we can't define local variables yet. But that's not insurmountable; just pass in extra arguments for any space you want on the stack 😀

result <- factorial n 0 0 0

permalink

* *
archive
projects
writings
videos
subscribe
Mastodon
RSS (?)
twtxt (?)
Station (?)