giantneco’s blog

技術メモ

プログラミング言語雑感

3,4 月あたりに仕事で複数の言語を触る機会があったので、その時に得た知見を書き留めておく。 ちなみに作業自体はコードの静的解析に関するもので、 各言語のリントやパーサ周りについて調査して、ほしいメトリクスがなかったら実装するというものだった。

Go

社内で Go 言語勉強会を開いていたのもあり、コードを書き始めるのにそれほど手間取らなかった。 型を書かずに初期化できる:=記法と、型を後置する記法は慣れてくるとと非常に使い勝手がよかった。 逆に公開する関数・構造体の頭文字を大文字にするのは最後まで慣れなかった…。

パーサも言語組み込みで用意されていてかなり扱いやすい。 静的解析ツールも数多くあったので CI に組み込めると開発が捗るはず。

Python

しょっちゅう触っている言語。今回触った言語の中では一番使っている。

関数のステップ数を測るリンターがないかと探していたのだがなんとこれがなかった。 どうも PEP にもステップ数に関する規約がないので、おそらく PEP に取り入れられない限りは静的解析ツールでの対応もないはず。

パーサは言語組み込みのastモジュールがありこれを使って作業したが、ASTノードの終了行がずれるというバグがあって結構苦労した。

Clojure

「七つの言語、七つの世界」を読んだときに Clojure は少し触っている。

emacsparedit-mode はかなりよく、コードの変形が非常に直観的に出来た。 paredit-mode もそうだが、cider-mode などあり emacs との相性が非常によい。 ここら辺はさすが Lisp という感じで、他の言語ではなかなかできないじゃなかろうか。 関数型言語として書いている楽にかけていたものの、オブジェクト指向で副作用を入れ始めるとつらくなってくる。正直あまりうまく書けてなかったと思う。

静的解析ツールはそれほどない。試した中ではeastwoodがよさそうだった(ツール名は何かのダジャレらしいがわからず)。

パーサはtools.analyzerというものが公式に用意されていて最初はこれを使おうと思っていたのだが、 マクロを展開してしまうため元のコードのメトリクスを測るという目的には使えなかった。 代わりにrewrite.cljというサードパーティのライブラリを使ってなんとか解決できたが、最初の想定より苦した。

TypeScript

TypeScript にはこの作業時に初めて触った。とはいえ javascript と npm には触ったことあったので、導入までさほど苦労はしなかった。 やはりこういう環境を楽に作れる仕組みは、新しく出てきた言語が受け入れられるには必要な条件なんじゃないかと思う。 触った範囲だと javascript に型が付いたぐらいだが言語としての出来は非常に良かったと思う。 一方でビルド周りは今一つ。結局何でビルドするのが良いのかその時はわからず、Makefile で書いてやろうかとも一瞬思ったり。今ドキュメント見たら gulp を使った場合が書かれていた。そうなの?

新しい言語だけあってメトリクス測定は少ししかない。tslintというのがあるくらい。

パーサは typescript が提供する API を使えば楽に利用できるので、静的解析ツールは割と楽に作れると思う。

Swift

Swift もこの作業時に初めて触った。 残念ながら、がっつり実装するところまでは進まず、ほぼ調査だけで終わった。 すこし見た印象だが、すごい驚きがあるような言語でなかったと思う。 あと驚いたことにセルフホスティングされた言語ではなかった。

静的解析ツールはswiftlinttailorというのがあるくらい。

またパーサは提供されていない。 代わりに SourceKit を利用すると、ある程度ソースコードを解析した情報が取れる。 ただこのライブラリは SourceKitService というデーモンに問い合わせをしているもので、 これを利用して独自に静的解析ツールを作るのは厳しいんじゃないかと思う。 もしやるのであればtailorが ANTLOR を使ってやっているように、外部のパーサジェネレータを使って作ることになるかと。

その他

メトリクス測定ツールを探すさいには次のページを参考にした。

wikipediaにも静的コード解析ツールのリストがあったが、こちらは最近の言語についてはあまり紹介されていないようだった