おぉ寒Go!

ふざけたタイトルの取り急ぎんぐメモっちんぐ。

本題として書こうと思ってたのは「Go言語のコマンドラインパース」で、その実際の検証はまぁおいおいで、なのだけれど、動機的なとこだけは今回書いとこうと思う。その思考過程で見つけたのが今回のネタにつながったので。

以前node.js についてのコマンドラインパースについて書いた際にちょっと書ききれなかったことなんだけれど、「何かしらのプログラミング環境におけるコマンドラインパースのサポート」には、ちょっとした悩ましい歴史がある。そのリンク先では「オリジナルの getopt と argparse の違い」に注目しているんだけれど、本当はこの話はもっと入り組んでいる。

Unix のコマンドラインプログラムが「統一的にコマンドライン解析を行ってくれるライブラリ」を使うようになったのがいつからなのかは、ワタシは正確には知らない。少なくともワタシが大学院生だった25年ほど前には既に広く統一的に使われていたし、GNU getopt もかなり人気があり、ゆえに UNIX の CUI プログラムのほとんど全てはオリジナル getopt か GNU getopt のどちらかを使っていた。これのおかげで我々エンドユーザは何か一つのコマンドさえ理解してしまえば、ほとんどのコマンドに近い知識を適用出来たわけである。しかも GNU/FSF がもたらしたユーザビリティの向上は非常に優秀で、「UNIX は快適だ」と感じる要因は、ほぼこの GNU getopt と GNU readline によるものといって良い。これさえ整っていれば UNIX ライフは極めて快適だった。この頃は、ワタシたちは無垢にこのまま GNU 世界が続くのだと信じていられた。

潮目が変わってきたのは丁度ワタシが大学を出て以降である。あれほど熱狂をもって歓迎されていた「GNU/FSF」が次第に敬遠されるようになり、「GNU getopt」を使うプログラムは、増えるどころか減る一方になっていった。無論これこそが「GPL によって汚染されることへの忌避」であり、いかにそれが優れたものであろうとも GPL ライセンスを避けるプロジェクトが大勢を占めるようになり、いまでは明に GNU getopt に依存するプログラムを探す方が難しい。そう、GNU 自身のプロジェクト以外ではあまり率先して使われない。CLI としての使い勝手としては GNU getopt と GNU readline は完全なる一つの完成形・理想形だったので、この事態は本当に泣きたくなるほどに悔しい状態なのだが、残念だがこの状態が先々解決することを願うのはのぞみ薄だろうと思う。

今では完全にそれに匹敵する argparse が書かれたので気付かないかもしれないが、Python もこの例にもれず、皆至らないコマンドラインパースモジュールで我慢してきたのだ。いまでもその名残は少し残っているのでわかるだろう。getopt モジュールがそれだ。Python の場合、標準ライブラリについては GPL のものは使えない、だったかな、少なくともそういうのは一つもない。無論皆とても苦労してきている。

というわけで Go も全く同じである。3-Clause BSD ライセンス、がメインなのかね、詳しくはわからんけれど、いずれにしても GNU getopt は標準ライブラリとしては採用出来ず、「それよりも遥かに使いにきーしょっぼい flag モジュール」が唯一のものである。node.js についてのコマンドラインパースについての話では argparse が伝統的な getopt とどう考え方が違うのか説明したが、Go の flag もまぁ似たようなもの。ただ個人的にこの Go の flag が気に喰わないのは、「GNU getopt に似てないのはともかくとして、元の getopt にさえ似ていない」ということである。うん、コーディングが、てことじゃないよ、作ったプログラムは、要するに「POSIX 流儀にすらならない」。ので Go の flag でパースする CUI は「何これ使いにくい」てなる。(zip2tar ネタの本日2022-01-24の追記として、Go で tar をアンパックするネタを書いたんだけど、そこで flag を実際に使ってるんで、ビルド出来る人はビルドしてこれを実感してみて欲しい。)

そういうわけで、である。

「現時点での Windows 版の Go は静的リンクだけ(?なのかな?)であり、ビルド時依存は実行時依存に無関係なので、標準ライブラリであるかどうかはあまり気にしなくてもいい」ということもあってなおさら「さすがにコマンドラインパースはサードパーティ製のを使いたいなぁ」と探した、というわけなのだわ。

いやぁ、なんか良さげよこれ:

ここから手繰って見つけたてホヤホヤなのでろくに中身を検証してないが、ここから「ええもん」を見つけやすい予感がする。うん、きっとありがたい、たぶんありがたい。

…、ま、まだわからんけどね、読んでないんだから。けど少なくともここで argparse が紹介されている。普通に google 検索してたがそのものズバリは見つけられてなかったんだ、少なくともありがとう、たぶん。(繰り返すが、評価はこれから。今は「めっけ」ただけ。)

あ、そうそう。今回の話はちょっと盛ってる。「UNIX 実機で UNIX プログラムを使う」と、実際はワタシが言うほどには GNU getopt は廃れていないし、どころか、体感的には8~9割はちゃんと GNU getopt で動作している。「GPL 忌避」は「UNIX そのもの」から独立しているものでは多く見られる傾向。ゆえに、UNIX だけで生活してるならそれを感じることはあまりない。でも逆に言えば Windows 主体で生活してると、ほんとこれ、強く感じるんだよね。