MetaWareのHigh Cコンパイラの失われた言語拡張
1980年代のCコンパイラ
- 1980年代には多くの小規模企業が競争し、さまざまな言語拡張を提供していた
- Phar Lapは32ビット80386プロセッサを活用できるDOSエクステンダを開発し、MetaWareはそのためにHigh Cコンパイラを移植した
- FujitsuはPhar LapのDOSエクステンダをFM TOWNSプラットフォームに統合し、High Cはこのプラットフォームの標準Cコンパイラとなった
High Cの独特な言語拡張
- High CにはDOS固有の拡張だけでなく、ユーザー志向の多様な言語拡張が含まれている
- 一部の機能は数十年後になってようやく正式な標準に取り込まれ、今なおCやC++に存在しないものもある
数値リテラルでのアンダースコア使用
- 長い数値リテラルを読みやすく区切るためにアンダースコアを使用できる
- C++はC++14でこの機能を導入し、CはC23で導入した
ラベル付き引数
- 多くの引数を持つ関数呼び出しで引数にラベルを付けられる
- Pythonの人気機能に似ており、引数ラベルがある場合は順序に関係なく引数を指定できる
- 標準CやC++にはまだこの機能がない
範囲ケース
- Pascalのように値の範囲をマッチできる機能を提供する
- 標準CやC++にはこの機能がない
ネストされた関数
- 関数内に別の関数をネストして宣言できる
- ネストされた関数は「完全な関数値」型として宣言でき、これは非エスケープクロージャとして動作する
- GCCのネスト関数拡張よりも完全な実装を提供する
- 標準Cにはまだ正式なネスト関数機能がない
ジェネレータ
- Pythonスタイルのジェネレータコルーチンをサポートする
- ジェネレータ関数は複数回にわたって値を生成でき、新しいforループ構文を使って各値を順番に処理できる
- ネスト関数機能との複雑な相互作用を許容する
- 標準Cがこの機能を統合する可能性は低い
GN⁺のまとめ
- MetaWareのHigh Cコンパイラは、1980年代の多様な言語拡張を提供することでC言語の表現力を大きく高めていた
- 一部の機能は数十年後になってようやく正式標準に取り込まれ、今なおCやC++に存在しないものもある
- ジェネレータやネストされた関数のような高度な機能は、今日の多くのプログラミング言語でも見つけにくい
- この記事はC言語の歴史と発展の過程を理解する助けとなり、プログラミング言語設計に関する興味深い洞察を与える
1件のコメント
Hacker Newsのコメント
2011年に iterator-driven for を書いた。当時はそれが C++ 標準に含まれる場合を想像していた
High C/C++ Language Reference を所有している
D 言語(または Das BetterC)で提供されている機能:
lcc-winC コンパイラが演算子オーバーロード、関数のデフォルト引数、関数オーバーロードを追加したPlan 9 C コンパイラが複数の言語拡張を導入し、その一部は C 標準に含まれた
現在 GCC は
-fplan9-extensionsフラグをサポートしており、構造体ポインタを無名フィールドへ自動変換する機能などを提供しているこうした機能を導入した人は非常に先進的だった。しかし標準に影響を与えられなかった点が惜しまれる
関連内容は以前 Hacker News でも取り上げられていた
PDF のコピーがあるのか気になっている人がいる
サンプルコードの文字列リテラルが
\nではなく ¥n で終わる理由は Shift-JIS コードページのためジェネレーターは Rust の内部/外部イテレーションの議論と
try_fold()を思い起こさせる本のタイポグラフィは美しくもあり、同時にひどくもあると感じる
日本語の表記法やカーニング規則には詳しくないが、可変幅フォントを固定幅セルに無理やり合わせたように見える
コード例が 8pt フォントではないのは良い
その本が日本語で書かれたのか、英語で書かれた後に日本語へ翻訳されたのか気になっている人がいる
Fujitsu のものなら、日本語で書かれた可能性が高い。非ネイティブによる
printf文やコードコメントの英語の質が印象的だとりわけジェネレーター関連の機能は、当時としては非常に先進的だった
Fujitsu が標準化プロセスを経ていなかったからこそ可能だったのかもしれない。しかし、それこそがこれらの拡張機能が現代の C/C++ で再発見・再発明されている理由でもある