Сам по себе процесс продвигался достаточно безболезненно, однако долго.
Приятно, что планируемые изменения в целом концептуально гладко уложились с текущей структурой компилятора. Однако переименование типов и небольшое изменение их зоны отвественности("утрясание" иерархий классов) отняли большую часть времени. Но в целом остался доволен, хотя и утомительное это занятие заниматься не делом.
среда, 27 октября 2010 г.
вторник, 12 октября 2010 г.
Время для рефакторинга
Достаточно сложно считать на несколько шагов вперед, хотя и очень интересно. Не всегда удается выбрать баланс между выразительностью и скоростью на ранних этапах, да и просто порой принятые решения по проектированию на ранних этапах в меньшей степени предусмотрены для задач для более поздних. Хотя технически работать можно и в рамках текущих проектных решений, однако это требует лишних движений, что отвлекает от решения текущих подзадач.
четверг, 7 октября 2010 г.
Added Procedural Types
Added procedural Types to YAR Language
Extend .NET codegen by MSIL calli instruction
Sample
TMyFunc=function(a:integer):integer;
TXfunc=function(var a:double):TMyFunc;
function abc(a:integer):integer;
begin
result:=a;
end;
function abc(var a:double):TMyFunc;
begin
result:=abc;
end;
e:double;
f:integer;
g:TXfunc;
begin
g:=abc;
f:=g(e)(f);
end
=>
.method static public void main() cil managed
{
.entrypoint
ldftn native int abc(float64& a)
stsfld native int g
ldsfld int32 f
ldsflda float64 e
ldsfld native int g
calli native int (float64& a)
calli int32 (int32 a)
stsfld int32 f
ret
}
Extend .NET codegen by MSIL calli instruction
Sample
TMyFunc=function(a:integer):integer;
TXfunc=function(var a:double):TMyFunc;
function abc(a:integer):integer;
begin
result:=a;
end;
function abc(var a:double):TMyFunc;
begin
result:=abc;
end;
e:double;
f:integer;
g:TXfunc;
begin
g:=abc;
f:=g(e)(f);
end
=>
.method static public void main() cil managed
{
.entrypoint
ldftn native int abc(float64& a)
stsfld native int g
ldsfld int32 f
ldsflda float64 e
ldsfld native int g
calli native int (float64& a)
calli int32 (int32 a)
stsfld int32 f
ret
}
вторник, 5 октября 2010 г.
Supporting dot operator for .NET backend
A sample
program Helloworld;
MyrecordStuff=record
a:integer;
b:integer;
c:boolean;
d:double;
f:double;
end;
Myrecord=record
a,b,c:integer;
private
d:integer;
f:integer;
public
pp:MyrecordStuff;
end;
function abc(var a:integer):integer;
begin
a:=1;
result:=5;
end;
function abc(var a:MyrecordStuff):integer;
begin
a.a:=7;
result:=5;
end;
a,b,c,d:Myrecord;
e:double;
f:integer;
begin
abc(a.a);
abc(a.pp.a);
e:=a.pp.d;
a.pp.a:=f;
a.pp.a:=a.pp.b;
write abc(a.pp);
write a.pp.a;
end
Generated MSIL code
.assembly extern mscorlib { auto }
.assembly project {}
.class public sealed MyrecordStuff extends [mscorlib]System.ValueType
{
.field public static int32 b
.field public static float64 f
.field public static int32 a
.field public static bool c
.field public static float64 d
}
.class public sealed Myrecord extends [mscorlib]System.ValueType
{
.field private static int32 f
.field private static int32 d
.field public static int32 b
.field public static int32 a
.field public static int32 c
.field public static valuetype MyrecordStuff pp
}
.field public static valuetype Myrecord b
.field public static float64 e
.field public static valuetype Myrecord a
.field public static int32 f
.field public static valuetype Myrecord c
.field public static valuetype Myrecord d
.method static public void main() cil managed
{
.entrypoint
ldsflda valuetype Myrecord a
ldflda int32 Myrecord::a
call int32 abc(int32& a)
pop
ldsflda valuetype Myrecord a
ldflda valuetype MyrecordStuff Myrecord::pp
ldflda int32 MyrecordStuff::a
call int32 abc(int32& a)
pop
ldsflda valuetype Myrecord a
ldflda valuetype MyrecordStuff Myrecord::pp
ldfld float64 MyrecordStuff::d
stsfld float64 e
ldsflda valuetype Myrecord a
ldflda valuetype MyrecordStuff Myrecord::pp
ldsfld int32 f
stfld int32 MyrecordStuff::a
ldsflda valuetype Myrecord a
ldflda valuetype MyrecordStuff Myrecord::pp
ldsflda valuetype Myrecord a
ldflda valuetype MyrecordStuff Myrecord::pp
ldfld int32 MyrecordStuff::b
stfld int32 MyrecordStuff::a
ldsflda valuetype Myrecord a
ldflda valuetype MyrecordStuff Myrecord::pp
call int32 abc( valuetype MyrecordStuff& a)
call void [mscorlib]System.Console::Write(int32)
ldsflda valuetype Myrecord a
ldflda valuetype MyrecordStuff Myrecord::pp
ldfld int32 MyrecordStuff::a
call void [mscorlib]System.Console::Write(int32)
ret
}
.method static public int32 abc(int32& a) cil managed
{
ldarg a
ldc.i4 1
stind.i4
ldc.i4 5
ret
}
.method static public int32 abc( valuetype MyrecordStuff& a) cil managed
{
ldarg a
ldc.i4 7
stfld int32 MyrecordStuff::a
ldc.i4 5
ret
}
program Helloworld;
MyrecordStuff=record
a:integer;
b:integer;
c:boolean;
d:double;
f:double;
end;
Myrecord=record
a,b,c:integer;
private
d:integer;
f:integer;
public
pp:MyrecordStuff;
end;
function abc(var a:integer):integer;
begin
a:=1;
result:=5;
end;
function abc(var a:MyrecordStuff):integer;
begin
a.a:=7;
result:=5;
end;
a,b,c,d:Myrecord;
e:double;
f:integer;
begin
abc(a.a);
abc(a.pp.a);
e:=a.pp.d;
a.pp.a:=f;
a.pp.a:=a.pp.b;
write abc(a.pp);
write a.pp.a;
end
Generated MSIL code
.assembly extern mscorlib { auto }
.assembly project {}
.class public sealed MyrecordStuff extends [mscorlib]System.ValueType
{
.field public static int32 b
.field public static float64 f
.field public static int32 a
.field public static bool c
.field public static float64 d
}
.class public sealed Myrecord extends [mscorlib]System.ValueType
{
.field private static int32 f
.field private static int32 d
.field public static int32 b
.field public static int32 a
.field public static int32 c
.field public static valuetype MyrecordStuff pp
}
.field public static valuetype Myrecord b
.field public static float64 e
.field public static valuetype Myrecord a
.field public static int32 f
.field public static valuetype Myrecord c
.field public static valuetype Myrecord d
.method static public void main() cil managed
{
.entrypoint
ldsflda valuetype Myrecord a
ldflda int32 Myrecord::a
call int32 abc(int32& a)
pop
ldsflda valuetype Myrecord a
ldflda valuetype MyrecordStuff Myrecord::pp
ldflda int32 MyrecordStuff::a
call int32 abc(int32& a)
pop
ldsflda valuetype Myrecord a
ldflda valuetype MyrecordStuff Myrecord::pp
ldfld float64 MyrecordStuff::d
stsfld float64 e
ldsflda valuetype Myrecord a
ldflda valuetype MyrecordStuff Myrecord::pp
ldsfld int32 f
stfld int32 MyrecordStuff::a
ldsflda valuetype Myrecord a
ldflda valuetype MyrecordStuff Myrecord::pp
ldsflda valuetype Myrecord a
ldflda valuetype MyrecordStuff Myrecord::pp
ldfld int32 MyrecordStuff::b
stfld int32 MyrecordStuff::a
ldsflda valuetype Myrecord a
ldflda valuetype MyrecordStuff Myrecord::pp
call int32 abc( valuetype MyrecordStuff& a)
call void [mscorlib]System.Console::Write(int32)
ldsflda valuetype Myrecord a
ldflda valuetype MyrecordStuff Myrecord::pp
ldfld int32 MyrecordStuff::a
call void [mscorlib]System.Console::Write(int32)
ret
}
.method static public int32 abc(int32& a) cil managed
{
ldarg a
ldc.i4 1
stind.i4
ldc.i4 5
ret
}
.method static public int32 abc( valuetype MyrecordStuff& a) cil managed
{
ldarg a
ldc.i4 7
stfld int32 MyrecordStuff::a
ldc.i4 5
ret
}
Подписаться на:
Сообщения (Atom)