0

そこで私は、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 とは少し異なります)。

私の質問は、変数の型 (特に、関数の引数で宣言された変数) をどのように理解できるかということです。これを行う唯一の方法は、関数が呼び出されたコンテキストに基づいて推測することです。

言うまでもなく、中間表現を直線的に作成しています。関数が定義されていても、後で呼び出されるまで呼び出されない場合はどうなりますか? 必要な型情報をすべて取得するまで、この中間表現を変更して何度か実行する必要がありますか?

4

0 に答える 0