• Use the Source

ソフトウェアについて記事を書く場合、それらを動かして確認を取るのが普通だ。いくらドキュメントに書いてあっても、動かない機能に関してはそのまま書くわけにもいかない。しかし、ドキュメントに書かれていないことも少なくない。ある意味、ソフトウェアのドキュメントとは常に、情報が不足しているといえる。しかし、ソフトウェアの振る舞いや機能などを完全に記述しているドキュメントは存在する。それがソースコードだ。昔はソースコードとは隠すものだったが、最近では公開するものも多数ある。

最近筆者は、Windows Terminalのプロファイル推測機能(profile matching)について調べた。これは、コマンドラインから起動したプログラムに対して、適切なプロファイルを推測して適用するもの。これについては、リリースノートに言及があり、関連する議論があるだけで、具体的にどういう場合にプロファイルが適用されるのかがはっきりしなかった。

そこで、Windows Terminalのソースコードを見ることにした。そのためには、gitを使う必要がある。ここでは、gitを知らない方のためにソースコードを見るため「だけ」にgitを使う方法を簡単に解説する。ソースコードを書き換えるソフトウェア開発の場合とは作法がちょっと違う点に注意されたい。

ソフトウェア開発では、日々ソースコードが書き換えられ、バージョンが上がっていく。その過程を記録するのがソースコード管理ツール(あるいはバージョン管理ツール)である。gitはその1つだ。Windows用のgitは、以下のURLから手に入る。

・Git for Windows
https://gitforwindows.org/

VS CodeやVisual Studioにもgit機能が組み込まれているが、gitを理解するなら、まずはgitコマンドを使うのが一番の早道である。

まずは、GitHubからソースコードを取得する。それには、リポジトリ(gitの管理単位)をコピー(クローン)してローカルリポジトリを作る。具体的には、コマンドプロンプトで適当なフォルダーに移動し、


git clone https://github.com/microsoft/terminal.git

とする(写真01)。これでterminalというフォルダーができる。ここにコピーされたリポジトリと最新版のソースコード(ワークツリー)が入る。一回、"git clone"を実行したら、次回以降は、“git fetch”で最新状態に更新できる。ファイルを間違って書き換えたなどでgitコマンドでエラーがでるようなら、フォルダーごと削除し、再度クローンを行えばよい。

  • 写真01: gitによるGitHubからソースコードのCloneからCheckoutによるバージョン切り替えまでの手順

gitでは、「コミット」(commit)コマンドを実行すると、その時点のソースコードを記録する。これを繰り返していくことで、リポジトリにソースコードが書き換えられていく過程が記録されていく。コミットは“git checkout”コマンドで自由に取り出すことができる。コミットには、それぞれ固有のID(SHA-1チェックサム)があり、これを使えば、どのコミットも取り出すことができる。“git checkout”は、指定したコミットで記録されたワークツリーで上書きするものだ。

一般的なソフトウェア開発では、外部にリリースした、バージョン番号を変えた、などの節目にあたるコミットには、タグ(tag)を付けるのが普通だ。Windows Terminalのソースコードでも、リリースごとにタグがついている。タグは、“git tag -l”で一覧を見ることができる。ここでは、最も新しいリリースである「v1.13.10733.0」を、“git checkout v1.13.10733.0”として取り出す。クローンした直後の状態に戻すには、Windows Terminalのソースコードでは、“git checkout main”を実行する。

さて、コマンドラインのプロファイルの推測機能だが、VS Codeの検索を使って、正規表現“Profile.*CommandLine”で検索すると、それらしいコードが見つかった。これにより、筆者は疑問を解決することができた。もし、ソースコードがなければ、実際にさまざまな条件でコマンドラインを起動し、その振る舞いを調べなければならなかった。まさにソースコード様々である。

今回のタイトルの元ネタは、多くの方がご存じのStar Warsの有名なセリフ“Use the Force , Luke”である。これにちなんだジョークに“Use the FORTH”というのがある。FORTHとはスタックを使うコンピュータ言語の1つ。処理対象をスタックにおいて処理を行うハードウェアや仮想マシンを「スタックマシン」という。このスタックマシン、歴史的に何度も表舞台に登場してきた。古くはBurroughs B5000(1961年)、HP社のプログラム電卓HP 9100A(1968年)、同ポケット関数電卓HP-35(1972年)、Intel 8087(1980年)、PostScript(1982年)、General MagicのTelescript(1990年)、Javaの仮想マシン(1995年)、.NET FrameworkのバイトコードMSIL(2000年)などである。この先、コンピュータ業界は、またスタックマシンのお世話になる時が来るだろう。そのとき、誰かの耳にUse the FORTHという声がするのかもしれない。