Giter Site home page Giter Site logo

Refactoring for v5.0.2.0 about jikka HOT 11 CLOSED

kmyk-jikka avatar kmyk-jikka commented on July 17, 2024
Refactoring for v5.0.2.0

from jikka.

Comments (11)

kmyk avatar kmyk commented on July 17, 2024

「関数 f は単調なので min { f(x) | x in [0, n) /\ f(x) >= a } (O(n)) は binsearch [0, n) (fun x -> f(x) >= a) (O(log n)) に最適化できますね」 とかをやっていく必要があり、この「関数 f は単調である」みたいな情報を素朴に型として表現しようとしていた (自然な発想) のですが、やめた方がいい気がしてきたんだよね。普通に annotation でよいはず。なぜなら、依存型はとってもしんどいので

from jikka.

kmyk avatar kmyk commented on July 17, 2024

現状の実装の処理の流れ (Debug.hs):

  1. Python コードの字句解析
  2. Python コードの構文解析
  3. Python AST の α 変換
  4. Python AST に型変数を挿入し型付き Python AST に変換
  5. 型付き Python AST の型推論
  6. 型付き Python AST を ML AST に変換
  7. ML AST 上で最適化 (無用変数削除)
  8. ML AST 上で最適化 (演算子強度低減)
  9. ML AST を SSA 形式ぽい形へ簡略化
  10. ML AST から C++ AST へ変換
  11. C++ AST からコード生成

from jikka.

kmyk avatar kmyk commented on July 17, 2024

v5.0.2.0 表層言語 暫定仕様 docs/language.md

from jikka.

kmyk avatar kmyk commented on July 17, 2024

エラー報告のことは考えてたけどエラー回復のことを考えてなかったね。回復は経験値が 0 なので困ったな

from jikka.

kmyk avatar kmyk commented on July 17, 2024

コードの位置情報を AST の全頂点に付けるのはしんどすぎるが、ではどこに付けるのがいいのだろう。変数だけ?

from jikka.

cannorin avatar cannorin commented on July 17, 2024

位置情報は基本的にASTの全頂点に付けるべき.私はよく

type WithInfo<'info, 'a> = {
  info: 'info
  value: 'a
}

type UntypedAst<'info> =
  | Var of string
  | App of UntypedAstWithInfo<'info> * UntypedAstWithInfo<'info>
  | Abs of string * UntypedAstWithInfo<'info>
and UntypedAstWithInfo<'info> = WithInfo<'info, UntypedAst<'info>>

みたいなことをやっています

↑これは Haskell なら型クラスとか使っていい感じに出来たりしないかな? Haskell で真面目なコンパイラ書いたことないからわからん.

from jikka.

cannorin avatar cannorin commented on July 17, 2024

一応,Python そのものではなく .pyc をパースするという方法もなくはないと思う

まぁ今の場合は Python のサブセットを表層言語にしたいっていうモチベなわけだし(そうだよね?)このままでいいか

from jikka.

cannorin avatar cannorin commented on July 17, 2024

エラー回復については基本的なことは https://www.tutorialspoint.com/compiler_design/compiler_design_error_recovery.htm に載っている.Panic Mode は素朴すぎるのでナシとすると,Statement Mode が一番ラクと思う.

from jikka.

cannorin avatar cannorin commented on July 17, 2024

実装上は,実質は lexical error と syntactical error しか問題にならない(semantic error / logical error のエラー回復はわりと自明なので).AST の前にコードブロックとかのレベルでのゆるい parse tree を用意しておいて,parse tree -> AST の変換時にどこかの場所でエラーが起こってもそこを放っておいたまま違う場所の変換を試行できるようにするのがラクかなぁ(Lexer/Parser とどう連携するのがベストかはよくわからない).

↑これ Lexer/Parser 側でいい感じにやってくれる機能が備わってたりしないんだろうか

from jikka.

kmyk avatar kmyk commented on July 17, 2024

@cannorin ありがとう。助かります

位置情報は基本的にASTの全頂点に付けるべき.

ここで言う AST は表層言語のもののみを指すという理解であってますか?
ところで内部的には λ 項だったり最終的には C++ AST もありますが、そのようなものへの位置情報についておすすめはありますか?

↑これは Haskell なら型クラスとか使っていい感じに出来たりしないかな? Haskell で真面目なコンパイラ書いたことないからわからん.

この方式は以前に教えてもらったからすでに使わせてもらってます: Pos.hs Expr.hs

一応,Python そのものではなく .pyc をパースするという方法もなくはないと思う

まぁ今の場合は Python のサブセットを表層言語にしたいっていうモチベなわけだし(そうだよね?)このままでいいか

.pyc をパースするのはありではあります。Python サブセットのひとつである RPython の処理系はそうしてたはず (言われるまで忘れてたけど)。
同様に ast.parse の結果を借りるのも選択肢に入るはず。

しかし、拡張性のためにそういう密結合は避けた方がいいと思ってます。今回は Python の厳密なサブセットであることに本質的な意味はない (ユーザにとって理解しやすいからそうなってる) だけなので、利便性が上まわるなら気軽に非互換機能を足せるようになっていてほしい。たとえば「切り上げ除算 2 項演算子」とかは使えてほしい。

AST の前にコードブロックとかのレベルでのゆるい parse tree を用意しておいて,parse tree -> AST の変換時にどこかの場所でエラーが起こってもそこを放っておいたまま違う場所の変換を試行できるようにするのがラクかなぁ(Lexer/Parser とどう連携するのがベストかはよくわからない).

コードブロックのレベルでの parse tree を作るのがかしこそう。採用です。ありがとう。
Parser にもそういう機能があったりなかったりすると思うけど、かなり複雑になってしんどそうだし、単純な方法でできるなら単純な方法ですませることにします。

from jikka.

cannorin avatar cannorin commented on July 17, 2024

ここで言う AST は表層言語のもののみを指すという理解であってますか?

型検査エラーなどをいい感じに出したかったら内部表現にも付ける必要が出てきます.

ところで内部的には λ 項だったり最終的には C++ AST もありますが、そのようなものへの位置情報についておすすめはありますか?

これに関しては元のコードの位置情報を泥臭く伝播させていくしかないと思います.実行時エラーもいい感じにしたい(かつ生成対象の言語がコード自動生成を意識してコードの位置情報をメタデータとして持っておく機能を備えている)ならば全ての段階において位置情報をもたせておく必要がありますね.

from jikka.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.