Two posts in two days? Madness!
Posts in StackLang:
But really, it got a bit late yesterday so I figured I’d split this into two different posts.
Two posts in two days? Madness!
But really, it got a bit late yesterday so I figured I’d split this into two different posts.
Let’s continue StackLang Part VII: New CLI and Datatypes and implement lists stacks in the compiler!
In this post:
We’ve gone through all sorts of things building up the StackLang language so far:
But what can we actually do with it?
It’s been a bit, but I hope it’s worth it. StackLang, part 5: compiling to C!
StackLang, part 4: an interpreter. Here we go again!
This time, the goal is to actually get code running
StackLang, part 3: parsing. This is going to be the most complicated one thus far! Onward.
StackLang, part 2: lexing.
It’s quite often the simplest part of implementing a programming language (although parsers for s-expression based languages come close), but it’s still something that needs done. So here we go!
I enjoy writing programming languages. Example: Tiny. Let’s do that again.
This time, StackLang:
{
@[n fact]
1
{ n 1 - $fact fact n * }
N 1 <= if
} @fact
5 $fact fact writeln
Bit of gibberish there, I suppose, but the goal is to write everything in a postfix/stack based model. So n 1 - $fact fact n *
is equivalent to fact(fact, n - 1) * n
in a more traditional language.
Over the next few posts, I hope to write up where I am thus far and what’s next.
Something was bugging me about my proof from yesterday. If we take another tack on proving Turing completeness, all we would have to prove is that we can simulate SUBLEQ. Since SUBLEQ
is Turing complete, that’s all we need–just convert each SUBLEQ
into a SUB
, JZ
, and a JLS
. So that means that Tiny as written should be Turing complete.
So how does that work?