Syntax:
program Helloworld;
Myrecord=record
c:integer;
function abc(a:integer):integer;
begin
self.c:=a;
result:=self.c;
end;
end;
mr:Myrecord;
function Func(var a:Myrecord):integer;
begin
a.c:=4;
write mr.c;
a.abc(5);
write a.c;
result:=6;
end;
begin
Func(mr);
end
.NET BackEnd:
.assembly extern mscorlib { auto }
.assembly project {}
.class public sealed Myrecord extends [mscorlib]System.ValueType
{
.field public static int32 c
.method public instance int32 abc(int32 a) cil managed
{
ldarg.0
ldarg a
stfld int32 .this::c
ldarg.0
ldfld int32 .this::c
ret
}
}
.field public static valuetype Myrecord mr
.method static public void main() cil managed
{
.entrypoint
ldsflda valuetype Myrecord mr
call int32 Func( valuetype Myrecord& a)
pop
ret
}
.method static public int32 Func( valuetype Myrecord& a) cil managed
{
ldarg a
ldc.i4 4
stfld int32 Myrecord::c
ldsflda valuetype Myrecord mr
ldfld int32 Myrecord::c
call void [mscorlib]System.Console::Write(int32)
ldarg a
ldc.i4 5
call instance int32 Myrecord::abc(int32 a)
pop
ldarg a
ldfld int32 Myrecord::c
call void [mscorlib]System.Console::Write(int32)
ldc.i4 6
ret
}
пятница, 3 декабря 2010 г.
понедельник, 8 ноября 2010 г.
Added @ and ^ operators
I have just added.
begin
pinteger:=@mr.c;
a:=pinteger^;
mr.c:=@a^;
end
=>
.entrypoint
ldsflda valuetype Myrecord mr
ldflda int32 Myrecord::c
stsfld int32* pinteger
ldsfld int32* pinteger
ldobj int32
stsfld int32 a
ldsflda valuetype Myrecord mr
ldsflda int32 a
ldobj int32
stfld int32 Myrecord::c
ret
begin
pinteger:=@mr.c;
a:=pinteger^;
mr.c:=@a^;
end
=>
.entrypoint
ldsflda valuetype Myrecord mr
ldflda int32 Myrecord::c
stsfld int32* pinteger
ldsfld int32* pinteger
ldobj int32
stsfld int32 a
ldsflda valuetype Myrecord mr
ldsflda int32 a
ldobj int32
stfld int32 Myrecord::c
ret
среда, 3 ноября 2010 г.
Test YAR Type inference
Todays working sample
function abc < T,U > (a:T):^U;
begin
end
pinteger:^integer;
d:double;
pinteger:=abc(d);
=> T=double
=> U=integer
So generic operators like @, [], sizeof .. to come very soon.
function abc < T,U > (a:T):^U;
begin
end
pinteger:^integer;
d:double;
pinteger:=abc(d);
=> T=double
=> U=integer
So generic operators like @, [], sizeof .. to come very soon.
вторник, 2 ноября 2010 г.
YAR and Type inference
Working on support Type Inference in YAR.
A sample:
mr:Myrecord;
a,b:integer;
d:double;
function GenericFunc < T, U , Z> (var a:T;b:U):Z;
begin
end;
..
begin
GenericFunc(a,a):=d; //I know this function result is not a lvalue.
//I relax the assign op type checking rules
//to test of infering of result type
A sample:
mr:Myrecord;
a,b:integer;
d:double;
function GenericFunc < T, U , Z> (var a:T;b:U):Z;
begin
end;
..
begin
GenericFunc(a,a):=d; //I know this function result is not a lvalue.
//I relax the assign op type checking rules
//to test of infering of result type
среда, 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
}
Подписаться на:
Сообщения (Atom)