Kadowaki)と言います。julia-vscode)のメンテナなどをやっています。最近Juliaの型推論システムを借用してJuliaプログラムのソースコードに対する静的な型解析を行うツールの開発[1]をしているのですが、その過程でJuliaの型推論について、その中でも特にisaを使って条件分岐した先のブロックにおける推論ついて少し知見ができたので共有します。Juliaの型推論のflow-sensitivityまず前提としてJuliaの型推論は"flow-sensitive"に行われます。ここで"flow-sensitive"とはどういうことかというと、Juliaはコードをコンパイルするとき、プログラム中の様々なコードに対してその実行コンテクストに応じた型を自動で推論するということです。以下のようなコードを考えてみましょう。Int)というようにaの型によって条件分岐を行なっているので、2行目のsin(a)においてaがInt型でしかありえないのは明らかだと思います。Juliaの型推論はプログラムの実行を仮想的にシミュレートすることによりこのような「2行目のaは常にIntである」といった情報を(追加的なアノテーションをせずとも)勝手に推論してくれます。以下のコードで確認してみましょう。Int)の情報を用いてa::Intと推論されているのがわかると思います。falseとして指定してあげると、型推論の後に行われるinliningや実行されない条件分岐先の削除など各種の最適化を行わないので、型推論の結果だけを見たい時などに便利です。このJuliaの型推論ルーチンのflow-sensitivityは、Juliaはある変数の型がプログラム中で変わったとしてもその変数のその文脈における型に応じた最適なコード生成を行ってくれたり、型不安定なコードを部分的に型安定にしてくれたりと、パフォーマンス上非常に重要です。以下のようなコードを実行する場合、fooに渡される引数aは型不安定(Union{Int,Char,String})ですが、それでもfoo3行目の呼び出しsin(a)はsin(a::Int)としてコンパイル時に解決されます[2]。sendより詳しく見てみると実際にfoo3行目の呼び出しsin(a)はsin(a::Int)としてコンパイル時に解決されますが起きていることを確認したい人は、Cthulhu.jlというパッケージを使ってみましょう。Int64}が見事に消えてinline展開されていることが確認できると思います[3]。analysis"は「楽に書けてしかも速いコード」を実現するために必要不可欠な機能です。isaによる条件分岐はよく使われるのでこの「isaで条件分岐した先のブロックの型推論」は重要なのですが、この機能について参考になるかもしれない知見が2点ほどあるので、以下ではそれを紹介します(本題)。(Julia<1.6)isaブロックがchainした場合はどうなるかみてみましょう。Int))しか伝播できなかったからです。conditionを分けて"diamond"の形をしたコードブロックにしてあげる必要がありました。endend...なのですが、この制限は最新のJuliaでは改善[4]されています。Int64}コンパイラがシュッと"diamond"を形成してくれてバシッとaの型が推論されているのが確認できると思います。1.6が待ち遠しいですね。conditionは伝播しない2020/09/27時点でのJuliaでは、別の関数(callee)呼び出しの結果を用いて条件分岐を行う場合、そのcallee関数内におけるisaによる型制約を伝播させることはできません。Anyこれはisaによる条件分岐がbaz(callee)の中で行われるため、それによる制約が元のcaller関数barにおける型推論にまで伝播していないからです。Main.Int)::Boolに置き換わっている)が、それでもsin(a)におけるaの型はうまく推論されていません。Int64}とはいえやはりこんな自明な型アノテーションは書きたくない人もいらっしゃるかもしれません。conditionによる型制約の伝播を中心にJuliaの型推論の機能をみてみました。Juliaのこのあたりの機能は日々改善されているので、おそらく2.2.で紹介した制限も将来的に改善されるでしょう。Juliaのコンパイラにはもっと頑張ってもらって、僕らJuliaプログラマはどんどん楽して高効率なコードを書けるようになってほしいですね。dispatch"と呼ばれます)、パフォーマンス上の問題になる場合があります。@noinlineをつけてfooを再定義してから同じようにcode_typedを試してみてください。conditionによる制約を伝播させることができるかもしれません。houseバッジを贈って著者を応援しようバッジを受け取った著者にはZennから現金やAmazonギフトカードが還元されます。Proよくある質問LinksX(Twitter)GitHubメディアキットLegal利用規約プライバシーポリシ。