среда, 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
}

вторник, 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
}