Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UnifyIR 関数を分割する #1

Open
otofune opened this issue Dec 2, 2020 · 0 comments
Open

UnifyIR 関数を分割する #1

otofune opened this issue Dec 2, 2020 · 0 comments
Labels

Comments

@otofune
Copy link
Owner

otofune commented Dec 2, 2020

Go に起こす部分でユニークなのは any にしなければならないという点でしかない。
情報量が落ちる処理のみが言語系に合わせる部分であり、その表現力を失わない範囲で併合することは問題がない。
その処理だけを切り出せば綺麗にまとまるのでは?

利点としては

  • 他言語への出力がしやすくなる
  • 中間言語を保存することで、生データを保存しなくても追記が行えるようになる
    • 公開リポジトリに元データを含みたくない欲求に答えられる
    • ただし元データは残しておくべき。あくまで中間表現 (キャッシュと同等) なので壊れる可能性がある

欠点としては

  • ただの内部表現であったのに JSON で保存される可能性が出てくると意味論の変更が難しくなるのではないか?
    • これは適当なフェイクのデータを IR から生成できるようにしてしまえば問題ない
      • 循環参照はサポートしていないので収束する
      • optional なフィールドか、Union かで分岐するだけ
    • ただし現在の変換処理が必要な情報まで捨てていた (表現力が足りなかった) 場合はどうしようもない

具体的には3つに分解する

IRUnion を情報量を減らさない範囲で併合する

方針: 同じ型のみ合成する

  1. IRUnion を子として含むなら、その内容を自身に併合する
    • これは子に IRUnion を含まなくなるまで繰り返す
  2. 全く同じ型しかなければ IRUnion をそれらの型にしてしまう
    • IRPrimitive なら条件はないのでそのまま外に出す
    • IRSlice なら of 同士を合成した IRUnion を作成し、併合処理を繰り返す
    • IRStruct なら field 毎に IRUnion を作成し、併合処理を繰り返す。このとき合計 struct 数より少ないフィールドには optional を付与
  3. 異なる型があればそれぞれの型同士で 1. の手順を行った結果を持つ IRUnion とする

IRIgnoreIRUnion から消し去る

[注意]
この処理を行うと IRAny になってしまう可能性があるので破壊的である。
最終成果物を生成する際にのみ、必要な処理。

  1. IRAny が含まれる IRUnion を常に IRAny にする
  2. 但し IRStruct のフィールドが IRUnion であった場合に限り、フィールドを optional 扱いにする役割を果す。その IRUnion からは IRAny を消し去った上で併合処理を繰り返す

Go のために IRUnion を消し去る

  1. 既に併合および IRIgnore を削除されているものとする。されていなければ、すること
  2. IRUnion は全て IRAny にする
    • この時点で併合できる範囲は併合されているはずだから
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant