Experimenting with a Compiled Language
4 points| JhonPork | 1 month ago
The core idea is allowing multiple execution profiles to coexist in a single source file:
- userland (default): indentation-based, Python-like syntax, safety by default - kernel: brace-based syntax, strict rules, no heap or runtime - baremetal: brace-based syntax, raw pointers, no safety net
At build time, a single profile is selected and all other code is erased at compile time — no runtime checks or overhead.
The compiler pipeline is lexer → parser → typed IR → LLVM backend, with profile rules enforced during IR validation rather than at runtime.
Roughly ~90% of the core language and compiler are implemented; I plan to open-source the project once the remaining pieces are finished.
This is still an experiment. I’m mainly curious: - does this model make sense? - are there obvious design pitfalls? - has anyone seen similar approaches succeed or fail?
I’d appreciate critical feedback.
platinumrad|1 month ago
Can you expand on this?
JhonPork|1 month ago
forgotpwd16|1 month ago
Implementation-wise: Tried myself something similar. One language (same core & lib & built-ins) with 2 front-ends that had different syntax and, but similar, semantics. (Didn't go far though.) An issue is not favoring one over the other. Inevitably, in a meta way, you'll if decide to self-host since will've to pick one form to do it. Also, having multiple co-existing forms in same file may complicate tooling.
About the last part, most similar things I've seen are: (i) Perl Mojo's embedded templates which can be included in same file with source code, (ii) Racket's #lang multi-file which allows combining, well, multiple files (thus also use different #lang directives) in same file.
Adoption-wise: It's in a weird position for widespread adoption. There's strong preference towards using a single language which splits into 2 branches: (1) using single language across every layer (basically Rust/Zig), (2) using high-level language with native-competive performance (Python+numpy, jax, etc / JS+ultrafast JIT / Julia).
Currently you target both (one base language) and none (different syntax/semantics). Could move towards an hybrid approach instead by having one syntax and high-level / low-level forms (uncertain what distinguishes kernel/baremetal currently). So some functionality may end up showing differently in the 2 cases to be more acceptable by both camps. This will probably also simplify tooling creation/maintenance.
Of course, since the project is quite experimental in nature, keeping it current way is interesting and very acceptable.
TL;DR Yes (~templating) - Yes (complexity, lower potential adoption) - No (unusual, experimental)
JhonPork|1 month ago