From Reddit
bearophile
bearophileHUGS at lycos.com
Wed Jun 17 07:34:10 PDT 2009
I have written some comments about the article written by Andrei Alexandrescu:
http://www.reddit.com/r/programming/comments/8t7s1/the_case_for_d_the_other_side_of_the_coin/
Andrei has commented some things on Reddit, I think it's better to move the discussion here.
If there are wrong things in what I have written I'll fix them (Fixing a LiveJournal post is simple, probably simpler than fixing an article on DDJ).
>I have seldom been this annoyed at a piece of feedback, and I've received my share of bile.<
I didn't mean to hurt feelings so much. I never had somethign against you or against D.
>I have no idea what the author wants to convey.<
I have answered that in the first few lines:
>Giving false expectations in possible new D users is dangerous. I think that giving a more balanced account of the current situation is better, even if in future most of current D problems may be fixed.<
I think your article shows mostly positive sides of D, even if what you say may become true in future.
I think my comments (once fixed) are actually good for the spreading of D :-)
>The article originates in some feedback that the author (I'd sent him a draft for review) sent me, and that I considered unfit to integrate in the final version.<
The article doesn't originate from that, it originates just from the final article you have written on DDJ.
>Some comments are patently false (such as the one that you must compile with dmc to call C functions on Windows).<
Is this true? I have seen many times people here answer that code has to be compiled with DMC, etc. If I am wrong I'll fix the text.
>Some are ignorant (the author concluded that dmd can't optimize tail recursion by trying it with the non-tail-recursive factorial function; and I took the time to explain him!).<
If I compile this D2 program with DMD:
import std.stdio: printf;
import std.conv: to;
int sum(int[] a, int start=0) {
if (start >= a.length)
return 0;
else {
return a[start] + sum(a, start+1);
//auto b = a[start];
//return b + sum(a, start+1);
}
}
void main(char[][] args) {
int n = args.length > 1 ? to!int(args[1]) : 1;
auto a = new int[n];
foreach(i, ref x; a)
x = i;
printf("%d\n", sum(a));
}
This is the cleaned up code I obtain:
sum:
L0: push EAX
push EAX
push EBX
cmp EAX,010h[ESP]
jb L12
pop EBX
add ESP,8
xor EAX,EAX
ret 8
L12: mov EDX,014h[ESP]
mov EBX,010h[ESP]
mov EAX,[EAX*4][EDX]
push EAX
sub ESP,4
mov EAX,010h[ESP]
push EDX
inc EAX
push EBX
call near ptr _D4test3sumFAiiZi
add ESP,4
mov ECX,EAX
pop EAX
add EAX,ECX
pop EBX
add ESP,8
ret 8
main
L0: sub ESP,024h
push EBX
push ESI
cmp dword ptr 030h[ESP],1
jbe L23
mov EDX,034h[ESP]
mov EAX,030h[ESP]
mov EAX,8[EDX]
mov EDX,0Ch[EDX]
push EDX
push EAX
call near ptr _D3std4conv19__T11parseStringTiZ11parseStringFAxaZi
jmp short L28
L23: mov EAX,1
L28: mov ECX,offset FLAT:_D11TypeInfo_Ai6__initZ
push EAX
push ECX
call near ptr __d_newarrayT
xor EBX,EBX
mov ESI,EDX
mov 014h[ESP],EAX
mov 018h[ESP],EDX
add ESP,8
cmp 0Ch[ESP],EBX
je L53
L49: mov [EBX*4][ESI],EBX
inc EBX
cmp EBX,0Ch[ESP]
jb L49
L53: push dword ptr 010h[ESP]
xor EAX,EAX
push dword ptr 010h[ESP]
call near ptr _D4test3sumFAiiZi
mov EBX,offset FLAT:_DATA
push EAX
push EBX
call near ptr _printf
add ESP,8
xor EAX,EAX
pop ESI
pop EBX
add ESP,024h
ret
LDC is almost able to turn that tail-call into a loop (you have to split the final expression in two parts, I don't know if in the meantime such limit has being lifed), and GCC is able to.
>Some are just nitpicky beyond belief.<
I don't agree.
Other anonymous people have answered lot of things in the comments in LiveJournal itself, in some time I'll fix things that have to be fixed, etc.
Bye,
bearophile
More information about the Digitalmars-d
mailing list