そこで私は、Python に似た構文を持つ単純なコンパイルから C への言語の作成に取り組んでいます。サンプル ソース コードを次に示します。
# All comments start with pound signs
# Integer declaration
speed = 4
motor = 69.5
text = "hey + guys!"
junk = 5 +4
# Move function
def move():
speed = speed + 1
print speed
# Main function (program entry)
def main():
localvar = 43.2
move()
if true:
print localvar
Python と同様に、この言語はインデント ポリシーによって読みやすさを重視しています。また、非常に緩い型宣言システムも備えています。タイプはコンテキストによって決定されます。
object = 5 // Creates an integer
object_two = "stuff" // Creates a string
object_three = 5.23 // Creates a float
上記のサンプル ソース コードは、次のように内部的に表されます。
[
[
"GLOBAL",
[
"speed = 4",
"motor = 69.5",
"text = \"hey + guys!\"",
"junk = 5 +4"
],
[
"SCOPE",
[
"speed",
"motor",
"text",
"junk"
],
[
"INT",
"FLOAT",
"STRING",
"INT"
],
[
0,
1,
2,
3
]
]
],
[
"def move():",
[
" speed = speed + 1",
" print speed"
],
[
"SCOPE",
[
"speed",
"motor",
"text",
"junk"
],
[
"GLOBAL",
"GLOBAL",
"GLOBAL",
"GLOBAL"
],
[
0,
1,
2,
3
]
]
],
[
"def main():",
[
" localvar = 43.2",
" move()",
" if true:",
" print localvar"
],
[
"SCOPE",
[
"speed",
"motor",
"text",
"junk",
"localvar"
],
[
"GLOBAL",
"GLOBAL",
"GLOBAL",
"GLOBAL",
"FLOAT"
],
[
0,
1,
2,
3,
0
]
]
]
]
すべての関数は、それぞれのローカル変数とその型 (関数に対して宣言されている行のインデックスも) とともに、この表現にパックされます。
この中間表現を実際の C コードに変換しようとしています (実際には NXC コードなので、C とは少し異なります)。
私の質問は、変数の型 (特に、関数の引数で宣言された変数) をどのように理解できるかということです。これを行う唯一の方法は、関数が呼び出されたコンテキストに基づいて推測することです。
言うまでもなく、中間表現を直線的に作成しています。関数が定義されていても、後で呼び出されるまで呼び出されない場合はどうなりますか? 必要な型情報をすべて取得するまで、この中間表現を変更して何度か実行する必要がありますか?