Don Wrote: > On 09.11.2011 09:17, foobar wrote: > > Don Wrote: > > > >> On 07.11.2011 14:13, Gor Gyolchanyan wrote: > >>> After reading > >>> > >>> http://prowiki.org/wiki4d/wiki.cgi?DMDSourceGuide > >>> https://github.com/gor-f-gyolchanyan/dmd/blob/master/src/interpret.c > >>> > >>> I had a thought: > >>> Why not compile and run CTFE code in a separate executable, write it's > >>> output into a file, read that file and include it's contents into the > >>> object file being compiled? > >>> This would cover 100% of D in CTFE, including external function calls > >>> and classes; > >>> String mixins would simply repeat the process of compiling and running > >>> an extra temporary executable. > >>> > >>> This would open up immense opportunities for such things as > >>> library-based build systems and tons of unprecedented stuff, that I > >>> can't imagine ATM. > >> > >> First comment: classes and exceptions now work in dmd git. The remaining > >> limitations on CTFE are intentional. > >> > >> With what you propose: > >> Cross compilation is a _big_ problem. It is not always true that the > >> source CPU is the same as the target CPU. The most trivial example, > >> which applies already for DMD 64bit, is size_t.sizeof. Conditional > >> compilation can magnify these differences. Different CPUs don't just > >> need different backend code generation; they may be quite different in > >> the semantic pass. I'm not sure that this is solvable. > >> > >> version(ARM) > >> { > >> immutable X = armSpecificCode(); // you want to run this on an X86??? > >> } > >> > > > > I think we discussed those issues before. > > 1. size_t.sizeof: > > auto a = mixin("size_t.sizeof"); // HOST CPU > > auto a = size_t.sizeof; // TARGET CPU > > That doesn't work. mixin happens _before_ CTFE. CTFE never does any > semantics whatsoever. >
If I wasn't clear before - the above example is meant to illustrate how multilevel compilation *should* work. If you want, we can make it even clearer by replacing 'mixin' above with 'macro'. > > > > 2. version (ARM) example - this needs clarification of the semantics. Two > > possible options are: > > a. immutable X = ... will be performed on TARGET as is the case today. > > require 'mixin' to call it on HOST. This should be backwards compatible > > since we keep the current CTFE and add support for multi-level compilation. > > b. immutable x = ... is run via the new system which requires the function > > "armSpecificCode" to be compiled ahead of time and provided to the compiler > > in an object form. No Platform incompatibility is possible. > > > > I don't see any problems with cross-compilation. It is a perfectly sound > > design (Universal Turing machine) and it was successfully implemented > > several times before: Lisp, scheme, Nemerle, etc.. It just requires to be a > > bit careful with the semantic definitions. > > AFAIK all these languages target a virtual machine. > Nope. See http://www.cons.org/cmucl/ for a native lisp compiler.