[om-list] Dynamic Code Generation

Mark Butler mark.butler at mavincentral.com
Wed Feb 6 12:41:03 EST 2002


Tom,

  Usign a set of C++ programs with a standard Unix would be the easiest way to start.

  Beyond that, I think you should make an MTL interpreter long before you think about any form of a compiler.

C# is nice, provided you can afford Visual Studio.NET or wait until the Mono C# tools stabilize.  C++ is far more portable, so you should probably stick with that for now.

- Mark

Tom and other Packers wrote:
> 
> Mark
> 
>     Would you suggest writing everything in C#, such as the shell, the
> utilities, ... what else is there?  I have too many questions, I don't know
> where to begin.
> 
>     Let's see if I have anything straight, yet.  You suggest I write some of
> the utilities first, as separate executables, which I can run in an existing
> shell, like bash.  Then you suggest I write my own shell, which interprets
> my written commands, like any other shell.  Then, do you suggest two more
> steps: (1) I should use C# Reflection.Emit in the shell to somehow convert
> my MTL into CLR byte code, and use whatever library or DLL that comes with
> C# and is compiled into my MTShell to run this new byte code at run-time.
> (2) I should write a compiler for my MTL.
> 
>     I'm guessing that step two would be a long way off, if I ever get to it.
> And even if I do, I think I will still want to be able to type commands into
> MTShell and run them immediately, without much hassle -- as though it were
> still like any other shell.
> 
>     Am I close?  The things you've shown me sound very interesting.  I just
> don't understand them well enough yet.  Should I start writing everything in
> C#?  Or should still write the utilities in C++ and compile them for both
> windows and Linux?  Is it easier or harder to port C# than C++?  Which is
> faster at run-time?  When you say that CLR modules start slower the first
> time, but speed up after that, does that assume you are running them in
> quick succession, such as when running one shell script.  Or does this
> happen even after closing the program, or re-booting the computer?
> 
> tomp
> 
> ----- Original Message -----
> From: "Mark Butler" <butlerm at middle.net>
> To: "One Model List" <om-list at onemodel.org>
> Cc: "Ping Wang" <pingwang at home.com>
> Sent: Friday, 23 November, 2001 12:50
> Subject: [om-list] Dynamic Code Generation
> 
> Tom,
> 
>   If you are interested in implemented your own language with a matching
> compiler, I thought you might find the following article very interesting:
> 
> http://www.oreillynet.com/pub/a/dotnet/excerpt/prog_csharp_ch18/index.html
> 
> It turns out that C# has capability known as "Reflection.Emit" that allows
> you to generate CLR byte code at run time and then invoke it directly.  This
> is not nearly as transparent as LISP, because CLR byte code is based on a
> FORTH style stack machine, but it is a great improvement over the more
> conventional technique of translating to source code, calling a compiler to
> build a library, and and loading, binding, and calling the compiled
> function.
> 
> The latter really isn't such a bad idea - you can still do it in C#, as
> described in the article.  The  big problem doing this with C++ is that
> there are no available functions to support C++ function lookup or name
> mangling, which makes the source generation / compiling technique limited to
> C functions or C++ functions with C wrappers.  Application plug-ins (e.g.
> Flash, Shockwave, Acrobat Reader, ODBC drivers, etc.) are generally all
> loaded and bound to a common C interface this way, excepting being compiled
> in advance, of course.
> 
> Java has a class loader which eliminates this binding problem, and C# goes
> one step further by providing libraries that allow you to generate CLR
> (common language runtime) byte code directly. CLR assemblies (an analog to
> Java class files) can be interpreted, but Microsoft's policy is always to
> compile and cache the whole assembly on demand, rather than use just-in-time
> compilation techniques to compile the detected hot spots while a program is
> being interpreted.  That means that CLR modules start slower the first time,
> but generally start and run very fast after that.
> 
> So in short, if you want to build an efficient language without building a
> full optimizing native code generator from scratch, writing a front end in
> C# and using the Reflection.Emit capabilities would be a good place to
> start.  Regardless, it would be advisable to implement all the basic
> operations of your language in a class framework long before you get around
> to writing parsers and code generators.
> 
> - Mark
> 
> More C# advocacy, from an open source perspective:
> 
>  http://www.oreillynet.com/pub/a/dotnet/2001/07/09/icaza.html
> 
> _______________________________________________
> om-list mailing list
> om-list at onemodel.org
> http://www.pairlist.net/mailman/listinfo/om-list
m




More information about the om-list mailing list