BCPL (Basic Combined Programming Language) is a procedural, imperative, and structuredprogramming language. Originally intended for writing compilers for other languages, BCPL is no longer in common use. However, its influence is still felt because a stripped down and syntactically changed version of BCPL, called B, was the language on which the C programming language was based. BCPL introduced several features of many modern programming languages, including using curly braces to delimit code blocks.[2] BCPL was first implemented by Martin Richards of the University of Cambridge in 1967.[1]
BCPL was designed so that small and simple compilers could be written for it; reputedly some compilers could be run in 16 kilobytes. Furthermore, the original compiler, itself written in BCPL, was easily portable. BCPL was thus a popular choice for bootstrapping a system. A major reason for the compiler's portability lay in its structure. It was split into two parts: the front end parsed the source and generated O-code, an intermediate language. The back end took the O-code and translated it into the machine code for the target machine. Only 1⁄5 of the compiler's code needed to be rewritten to support a new machine, a task that usually took between 2 and 5 person-months. This approach became common practice later (e.g. Pascal, Java).
The language is unusual in having only one data type: a word, a fixed number of bits, usually chosen to align with the same platform architecture's machine word and of adequate capacity to represent any valid storage address. For many machines of the time, this data type was a 16-bit word. This choice later proved to be a significant problem when BCPL was used on machines in which the smallest addressable item was not a word but a byte or on machines with larger word sizes such as 32-bit or 64-bit.
The interpretation of any value was determined by the operators used to process the values. (For example, + added two values together, treating them as integers; ! indirected through a value, effectively treating it as a pointer.) In order for this to work, the implementation provided no type checking.
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メンテナンス: アーカイブサービスは非推奨になりました (リンク)