-
Notifications
You must be signed in to change notification settings - Fork 2
/
section4.tex
83 lines (63 loc) · 4.95 KB
/
section4.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
% !TeX root = ./main.tex
\section{評価と今後の課題} \label{section:4}
このsectionではTypeProfiler.jlの性能を評価し,また現状で把握している課題点についても報告する.
\subsection{実験と比較} \label{subsection:experiments-and-comparison}
% TODO: PPLまでには絶対やる
現時点ではTypeProfiler.jlの性能の正確な評価までは行うことができていない.
% \paragraph{section~\ref{section:2}で紹介したコードに対するレポート}
% \paragraph{現実のコードベースに対するプロファイリング}
% \paragraph{ruby-type-profilerとの比較}
% ruby-type-profilerとのルーチンの違い:
% - 言語設計から生じる違いがある?
% * Ruby: 型はクラスになる <- コンテナ型はどうなる?
% * Julia: 様々な型がある
% - 型システムの設計になる
\subsection{今後の課題} \label{subsection:issues}
% TODO: もっとimpl & evaluation 進めたらもっと見えてくるはず
\subsubsection{builtin functionの型検査関数の実装}
Juliaのbuiltin functionの数は数少ないとは言え,
現時点ではすべてのbuiltin-functionに対する型検査関数の実装はできていない.
全てのbuiltin-functionに対する型検査関数の実装は,
実用的な型プロファイリングを行う上で必須である.
\subsubsection{型推論のヒューリスティックのより慎重な調整}
現時点では,Juliaの型推論の収束を早めるために用いられている各種のヒューリスティックの
それぞれの具体的な内容について把握しきれていない.
それぞれのヒューリスティックが型推論においてもたらす意味を,
元々のパフォーマンスの向上という観点からではなく,
型エラーの検出という観点から把握しなおす必要がある.
その上で,
TypeProfiler.jlが呼び出す型推論ルーチンにおいてそれらのヒューリスティックをどのように扱うのか,
型プロファイリングの実行速度と,型エラー検出の正確性とのトレードオフを考慮しつつ,
(おそらく実験的に)調整していく必要がある.
% REVIEW: how to profile on generated function
\subsubsection{staged programmingを含むプログラムのサポート}
現時点では,staged programmingが含まれるプログラムに対する解析はまだサポートできていない.
ただ,以下のやり方で部分的にサポートをすることは可能である.
プロファイリングの過程で\verb|@generated|マクロが付与されたメソッドの呼び出しが生じたとき,
メソッドの呼び出しをする前に,まず(concreteな)引数組の型情報を用いてそのgenerated functionの実装となるコードを生成し,
その後にその生成されたコードに対して通常のメソッド呼び出しと同様の型プロファイリングを行う.
しかし,generated functionによるコード生成は実行時の型情報を用いて行われるため,
推論された引数型がconcreteでない場合,コード生成を正しく行うことができない.
その場合にどのように解析を行うかについての検討は今後の課題である.
\subsubsection{マクロ展開に対するエラー検出}
paragraph~\label{paragraph:type-profiler-basic-implementation}で説明したように,
TypeProfiler.jlは型推論後のプログラム表現であるtyped lowered codeに対して解析を行うため,
マクロ展開そのものに対する解析は行わない
\footnote{
typed lowered codeを得る前の段階
(\hyperref[subsubsection:eval-process]{Juliaの実行プロセス}参照)
で,マクロは既に展開されている.
}.
Juliaのマクロ展開においては,マクロの返り値となる式を計算する際,
通常の関数呼び出しと同様の計算を行うことができるため,
マクロ展開自体に対しても型プロファリングを行える方が望ましい
\footnote{
また,マクロ展開を抽象解釈したときに分かるのは,
そのマクロの返り値となる\textbf{式の抽象値}である.
展開される式の抽象値と,そのマクロが使用されるプログラム部分との整合性を調べることにより,
マクロが展開されるコンテクストに関するエラーを解析することも可能であると思われる.
}.
しかし,Juliaのcode speicializationはマクロ展開に対しては行われないため,
したがってJuliaの型推論ルーチン自体もマクロ展開に対しては利用できない.
そのため,マクロ展開に対する型プロファイリングのメインルーチンはJuliaの型推論ルーチンとは別に実装される必要があり,
今回の取り組みではマクロ展開に対する解析をサポートすることはできなかった.