Skip to content
forked from kekyo/IL2C

IL2C - A translator for ECMA-335 CIL/MSIL to C language.

License

Notifications You must be signed in to change notification settings

FrostyFeng/IL2C

 
 

Repository files navigation

IL2C - A translator for ECMA-335 CIL/MSIL to C language.

Intermediate language everywhere!

Status

Provider Branch Build
AppVeyor master AppVeyor (.NET 4.5 / .NET Core 2.0) AppVeyor tests
Build Stats
AppVeyor devel AppVeyor (.NET 4.5 / .NET Core 2.0) AppVeyor tests
Build Stats
Building package Current
IL2C.Build NuGet IL2C.Build
Library packages Current
IL2C.Interop NuGet IL2C.Interop
IL2C.Core NuGet IL2C.Core

What's this?

  • IL2C is a translator (transpiler) of ECMA-335 CIL/MSIL to C language.

  • We're aiming for:

    • Better predictability of runtime costs
      Better human readability of C source code translated by IL2C.
    • Very tiny footprint requirements
      We're thinking about how to fit from large system with many resources to tiny embedded system. (KB order for the non-OSes system)
    • Better code/runtime portability
      Minimum requirement is only C99 compiler. The runtime minimum requires only the heap, CAS instructions, (POSIX) signal and setjmp/longjmp. Additional better feature is threading API (Win32, pthreads and FreeRTOS.)
    • Better interoperabilities for existed C libraries
      You can use the standard .NET interop technics (like P/Invoke.)
    • Containing seamless building systems for major C toolkits
      for example: CMake system, Arduino IDE, VC++ ...

Simple hello-world like code

Original C# source code:

public static class HelloWorld
{
    public static void Main()
    {
        Console.WriteLine("Hello world with IL2C!");
    }
}

Translated to C source code (all comments are stripped):

IL2C_CONST_STRING(string0__, L"Hello world with IL2C!");

void HelloWorld_Main()
{
    struct
    {
        const IL2C_EXECUTION_FRAME* pNext__;
        const uint16_t objRefCount__;
        const uint16_t valueCount__;
        System_String* stack0_0__;
    } frame__ = { NULL, 1, 0 };
    il2c_link_execution_frame(&frame__);

    frame__.stack0_0__ = string0__;
    System_Console_WriteLine_10(frame__.stack0_0__);
    il2c_unlink_execution_frame(&frame__);
    return;
}

View with comments / other sample translation results (contain complex results)

Getting started

IL2C current status is experimental, read a simple "Getting started" for first step.

And also you can read a blog post using case for the Azure Sphere: "Try writing code using both the Azure Sphere Development Kit and C#" (My blog).

Inside IL2C

If you need understanding deep knowledge for IL2C, see "Inside IL2C" .

Overall status

Following lists are auto-generated by unit test.

License

Under Apache v2.

Related information

Photos of design process

  • #6-6: Near milestones

    #6-6: Near milestones

  • #6-14: Data flow analysis

    #6-14: Data flow analysis

  • Milestone 1: Test on VC++ and check how C compiler's optimizer works.

    Milestone 1: Test on VC++ and check how C compiler's optimizer works

  • #6-48: How mark-and-sweep garbage collection works on a translated code.

    #6-48: How mark-and-sweep garbage collection works on a translated code

  • How overload/override/virtual method symbol calculus work.

    How overload/override/virtual method symbol calculus work

  • How to translate exception handlers when combined the local unwind and global unwind.

    How to translate exception handlers when combined the local unwind and global unwind

  • This is the strcuture graph for the exection-frame and exception-frame.

    This is the strcuture graph for the exection-frame and exception-frame

About

IL2C - A translator for ECMA-335 CIL/MSIL to C language.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C# 61.2%
  • C 31.0%
  • C++ 7.4%
  • Other 0.4%