compiler

Unnamed Compiled Systems Language Project
git clone http://frotz.net/git/compiler.git
Log | Files | Refs

commit a1663368b1f1753be899839d9ae056632770c08b
parent d30153ccc6a1f5e61d13094999e703504153aa94
Author: Brian Swetland <swetland@frotz.net>
Date:   Sun, 23 May 2021 16:28:23 -0700

docs: why: reflow for 80 col, add some links

Diffstat:
Mdocs/why-write-a-compiler.md | 99+++++++++++++++++++++++++++++++++++++++++++------------------------------------
1 file changed, 54 insertions(+), 45 deletions(-)

diff --git a/docs/why-write-a-compiler.md b/docs/why-write-a-compiler.md @@ -2,75 +2,84 @@ I think my primary motivation is simply that I had never done so before. -Across 30-some years programming, I've written a bunch of assemblers, -several interpreted languages, a number of bytecode runtimes, a linker/preprocessor -for java class files and bytecode into a smaller/lighter bytecode (for -the hiptop family devices), various disassembler, and a pile of domain specific -configuration languages, but never a full top-to-bottom compiled programming language -that starts with source code and ends up with executable machine instructions of -some form or another. +Across 30-some years programming, I've written a bunch of assemblers, several +interpreted languages, a number of bytecode runtimes, a linker/preprocessor for +java class files and bytecode into a smaller/lighter bytecode (for the hiptop +family devices), various disassembler, and a pile of domain specific +configuration languages, but never a full top-to-bottom compiled programming +language that starts with source code and ends up with executable machine +instructions of some form or another. It feels like one of those things that everybody should do at least once. ### Open Source FPGA Toolchains Advances in the state of the art of open source FPGA toolchains have made doing -"real" digital design stuff without awful vendor tools possible, which re-kindled -my interest in this space. It's pretty trivial to build a little CPU on verilog. -It's not hard to crank out a little assembler for it. But if you're doing anything -serious, writing a lot of software in assembly is just not that fun or efficient, -at least not for me. I'd like to have a little systems compiler amongst my tools -that I could easily target various little CPUs with. +"real" digital design stuff without awful vendor tools possible, which +re-kindled my interest in this space. It's pretty trivial to build a little +CPU on verilog. It's not hard to crank out a little assembler for it. But if +you're doing anything serious, writing a lot of software in assembly is just +not that fun or efficient, at least not for me. I'd like to have a little +systems compiler amongst my tools that I could easily target various little +CPUs with. ### The Big Compilers are Way Too Big GCC and LLVM/clang are open source. And very powerful. And frickin' enormous. -So while I could invest in learning how to make use of, say, LLVM to build my own -frontends and share backends, or write backends for either, both of them are quite -enormous, complex source bases, and I'm not super excited about dealing with giant -piles of other peoples' software. +So while I could invest in learning how to make use of, say, LLVM to build my +own frontends and share backends, or write backends for either, both of them +are quite enormous, complex source bases, and I'm not super excited about +dealing with giant piles of other peoples' software. ### Self-Hosting and Embedded Platforms -While I'm writing the initial version in C, once I have sufficient feature coverage -I hope to mechanically translate the C version and migrate to building the compiler -with itself. A Self-Hosting Compiler is another one of those "it'd be fun to do -that at least once" sort of things. +While I'm writing the initial version in C, once I have sufficient feature +coverage I hope to mechanically translate the C version and migrate to building +the compiler with itself. A Self-Hosting Compiler is another one of those +"it'd be fun to do that at least once" sort of things. -I'd also like to be able to use the compiler not just to build for but run on small -embedded devices, retro computing systems, or experimental small platforms. On the -scale of single-digit megabytes of memory or less at the low end. That definitely -rules out GCC and clang. +I'd also like to be able to use the compiler not just to build for but run on +small embedded devices, retro computing systems, or experimental small +platforms. On the scale of single-digit megabytes of memory or less at the low +end. That definitely rules out GCC and clang. ### At Most, I Want "Just Enough" Optimization -Modern optimizing compilers are amazing things, but they increasingly seem to be -getting to clever for their own good (or at least mine). For systems programming, -especially, I really don't want the compiler to silently drop code or massively -rearrange it. I want to be able to rely on the compiler mostly doing what I tell -it and not getting all inventive about "undefined behaviour." +Modern optimizing compilers are amazing things, but they increasingly seem to +be getting to clever for their own good (or at least mine). For systems +programming, especially, I really don't want the compiler to silently drop code +or massively rearrange it. I want to be able to rely on the compiler mostly +doing what I tell it and not getting all inventive about "undefined behaviour." C and C++ have a bunch of undefined behaviour around integer and unsigned math, -for example, which result in a weird gap between what the underlying machine does -if you ask it and what a modern compiler considers "valid", and if "not valid" -happily pretends like it doesn't matter. In a way I'm looking for a bit more of -the "high level assembly language" that C is often accused of being while it is -increasingly not... +for example, which result in a weird gap between what the underlying machine +does if you ask it and what a modern compiler considers "valid", and if "not +valid" happily pretends like it doesn't matter. In a way I'm looking for a bit +more of the "high level assembly language" that C is often accused of being +while it is increasingly not... + +https://www.yodaiken.com/2021/05/19/undefined-behavior-in-c-is-a-reading-error/ + +https://www.yodaiken.com/2021/05/16/c-is-not-a-serious-programming-language/ ### They Still Haven't Built me a "Better C" -Go comes close, but its insistence of green threads, userspace scheduling, garbage -collection, largish libraries, large runtime memory footprint, and really awkward -interworking with native C/ELF ABI code are deal breakers. +Go comes close, but its insistence of green threads, userspace scheduling, +garbage collection, largish libraries, large runtime memory footprint, and +really awkward interworking with native C/ELF ABI code are deal breakers. + +Rust is more pragmatic about inteworking with C/C++ native code and native +platform threading (yay), but still suffers from a large standard library that +doesn't seem to layer/subset well, resulting in even small programs being +several megabytes in size. -Rust is more pragmatic about inteworking with C/C++ native code and native platform -threading (yay), but still suffers from a large standard library that doesn't seem -to layer/subset well, resulting in even small programs being several megabytes in size. -I feel like its heart is in the right place with the lifetime tracking stuff, but it -feels rather awkward to code with. It also suffers from very slow compilation. +I feel like its heart is in the right place with the lifetime tracking stuff, +but it feels rather awkward to code with. It also suffers from very slow +compilation. And so on and so on. -This project gives me a chance to do my own experimenting, and while I am skeptical -that I shall succeed wildly where all others have failed, at least I'll have fun trying. +This project gives me a chance to do my own experimenting, and while I am +skeptical that I shall succeed wildly where all others have failed, at least +I'll have fun trying.