Cesium is a fully managed C compiler for CLI platform (.NET).
What? Cesium compiles standard C source code to a .NET assembly. No unmanaged/mixed mode (a-lá C++/CLI) code is generated; everything is fully managed (but may be unsafe).
Why? C programs are very useful in the modern world, and solve practical tasks. At the same time, deploying C code alongside .NET code may be tricky (especially if your application supports multiple platforms). Cesium is designed to resolve the problems of C code deployment, and lift it to the managed state (so it is cross-platform in the same way the underlying CIL code it is compiled to).
Unfortunately, not yet. You won't be able to use Cesium for anything useful today. Probably, you'll be able to start after the next milestone is implemented. Stay tuned!
- C17 standard compatibility: poor
- Preprocessor: only
#include
is supported - Lexer: mostly works, but needs more tests and validation on its compliance
- Parser: supports about 20% of the language syntax
- Preprocessor: only
- Compiler
- CIL code generator: basics are ready, new features get added
- PDB support: none
- Standard library: a very few functions are supported
- .NET SDK: none
Have a question? Welcome to the discussions section!
Looking to contribute? Check open issues with the "help wanted" label. Cesium is a big project which lives thanks to its contributors.
If you're interested in certain project area, check the per-area issue labels:
area:cil-interop
: issues related to CLI interoparea:compiler
: issues related to the Cesium compiler, type checker, and code analyzerarea:parser
: issues related to C parsingarea:standard-support
: issues related to C17 standard supportarea:sdk
: issues related to the Cesium .NET SDK
Currently, Cesium is able to compile a "Hello, world" C17 example to a .NET assembly:
#include <stdio.h>
int main(int argc, char *argv[])
{
puts("Hello, world!");
return 42;
}
The next milestone is #61: sha1collisiondetection, which is 0% complete.
$ dotnet run --project Cesium.Compiler -- <path to the input .c file> <path to the output assembly>
For example, this will generate an assembly executable by .NET 6, .NET Framework, or Mono:
$ dotnet run --project Cesium.Compiler -- Cesium.Samples/minimal.c out.exe
$ dotnet ./out.exe # run with .NET 6
$ ./out.exe # only on Windows, run with .NET Framework
$ mono ./out.exe # run with Mono
In order to test changes please run following for fast-cycle testing
$ dotnet test
And if you want to run integration tests
$ pwsh -c ./Cesium.IntegrationTests/Run-Tests.ps1 -NoBuild
(don't pass -NoBuild
if you want to automatically rebuild the compiler before running the integration tests)
If you debug integration tests and want to run just single test
pwsh -c ./Cesium.IntegrationTests/Run-Tests.ps1 -TestCaseName quoted_include_fallback.c
where quoted_include_fallback.c
is path within Cesium.IntegrationTests
folder.