Click here to Skip to main content
13,828,588 members
Click here to Skip to main content
Add your own
alternative version

Tagged as


25 bookmarked
Posted 4 Sep 2008
Licenced CPOL

C# for MS-DOS: Expression trees compiled into 16-bit MS-DOS binary

, 4 Sep 2008
Rate this:
Please Sign up or sign in to vote.
C# arithmetic expressions compiled into 8086 machine code (yes, you can run it on Vista :-))

What does the Sample do

It compiles C# lambda expressions into 16-bit executable files.

Why is it Interesting?

C# expression trees allow you to analyze C# code and reinterpret it in a different way. E.g. LINQ-to-SQL takes expressions written in C# and turns them into SQL statements.

This sample turns (a small subset of) C# into 8086 machine code.


I have read many blogs about LINQ expression trees and how "cool" they are. However, very few posts explained what actually expression trees are for. This sample demonstrates one possible usage. Some day, I may expand this article to further discuss the place of expression trees in life.

Why .Com Files 

I chose .com files because they are as simple as executable format gets. Just an array of 8086 machine codes with absolutely no headers or metadata. A compiler writer heaven. And it is still executable on all versions of Windows.

NB: "com" here is merely a file extension, as in It has nothing to do with Component Object Model which appeared 10 or so years after .com files.  

Compiling Expressions

An expression may contain variables and three arithmetic operations: +, -, and *. All arithmetic is done in unsigned 16-bit integers.

When the generated COM file executes, it prints a banner, prompts the user for parameter values (if any), calculates the result and displays it. COM files shall be executed in a console window, e.g. from cmd.exe.

E.g. expression (x,y) => 2*x + 3*y when compiled and executed produces the following output (user input in bold):

C# for MS-DOS, version 1.0
x? 10
y? 20
((2 * x) + (3 * y)) = 80

Calling Expression Compiler

The sample provides class ExpressionCompiler86 with the method Compile(Expression expr). Here is how main class Program compiles three expressions:

// a little wrapper to makes things simpler
static void Compile<T>(string file, Expression<T> expr)
    using (ExpressionCompiler86 compiler = new ExpressionCompiler86(file))


Compile<Func<int>>( "", () => 42);
Compile<Func<int>>( "", () => 1+2+3*4);
Compile<Func<int,int,int>>( "", (x,y) => 2*x + 3*y );


Please be lenient to the quality of code. It is not production code. It's a sample, or, rather, a proof of concept. It was written in one day. It contains absolutely no automated tests. There are absolutely no overflow checks or anything like that. Class names may be questionable. Bugs are likely.  



  • 4th September, 2008: Initial post


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Ivan Krivyakov
Technical Lead Thomson Reuters
United States United States
Ivan is a hands-on software architect/technical lead working for Thomson Reuters in the New York City area. At present I am mostly building complex multi-threaded WPF application for the financial sector, but I am also interested in cloud computing, web development, mobile development, etc.

Please visit my web site:

You may also be interested in...

Comments and Discussions

GeneralGot my 5 Pin
Lee Humphries8-Sep-08 14:16
professionalLee Humphries8-Sep-08 14:16 
GeneralRe: Got my 5 Pin
Ivan Krivyakov9-Sep-08 16:32
memberIvan Krivyakov9-Sep-08 16:32 
GeneralRe: Got my 5 Pin
Lee Humphries9-Sep-08 19:07
professionalLee Humphries9-Sep-08 19:07 
GeneralExcellent Pin
torial5-Sep-08 5:57
membertorial5-Sep-08 5:57 
GeneralNice... Pin
Rob Philpott5-Sep-08 2:43
memberRob Philpott5-Sep-08 2:43 
Generalgenius Pin
Huisheng Chen4-Sep-08 21:20
memberHuisheng Chen4-Sep-08 21:20 
GeneralAwesome Pin
Tarnacious Barfish4-Sep-08 20:37
memberTarnacious Barfish4-Sep-08 20:37 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Cookies | Terms of Use | Mobile
Web02 | 2.8.190114.1 | Last Updated 4 Sep 2008
Article Copyright 2008 by Ivan Krivyakov
Everything else Copyright © CodeProject, 1999-2019
Layout: fixed | fluid