パソコンでプログラミングしよう ウィンドウズC++プログラミング環境の構築
1.6.3.6(15)
コマンドプロンプト

コマンドプロンプト(cmd.exe)はウィンドウズに搭載されているコマンドラインインタプリタ(CLI)である。

その他の外部情報

本サイトでの解釈

"コマンドプロンプト"は二つの定義を持ち、一つはウィンドウズのコマンドラインシェル、もう一つはコマンドラインインターフェースでコマンド受け入れ準備を示す文字列を指す。つまり"C:\Users\user>"はコマンドプロンプトのコマンドプロンプトだ。本サイトは断らない限り前者を参照し、その実体は"C:\Windows\System32\cmd.exe"である。さらに参照においては標準的な実行環境である"コンソール"も曖昧に含意する。明確にシェルのみを参照する場合は"コマンドプロンプト(cmd.exe)"とし、cmd.exeに限定せず一般にコマンド受け入れ準備を示す文字列は"コマンドプロンプト(コマンド受け入れ準備を示す文字列)"とする。

シェル

アプリケーションはオペレーティングシステムとAPI(Application Programming Interface)関数を介して対話する。人間はそうも行かないのでシェルと呼ぶアプリケーションを介在し、シェルは入出力装置を通じて人間と対話する。シェルはコマンドラインシェル(CLIシェル)とグラフィカルシェル(GUIシェル)に分類され、コマンドプロンプト(cmd.exe)はウィンドウズ標準のCLIシェルと位置付けられる。本サイトは特に断らない限りCLIシェルをシェルと参照する。

コンソールとターミナル

コンソールとターミナルはシェルを含むテキストベースアプリケーションの実行環境を指す。ほとんどの場合にシェルを実行して他のアプリケーションはシェルから起動するためシェルと一体化して扱われる。これは厳密ではないが現実的ではある。多くの場合にコンソールとターミナルは同じ事を意味するが歴史的背景から微妙なニュアンス差が残る。本サイトはウィンドウズ標準のそれをシェルと合わせて"コマンドプロンプト"として参照し、MSYS2のそれを"POSIX互換ターミナル"として参照する。

かつてコンソールはコンピュータ操作卓を、ターミナルはデータ入出力装置を指した。古代の大型計算機センターで操作卓(コンソール)はキーボードと専用ラインプリンタを備えたアンタッチャブルな装置として君臨し、我々ユーザーはカード読み取り装置に入力して一般用ラインプリンタから出力を拾う。我々の操作は入力データの一部であるJCL(Job Control Language)で限定的に行うだけで、コンソールに近づこうものなら強制排除される。やがてキーボードとビデオディスプレイを備える入出力装置(ターミナル)が現れ我々はTSS(Time Sharing System)端末室に隔離される。数十台のターミナルが大型計算機にシリアルポートで接続されていたと伝わるが本当だったんだろうか。

ユニックスライクは操作卓とデータ入出力装置を統合してコンソールとターミナルを再定義する。コンピュータ本体をコンソール、シリアルポートなどに接続した入出力装置をターミナルと呼べば良い感じだが、ターミナル上でシェル起動に成功すれば両者に機能的な差異は無い。そしてGUIはウィンドウベースで入出力装置を模擬するターミナルエミュレータを用意する。ターミナルエミュレータがGUIの走るコンピュータのターミナルとして機能することを疑似ターミナルと呼ぶ。ハードウェアとしての入出力装置が絶滅した現在、コンソールはGUI起動前の入出力、ターミナルはGUI上の疑似ターミナルとするのが一般的となる。MSYS2のPOSIX互換ターミナルは疑似ターミナルの一つと見なす。

ウィンドウズの現在地

伝統的にウィンドウズはコンソールアプリケーション(コンソール入出力するテキストベースアプリケーション)実行環境をコンソールと呼び、ウィンドウズで実現するターミナルエミュレータをターミナルと呼んできた。前者はウィンドウズ3.0のMS-DOS実行環境(いわゆるDOSボックス)に始まり、背景技術は大きく変わったがそれを意識する事もなく30年以上の腐れ縁になる。後者はサードパーティーが供給してパソコンを入出力装置とする事を目的とし、ウィンドウズも一時OEM品をバンドルしていた。

ウィンドウズの文脈でコンソールとターミナルを再定義する。本サイトはコンソールアプリケーション実行環境とシェルを合わせて"コマンドプロンプト"と参照するが、ここでは例外的に実行環境のみを参照して"コンソール"とする。ウィンドウズの疑似ターミナルが存在すると仮定して、例えばそれはMSYS2のPOSIX互換ターミナルであるが、これを"ターミナル"とする。コンソールとターミナルは外見も機能も良く似ているが生まれが異なる。コンソールはオペレーティングシステムの一部で低レベルAPI関数で情報を交換する。ターミナルは独立したアプリケーションで高レベル標準入出力で情報を交換する。コンソールもC++/C言語標準ライブラリが標準入出力するがライブラリがそのように実装しているからで、ターミナルならエスケープシーケンスで行う制御はAPI関数が行う。つまりテキストベースアプリケーションがそういった制御を行う場合、コンソール用とターミナル用は互換しない。

ウィンドウズ11から新たにウィンドウズターミナル(wt.exe)がバンドルされた。これはコンソールとターミナルを統合して、つまりAPI関数制御とエスケープシーケンス(マイクロソフトは仮想ターミナルシーケンスと呼ぶ)制御を両立する。シェルはコマンドプロンプト(cmd.exe)、本サイトが無視するパワーシェル(powershell.exe)、本サイトが無視するリナックス用ウィンドウズサブシステム(wsl.exe)などを想定する。ユニックスライクのツールを取り込むのが目的の一つでリンク(Windows Console and Terminal Ecosystem Roadmap)より引用する。

Windows Terminal is the flagship text-mode user interface for Windows. It demonstrates the capabilities of the ecosystem and is driving Windows development toward unifying with other platforms. Windows Terminal is also an example of how to build a robust and complex modern application that spans the history and gamut of Windows APIs and frameworks. Per the definitions above, this product operates in a terminal role.

開発もGitHubオープンソースを利用してマイクロソフトも随分変わったものだ。コンソールの完全代替を企図するが良いニュースなのか悪いニュースなのか。ウィンドウズ10にも導入可能なのでそのうち試してみよう。