Sujet : Re: transpiling to low level C
De : cr88192 (at) *nospam* gmail.com (BGB)
Groupes : comp.lang.cDate : 16. Dec 2024, 00:53:30
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <vjnq5s$pubt$1@dont-email.me>
References : 1 2 3
User-Agent : Mozilla Thunderbird
On 12/15/2024 3:32 PM, bart wrote:
On 15/12/2024 19:08, Bonita Montero wrote:
C++ is more readable because is is magnitudes more expressive than C.
You can easily write a C++-statement that would hunddres of lines in
C (imagines specializing a unordered_map by hand). Making a language
less expressive makes it even less readable, and that's also true for
your reduced C.
>
That's not really the point of it. This reduced C is used as an intermediate language for a compiler target. It will not usually be read, or maintained.
An intermediate language needs to at a lower level than the source language.
And for this project, it needs to be compilable by any C89 compiler.
Generating C++ would be quite useless.
As an IL, even C is a little overkill, unless turned into a restricted subset (say, along similar lines to GCC's GIMPLE).
Say:
Only function-scope variables allowed;
No high-level control structures;
...
Say:
int foo(int x)
{
int i, v;
for(i=x, v=0; i>0; i--)
v=v*i;
return(v);
}
Becoming, say:
int foo(int x)
{
int i;
int v;
i=x;
v=0;
if(i<=0)goto L1;
L0:
v=v*i;
i=i-1;
if(i>0)goto L0;
L1:
return v;
}
...
Though, this still requires the backend to have a full parser.
Would still be simpler still for a backend to use a plain binary serialization, and/or maybe a syntax more like BASIC or similar.
Say:
SUB foo ( x as Int ) as Int
DIM i as Int
DIM v as Int
i=x
v=0
IF i <= 0 THEN GOTO L1
L0:
v = v * i
i = i - 1
IF i > 0 THEN GOTO L0
L1:
RETURN v
END SUB
Where one can have a parser that reads one line at a time, breaks it into tokens, and does simple pattern matching.
Pretty much all higher level control flow can be expressed via goto.
Variables within sub-blocks can be promoted to function scope, possibly renamed:
int i;
if() {
long i;
...
}
Remaps:
int i$0;
long i$1;
"switch()" can be decomposed:
switch(i)
{
case 1:
A;
break;
case 2:
B;
case 3:
C;
}
To:
if(i==1)goto CL1;
if(i==2)goto CL2;
if(i==3)goto CL3;
goto CDFL;
CL1:
A;
goto CEND;
CL2:
B;
CL3:
C;
CDFL:
CEND:
...