From 426d9c9977489f7adba7f4b554e8466a47e520f1 Mon Sep 17 00:00:00 2001
From: Leo Tenenbaum
toc
improves on C’s syntax (and semantics) in many ways,
+
toc
improves on C's syntax (and semantics) in many ways,
To declare x
as an integer and set it to 5,
you can do:
-x := 5; // Declare x and set x to 5 (infer type)
-x : int = 5; // Explicitly make the type int.
-x : int; x = 5; // Declare x as an integer, then set it to 5.
+x := 5; // Declare x and set x to 5 (infer type)
+x : int = 5; // Explicitly make the type int.
+x : int; x = 5; // Declare x as an integer, then set it to 5.
toc
is statically typed and has many of C’s features, but
+
toc
is statically typed and has many of C's features, but
it is nearly as fast in theory.
See docs
for more information (in progress).
tests
has some test programs written in toc
.
To compile the compiler on a Unix-y system, just run ./build.sh release
. You can supply a compiler by running CC=tcc ./build.sh release
, or build it in debug mode without the release
.
To compile the compiler on a Unix-y system, just run ./build.sh release
. You can supply a compiler by running CC=tcc ./build.sh release
, or build it in debug mode without the release
. To disable compile time foreign function support (which you will need to do if you don't have ffcall/dl), prefix this with COMPILE_TIME_FOREIGN_FN_SUPPORT=no
.
On other systems, you can just compile main.c with a C compiler. toc
uses several C99 and a couple of C11 features, so it might not work on all compilers. But it does compile on quite a few, including clang
, gcc
, and tcc
. It can also be compiled as if it were C++, so, MSVC and g++
can also compile it (it does rely on implicit casting of void *
though). The outputted code should be C99-compliant.
toc
compiles to C. Here are some reasons why:
toc
Compiler Source Codetoc
is set up as a unity build, meaning that there is only one translation unit. So, main.c
#include
s toc.c
, which #include
s all of toc
’s files.
toc
is set up as a unity build, meaning that there is only one translation unit. So, main.c
#include
s toc.c
, which #include
s all of toc
's files.
This improves compilation speeds (especially from scratch), since you don’t have to include headers a bunch of times for each translation unit. This is more of a problem in C++, where, for example, doing #include <map>
ends up turning into 25,000 lines after preprocessing. All of toc’s source code, which includes most of the C standard library, at the time of this writing (Dec 2019) is only 22,000 lines after preprocessing; imagine including all of that once for each translation unit which includes map
. It also obviates the need for fancy build systems like CMake.
This improves compilation speeds (especially from scratch), since you don't have to include headers a bunch of times for each translation unit. This is more of a problem in C++, where, for example, doing #include <map>
ends up turning into 25,000 lines after preprocessing. All of toc's source code, which includes most of the C standard library, at the time of this writing (Dec 2019) is only 22,000 lines after preprocessing; imagine including all of that once for each translation unit which includes map
. It also obviates the need for fancy build systems like CMake.
Here are all the C99 features which toc
depends on (I might have forgotten some…):
Here are all the C99 features which toc
depends on (I might have forgotten some...):
And here are all of its C11 features:
max_align_t
- It can still compile without this, and will almost definitely work, but it won’t technically be standard-compliantmax_align_t
- It can still compile without this, and will almost definitely work, but it won't technically be standard-compliantSee main.c
for a bit more information.
If you find a bug, you can report it through GitHub’s issue tracker, or by emailing pommicket@gmail.com.
+If you find a bug, you can report it through GitHub's issue tracker, or by emailing pommicket@gmail.com.
-Just send me the toc
source code which results in the bug, and I’ll try to fix it.
Just send me the toc
source code which results in the bug, and I'll try to fix it.