Official DMD compiler written in D

Timon Gehr timon.gehr at gmx.ch
Thu Jan 10 17:43:56 PST 2013


On 01/10/2013 08:52 PM, Dmitry Olshansky wrote:
> 09-Jan-2013 15:05, Timon Gehr пишет:
>> On 01/08/2013 10:06 PM, Philippe Sigaud wrote:
>>> ...
>>>
>>> Isn't SDC also in D? (Bernard Helyer and friends)
>>> https://github.com/bhelyer/SDC
>>>
>>>
>>> Also, Timon Gehr spoke of his own front-end (assumed to be in D) in the
>>> past, but did not provide any link to it.
>>>
>>
>> Yes, it is in D. Nothing is released yet. It needs to be polished a
>> little so that there are no known embarrassing shortcomings anymore.
>> (eg. the parser cannot parse extern(...) declarations in alias
>> declarations yet, and I need to finish making a minor tweak to how
>> template instances are analyzed in order to get circular dependency
>> detection to work reliably. Furthermore, examples like the following are
>> currently rejected, while I want it to work:
>
> [snip]
>
>> CTFE is basically done (as a portable byte code interpreter, but other
>> strategies, such as JIT, could be easily plugged). This is a snippet of
>> my regression test suite:
>>
>> auto dynRangePrimes(){
>>      DynRange!int impl(int start)=>
>>
>> dynRange(cons(start,delay(()=>filter!(a=>a%start)(impl(start+1)))));
>>      return impl(2);
>> }
>>
>> static assert(array(take(dynRangePrimes(), 20)) ==
>> [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71]);
>>
>> )
>
> Cool! I'd love to take even the very preliminary peek at the speed
> profile of this CTFE engine.
>
> If you are interested I'd love to test a small (the code though contains
> a lot of static data) CTFE benchmark that is the bottleneck in the
> compilation of current ctRegex.
>
> See the attachment here:
> http://d.puremagic.com/issues/show_bug.cgi?id=7442
>
> would be nice to see some rough numbers for this vs DMD.
>

I'll let you know as soon as the example runs. Currently this is blocked 
by the missing implementation for the following language features:

- import declarations
- UFCS
- Optional parens on function calls
- Struct literals
- Static struct data
- debug declarations
- Some of the built-in array operations
- Missing object.d (no string, size_t, hash_t alias.)
- (static) foreach
- __ctfe

I will prioritize those features. Except import declarations, they are 
mostly easy to implement, but I haven't gotten around to them yet.

For the meantime, maybe these quick measurements are somewhat useful:

int[] erathos(int x){
	bool[] p;
	for(int i=0;i<=x;i++) p~=true;
	for(int i=3;i*i<=x;i+=2){
		if(p[i]) for(int k=i*i;k<=x;k=k+i) p[k]=false;
	}
	int[] r;
	if(x>=2) r~=2;
	for(int i=3;i<=x;i+=2) if(p[i]) r~=i;
	return r;
}

pragma(msg, "erathos: ",erathos(40000).length);


The frontend (32-bit dmd build, without -inline, otherwise DMD ICEs):
$ time ./d erathos.d
erathos: 4203U

real	0m0.077s
user	0m0.076s
sys	0m0.000s


DMD 2.060 (64 bit):
$ time dmd -o- erathos.d
erathos: 4203u

real	0m2.594s
user	0m0.716s
sys	0m1.696s


...

pragma(msg, "erathos: ",erathos(400000)); // (that is one 0 more)

The frontend:
erathos: 33860U

real	0m0.662s
user	0m0.660s
sys	0m0.000s

DMD: brings down the machine

pragma(msg, "erathos: ",erathos(4000000)); // (yet another 0 more)

The frontend:
erathos: 283146U

real	0m6.867s
user	0m6.832s
sys	0m0.016s

// pragma(msg, "erathos: ",erathos(4000000));
void main(){
     import std.stdio;
     writeln(erathos(4000000).length);
}

$ dmd -O -release -inline -noboundscheck erathos.d && time ./erathos
dmd: module.c:829: void Module::semantic3(): Assertion `semanticstarted 
== 2' failed.

(I'll see if it also fails with DMD 2.061.)

$ dmd -O -release -noboundscheck erathos.d && time ./erathos
283146

real	0m0.144s
user	0m0.132s
sys	0m0.008s

So CTFE in the front end seems to be ~50 times slower than a optimized 
DMD build of the same code in this case. But note that it is powered by 
a simple-minded bytecode interpreter I hacked together mostly during two 
weekends. (the array append is the one from druntime) A lot more is 
possible. I guess it is already fast enough to power std.regex.



More information about the Digitalmars-d mailing list