| BCPL | |
|---|---|
| パラダイム | 手続き的、命令的、構造的 |
| デザイン : | マーティン・リチャーズ |
| 初 登場 | 1967年 (1967年)[ 1 ] |
| タイピングの規律 | 型なし(すべてが単語である) |
| 影響を受けた | |
| 伍長 | |
| 影響を受けた | |
| B、C | |
BCPL ( Basic Combined Programming Language ) は、手続き型、命令型、構造型のプログラミング言語です。元々は他の言語のコンパイラを作成するために考案された BCPL は、現在では一般的に使用されていません。しかし、BCPL の簡略化され構文が変更されたバージョンであるBがC プログラミング言語のベースとなった言語であるため、その影響は今も残っています。BCPL は、コードブロックを区切るために波括弧を使用するなど、多くの現代のプログラミング言語のいくつかの機能を導入しました。[ 2 ] BCPL は、 1967 年にケンブリッジ大学のMartin Richardsによって初めて実装されました。[ 1 ]
BCPLは、小型でシンプルなコンパイラを作成できるように設計されており、一部のコンパイラは16キロバイトで実行できたと言われています。さらに、BCPLで書かれたオリジナルのコンパイラ自体も移植性が高く、BCPLはシステムのブートストラップによく使われていました。 コンパイラの移植性の高さの主な理由は、その構造にありました。コンパイラは2つの部分に分かれており、フロントエンドはソースコードを解析して中間言語であるOコードを生成し、バックエンドはOコードを受け取ってターゲットマシンのマシンコードに変換していました。新しいマシンをサポートするために書き換える必要があったのはコンパイラのコードの5分の1だけで、この作業は通常2~5人月かかりました。このアプローチは後に一般的な手法となりました(例:Pascal、Java)。
この言語の特徴は、データ型がワード(固定ビット数)のみである点です。ワードは通常、同じプラットフォームアーキテクチャのマシンワードに合わせるように選択され、有効なストレージアドレスを表現するのに十分な容量を備えています。当時の多くのマシンでは、このデータ型は16ビットワードでした。しかし、この選択は後に、最小アドレス指定単位がワードではなくバイトであるマシンや、32ビットや64ビットといったより大きなワードサイズを持つマシンでBCPLが使用される際に、重大な問題となることが判明しました。
値の解釈は、値を処理するために使用される演算子によって決定されました。(例えば、+2つの値を加算すると、それらは整数として扱われます。!値を介して間接参照すると、実質的にポインタとして扱われます。)この仕組みを実現するために、実装では型チェックは行われませんでした。
BCPLのワード指向とバイト指向ハードウェアとの不一致は、いくつかの方法で対処されました。1つは、ワードをバイト列にパックおよびアンパックするための標準ライブラリルーチンを提供することでした。その後、ビットフィールド選択演算子と中置バイト間接参照演算子(で表される%)という2つの言語機能が追加されました。 [ 3 ]
BCPLは、複数のコンパイル単位にまたがるバインディングを独自の方法で処理します。ユーザーが宣言できるグローバル変数はなく、代わりにFortranの「blank common」に似たグローバルベクトルが存在します。異なるコンパイル単位間で共有されるすべてのデータは、グローバルベクトル内の所定の場所に格納されたスカラーとベクトルへのポインタで構成されます。そのため、コンパイル時に「GET」ディレクティブを使用してインクルードされるヘッダーファイルが、コンパイル単位間のグローバルデータを同期する主要な手段となります。ヘッダーファイルには、シンボル名のリストを示す「GLOBAL」ディレクティブが含まれており、各シンボル名は、グローバルベクトル内の対応する数値アドレスのワードと関連付けられる番号とペアになっています。グローバルベクトルには、変数だけでなく、外部プロシージャのバインディングも含まれています。これにより、コンパイル単位の動的ロードが非常に簡単に実現できます。BCPLは、基盤となる実装のリンクローダーに依存するのではなく、実質的にプログラマにリンク処理の制御権を与えます。
グローバルベクターは、標準ライブラリルーチンの置換や拡張も容易にしました。プログラムは、グローバルベクターから既存のルーチンへのポインタを格納し、それを別の実装へのポインタに置き換えることができました。置換後のルーチンは、実行時に元のルーチンを呼び出すことができました。このように関数ポインタを用いてルーチンの動作を傍受・拡張する手法は、関数インターポジションやフックで説明されている手法と類似しており、臨時のデバッグ手法として用いられることもありました。
BCPLは最初のブレースプログラミング言語であり、ブレースは構文の変更後も存続し、プログラムのソースコードステートメントを示す一般的な手段となった。実際には、当時の限られたキーボードでは、ソースプログラムでは記号との代わりに、シーケンス$(と$)また[はとがよく使われていた。BCPLの単一行コメントはCには採用されなかったが、C++、そして後にC99で再び登場した。]{}//
『 BCPL:言語とそのコンパイラ』という書籍では、BCPLの理念を次のように説明しています。
BCPLの哲学は、自分が一番よく知っていると思い込み、何が許されて何が許されないかを一方的に決める暴君のそれではなく、むしろBCPLは、たとえ明らかなナンセンスに直面しても、文句を言わずに自分の能力を最大限に発揮してサービスを提供する召使いのようなものである。プログラマーは常に自分が何をしているのかを理解していると想定されており、些細な制約に縛られることはない。[ 4 ]
BCPLは、1967年にケンブリッジ大学のマーティン・リチャーズによって初めて実装されました。[ 1 ] BCPLは、1960年代初頭に設計された前身のケンブリッジ・プログラミング言語(後に複合プログラミング言語(CPL)と改名)の困難に対する対応として開発されました。リチャーズは、「コンパイルを困難にする完全な言語の機能を取り除く」ことでBCPLを作成しました。最初のコンパイラ実装は、互換性タイムシェアリングシステム上のIBM 7094向けに、リチャーズが1967年春にマサチューセッツ工科大学のプロジェクトMACを訪問中に作成されました。この言語は、1969年春の合同コンピュータ会議で発表された論文で初めて説明されました。
BCPLは元々「Bootstrap Cambridge Programming Language」の略だったという噂があるが、BCPLの開発が停止したためCPLは作成されず、この略語は後にBCPLの書籍のために再解釈された。
BCPLは、オリジナルの「Hello, World!」プログラムが書かれた言語です。[ 5 ]最初のMUDもBCPLで書かれました(MUD1)。
いくつかのオペレーティングシステムは、部分的に、あるいは完全にBCPLで記述されました(例えば、TRIPOSや初期のAmigaDOSなど)。BCPLは、 Xerox PARC Altoプロジェクトで最初に使用された言語でもありました。その他のプロジェクトの中でも、Bravo文書作成システムはBCPLで記述されました。
1969年に開発された初期のコンパイラは、リチャーズのAtlas 2コンパイラのOコードを収録した紙テープを基にブートストラップ方式で開発され、 ICT 1900シリーズを対象としていた。両機種はワード長(48ビット対24ビット)、文字エンコーディング、パック文字列表現が異なっていたが、このブートストラップ方式の成功により、この手法の実用性に対する信頼が高まった。
1970年後半までに、Honeywell 635、Honeywell 645、IBM 360、PDP-10、TX-2、CDC 6400、UNIVAC 1108、PDP-9、KDF 9 、Atlas 2 用の実装が存在した。1974年、中間 O コードを使用せずにBCPL の方言がBBNで実装された。最初の実装は、 BBN のTENEX PDP-10上で動作するクロス コンパイラであり、ARPANETで使用される第 2 世代IMPの BBN 実装で使用されるPDP-11 を直接ターゲットとしていた。
1980年代半ばには、マーティン・リチャーズの兄弟であるジョン・リチャーズが設立したリチャーズ・コンピュータ・プロダクツ社によって、BBC Micro用のバージョンも制作された。 [ 6 ] BBCドゥームズデイ・プロジェクトでは、この言語が使用された。1986年には、英国のソフトウェア会社 Arnor Ltd. によって、 Amstrad CPCおよびAmstrad PCWコンピュータ用の BCPL バージョンもリリースされた。MacBCPL は、1985 年に英国ケンジントンの Topexpress Ltd. によって Apple Macintosh 用にリリースされた。
BCPL の設計と哲学はB に強く影響を与え、それが今度はC に影響を与えた。[ 7 ] 当時のプログラマーは、C の後継となる言語がアルファベットの次の文字である「D」になるか、親言語名の次の文字である「P」になるかについて議論した。C の後継言語として最も広く受け入れられているのはC++ ( ++C のインクリメント演算子) であるが、[ 8 ]その一方でDプログラミング言語も存在する。
1979年当時、BCPLの実装は少なくとも25種類のアーキテクチャ向けに存在していたが、非UnixシステムでC言語が普及するにつれて、BCPLは徐々に廃れていった。
マーティン・リチャーズは、2023年に最終更新されたBCPLの最新バージョンを自身のウェブサイトで維持している。[ 9 ]これは、Linux、FreeBSD、Mac OS Xなどのさまざまなシステムで動作するように設定できる。最新のディストリビューションにはグラフィックおよびサウンドライブラリが含まれており、包括的なマニュアルも用意されている。彼は、音楽の自動スコア追従に関する研究を含め、BCPLでプログラミングを続けている。
BCPL の一般的な非公式MIME タイプはtext/x-bcplです。
リチャーズとウィットビー・ストレーベンス[ 10 ]は、標準システムヘッダー「LIBHDR」を使用したBCPL用の「Hello, World!」プログラムの例を示しています。
「LIBHDR」を取得する LET START() BE WRITES("Hello, World") これらのプログラムをリチャーズ氏の現在のバージョンのCintsys(2018年12月版)で実行する場合、エラーを回避するためにLIBHDR、START、WRITEFを小文字に変更する必要があります。
階乗を印刷する:
「LIBHDR」を取得する LET START() = VALOF $( i = 1 から 5 まで繰り返す WRITEF("%N! = %I4*N", I, FACT(I)) 結果 0 $) AND FACT(N) = N = 0 -> 1, N * FACT(N - 1) Nクイーン問題の解の数を数える:
「LIBHDR」を取得する グローバル$( カウント: 200 全員: 201 $) LET TRY(LD, ROW, RD) BE テスト行 = すべての場合 COUNT := COUNT + 1 それ以外の場合 $( LET POSS = ALL & ~(LD | ROW | RD) UNTIL POSS = 0 DO $( P = POSS および -POSS とする POSS := POSS - P TRY(LD + P << 1, ROW + P, RD + P >> 1) $) $) LET START() = VALOF $( すべて := 1 FOR I = 1 TO 12 DO $( カウント := 0 TRY(0, 0, 0) WRITEF("%I2-クイーン問題には%I5個の解があります*N", I, COUNT) ALL := 2 * ALL + 1 $) 結果 0 $) {{cite web}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)