BOOTSTRAPPING ★ 132 upvotes 2021

Show HN: PlanckForth – Bootstrapping an interpreter from handwritten 1kb binary

Retrospective Overview & Key Insights

Distilled analysis of the business dynamics, operational challenges, and strategic takeaways:

Published in 2021, this chronicle by @nineties details the mechanics of building a profitable, self-funded business without venture backing.

Core Principles for Independent Builders:
1
Charging customers from day one acts as the ultimate filter for building software that solves genuine, high-urgency problems.
2
Keeping fixed overhead low and leveraging lean infrastructure allows founders to stay alive until market tailwinds kick in.
3
Small, repetitive improvements in customer retention and conversion rates yield massive returns over multi-year horizons.
Community Debate Themes:

The community focused on B2B customer acquisition channels, cold email vs SEO distribution, and balancing full-time employment with side-project development.

Founder's Discussion Replies (@nineties)

Direct clarifications and follow-up comments shared by the author during the live discussion:

OP @nineties Original Author
2021

This project is to bootstrap a language processor from a hand-written ELF binary. This is a hobby project and is not intended for any practical use, but constructing a language processor completely from scratch is a lot of fun. Please try running, reading and playing with the code!

Bootstrapping proceeds as follows:

1. Implement a simple Forth interpreter (really) by handwriting ELF.

2. Grow it into a relatively expressive language through self-extension.

Since writing a program in machine language by hand is a tough work, the first interpreter is designed to be very simple. Every built-in word is single-letter and the interpreter just repeats that reads a character, looks it up from the dictionary and executes it. Also there is no error checking.

This is the actual code for the first interpreter, which is a 136-byte implementation of the interpreter followed by a built-in dictionary of 888 bytes.

https://github.com/nineties/planckforth/blob/main/planck.xxd

The first interpreter and language is so esoteric that, for example, the Hello World looks like this.

``` $ ./planck kHtketkltkltkotk tkWtkotkrtkltkdtk!tk:k0-tQ

``` bootstrap.fs self-extends this. After running bootstrap.fs, the Hello World program can be written like this:

``` $ ./planck < bootstrap.fs ." Hello World!" cr

``` At the beginning of bootstrap.fs, you can only use one-letter words, so the code is difficult to read as shown below.

``` $ head bootstrap.fs h@l@h@!h@C+h!k1k0-h@$k:k0-h@k1k0-+$h@C+h!ih@!h@C+h!kefh@!h@C+h!l! h@l@h@!h@C+h!k1k0-h@$k h@k1k0-+$h@C+h!ih@!h@C+h!kefh@!h@C+h!l! h@l@ h@!h@C+h! k1k0-h@$ k\h@k1k0-+$ h@C+h! i h@!h@C+h! kkf h@!h@C+h! kLf h@!h@C+h! k:k0- h@!h@C+h! k=f h@!h@C+h! kJf h@!h@C+h!

``` However, at the end, you can write a normal Forth program as follows. In this way, the interpreter and the language are self-extended during the execution of the script.

``` $ tail bootstrap.fs next-arg dup argv @ ! included else ." Welcome to PlanckForth " version type ." [" runtime type ." ]" cr copyright ." Type 'bye' to exit." cr s" /dev/tty" included then ; execute

``` Various functionalities like compile mode, immediate mode, control-flow structures, literals, variables, constants, file I/O, heap memory, etc. will be available after running bootstrap.fs.

Also, the language and bootstrap.fs are designed to be as environment-independent as possible, so you can implement the runtime in other languages as well. As an example, I added an implementation of the runtime in C and Python 3.

There is no space for detailed explanation here. So please read the following source code and comments.

https://github.com/nineties/planckforth/blob/main/bootstrap.fs

Also, there is a commentary article in Japanese here. I hope you can read it with google translate. (I will write it in English if I have time. someday.)

https://qiita.com/9_ties/items/349b2ed65b7cd8a7d580

Feedbacks and pull requests such as runtime implementations in other languages are very welcome.

Thank you for reading.

OP @nineties Original Author
2021

Sorry. I found a bug in the *Hello World* program I posted above. The Q operation requires an integer argument, an exit status.

So

``` kHtketkltkltkotk tkWtkotkrtkltkdtk!tk:k0-tQ

``` is wrong. The below is correct.

``` kHtketkltkltkotk tkWtkotkrtkltkdtk!tk:k0-tk0k0-Q ```

Community Discussions & Critical Reviews

High-signal perspectives, counter-arguments, and peer founder insights debated on Hacker News (19 total discussions):

NI @nickcw Peer Contributor

bootstrap.fs is a thing of beauty

https://github.com/nineties/planckforth/blob/main/bootstrap.fs

It starts off looking like line noise (the very simple interpreter defined in hex) and gradually turns into the forth we know and love.

Fantastic!

LI @lifthrasiir Peer Contributor

It would make a great addition to the Bootstrapping Wiki [1]!

[1] https://bootstrapping.miraheze.org/ (also a great trove of resources if you are into this kind of things)

ZO @zogomoox Peer Contributor

@nineties, I'm curious why you included things like 'mul', 'divmod', 'and', 'or' in the initial instruction set? These can all be composed, so would make your initial ELF binary a bit smaller.

XV @xvilka Peer Contributor

Reminds me of Mes[1] from Boostrappable project.

[1] https://bootstrappable.org/projects/mes.html

PE @peteri Peer Contributor

Reminds me of buzzard.2 from the 1992 ioccc contest.

http://www.ioccc.org/years.html#1992

HISTORICAL ERA Pandemic Bubble (2020–2022)
COMMUNITY SCORE ★ 132 points
TOTAL DISCUSSIONS 19 comments
TOPICS & TECH STACK:
More Retrospectives by @nineties