Freestanding programming language
Go to file
Sasha Koshka e55e332e17 Fixed doc for fsplc and fsplmod 2024-02-23 03:20:51 -05:00
analyzer Changed repository import paths 2024-02-22 19:22:53 -05:00
assets Add logo to readme 2024-01-25 07:42:32 +00:00
cli Cli now handles printing stuff 2024-02-22 21:24:07 -05:00
cmd Fixed doc for fsplc and fsplmod 2024-02-23 03:20:51 -05:00
compiler Cli now handles printing stuff 2024-02-22 21:24:07 -05:00
design Reflected those changes in unit design doc 2024-02-21 13:46:26 -05:00
entity Metadata.String quotes UUID 2024-02-23 00:24:09 -05:00
errors Changed repository import paths 2024-02-22 19:22:53 -05:00
generator Changed repository import paths 2024-02-22 19:22:53 -05:00
integer Add doc comments to integer 2024-02-09 01:00:54 -05:00
lexer Lexer skips over zero runes now 2024-02-23 01:08:58 -05:00
llvm Remove llvm/ 2024-02-09 03:37:10 -05:00
parser Lexer skips over zero runes now 2024-02-23 01:08:58 -05:00
testcommon testcommon last column no longer has trailing spaces 2024-02-10 21:24:09 -05:00
.editorconfig Add .editorconfig 2024-02-10 19:03:38 -05:00
LICENSE License under GPLv3 2024-02-13 19:16:11 +00:00 Minor readme fixes 2024-02-13 19:58:28 +00:00
go.mod Changed repository import paths 2024-02-22 19:22:53 -05:00
go.sum Changed go.mod version to 1.19 2024-02-21 13:49:46 -05:00


FSPL logo.

Freestanding programming language: a high-ish-level language that has absolutely no need for any runtime support, designed to work well in scenarios where dragging along a language runtime is either not possible or simply unwanted.

This language is designed for:

  • Operating system development
  • Embedded software
  • Integrating cleanly into existing software

Design Principles

  • Abstractions must happen at compile time unless absolutely necessary
  • Compiler must not generate any functions that the user does not write
  • Compiler must avoid generating logic that the user does not write


You can install the compiler by running:

go install ./cmd/fsplc

The fsplc program depends on the LLVM IR compiler (llc). If it is not found, it will attempt to use clang instead but with some features disabled. Please ensure either llc or clang are installed and accessible from your PATH before using this software.


The fsplc program may be used as follows:

fsplc [ARGUMENT(S)...] FILE(S)...

The program compiles all input files into one output. The output file type is determined by the filename extension of the output file:

Extension Type
.s Native assembly
.o Object file

If no output file is specified, it will default to an object file with the name of the first input file.

Object files can be linked into an executable binary using the linker of your choice, or by using a C compiler such as clang:

clang -o OUTPUT INPUT.o

Using a C compiler will link the C standard library to your program, which may be useful for building normal user applications.

Learning the language

At this time, there is no guided method of learning how to write FSPL code. However, a good place to start is the design directory, which contains a language specification among other things. The language specification goes into detail about the syntax and semantics of the language, and assuming some background in C programming, it should be enough to attain a reasonable grasp of the language.

Caveats, Bugs

Note that the compiler is still relatively early in development, and has numerous bugs. In addition, language features and syntax are not yet set in stone and may change in the future. Please report any bugs you find to the issue tracker.


Late 2023 (These have been implemented):

  • Top-level entities
    • Type definitions
      • Methods
    • Defined and external functions
  • Type system
    • Strict, static, bottom-up type inference
    • Pointers
    • Arrays
    • Slices
    • Structs
    • Interfaces
  • Expressions and control structures
    • Literals adapt to types via bottom-up type inference
    • Assignment
    • Variable declaration
    • Variable access
    • Function calls
    • Method calls
    • Interface behavior calls
    • Operations
    • Casting
    • Blocks
    • If/else
    • Loops

Q1 2024:

  • Union types (carry type information)
  • Match statements
  • Modules
  • Mutable/immutable variables
  • For/range loops

Q2 2024:

  • Basic, non-final standard library routines
  • Conditional compilation
  • Shared library compilation
  • Constants
  • Vararg
    • FSPL vararg using Slices
    • Optional per-function C-style vararg for compatibility

Q3 2024:

  • Generics
  • Ownership system
  • Lightweight, modularized (and of course, totally optional) standard library to replace those written in Q2

At the beginning of Q4 2024, a 1.0 version of the language will be released.