A plan, deferred behind the 1.0 freeze like everything else here: what Finch is today (measured from its repository: LLVM, self-hosting boot/ compiler, C import, targets), what SchOS would need, and the open question of what "finishing" it means. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015f73FesGZGYPkmDvUcj6QX
3.5 KiB
Finch, for SchOS's own programs
Later. Not being worked on — it is behind 1.0.md's freeze like everything else here that is not named there. This records the decision so it is not rediscovered.
Finch is the author's own language: https://pandor.pl/git/nexoniarz/Finch
(GitHub mirror: Nexoniarz/Finch). The plan is to write SchOS's own
applications and tools in it, in place of C, and so leave behind what C does
badly: silent narrowing, signed/unsigned mixing, undefined behaviour on an
out-of-range index, a forgotten free.
What it is today (version 2.4.0)
Measured from the repository, not from its README alone:
- LLVM front end, C-like syntax, no semicolons, no headers, no preprocessor.
It compiles through LLVM's
-O2pipeline to native code; there is no garbage collector. - Values, not references: lists, text and structs copy on assignment and are freed at the end of their block. Out-of-range indexes, division by zero and null pointers stop with a runtime error rather than undefined behaviour.
- Errors as values (
int(s) or 0,try read_file(p)), maps, methods, modules. - C interop through libclang:
import "foo.h"pluslink "foo"calls any C library, structs by value and callbacks included. That is the way in to everything SchOS already has — musl, the/dev/*interfaces, Alpine's libraries. - Targets: Linux, macOS, Windows, on x86-64 and ARM64 (
src/target.cpp; the System V, AAPCS64 and Microsoft x64 ABIs are insrc/abi.cpp). - Tooling: a language server (
finch lsp), VS Code and Kate support, 74 tests. - Self-hosting:
boot/is a Finch compiler written in Finch (about 3,100 lines, against about 5,000 for the C++ one insrc/) that builds itself to a byte-identical result —tests/boot.sh.
What SchOS would need to do
- A
schostarget.finchpicks a triple, a C compiler and a linker per target. SchOS runs unmodified Alpine binaries and Alpine's musl (see alpine.md), so the first target is the existingx86_64-unknown-linux-musl, and a Finch program built on the host should run on SchOS before anything in Finch is made SchOS-specific. Test that before writing a line of target code. - The compiler on SchOS. Needs LLVM 21 and libclang, both of which Alpine packages. That is a question of apk and memory, not of SchOS.
boot/as the SchOS-hosted compiler. The C++ compiler needs LLVM's C++ libraries; the one inboot/is the candidate for being the compiler that ships in the image, once it emits through LLVM's C API or a smaller back end.- Bindings for SchOS's own interfaces (
/dev/pci,/dev/netdev, schinit's job protocol, the framebuffer) — generated by the C importer from the headers ininclude/uapi/, so they are not hand-written and cannot drift from the kernel.
What "finishing Finch" means is not settled
The repository has no list of what is unfinished. Before work starts, the
author names it. Candidates seen in the tree: note.txt and notatka.txt are
scratch files; OpenGL.fn was deleted in the last commit; the boot/ compiler
is shorter than the C++ one, so some language features may exist only in the
latter. The first task is to diff the two feature sets, not to guess.
Rules
- Nothing in the kernel is rewritten in Finch. It is for applications and tools.
- No new capability starts until the register of unfinished work is empty; this document is a plan, not an exception to that.