parent
d60a20abe7
commit
c32d5edd56
52
content/posts/os/2024-08-11.md
Normal file
52
content/posts/os/2024-08-11.md
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
+++
|
||||||
|
title = 'Os Devlog: Lisp Compiler'
|
||||||
|
date = 2024-09-08T12:00:00+02:00
|
||||||
|
categories = ["os"]
|
||||||
|
tags = ["lowlevel", "lisp", "compiler"]
|
||||||
|
summary = "LISP :3"
|
||||||
|
draft = true
|
||||||
|
+++
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
In my previous article I wrote about my [os](https://forgejo.vanten-s.com/vanten-s/os).
|
||||||
|
In this article I will explore the [compiler I have made for the system](https://forgejo.vanten-s.com/vanten-s/lisp-8bit).
|
||||||
|
|
||||||
|
## Goals for the compiler
|
||||||
|
Goals are important for getting stuff done. With this compiler I want to:
|
||||||
|
- Implement a simple LISP language
|
||||||
|
- Compile to a format that my OS supports
|
||||||
|
- Functions
|
||||||
|
- Variables
|
||||||
|
- Loops
|
||||||
|
- If statements
|
||||||
|
- First-class functions
|
||||||
|
|
||||||
|
## AST
|
||||||
|
|
||||||
|
For the program
|
||||||
|
```lisp
|
||||||
|
(+ 1 (+
|
||||||
|
a b ))
|
||||||
|
```
|
||||||
|
The AST looks like this:
|
||||||
|
```text
|
||||||
|
/ \
|
||||||
|
+ / \
|
||||||
|
1 / \
|
||||||
|
/ \ NIL
|
||||||
|
+ / \
|
||||||
|
a / \
|
||||||
|
b NIL
|
||||||
|
```
|
||||||
|
|
||||||
|
## Compilation
|
||||||
|
My lisp-implementation is heavily stack-based, and only uses registers when using instructions that need them.
|
||||||
|
|
||||||
|
For example, a + function could compiler to this:
|
||||||
|
```asm
|
||||||
|
pop eax
|
||||||
|
pop ebx
|
||||||
|
add eax, ebx
|
||||||
|
push eax
|
||||||
|
```
|
||||||
|
|
Loading…
Reference in a new issue