Don Wrote:

> On 09.11.2011 16:30, foobar wrote:
> > 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.
> 
> Sorry, I don't understand what you're suggesting here.
> 
> > If you want, we can make it even clearer by replacing 'mixin' above with 
> > 'macro'.
> That doesn't help me. Unless it means that what you're talking about 
> goes far, far beyond CTFE.
> 
> Take std.bigint as an example, and suppose we're generating code for ARM 
> on an x86 machine. The final executable is going to be using BigInt, and 
> CTFE uses it as well.
> The semantic pass begins. The semantic pass discards all of the 
> x86-specific code in favour of the ARM-specific stuff. Now CTFE runs. 
> How can it then run natively on x86? All the x86 code is *gone* by then. 
> How do you deal with this?
> 

What I'm suggesting is to generalize C++'s two level compilation into arbitrary 
N-level compilation. 
The model is actually simpler and requires much less language support. 
It works like this: 
level n: you write *regular* run-time code as a "macro" using the compiler's 
public API to access its data structures. You compile into object form plug-ins 
loadable by the compiler.
level n+1 : you write *regular* run-time code. You provide the compiler the 
relevant plug-ins from level n, the compiler loads them and then compiles level 
n+1 code.
of course, this has arbitrary n levels since you could nest macros. 

So to answer your question, I do want to go far beyond CTFE. 
The problem you describe above happens due to the fact that CTFE is *not* a 
separate compilation step. With my model bigint would be compiled twice - once 
for X86 and another for ARM. 
As far as I understand this scenario is currently impossible - you can't use 
bigint with CTFE. 

> 
> >>>
> >>> 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.
> 
> That looks to me, as if it compiles to a virtual machine IR, then 
> compiles that. The real question is whether the characteristics of the 
> real machine are allowed to affect front-end semantics. Do any of those 
> languages do that?
> 

Reply via email to