コンテンツへスキップ
Topos Uranos

要約

このレッスンは、C++ によるプログラミングのはじめの一歩にあてたコースの第一単元を締めくくる。仕様の定まった問題から、その発生の時点によって分類されたエラーまでをつなぐ概念の連鎖を、アルゴリズム、ソースコード、コンパイルとリンク、実行ファイル、そしてプログラムと外部とのやりとりを経由して組み立て直す。そのうちどの言語でも通用することと C++ に固有のこととを区別する。単元が示した未定義動作と、そこから導かれるコースの規則、すなわち常に警告を有効にしてコンパイルし、開発中はサニタイザも有効にするという規則をまとめる。まとめテストでは導入テストの技能を繰り返す。そして単元全体を組み合わせる六つの挑戦課題で終わる。最少の硬貨でのおつり、ループなしで揃えた表、五種類の欠陥を五つ含むプログラム、出力バッファについての実験、固定書式の日付、そしてインタプリタ言語しか知らない人へのコンパイラの説明である。

学習目標

  1. 問題文から実行されたプログラムまでの道のりを、助けなしにたどる。仕様を定め、アルゴリズムを書き、手で追い、C++ で書き、コースのオプションでコンパイルし、実行し、結果を確かめる。
  2. その道のりの各手順でどのツール(エディタ、プリプロセッサ、コンパイラ、リンカ、サニタイザ)が働き、それぞれが何を受け取り何を渡すかを説明する。
  3. エラーの種別(コンパイルエラー、リンクエラー、実行時エラー、論理エラー)をその現れ方から見分け、複数のエラーを現れる順に直す。
  4. 未定義動作とは何か、そしてなぜコースが警告とサニタイザを有効にしてコンパイルするのかを、例を挙げて説明する。
  5. 単元で学んだことのうち、どの言語でも通用することと C++ に固有のこととを区別する。

単元で達成したこと

この単元は、プログラムを書いたことのない人を、日常の言葉で述べられた問題から、コンパイルでき、実行でき、データを読み、結果を書くプログラムまで導き、その途中で各ツールが何をしたかを理解させることを目指した。それを、導入が既知とした事柄、すなわち学校で習う算数、書かれた指示に従う習慣、ファイルとフォルダの扱いだけに頼って成し遂げた。

問題からアルゴリズムへ

レッスン 問題からアルゴリズムへは、問題はその仕様によって定まることを確かめた。仕様とは、事前条件を満たすあらゆる入力に事後条件を約束し、それ以外には何も約束しない契約である。アルゴリズムは有限で明確で一般的な手続きであり、番号付きの手順で書かれ、トレース表で手で追われ、順次、分岐、反復から組み立てられる。反復にはそれぞれ変量が伴う。変量とは、周ごとに減少して反復の停止を保証する自然数の量である。

プログラム・コンパイラ・C++

レッスン プログラム・コンパイラ・C++は、C++ のプログラムのテキストはそのままでは実行されず、プリプロセッサ、コンパイラ、リンカがそれを実行ファイルに変えることを示した。そこから単元全体を貫く区別が生まれた。テキストだけに依存するものはコンパイルやリンクのときに見つかり、データに依存するものは実行のときにしか見つからない。このレッスンはコンパイル方式とインタプリタ方式を比較し、コースが C++23 を使い、それを -std=c++23 で指定する理由を述べた。

環境構築

レッスン Windows・macOS・Linux での環境構築は、C++23 に対応したコンパイラと、C++ 用の拡張機能を備えた Visual Studio Code をインストールした。その方法上の教訓は、エディタはコンパイルせず、ターミナルが見つけられなければならないコンパイラを呼び出すこと、そしてメッセージの正確な文面がインストールの不具合と呼び出しの不具合とを区別することである。

コンパイル・実行・設定

レッスン コンパイル・実行・設定は、編集、保存、コンパイル、実行、読むという作業の流れと、このコースのコマンドを定めた。実行ファイルを作らせないエラーと、作らせはするが疑わしいコードを指摘する警告とを区別した。実行を見張るサニタイザ(メモリエラーのサニタイザである AddressSanitizer と、未定義動作のサニタイザである UndefinedBehaviorSanitizer)を有効にし、その限界を示した。そして、ファイル、コンパイラ、コンソールが UTF-8 で一致していなければならないことを説明した。

プログラムの解剖

レッスン プログラムの解剖は、最小のプログラムを解剖した。各依存関係を宣言するヘッダ、エントリポイントでありその値が終了コードとなる main、名前空間 std、文、ブロック、コメントである。メッセージを最初のものから読むことを教え、コースのスタイルガイドを定めた。

入力・出力・エラー

レッスン 入力・出力・エラーは、プログラムを外部と接触させた。std::println は書式指定を使って求められたとおりに書き、std::cin は読み取って、役に立たない最初の文字で止まる。数を作れない文字につまずいた読み取りは、変数を 0 にし、ストリームをエラー状態にする。しかも黙って行う(型に収まらない数や尽きた入力は変数に別の値を残し、レッスンはその場合を列挙している)。だから読み取りは確かめる。レッスンは、エラーを発生の時点で分類して単元を締めくくった。コンパイルエラー、リンクエラー、実行時エラー、論理エラーである。