狠狠撸

狠狠撸Share a Scribd company logo
Clojureシンタックスハイライター
開発から考える
これからのLispに必要なもの
Lisp meet up #30
@athos0220
genuine-highlighter
? マクロを認識するシンタックス
ハイライター
? Clojureの細粒度解析器?
symbol-analyzer上に実現
? 技術的な詳細はShibuya.lisp TT
#8を参照
lein-highlight
genuine-highlighter
symbol-analyzer
シンタックスハイライターから感じたこと
? 解析の精度を上げようとすればするほど、リーダやコン
パイラがやっていることの再実装をするハメに
? リーダやコンパイラ等、標準機能は再利用できなかった
? 尝颈蝉辫はメタプログラミングに强い言语だったのでは…?
尝颈蝉辫は尝颈蝉辫コードを扱うのが得意
尝颈蝉辫は尝颈蝉辫コードを扱うのが得意
尝颈蝉辫は尝颈蝉辫コードを扱うのが得意
LispはS式を扱うのが得意
Lispの強力さの秘訣
ソースコード
マクロ
展開済みS式
S式
read
macro
expand compile
Lispの強力さの秘訣
ソースコード
マクロ
展開済みS式
S式
read
macro
expand compile
コンパイラが感知するのは
これ以降
最終的にコンパイラの知るフォームに落ちれば
マクロやリーダマクロで自由に拡張可能
Lispの強力さの秘訣
? Lispは「プログラマが実際にどういうコードを書いているのか」に
無頓着になることで強力な拡張性を得てきた
? そのことがコードの静的解析を難しくしている
ソースコード
マクロ
展開済みS式
S式
read
macro
expand compile
コンパイラが感知するのは
これ以降
最終的にコンパイラの知るフォームに落ちれば
マクロやリーダマクロで自由に拡張可能
Clojure界隈での事情
? コード解析が不完全なツールたち
? Kibit: コーディングチェッカ
? bikeshed: コーディングチェッカ
? Yagni: コールグラフ解析ツール
? cloverage: カバレッジツール
? clojail: サンドボックスツール
? etc. etc.
? tools.analyzerの登場により、状況はある程度改善したが
tools.analyzerを使っても不十分なケースも少なくない
コードの“読み手”
プログラマ 処理系コード
コードの“読み手”
カバレッジツールコードフォーマッタ
IDE?エディタ メトリクス計測ツール
プログラマ 処理系
コーディングチェッカ
コード
コードの“読み手”
? プログラマと処理系だけがコードを読む牧歌的な時代は終わり、
今や多くのCASE ツールがコードを読む時代
? これらのツールの多くが知りたいのは「プログラマがどういう
コードを書いたか」≠ コンパイラにどんなコードが渡るか
*1
カバレッジツールコードフォーマッタ
IDE?エディタ メトリクス計測ツール
プログラマ 処理系
コーディングチェッカ
*1 CASE: Computer-Aided Software Engineering,
????一般にはもっと高機能なものを指すが、ここでは「コードを解析するツール」程度の意味。
コード
グリーンスパンの第10法则
グリーンスパンの第10法则
十分に複雑なCまたはFortranのプログラムは全て、後付けで
正式な仕様がなく、バグがてんこもりの遅いCommon Lisp
の半分の実装を含んでいる
“
グリーンスパンの第10法则
十分に複雑なCまたはFortranのプログラムは全て、後付けで
正式な仕様がなく、バグがてんこもりの遅いCommon Lisp
の半分の実装を含んでいる
“
十分に複雑なLispのコード解析器は全て、後付けで正式な仕
様がなく、バグがてんこもりの遅いLispの半分の実装を含ん
でいる…?
グリーンスパンの第10法则
? LisperもまたLispを(ムダに)再実装している
? 共通で使える汎用的なしくみは用意できないのか?
十分に複雑なCまたはFortranのプログラムは全て、後付けで
正式な仕様がなく、バグがてんこもりの遅いCommon Lisp
の半分の実装を含んでいる
“
十分に複雑なLispのコード解析器は全て、後付けで正式な仕
様がなく、バグがてんこもりの遅いLispの半分の実装を含ん
でいる…?
JavaScriptの場合…
? Esprima:汎用的なJSコード解析器
? 多くのJS CASEツールがEsprima上に実装されている
? Lispの場合はマクロがあるので、問題はこんなに簡単で
はない(が目指す状況はこんな感じ)
処理系ごとの対応
? コード解析は処理系におまかせ、という手もある?
? (例)いくつかのCL処理系は独自にテストカバレッジ機能を提供
? 他の機能についても処理系の対応を待つ…?
? 言語機能自体はマクロで拡張できるのに、コード解析に
ついては処理系の対応待ちが必要というのは歯がゆい
では、どうするか?
? 標準化
? Schemeのシンタックスオブジェクト的な方向性はよさそう
? Common Clojure Source Metadata Model
? 汎用的なコード解析器
? 解析器が解析しやすいコードをプログラマが書く
? スタイルだけで解決できる問題か?
? 解析しやすいようにアノテーションをつける?
? etc.
まとめ
? コードをプログラマと処理系だけが読めればいい時代は
すでに終わり
? CASEツールの解析で必要なのは「プログラマがどうい
うコードを書いたか」
? マクロがあることを口実にまともにコード解析できない
現状から逃げ続けていいのか?

More Related Content

颁濒辞箩耻谤别シンタックスハイライター开発から考えるこれからの濒颈蝉辫に必要なもの