* MCS: The Ximian C# compiler
- MCS began as an experiment to learn the features of C# by
- writing a large C# program. MCS is currently able to parse C#
- programs and create an internal tree representation of the
- program. MCS can parse itself.
+ MCS is currently able to compile itself and many more C#
+ programs (there is a test suite included that you can use).
+ It is routinely used to compile Mono, roughly half a million
+ lines of C# code.
- Work is progressing quickly on various fronts in the C#
- compiler. Recently I started using the System.Reflection API
- to load system type definitions and avoid self-population of
- types in the compiler and dropped my internal Type
- representation in favor of using the CLI's System.Type.
+ We are in feature completion mode right now. There are still
+ a couple of areas that are not covered by the Mono compiler, but
+ they are very very few at this point (security attributes),
+ you can also browse the MCS <a href="http://bugzilla.ximian.com/buglist.cgi?product=Mono%2FMCS&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&changedin=&chfieldfrom=&chfieldto=Now&chfieldvalue=&short_desc=&short_desc_type=substring&long_desc=&long_desc_type=substring&bug_file_loc=&bug_file_loc_type=substring&keywords=&keywords_type=anywords&op_sys_details=&op_sys_details_type=substring&version_details=&version_details_type=substring&cmdtype=doit&newqueryname=&order=Reuse+same+sort+as+last+time&form_name=query">bugs</a> from Bugzilla.
+
+ A test suite is maintained to track the progress of
+ the compiler and various programs are routinely compiled and
+ ran.
+
+** Slides
+
+ Slides for the Mono C# Compiler presentation at .NET ONE are
+ available <a
+ href="http://primates.ximian.com/~miguel/slides-europe-nov-2002/Mono_C_Sharp_Overview_1007.sxi">here</a>
+ in StarOffice format.
+
+** Obtaining MCS
+
+ The Mono C# compiler is part of the `mcs' module in the Mono CVS
+ you can get it from our <a href="anoncvs.html">Anonymous CVS</a> server,
+ or you can get nightly <a href="download.html">download page</a>.
+
+** Running MCS
+
+ MCS is written in C# and uses heavily the .NET APIs. MCS runs
+ on Linux with the Mono runtime and on Windows with both the
+ .NET runtime and the Mono runtime.
+
+** Reporting Bugs in MCS
+
+ When you report a bug, try to provide a small test case that would
+ show the error so we can include this as part of the Mono C# regression
+ test suite.
+
+ If the bug is an error or a warning that we do not flag, write
+ a sample program called `csXXXX.cs' where XXXX is the code number
+ that is used by the Microsoft C# compiler that illustrates the
+ problem. That way we can also do regression tests on the invalid
+ input.
** Phases of the compiler
have to postpone this decision until the above steps
are finished.
- * Code generation: nothing done so far, but I do not
- expect this to be hard, as I will just use
- System.Reflection.Emit to generate the code.
-
+ * Code generation: The code generation is done through
+ the System.Reflection.Emit API.
</ul>
-<a name="tasks">
-** Current pending tasks
+** CIL Optimizations.
- Simple tasks:
+ The compiler performs a number of simple optimizations on its input:
+ constant folding (this is required by the C# language spec) and
+ can perform dead code elimination.
- <ul>
- * Array declarations are currently being ignored,
+ Other more interesting optimizations like hoisting are not possible
+ at this point since the compiler output at this point does not
+ generate an intermediate representation that is suitable to
+ perform basic block computation.
- * PInvoke declarations are not supported.
+ Adding an intermediate layer to enable the basic block
+ computation to the compiler should be a simple task, but we
+ are considering having a generic CIL optimizer. Since all the
+ information that is required to perform basic block-based
+ optimizations is available at the CIL level, we might just skip
+ this step altogether and have just a generic IL optimizer that
+ would perform hoisting on arbitrary CIL programs, not only
+ those produced by MCS.
- * Pre-processing is not supported.
+ If this tool is further expanded to perform constant folding
+ (not needed for our C# compiler, as it is already in there)
+ and dead code elimination, other compiler authors might be
+ able to use this generic CIL optimizer in their projects
+ reducing their time to develop a production compiler.
- * Attribute declarations and passing currently ignored.
+** History
- * Compiler does not pass around line/col information from tokenizer for error reporting.
+ MCS was able to parse itself on April 2001, MCS compiled itself
+ for the first time on December 28 2001. MCS became self hosting
+ on January 3rd, 2002.
- * Jay does not work correctly with `error'
- productions, making parser errors hard to point. It
- would be best to port the Bison-To-Java compiler to
- become Bison-to-C# compiler (bjepson@oreilly.com
- might have more information)
- </ul>
-
- Critical tasks:
-
- <ul>
- * Resolve "base" classes and "base" interfaces for
- classes, structs and interfaces.
-
- Once this is done, we can actually do the semantic
- analysis, because otherwise we do not know who our
- parents are.
- </ul>
+ The Mono Runtime and the Mono execution engine were able to make
+ our compiler self hosting on March 12, 2002.
** Questions and Answers
We will do this through an implementation of the CLI Virtual
Execution System for Unix (our JIT engine).
+ Our JIT engine is working for the purposes of using the compiler.
+ The supporting class libraries are being worked on to fully support
+ the compiler.
+
Q: Do you use Bison?
A: No, currently I am using Jay which is a port of Berkeley Yacc to
In the future I want to port one of the Bison/Java ports to C# for
the parser.
-Q: How do I compile it?
+Q: Should someone work on a GCC front-end to C#?
+
+A: I would love if someone does, and we would love to help anyone that
+ takes on that task, but we do not have the time or expertise to
+ build a C# compiler with the GCC engine. I find it a lot more fun
+ personally to work on C# on a C# compiler, which has an intrinsic
+ beauty.
+
+ We can provide help and assistance to anyone who would like to work
+ on this task.
+
+Q: Should someone make a GCC backend that will generate CIL images?
+
+A: I would love to see a backend to GCC that generates CIL images. It
+ would provide a ton of free compilers that would generate CIL
+ code. This is something that people would want to look into
+ anyways for Windows interoperation in the future.
+
+ Again, we would love to provide help and assistance to anyone
+ interested in working in such a project.
+
+Q: What about making a front-end to GCC that takes CIL images and
+ generates native code?
+
+A: I would love to see this, specially since GCC supports this same
+ feature for Java Byte Codes. You could use the metadata library
+ from Mono to read the byte codes (ie, this would be your
+ "front-end") and generate the trees that get passed to the
+ optimizer.
+
+ Ideally our implementation of the CLI will be available as a shared
+ library that could be linked with your application as its runtime
+ support.
+
+ Again, we would love to provide help and assistance to anyone
+ interested in working in such a project.
+
+Q: But would this work around the GPL in the GCC compiler and allow
+ people to work on non-free front-ends?
-A: Compiling MCS currently requires you to run my port of <a
- href="http://primates.ximian.com/~miguel/code/jay.cs.tar.gz">Jay to
- C#</a> on a Unix system to generate the parser, and then you need
- to use Microsoft's .NET csc.exe compiler to compile the compiler.
+A: People can already do this by targeting the JVM byte codes (there
+ are about 130 compilers for various languages that target the JVM).
- You only need to compile the compiler compiler (C code), the
- samples are Java samples that I did not port, and you do not need
- them.
+Q: Why are you writing a JIT engine instead of a front-end to GCC?
- It might be simple to port Jay.cs to Windows, but I have not tried
- this.
+A: The JIT engine and runtime engine will be able to execute CIL
+ executables generated on Windows.
You might also want to look at the <a href="faq.html#gcc">GCC</a>
section on the main FAQ