| パラダイム | 手続き的、命令的、構造化された |
|---|---|
| デザイン: | IBM、SHARE言語開発委員会、ISO |
| 初登場 | 1964年 |
| Webサイト | www.ibm.com/products/pli-compiler-zos |
| 方言 | |
| 方言を見る | |
| 影響を受けた | |
| COBOL、Fortran、ALGOL 60 言語 | |
| 影響を受けた | |
| 制御言語、PL/M、PL/S、PL-6、PL.8、REXX、SAS | |
PL/I(プログラミング言語ワン、発音は/ p iː ɛ l w ʌ n / 、 PL/1と表記されることもある)[1]は、 IBMによって最初に開発された手続き型の命令型コンピュータプログラミング言語です。科学、工学、ビジネス、システムプログラミング用に設計されています。1960年代に導入されて以来、学術、商業、産業の組織で継続的に使用されています。[2]
PL/1 ANSI標準 X3.53-1976 は 1976 年に公開されました。
PL/I の主なドメインは、データ処理、数値計算、科学計算、およびシステム プログラミングです。再帰、構造化プログラミング、リンク データ構造の処理、固定小数点、浮動小数点、複素数、文字列の処理、およびビット文字列の処理をサポートしています。言語構文は英語に似ており、複雑なデータ形式を記述するのに適しており、検証や操作に使用できる幅広い関数が用意されています。
初期の歴史
1950年代から1960年代初頭にかけて、ビジネスユーザーと科学技術ユーザーは、異なるコンピュータハードウェア向けに異なるプログラミング言語を使用してプログラミングしていました。ビジネスユーザーは、AutocoderからCOMTRANを経由してCOBOLに移行し、科学技術ユーザーはFortran、ALGOL、GEORGEなどでプログラミングしていました。IBM System/360 [3](1964年に発表され、1966年に納品)は、両方のユーザーグループに共通のマシンアーキテクチャとして設計され、既存のすべてのIBMアーキテクチャに取って代わりました。同様に、IBMはすべてのユーザーに単一のプログラミング言語を望んでいました。Fortranを拡張して、商用プログラマが必要とする機能を含めることができるとIBMは期待していました。1963年10月、Fortranへのこれらの拡張機能を提案するために、ニューヨークのIBM社員3人とIBMの科学技術ユーザーグループであるSHAREのメンバー3人で構成される委員会が結成されました[4] 。 Fortranの制約により、彼らはこれを実現できず、ALGOLを大まかにベースにしたNPLという新しいプログラミング言語の設計に着手した。この頭字語は英国国立物理学研究所の頭字語と衝突したため、一時的にMPPL (多目的プログラミング言語)に置き換えられ、1965年には[5] PL /I(ローマ数字の「I」付き)に置き換えられた。最初の定義は1964年4月に登場した。[7] [8]
IBMはNPLを出発点として、最初のコンパイラが書けるレベルまで設計を完成させた。NPLの定義は範囲と詳細の点で不完全だった。[9] PL/I言語[10]の管理は、最初はニューヨークプログラミングセンターが行い、後にハースリーのIBM UK研究所が担当した。SHAREおよびGUIDEユーザーグループは言語の拡張に携わり、PL/Iプロジェクトを通じてIBMの言語管理プロセスに関与した。このような大規模な言語を定義する経験から、PL/Iの正式な定義が必要であることがわかった。1967年、明確で完全な仕様を作成するプロジェクトがIBMウィーン研究所で立ち上げられた。 [11]これが、開発のための最初の大規模な形式手法の1つであるVDMにつながった。
フレッド・ブルックスはPL/IにCHARACTERデータ型を導入した功績がある。[12]
この言語は、1965 年にニューヨークで書かれたマニュアル「PL/I 言語仕様。C28-6571」で初めて詳細に規定され、1967 年に Hursley によって書かれた「PL/I 言語仕様。GY33-6003」に置き換えられました。IBM は 60 年代後半から 70 年代前半にかけて PL/I の開発を続け、GY33-6003 マニュアルとして公開しました。これらのマニュアルは、Multicsグループやその他の初期の実装者によって使用されました。
最初のコンパイラは 1966 年に提供されました。PL/I の標準は 1976 年に承認されました。
目標と原則
PL/Iの目標は、言語の開発初期に進化しました。COBOLのレコード処理とレポート作成との競争力が求められました。言語の有用性の範囲は、システムプログラミングとイベント駆動型プログラミングを含むように拡大しました。[13] PL/Iのその他の目標は次のとおりです。[3]
- コンパイルされたコードのパフォーマンスは Fortran と同等 (ただし、これは達成されなかった) [引用が必要]
- 新しいハードウェアと新しいアプリケーション領域への拡張性
- プログラミングプロセスの生産性が向上し、プログラマーの労力がコンパイラーに移る
- メインのコンピュータハードウェアとオペレーティングシステム上で効果的に動作するためのマシンの独立性
これらの目標を達成するために、PL/I は現代の言語からアイデアを借用しながら、重要な新機能を追加し、簡潔で読みやすい独特の構文を採用しました。多くの原則と機能が組み合わさって言語に特徴を与え、言語の目標を達成する上で重要になりました。
- Algol 60に似た、基礎となるセマンティクス (再帰を含む)を持つブロック構造。引数は参照渡しで渡され、必要な場合は値にダミー変数が使用されます (値渡し)。
- 広範囲の計算データ型、プログラム制御データ型、およびデータ構造の形式 (強力な型付け)。
- プロシージャ パラメータによる範囲の継承を伴う配列と文字列の動的範囲。
- 省略形が許可された式、宣言、およびステートメントの簡潔な構文。60グリフの文字セットに適しており、48 までサブセット可能です。
- ステートメント、オプション、宣言のデフォルトの広範な構造により、一部の複雑さを隠し、キーストロークを最小限に抑えながら言語の拡張を容易にします。
- 構造化プログラミングを適切にサポートする強力な反復処理。
- 予約語は存在しないことになっていた(ただし、関数名
DATEとはこの目標を達成することはTIME当初不可能であることが判明した[要出典])。既存のプログラムを無効にすることなく、新しい属性、文、文オプションをPL/Iに追加できる。IF, THEN, ELSE、、さえもDO予約語ではなかった。[14] - 直交性: 各機能は他の機能から独立しており、意味のある場合には他の機能と自由に組み合わせることができます。各機能は意味のある場合にはすべてのコンテキストで利用可能であり、可能な限り広く活用し、「恣意的な制限」を回避します。直交性は言語を「大規模」にするのに役立ちます。[説明が必要]
- 実行時に例外的な状況を制御およびインターセプトするための例外処理機能。
- 別々にコンパイル可能なセクションに分割されたプログラム。標準には含まれていない、ソース コードのセクションをカスタマイズして完全なプログラムに組み合わせるための、広範なコンパイル時機能 (マクロとも呼ばれる) を備えています。別々にコンパイルされたプロシージャを 1 つのプログラムに結合するための外部名。
- デバッグ機能が言語に統合されています。
言語の概要
この言語は、どのような問題に適用されるかに関係なく、すべてのプログラマーのニーズを満たすのに十分な機能を提供するように設計されています。[15]要約は、ANSI PL / I標準[16] とANSI PL / I汎用サブセット標準[17] から抜粋したものです。
PL/I プログラムは一連のプロシージャで構成され、各プロシージャは一連のステートメントとして記述されます。この%INCLUDE構造は、プログラム変換中に他のソースからのテキストを組み込むために使用されます。すべてのステートメント タイプは、言語の概要を示すグループにまとめられています (標準ではこの構成が使用されています)。
(マルチタスクやPL/I プリプロセッサなどの機能は標準には含まれていませんが、PL/IF コンパイラではサポートされており、その他の実装については言語の進化のセクションで説明されています。)
名前は、次のタイプのデータを単一の値として、または次元ごとに下限と上限を持つ配列形式の集合体として、または構造体(ネストされた構造体、配列、およびスカラー変数で構成)として表すために宣言できます。
このarithmeticタイプは次の属性で構成されます。
型の基数、スケール、精度、スケール係数はPicture-for-arithmetic内にエンコードされますpicture-specification。モードは別々に指定され、 はpicture specification実部と虚部の両方に適用されます。
値は、特定の演算セットと組み込み関数を使用して記述された式によって計算されます。そのほとんどは、集計値と単一の値の両方に適用できます。また、同様に集計値と単一の値を操作して返すことができるユーザー定義のプロシージャも使用できます。代入ステートメントは、1 つ以上の変数に値を割り当てます。
PL/I には予約語はありません。文はセミコロンで終了します。文の最大長は実装定義です。コメントは、スペースが許可されているプログラム内の任意の場所に記述でき、文字スラッシュ、アスタリスクで始まり、文字アスタリスク、スラッシュで終了します (つまり)。文には、エントリ名 (および文) またはラベル/* This is a comment. */名を導入するラベル接頭辞と、計算条件を有効または無効にする条件接頭辞 (例) を含めることができます。エントリ名とラベル名は、単一の識別子、または識別子の後に定数の添え字リストが続くもの ( など) にすることができます。
ENTRYPROCEDURE(NOSIZE)L(12,2):A=0;
一連の文は、その前に文があり、後ろに文がある場合にグループになります。グループには、ネストされたグループと開始ブロックを含めることができます。文は、グループまたは単一の文を部分と部分として指定します (サンプル プログラムを参照)。グループは反復の単位です。開始ブロック( ) には、ブロックにローカルな名前と内部プロシージャの宣言を含めることができます。プロシージャは文で始まり、文によって構文的に終了します。プロシージャの本体は、一連のブロック、グループ、および文であり、プロシージャまたはプロシージャにローカルな名前とプロシージャの宣言が含まれます。
DOENDIFTHENELSEBEGIN; stmt-list END;PROCEDUREENDEXTERNAL
ON ユニットは、次の条件の 1 つ以上が発生したときに実行されるように記述された単一のステートメントまたはステートメントのブロックです。
計算条件、
または入力/出力条件、
または、次のいずれかの条件を満たす場合:
AREA、、、CONDITION (identifier)ERRORFINISH
識別子の宣言には、次の属性の 1 つ以上を含めることができます (ただし、相互に一貫している必要があります)。
Micro Focusの現在のコンパイラ、特に IBM のコンパイラは、言語の標準化バージョンに対して多くの拡張機能を実装しています。IBM の拡張機能については、後述のコンパイラの実装サブセクションでまとめています。これらのコンパイラに共通する拡張機能がいくつかありますが、現在の標準がないため、互換性は保証されません。
標準化
言語の標準化は、1966年4月にヨーロッパでECMA TC10から始まりました。1969年にANSIは「複合言語開発委員会」を設立しました。これは「Kludge」というニックネームで呼ばれ、後にX3J1 PL/Iに改名されました。[18]標準化はECMA TC/10とANSI X3J1の共同作業となりました。GY33-6003 [19]文書のサブセットはIBMによって共同作業に提供され、標準化の基本文書となりました。基本文書から省略された主な機能は、マルチタスクとプログラム最適化の属性(例:NORMALおよびABNORMAL)でした。
基本文書の変更提案は、両委員会で投票にかけられました。委員会の意見が一致しない場合は、当初はゼネラルモーターズのマイケル・マルコッティ氏とICLを代表するCARホーア氏が議長を務め、その意見の不一致を解決しなければなりませんでした。IBMに加えて、Honeywell、CDC、Data General、Digital Equipment Corporation、Prime Computer、Burroughs、RCA、Univacが、主要ユーザーであるEastman Kodak、MITRE、Union Carbide、Bell Laboratories 、およびさまざまな政府および大学の代表者とともにX3J1に携わりました。言語のさらなる開発は標準化団体で行われ、構造化プログラミングと内部一貫性が継続的に改善され、わかりにくい機能や議論の多い機能が省略されました。
言語開発が終わりに近づくと、X3J1/TC10 は英語のテキストで書かれた文書に多くの問題があることに気付きました。1 つの項目に関する議論が複数の場所で現れ、それらが一致したり一致しなかったりすることがあります。欠落や矛盾があるかどうかを判断するのは困難でした。その結果、David Beech (IBM)、Robert Freiburghouse (Honeywell)、Milton Barber (CDC)、M. Donald MacLaren ( Argonne National Laboratory )、Craig Franklin (Data General)、Lois Frampton (Digital Equipment Corporation)、および編集者の IBM の DJ Andrews が、文書全体を書き直すことに着手し、それぞれが 1 つ以上の完全な章を作成しました。この標準は、セマンティクスを指定するために 「PL/I マシン」[20]を使用した正式な定義[16]として表現されています 。これは、半正式な定義として書かれた最初のプログラミング言語標準でした。
「PL/I汎用サブセット」(「サブセットG」)標準は1981年にANSIによって発行され[17]、1987年に改訂版が公開されました。[21]汎用サブセットは、PL/I実装のカーネルとして広く採用されました。
実装
IBM PL/IF および D コンパイラ
PL/Iは、 System/360の開発の一環として、英国ハースレー研究所のIBMによって最初に実装されました。最初の製品版PL/Iコンパイラは、英国ハースレーのジョン・ナッシュのチームによって構築されたOS/360オペレーティングシステム用のPL/IFコンパイラでした。ランタイムライブラリチームはIM(ノビー)クラークによって管理されていました。PL/IFコンパイラは、すべてSystem/360アセンブリ言語で書かれていました。[22] リリース1は1966年に出荷されました。OS/360は実メモリ環境であり、コンパイラは、実ストレージが64キロバイト(S/360の用語ではFは64kB)しかないシステム向けに設計されました。大規模なコンパイラを64キロバイトのマシンで使用可能な44キロバイトのメモリに収めるため、コンパイラは制御フェーズと多数のコンパイラフェーズ(約100)で構成されています。フェーズは、特定の言語機能やコンパイルの側面を処理するために、ディスクから1つずつメモリに読み込まれます。各フェーズは、通常はメモリに保持されている部分的にコンパイルされたプログラムに対して1回のパスを実行します。[23]
PL/IF が実装された当時、言語の側面はまだ設計中であったため、後のリリースまでいくつかは省略されました。PL/I RECORD I/O は、PL/IF リリース 2 で出荷されました。リスト処理関数[24] - 基底変数、ポインタ、領域とオフセット、およびLOCATE モード I/O - は、リリース 4 で初めて出荷されました。PL/I コードを Fortran オブジェクト コードに匹敵する速度に引き上げる大きな試みとして、PL/IF リリース 5 では、プロシージャの REORDER オプションによって促進される DO ループの大幅なプログラム最適化が行われます。
PL/IFのバージョンは、IBM Mohansic Labで適応されたSystem/360 Model 67用のTSS/360タイムシェアリングオペレーティングシステムでリリースされました。フランスのIBM La Gaude Labは、Fortran、Cobol、およびAlgolプログラムをPL/IのPL/IFレベルに変換する「言語変換プログラム」 [25]を開発しました。
PL/IDコンパイラは、16キロバイトのメモリを使用し、IBMドイツがDOS/360ローエンドオペレーティングシステム用に開発しました。PL/I言語のサブセットを実装し、すべての文字列と配列が固定範囲を持つことを要求するため、ランタイム環境が簡素化されます。基盤となるオペレーティングシステムを反映して、動的ストレージ割り当てと制御ストレージクラスがありません。[26] PL/I Fの1年以内に出荷されました。
Multics PL/I および派生語
1960年代初頭には、いくつかのグループによってコンパイラが実装された。高級言語でオペレーティングシステムを開発した最初のプロジェクトの1つであるMITのMulticsプロジェクトでは、1964年にPL/Iのサブセット方言であるEarly PL/I (EPL)を実装言語として使用した。EPLはベル研究所とMITでDouglas McIlroy、Robert Morrisらによって開発されました。[27]当初は、TMGコンパイラコンパイラを使用して開発されました。[28]影響力のあったMultics PL/Iコンパイラ[27]は、多くのメーカーやソフトウェアグループが使用するコンパイラ技術の源でした。EPLはシステムプログラミング言語であり、オリジナルのPL/Iにはなかった機能をいくつか備えたPL/Iの方言でした。
Honeywell PL/Iコンパイラ(シリーズ60用)は、完全なANSI X3J1標準の実装です。[29]
IBM PL/I 最適化およびチェックアウト コンパイラ
ハースリーで開発されたPL/Iオプティマイザとチェックアウトコンパイラは、共通レベルのPL/I言語[30]をサポートし、PL/IFコンパイラを置き換えることを目的としていました。チェックアウトコンパイラは、PL/IFをIBMのPL/Iに似た独自の実装言語であるBSL(後のPL/S)で書き直したものです。[22] コンパイラに設定されたパフォーマンス目標は、BCSへのIBMのプレゼンテーションで示されています。[22]コンパイラは同一の結果を生成する必要がありました。チェックアウトコンパイラは、その後オプティマイザに送信されるプログラムをデバッグするために使用されます。コンパイラの設計がまったく異なり、完全なPL/I言語を処理していたことを考えると、この目標は困難でしたが、達成されました。
IBM は、 BUILTIN、ケース ステートメント ( SELECT / WHEN / OTHERWISE )、ループ制御 ( ITERATEおよびLEAVE )、および null 引数リストなどの新しい属性と構文を導入して、たとえば、 という曖昧さを解消しました。
DATE()
PL/I 最適化コンパイラは PL/IF コンパイラを引き継ぎ、1970 年代から 1990 年代にかけて IBM の主力コンパイラでした。PL/IF と同様に、44 キロバイトの設計ポイントを持つマルチパス コンパイラですが、完全に新しい設計です。F コンパイラとは異なり、ランタイム ライブラリを使用して定数式のコンパイル時の評価を実行する必要があるため、コンパイラ フェーズの最大メモリが 28 キロバイトに削減されます。2 度目の設計で、カスケード診断などの PL/IF の煩わしさを排除することに成功しました。[31]これは、Tony Burbridge が率いるチームによって S/360 Macro Assembler で書かれました。チームのメンバーのほとんどは PL/I F に携わっていました。マクロは、一般的なコンパイラ サービスを自動化し、コンパイラ作成者がリアル モード ストレージの管理作業から解放されるように定義され、コンパイラを他のメモリ モデルに簡単に移動できるようにしました。当時の IBM Fortran H コンパイラ用に開発されたプログラム最適化技術の全範囲が採用されました。オプティマイザは、優れたプログラマの手にかかれば Fortran の実行速度に匹敵しました。1970 年に IBM S/370 で発表され、1971 年 8 月に最初にDOS/360オペレーティング システム用に出荷され、その後すぐに OS/360 用に出荷されました。 [32]また、最初の仮想メモリ IBM オペレーティング システムOS/VS1、MVS、およびVM/CMS用にも出荷されました。(開発者は、コードを 28 KB のセクションに押し込んでいる間に、IBM Poughkeepsie が最終的に OS/360 で仮想メモリ サポートを出荷する準備が整っていたことに気づいていませんでした)。バッチ プログラミング環境をサポートし、TSO および CMS の下で対話的に実行できました。
このコンパイラは、以下の「IBM PL/I for OS/2、AIX、Linux、z/OS」に置き換えられました。
1970 年 8 月に発表されたPL/I チェックアウト コンパイラ[33] [34] (俗称「チェッカー」) は、PL/I プログラムのデバッグを高速化し、改善するために設計されました。このチームは Brian Marks が率いました。3 パス設計により、プログラムのコンパイル時間が F コンパイラの 25% に短縮されました。このコンパイラは対話型端末から実行でき、PL/I プログラムを内部形式「H テキスト」に変換します。この形式は実行時にチェックアウト コンパイラによって解釈され、事実上すべての種類のエラーを検出します。ポインタは 16 バイトで表され、ターゲット アドレスと参照項目の説明が含まれているため、「不適切な」ポインタの使用を診断できます。会話型環境では、エラーが検出されると、制御がユーザーに渡され、ユーザーは変数を調べ、デバッグ ステートメントを導入し、ソース プログラムを編集できます。時間の経過とともに、メインフレーム プログラミング環境のデバッグ機能によって、このコンパイラが提供する機能のほとんどが開発され、このコンパイラは廃止されました (1990 年代?)。
12 月 PL/I
IBM以外でおそらく最も商業的に成功した実装は、Digital Equipment CorporationのVAX-11 PL/I(後にVAX PL/I、さらにDEC PL/Iとして知られるようになった)だろう。この実装は「ANSI X3.4-1981 PL/I汎用サブセットの厳密なスーパーセットであり、新しいANSI X3.74-1987 PL/I汎用サブセットのほとんどの機能を提供する」ものであり、1980年に初めてリリースされた。 [35] [36]当初は、 Dave Cutler率いるチームによって作成されたVAX Code Generator(VCG)というコンパイラバックエンドを使用していた。[37]フロントエンドはRobert Freiburghouseによって設計され、MulticsからVAX/VMSに移植された。[38]これは、 VAXおよびAlpha上のVMS 、およびTru64で動作する。1990年代に、DigitalはコンパイラをUniPrise Systemsに売却し、その後、Kednosという会社に売却された。[39]ケドノスは2016年10月に取引を停止するまで、このコンパイラをケドノスPL/Iとして販売していた。[40]
サブセットコンパイラの指導
1960年代後半から1970年代前半にかけて、多くの米国とカナダの大学がキャンパス内にタイムシェアリングサービスを導入し、科学、数学、工学、コンピュータサイエンスの教育に使用する会話型コンパイラ/インタープリタを必要としていました。ダートマス大学はBASICを開発していましたが、簡潔で教えやすいPL/Iが人気でした。IBMの製品は不適切だったため、[41]多くの大学が独自のPL/Iのサブセットと独自の対話型サポートを構築しました。例は次のとおりです。
1960 年代から 1970 年代初頭にかけて、Allen-Babcock はカスタムマイクロコードを使用してIBM System/360 Model 50用の Remote Users of Shared Hardware (RUSH) タイム シェアリング システムを実装し、その後 IBM のCPS を実装しました。CPS は、コンピュータ サイエンスの基礎を教えることを目的としたOS/360用の対話型タイム シェアリング システムで、BASIC に加えて PL/I 言語の限定されたサブセットとリモート ジョブ エントリ機能を提供しました。
コーネル大学で開発された教育用コンパイラであるPL/Cは、多くの構文エラーを広範囲に自動修正し、残っている構文エラーを出力ステートメントに変換することで、どんなプログラムでもコンパイルに失敗することのない珍しい機能を持っていました。この言語は、IBMによって実装されたPL/Iのほぼすべてでした。 [42] PL/Cは非常に高速なコンパイラでした。
SL/1(Student Language/1、Student Language/One、またはSubset Language/1)[43][44]は、1960年代後半に最初に利用可能になったPL/Iのサブセットで、IBM 1130、教育用途に強みを持っていました。
ブルックリン工科大学で開発されたPLAGOは、PL/I言語の簡略化されたサブセット[45]を使用し、優れた診断エラーメッセージと高速なコンパイル時間に重点を置いていました。
トロント大学のコンピュータシステム研究グループは、プログラミング教育用に、SP/1、SP/2、SP/3、...、SP/8と呼ばれるPL/IのサブセットのシーケンスをサポートするSP/kコンパイラを開発しました。SP/kコンパイラでエラーなく実行されたプログラムは、IBMのPL/IFコンパイラ、IBMのチェックアウトコンパイラ、コーネル大学のPL/Cコンパイラなど、他の当時のPL/Iコンパイラでも同じ結果を生成しました。[46]
他の例としては、ニューサウスウェールズ大学のP. GrouseによるPL0 、メリーランド大学のMarvin Victor ZelkowitzによるPLUM 、 [47]、トロント大学の PLUTOなどがあります。
OS/2、AIX、Linux、z/OS 向け IBM PL/I
PL/Iの大幅な改良として、カリフォルニア州のIBMサンタテレサは1992年にまったく新しいコンパイラを発売した。最初の出荷はOS/2用で、ほとんどのANSI-G機能と多くの新しいPL/I機能が含まれていた。[48]その後のリリースでは追加のプラットフォーム(MVS、VM、OS/390、AIX、Windows)が提供されたが、2021年現在、サポートされているプラットフォームはz/OSとAIXのみである。[49] IBMは、追い抜かれていた分野でPL/Iを他の言語(特にCとC++)と完全に競争できるように機能を追加し続けた。対応する「IBM Language Environment」は、PL/Iプログラムとデータベースおよびトランザクションシステムとの相互運用をサポートし、C、C++、およびCOBOLで書かれたプログラムでは、コンパイラはこれらの言語との相互通信に必要なすべてのデータ型をサポートしている。
PL/I の設計原則は保持され、いくつかの新しいデータ型、新しいステートメントとステートメント オプション、新しい例外条件、およびプログラム ソースの新しい構成を含むこの大規模な拡張に耐えました。結果として得られた言語は、PL/I 標準と以前の IBM コンパイラーの互換性のあるスーパーセットです。PL/I に追加された主なトピックは次のとおりです。
- ユーザー定義データ型のサポートを強化するための新しい属性 -
DEFINE ALIASユーザー定義型、ロケーター データ型、データ型自体、データ型、および新しい型を操作するための組み込み関数を導入する、、ORDINALおよびステートメント。DEFINE STRUCTUREHANDLETYPEUNION - 一般的な PC データ型に対応する追加のデータ型と属性 (例
UNSIGNED: 、VARYINGZ)。 - プログラムの可読性の向上 - 暗黙の使用法を明示的に表現することが多い(例:
BYVALUEパラメータの属性) - 追加の構造化プログラミング構成要素。
- 割り込み処理の追加。
- コンパイル時プリプロセッサが拡張され、ほぼすべてのPL/I文字列処理機能が提供され、アプリケーション開発環境とインターフェイスできるようになりました。
Enterprise PL/I for z/OS と呼ばれる z/OS 用の PL/I コンパイラーの最新シリーズは、コンパイル時に渡される ARCHLVL パラメーター制御を使用して、最新の z/Architecture プロセッサー (z14、z13、zEC12、zBC12、z196、z114) のコード生成を活用します。これは、z/OS 言語環境でサポートされている高水準言語の中で、これを実現する 2 番目の言語です (最初の言語は XL C/C++、最後の言語は Enterprise COBOL v5)。
データ型
ORDINAL は新しい計算データ型です。序数の機能はPascalのものと似ていますが、DEFINE ORDINAL Colour (red, yellow, green, blue, violet);
さらに名前と内部値に組み込み関数を介してアクセスできます。組み込み関数は、序数値の前後の値へのアクセスを提供します。
DEFINEステートメント (下記参照) を使用すると、PL/I の組み込み属性から構成される追加のTYPEを宣言 できます。
ロケータデータ型はPOINTERHANDLE(data structure)データ型に似ていますが、特定のデータ構造にのみバインドするように厳密に型指定されています。演算子は、ハンドルを使用してデータ構造を選択するために使用されます。
=>
UNION属性 (初期の PL/I 仕様のCELLに相当) を使用すると、複数のスカラー変数、配列、または構造体が、最大の選択肢に必要なストレージ量を占有するユニット内で同じストレージを共有できるようになります。
PCとC言語での競争力
次の属性が追加されました:
- 文字列属性
VARYINGZ(ゼロ終了文字列用)HEXADEC、、、WIDECHARおよびGRAPHIC。 - オプションの算術属性
UNSIGNEDおよびSIGNED、BIGENDIANおよびLITTLEENDIAN。により、反復グループにおよびオプションがUNSIGNED必要になり 、カウンタ制御ループを制限値を超えずに実行できるようになりました ( にも必須で、ループのドキュメント化にも役立ちます)。UPTHRUDOWNTHRUORDINAL DATE(pattern)日付の表現と追加を制御して、時間と日付を現在のベストプラクティスにするための属性。日付を操作するための新しい関数には、 日付DAYSとDAYSTODATE日数を変換するための関数と、DATETIME日付形式を変更するための一般的な関数が含まれます。
新しい文字列処理関数が追加されました。テキストを中央揃えにする、画像形式を使用して編集する、テキストの先頭または末尾から空白または選択した文字をトリミングする、右側から VERIFYR削除する、および関数です。
VERIFYSEARCHTALLY
C 風の複合代入演算子 (例+=: &=、、-=)||=が追加されました。A+=1は と同等ですA=A+1。
省略された引数と可変長引数リストに対して、 追加のパラメータ記述子と属性が追加されました。
プログラムの可読性 – 意図を明確にする
VALUE属性は、識別子を定数 (特定のリテラル値または制限された式から派生) として宣言します。
パラメータには、 BYADDR (アドレス渡し) 属性またはBYVALUE (値渡し) 属性 を指定できます。
ASSIGNABLE属性とNONASSIGNABLE属性は、意図しない割り当てを防止します。
DO FOREVER;不自然な構成の必要性を排除します。
DO WHILE ( '1'B );
DEFINEステートメントは、組み込み属性の組み合わせ (例: )に対してユーザー指定の名前 (例: INTEGER ) を導入します。したがって、組み込み属性セット FIXED BINARY(31.0) の別名としてTYPE名INTEGER が作成されます。は構造体とそのメンバーに適用されます。構造体宣言で使用するために、構造体属性セットと対応するサブ構造体メンバー宣言のTYPE名を提供します( LIKE属性の一般化)。
FIXED BINARY(31,0)DEFINE ALIAS INTEGER FIXED BINARY(31.0)DEFINE STRUCTURE
構造化プログラミングの追加
ループを終了するにはLEAVEステートメントを使用し、ループの次の反復を続行するには ITERATE を使用します。
反復グループに対する UPTHRUおよびDOWNTHRUオプション。
パッケージ構造は、ユニットとして使用するための一連のプロシージャと宣言で構成されます。プロシージャの外部で宣言された変数はパッケージに対してローカルであり、STATIC、BASEDまたはCONTROLLEDストレージを使用できます。パッケージ内で使用されるプロシージャ名もローカルですが、PACKAGEステートメントのEXPORTSオプションを使用して外部にすることができます。
割り込み処理
ON ユニットで実行されるRESIGNALステートメントは、 ON ユニットの実行を終了し、現在のプロシージャを呼び出したプロシージャで条件を再度発生させます (したがって、そのプロシージャに対応する ON ユニットに制御が渡されます)。
INVALIDOP条件は、 PC プロセッサによって検出された無効な演算コード、および 2 つの無限値の減算などの不正な算術演算を処理します。
ANYCONDITION条件は、現在の手順で特定の ON ユニットが提供されていない条件をインターセプトするために提供されます。
ALLOCATEステートメントが十分なストレージを取得できない 場合、 STORAGE条件が発生します。
その他のメインフレームおよびミニコンピュータコンパイラ
1970 年代には、多くのベンダーがメインフレームやミニコンピュータ上の IBM PL/IF や最適化コンパイラと競合するコンパイラを開発しました。1980 年代には、ターゲットは通常、新たに登場した ANSI-G サブセットでした。
- 1974年にバローズ社はB6700とB7700用のPL/Iを発表しました。[50]
- UNIVACはUNIVAC PL/I [51]をリリースし、1970年代にはシステムプログラミングにPL/Iの派生版であるPL/I PLUSも使用しました。
- 1978年から、データジェネラルはAOS、AOS/VS、AOS/VS IIオペレーティングシステムを実行するEclipseおよびEclipse MVプラットフォーム上でPL/Iを提供しました。[52]多くのオペレーティングシステムユーティリティプログラムがこの言語で書かれました。
- ニューヨーク大学クーラント数学研究所のポール・エイブラハムは、1972年にPL/IでCIMS PL/Iを書き、PL/I Fを介してブートストラップしました。これは、CDC 6600へのPL/Iコンパイルの「約70%」をサポートしました[53]
- CDCはCyber 70、170、6000シリーズ向けに最適化サブセットPL/Iコンパイラを提供した。[54]
- 富士通は、PL/I Optimizer と同等の PL/I コンパイラを提供しました。
- Stratus Technologies PL/Iは、 VOSオペレーティングシステム用のANSI G実装です。[55]
- IBMシリーズ/1 PL/I [56] [57]は、IBMシリーズ/1リアルタイムプログラミングシステム用のANSIプログラミング言語PL/I(ANSI X3.53-1976)の拡張サブセットです。
Microsoft .NET 用 PL/I コンパイラ
- 2011 年、Raincode は、Microsoft .NETおよび.NET Coreプラットフォーム用の完全なレガシー コンパイラーを設計し、Raincode PL/I コンパイラーと名付けました。
パーソナルコンピュータおよび Unix 用の PL/I コンパイラ
- 1970年代から1980年代にかけて、デジタルリサーチ社はCP/M(PL/I-80)、CP/M-86(PL/I-86)、DOS搭載のパーソナルコンピュータ用のPL/Iコンパイラを販売していました。[58]これはPL/IのサブセットG [58]に基づいており、 PL/Mで書かれていました。
- Micro FocusはLiantから買収したWindows [59]およびUNIX/Linuxシステム[60]用のOpen PL/Iを実装しました。
- IBMは1994年にOS/2用のPL/I [48]を、1995年にはAIX用のPL/Iをリリースした。 [61]
- OS/2およびLinux向けのIron Spring PL/Iは2007年に導入されました。[62]
PL/I方言
- PL/Sは PL/I の方言で、当初は BSL と呼ばれていましたが、1960 年代後半に開発され、 IBM メインフレームのシステム プログラミング言語になりました。1970 年代と 1980 年代のほぼすべての IBM メインフレーム システム ソフトウェアは、PL/S で記述されていました。PL/I と異なる点は、データ型の変換がなく、ランタイム環境がなく、構造が異なってマッピングされ、割り当てがバイト単位でコピーされることです。すべての文字列と配列は固定エクステントを持つか、
REFERオプションを使用しました。PL/S の後継は PL/AS で、さらに PL/X が続きました。PL/X は現在、最新のオペレーティング システムであるOS/390とz/OSの内部作業に使用されている言語です。また、一部のz/VSEおよびz/VMコンポーネントにも使用されています。IBM Db2 for z/OS も PL/X で記述されています。 - PL/Cは、1970 年代にコーネル大学で開発された、PL/I コンピュータ プログラミング言語の教育用方言です。
- PL/Iの2つの方言であるPL/MP(マシンプロダクト)とPL/MI(マシンインターフェース)は、IBMのSystem/38およびAS/400プラットフォームのシステムソフトウェアで使用されていました。[63] [64] [65] PL/MPは、これらのプラットフォームのいわゆる垂直マイクロコードを実装するために使用され、IMPI命令セットを対象としていました。PL/MIはこれらのプラットフォームのマシンインターフェースを対象としており、System/38制御プログラム機能とOS/400のXPFレイヤーで使用されています。[66] PL/MPコードは、OS/400がIBM RS64プロセッサファミリに移植されたときに大部分がC++に置き換えられましたが、一部は保持され、PowerPC / Power ISAアーキテクチャ用に再ターゲットされました。[67] PL/MIコードは置き換えられず、IBM iで引き続き使用されています。[68]
- PL.8は、PL/Iの約80%を占めていたことからその名がつけられた[69]。もともとは1970年代にIBMリサーチ社によってIBM 801アーキテクチャ向けに開発された。[70]その後、モトローラ68000およびSystem/370アーキテクチャでもサポートされるようになった。[71]現在でもIBM社内のシステム開発タスク(z/Architectureシステムのミリコードやファームウェアなど)に使用され、 64ビットのgccベースのバックエンドを使用するように再設計されている。[70] [72]
- Honeywell, Inc. は、CP-6オペレーティング システムの作成に使用するためにPL-6 を開発しました。
- Prime Computer は、PRIMOSオペレーティング システムのシステム プログラミング言語として、バージョン 18 からはPL/P、バージョン 19 からは SPL という2 つの異なる PL/I 方言を使用しました。
- XPL は、 XPL コンパイラ技術を使用して他のコンパイラを作成するために使用される PL/I の方言です。XPL は、PL/I の小さなサブセットにヒープ文字列データ型を追加しました。
- HAL/Sはリアルタイムの航空宇宙プログラミング言語で、スペース シャトル プログラムでの使用で最もよく知られています。1970 年代に Intermetrics 社によって NASA 向けに設計されました。HAL/S は XPL で実装されました。
- IBM とさまざまな下請け業者は、1970 年代初頭に海軍の信号処理をサポートするために、SPL/I と呼ばれる別の PL/I バリアントも開発しました。
- SabreTalk は、 Sabre航空会社予約システムをプログラムするために使用される PL/I のリアルタイム方言です。
- Apple は、ゼネラルモーターズ研究所がControl Data Corporation STAR-100スーパーコンピュータ用に開発した PL/I 方言で、グラフィック デザインで広く使用されています。
使用法
PL/Iの実装は、1960年代後半からメインフレーム向けに、1970年代にはミニコンピュータ向けに、1980年代から1990年代にはパーソナルコンピュータ[58]向けに開発されました。主にメインフレームで使用されてきましたが、 DOS、Microsoft Windows、OS/2、AIX、OpenVMS、Unix向けのPL/Iバージョンも存在します。
PL/Iはビジネスデータ処理[73]や特定のプラットフォーム上でのオペレーティングシステムの作成に 広く使用されています。非常に複雑で強力なシステムがPL/Iで構築されています。
- SASシステムは当初 PL/I で記述されており、SAS データ ステップは現在でも PL/I 構文に基づいてモデル化されています。
- 先駆的なオンライン航空券予約システムであるSabre は、もともと IBM 7090 用にアセンブラーで作成されました。S/360 バージョンは主に、専用制御プログラム用に特別に構築されたサブセット PL/I コンパイラであるSabreTalk を使用して作成されました。
- Multicsオペレーティング システムは主に PL/I で記述されました。
- PL/IはIBMのシステムネットワークアーキテクチャを解釈するための実行可能な形式定義[74]を記述するために使用されました。
- OpenVMSオペレーティングシステムの一部のコンポーネントはもともとPL/Iで書かれていましたが、後にVMSをIA64アーキテクチャに移植する際にCで書き直されました。[75]
PL/I は、Fortran や COBOL に取って代わり、メインフレームの主要プレイヤーになるという支持者の期待に応えることはできませんでした。少数派ではあるものの、重要なプレイヤーであり続けました。これについては明確な説明はできませんが、1970 年代と 1980 年代のいくつかの傾向により、PL/I が競争上の優位性を持つ領域が徐々に縮小し、その成功が妨げられました。
まず、メインフレーム ソフトウェア環境の性質が変化しました。データベースおよびトランザクション処理用のアプリケーション サブシステム( System 370 上のCICS、IMS、およびOracle ) とアプリケーション ジェネレーターが、メインフレーム ユーザーのアプリケーション開発の焦点となりました。サブシステムの対応するネイティブ機能 (タスク処理や入出力の大部分など) を使用する必要があったため、言語の重要な部分が無関係になりました。Fortran はこれらのアプリケーション領域では使用されなかったため、PL/I は COBOL の領域に限定され、ほとんどのユーザーは COBOL を使い続けました。しかし、PC がプログラム開発の主要環境になると、Fortran、COBOL、および PL/I はすべて少数派言語となり、C++、Javaなどに取って代わられました。
第二に、PL/Iはシステムプログラミングの分野で追い抜かれました。IBMのシステムプログラミングコミュニティはPL/Iを使用する準備ができていませんでした。代わりに、IBMはシステムプログラミング用にPL/Iの独自の方言であるPL/Sを開発し、採用しました。[76] IBM社内でのPL/Sの成功とIBM外でのCの成功により、システムプログラミングにおけるPL/Iの独自の強みは価値が下がりました。
3 番目に、開発環境によって対話型ソフトウェア開発の機能が強化され、これによっても PL/I 独自の対話型およびデバッグ機能の価値が低下しました。
4 番目に、構造化プログラミング、文字列操作、オブジェクト指向などの機能が COBOL と Fortran に追加されたため、PL/I の相対的な利点がさらに低下しました。
メインフレームでは、ビジネス上の重大な問題も発生していました。IBM のハードウェア競合企業は、PL/I の成功によって得るものはほとんどなく、失うものの方が大きかったのです。コンパイラの開発は高価で、IBM コンパイラ グループには競争上の優位性が備わっていました。多くの IBM ユーザーは、独自のソリューションに縛られることを避けたいと考えていました。他のベンダーによる PL/I の早期サポートがなかったため、PL/I を避けるのが最善でした。
PL/I言語の進化
この記事では、言語機能の参照ポイントとして PL/I 標準を使用しています。しかし、初期の実装で重要だった機能の多くは標準にはなく、IBM 以外のコンパイラーで提供されていたものもあります。そして、事実上の言語は標準の制定後も成長を続け、最終的にはパーソナル コンピューターの開発によって推進されました。
標準から省略された重要な機能
マルチスレッド
マルチスレッドは、「マルチタスク」という名前で、PL/IF、[77]、 PL/Iチェックアウトおよび最適化コンパイラ、[78]、およびより新しいAIXおよびZ/OSコンパイラによって実装されました。これは、データ型EVENTおよびTASK、CALL文(Fork)のTASKオプション、 WAIT文(Join)、レコードI/O文のEVENTオプション、およびEXCLUSIVEファイルでロックされたレコードのロックを解除するUNLOCK文で構成されます。イベントデータは特定のイベントを識別し、完了('1'B)か不完全('0'B)かを示します。タスクデータ項目は特定のタスク(またはプロセス)を識別し、他のタスクに対するその優先度を示します。
DELAY(delay-time)
プリプロセッサ
最初の IBMコンパイル時プリプロセッサは、マサチューセッツ州ケンブリッジにある IBM ボストン高度プログラミングセンターで構築され、PL/IF コンパイラとともに出荷されました。 文は%INCLUDE標準に含まれていましたが、残りの機能は標準ではありませんでした。DEC および Kednos [40] PL/I コンパイラは、IBM とほぼ同じ機能セットを実装しましたが、独自の追加機能もいくつかありました。IBM は、コンパイラにプリプロセッサ機能を追加し続けています。プリプロセッサは、記述されたソース プログラムをトークンのシーケンスとして扱い、それらを出力ソース ファイルにコピーするか、それらに基づいて操作します。% トークンが検出されると、次のコンパイル時文が実行されます。識別子トークンが検出され、その識別子がDECLAREおよびACTIVATEされ、コンパイル時の値が割り当てられている場合、識別子はこの値に置き換えられます。トークンは、アクションを必要としない場合 (例 )、出力ストリームに追加されます。これは、ACTIVATE されたコンパイル時式の値の場合も同様です。したがって、コンパイル時変数PI は、 を使用して宣言、アクティブ化、および割り当てることができます。それ以降のPIはに置き換えられます。
+%PI='3.14159265'3.14159265
サポートされているデータ型は、最大長のない可変長の
FIXED DECIMAL整数とCHARACTER文字列です。構造ステートメントは次のとおりです。
%[label_list:]DO iteration: statements; %[label_list:]END;%procedure_name: PROCEDURE (parameter list) RETURNS (type); statements...; %[label_list:]END;%[label_list:]IF...%THEN...%ELSE..
そして、単純な文も、[label_list:]
%ACTIVATE(identifier_list)そして%DEACTIVATE- 代入文
%DECLARE identifier_attribute_list%GO TO label%INCLUDE- ヌル文
この機能により、プログラマーは定数 (製品部品番号や数学定数など) に識別子を使用できるようになりましたが、標準では計算データ用の名前付き定数に置き換えられました。コンパイル時の機能で可能な条件付きコンパイルとソース コードの反復生成は、標準ではサポートされていませんでした。いくつかのメーカーがこれらの機能を実装しました。
構造化プログラミングの追加
構造化プログラミングの追加は標準化中に PL/I に対して行われましたが、標準には採用されませんでした。これらの機能には、反復DOを終了するLEAVEステートメント、DOに追加されたUNTILオプションとREPEATオプション、および一般形式の case ステートメントがあります。
SELECT (式) {WHEN (式) グループ}... OTHERWISE グループ
これらの機能はすべてIBMのPL/Iチェックアウトおよび最適化コンパイラ[30]とDEC PL/I [79]に含まれていました。
デバッグ機能
PL/IF は、標準には提案されなかったものの、他者によって実装されたいくつかのデバッグ機能を提供していました。特に、CHECK(変数リスト) 条件プレフィックス、CHECKオン条件、およびSNAPオプションです。IBM の最適化およびチェックアウト コンパイラは、会話型メインフレーム プログラミング環境に適した追加機能 (条件など) を追加しましたATTENTION。
標準規格以降に開発された重要な機能
初期の IBM では、複数のデータ型のうちの 1 つを持つことができる構造体メンバー型を設計する試みが何度か行われていました。プログラミング理論のクラスCELLの成長に伴い、これに対するアプローチは PL/I ベースで可能になりました 。などがいくつかのコンパイラによって追加されました。
UNIONTYPE
PL/I は、シングルバイト文字の世界で構想されていました。日本語と中国語のサポートが不可欠になり、国際コード ページが開発されたことで、文字列の概念が拡張され、幅広い非 ASCII/EBCDIC 文字列に対応できるようになりました。
ミレニアム問題に対処するために、日付と時刻の処理が全面的に見直され、約 35 種類の形式のいずれかで日付と時刻を返す DATETIME 関数が導入されました。他のいくつかの日付関数は、日と秒の間の変換を処理します。
批判
実装上の問題
この言語は習得しやすく使いやすいが、PL/I コンパイラの実装は難しく、時間がかかる。PL/I ほど大きな言語には、ほとんどのベンダーが作成でき、ほとんどのユーザーが習得できるサブセットが必要だった。この問題は、「ANSI G」が発行されるまで解決されなかった。PL/I に特有のコンパイル時の機能には、追加の実装作業と追加のコンパイラ パスが必要だった。PL/I コンパイラは、同等の Fortran または COBOL コンパイラの 2 ~ 4 倍の大きさで、その分だけ速度も遅いが、プログラマの生産性向上によって相殺されると考えられていた。これは、最初のコンパイラが書かれる前から IBM で予想されていた。[9]
PL/I は解析が非常に難しいと主張する人もいます。[80] PL/I のキーワードは予約されていないため、プログラマーはプログラム内で変数名やプロシージャ名として使用できます。オリジナルの PL/I(F) コンパイラーは、キーワードが誤ったコンテキストで使用されている場合に自動修正を試みることにより、多くの場合、それを変数名であると想定します。これにより「カスケード診断」が発生しますが、[31]この問題は後のコンパイラーによって解決されました。
言語の初期設計では、優れたオブジェクト コードを作成するために必要な労力が過小評価されていた可能性があります。プログラムの最適化(既存の Fortran コンパイラによって実行される優れたプログラム最適化に対抗するために必要) は、副作用と変数のエイリアシングに関する広範な問題のために、異常に複雑です。予期しない変更が例外ハンドラで非同期的に発生する可能性があり、これは (見えない) 呼び出し元の「 ONステートメント」によって提供される場合があります。これらが組み合わさって、プログラムの変数が実行時にいつ変更されるかを確実に予測することが困難になります。ただし、通常の使用では、ユーザーが作成したエラー ハンドラ ( ONユニット) は、変数への割り当てを行わないことがよくあります。前述の困難にもかかわらず、IBM は 1971 年に PL/I 最適化コンパイラを開発しました。[32]
PL/I には、マルチタスクサポート (IBM による言語拡張)など、コンパイラーのコストと複雑さを増大させる、あまり使用されない機能が多数含まれており、そのコプロセッシング機能には、オペレーティング システムによるプロセスの非ブロッキング マルチスレッドをサポートするマルチプログラミング環境が必要です。コンパイラーの作成者は、これらの機能を実装するかどうかを自由に選択できました。
宣言されていない変数は、デフォルトでは最初に出現したときに宣言されます。そのため、スペルミスがあると予期しない結果が生じる可能性があります。この「暗黙の宣言」は、FORTRAN プログラムと変わりません。ただし、PL/I(F) の場合、属性リストによってプログラマーはスペルミスや宣言されていない変数を検出できます。
プログラマーの問題
多くのプログラマーは、言語の複雑さと PL/IF コンパイラーの未熟さを認識していたため、COBOL または Fortran から移行するのに時間がかかりました。プログラマーは、科学プログラマー (Fortran を使用) とビジネス プログラマー (COBOL を使用) に明確に分かれており、グループ間には大きな緊張関係があり、嫌悪感さえありました。PL/I 構文は、COBOL と Fortran の両方の構文から借用したものです。そのため、当時の Fortran プログラマーは、自分の仕事を楽にする機能に気づく代わりに、COBOL 構文に注目してビジネス言語であるという意見を持ち、COBOL プログラマーは Fortran 構文に注目して科学言語と見なしました。
COBOL と Fortran のプログラマーはどちらも、それを自分たちの言語の「大きな」バージョンとみなしており、どちらもこの言語に多少の恐れを感じ、採用する気はなかった。もう 1 つの要因は、 COBOL、Fortran、および ALGOL との疑似類似性であった。これらは、これらの言語のいずれかに似ているように見える PL/I 要素であったが、PL/I では動作が異なっていた。このようなフラストレーションから、多くの経験豊富なプログラマーは PL/I に対して偏見を抱き、この言語を嫌うようになった。初期の UNIXフォーチュンファイルには、この言語に関する次のような冗談めいた説明が含まれていた。[要出典]
PL/I の複雑さを詳しく調べた人間として言うと、このようなマシンを大量に消費し、サイクルをつかむ、すべてを網羅するモンスターを書けたのは本物の男だけだったと確信しています。配列を割り当てて真ん中の 3 分の 1 を解放しますか? もちろんです! なぜダメなのでしょう? 文字列とビット文字列を掛け合わせて、その結果を浮動小数点数に代入しますか? どうぞ! 制御変数プロシージャ パラメータを解放し、それを戻す前に再割り当てしますか? 同じメモリ位置に 3 つの異なるタイプの変数を重ねますか? 何でもします! 再帰マクロを書きますか? いや、違いますが、本物の男は rescan を使用します。本物の男によって設計および作成されたことが明らかな言語が、本物の男が使用することを意図していないはずがありません。
良い面としては、すべてのデータ型へのポインター(構造体へのポインターを含む)、再帰、マルチタスク、文字列処理、および広範な組み込み関数の完全なサポートにより、PL/I は当時のプログラミング言語と比較して確かに大きな進歩を遂げました。しかし、これらは大多数のプログラマーやショップを PL/I に切り替えるのに十分ではありませんでした。
PL/IFコンパイラのコンパイル時プリプロセッサは、ターゲット言語の構文とセマンティクスを使用するという点で(Lispの世界[81]以外では)珍しいものでした(例えば、Cプリプロセッサの「#」ディレクティブと比較して)。
PL/Iの特別なトピック
ストレージクラス
PL/I には、
変数のストレージの有効期間の管理方法を示す「ストレージ クラス」がいくつか用意されています ( STATIC、、、、、および) AUTOMATIC。CONTROLLEDBASEDAREA
STATICデータは、 COBOLの「作業領域」や初期のFortranと同様に、ロード時に割り当てられ、初期化されます。これは変数のデフォルトですEXTERNAL(Cの「extern」やFortranの「named common」に似ています)。
AUTOMATICは、 PL/I の変数のデフォルト ストレージ クラスです。これは、 C言語の「自動」ストレージ クラス、Pascalのデフォルト ストレージ割り当て、 IBM COBOL の「ローカル ストレージ」など、 ALGOLINTERNALの影響を受けた他のブロック構造言語のストレージ クラスに似ています。変数のストレージは、変数が宣言されているプロシージャ、ブロック、またはユニットに入るときに割り当てられます。コンパイラとランタイム システムは、変数とその他のハウスキーピング情報を格納するスタック フレームにメモリを割り当てます。変数が-attribute で宣言されている場合は、この時点で初期値に設定するコードが実行されます。初期化の使用を適切に管理するには注意が必要です。特に変数が配列または構造体である場合は、スコープに入るたびに変数を初期化するために大量のコードが実行されることがあります。変数のストレージは、ブロックの終了時に解放されます。
AUTOMATICBEGINONINITIALAUTOMATIC
STATIC、、CONTROLLEDまたはBASED変数は、プロシージャまたはブロックの呼び出し間で変数の内容を保持するために使用されます。
CONTROLLEDストレージはスタックを使用して管理されますが、スタック上の割り当てのプッシュとポップは、ALLOCATEおよびFREEステートメントを使用してプログラマーによって管理されます。
変数のストレージも/をBASED使用して管理されますが、スタックではなく、これらの割り当てには独立した有効期間があり、または変数を通じてアドレス指定されます。変数は、たとえばリンク リストに従うことで、関連付けられた変数を設定することにより、任意のストレージ領域をアドレス指定するために使用することもできます。
ALLOCATEFREEOFFSETPOINTERBASEDPOINTER
このAREA属性はプログラマ定義ヒープを宣言するために使用される。特定の領域内でデータの割り当てと解放が可能であり、その領域を単位として削除、読み取り、書き込みを行うことができる。[82] : pp.235–274
ストレージタイプの共有
割り当てられたストレージにアクセスする方法は、さまざまなデータ宣言を通じていくつかあります。これらの方法には、明確に定義され安全なものもあれば、慎重にプログラミングすれば安全に使用できるものもありますが、本質的に安全でないものやマシンに依存するものもあります。[82] : pp.262–267, 178–180
変数を引数として参照渡しすると、引数に割り当てられたストレージをパラメーターを使用して参照できます。DEFINED属性(例) を使用すると、変数のストレージの一部またはすべてを、異なるが一貫性のある宣言で使用できます。言語定義には、異なるデータ定義が同じストレージを共有できるようにするためのCELL属性 (後にUNIONに名前が変更されました) が含まれています。これは、初期の多くの IBM コンパイラーではサポートされていませんでした。これらの使用法は安全で、マシンに依存しません。
DCL A(10,10), B(2:9,2:9) DEFINED A
レコード I/O とリスト処理では、プログラマーが、次のレコードまたは項目のストレージに宣言を適合させる必要がある状況が発生します。その前に、そのデータ構造のタイプがわかります。基底付き変数とポインターは、このようなプログラムの鍵となります。データ構造は適切に設計する必要があり、通常はデータ構造内のフィールドを使用して、そのタイプとサイズに関する情報をエンコードします。フィールドは、前の構造に保持することも、制約付きで現在の構造に保持することもできます。エンコードが前の構造にある場合、プログラムは、現在の項目に一致する宣言を持つ基底付き変数を割り当てる必要があります (必要な場合はエクステントの式を使用)。タイプとサイズの情報を現在の構造に保持する場合 (「自己定義構造」)、タイプ定義フィールドは、タイプに依存する項目より前で、データ構造のすべてのバージョンで同じ場所にある必要があります。 REFERオプションは、自己定義範囲 ( などの文字列の長さなど)に使用されます。ここで、 LENGTH はデータ構造のインスタンスを割り当てるために使用されます。自己定義構造の場合、型指定フィールドとREFERされたフィールドは、「実際の」データの前に配置されます。データ セット内のレコード、またはデータ構造のリスト内の項目がこのように構成されている場合、マシンに依存しない方法で安全に処理できます。
DCL 1 A BASED, 2 N BINARY, 2 B CHAR(LENGTH REFER A.N.)
PL/I 実装では (PL/I Checkout コンパイラを除く)、ストレージが最初に割り当てられたときに使用されるデータ構造を追跡しません。BASED宣言は、ストレージへのポインターと共に使用してストレージにアクセスできますが、本質的に安全ではなく、マシンに依存します。 ただし、この使用法は、「ポインター演算」(通常は既知のアドレスに特定の量を追加する) にとって重要になっています。 これは、コンピューター サイエンスで議論の的となっています。 ワイルド参照とバッファー オーバーランの問題に加えて、特定のマシンとコンパイラで使用されるデータ型の配置と長さによって問題が発生します。 ポインター演算が必要になる可能性のある多くの場合、より大きなデータ構造内の要素へのポインターの検索が関係しています。ADDR関数は、そのようなポインターを安全に、マシンに依存せずに計算します。
ポインタ演算は、次のようにバイナリ変数をポインタでエイリアス化することで実現できます。
DCL P ポインタ、N 固定バイナリ(31)ベース(ADDR(P)); N=N+255;
これは、ポインタが整数と同じ長さでありFIXED BINARY(31)、同じ境界に配置されていることを前提としています。
C の普及とポインタ演算に対する自由で容易な姿勢により、最近の IBM PL/I コンパイラでは、ポインタを加算演算子と減算演算子で使用して、最も単純な構文を実現できます (ただし、安全性とマシン独立性が最優先される場合は、コンパイラ オプションによってこれらの使用を禁止できます)。
ONユニットと例外処理
PL/I が設計された当時、プログラムはバッチ モードでのみ実行され、端末でのプログラマーによる介入は不可能でした。ゼロ除算などの例外条件が発生すると、プログラムは中止され、16 進数のコア ダンプのみが出力されます。ON ユニットを介した PL/I 例外処理により、ハードウェアまたはオペレーティング システムの例外が発生してもプログラムは制御を維持し、より適切に終了する前にデバッグ情報を回復できます。プログラムが適切にデバッグされるようになると、例外処理のほとんどを削除または無効にできます。会話型実行が一般的になるにつれて、このレベルの制御はそれほど重要ではなくなりました。
計算例外処理は、ステートメント、ブロック ( ONユニットを含む)、およびプロシージャの条件プレフィックスによって有効化または無効化されます。 – 例: 入出力およびストレージ管理のオペレーティング システム例外は常に有効です。
(SIZE, NOSUBSCRIPTRANGE): A(I)=B(I)*C;
ONユニットは、 ONステートメントによって導入される単一のステートメントまたはBEGINブロックです。 ONステートメントを実行すると、指定された条件 (例: ユニット)が有効になります。この条件の例外が発生し、条件が有効になっている場合、その条件のONユニットが実行されます。 ONユニットは、呼び出しチェーンに沿って継承されます。ブロック、プロシージャ、またはONユニットがアクティブ化されると、呼び出し元のアクティブ化によって確立されたONユニットが新しいアクティブ化によって継承されます。これらは別のONステートメントによって上書きされ、 REVERTステートメントによって再確立できます。例外は、SIGNALステートメントを使用してシミュレートできます (例: 例外ハンドラーのデバッグに役立てる)。 ONユニットの動的継承の原則により、ルーチンは、使用するサブルーチン内で発生する例外を処理できます。
ON ZERODIVIDE ON
条件が発生したときにONユニットが有効になっていない場合は、標準のシステム アクションが実行されます (多くの場合、これはERROR条件を発生させます)。システム アクションは、ONステートメントのSYSTEMオプションを使用して再設定できます。条件によっては、 ON ユニットの実行を完了して割り込みポイントに戻り (例: STRINGRANGE、UNDERFLOW、CONVERSION、OVERFLOW、AREA、およびFILE条件)、通常の実行を再開することができます。 などの他の条件では、これを行おうとするとERROR条件が発生します。 ON ユニットは で終了して割り込みポイントに戻れないようにすることができますが、プログラマが決定した別の場所でプログラムの実行を継続することはできます。
(SUBSCRIPTRANGE)GO TO
ONユニットは、 ONユニット自体で発生する例外を処理できるように設計する必要があります。この文では、ネストされたエラー トラップが許可されます。ON ユニット内でエラーが発生した場合、制御はオペレーティング システムに渡され、システム ダンプが生成される場合があります。また、一部の計算条件では、実行が継続されます (前述のとおり)。
ON ERROR SYSTEM;
PL/I RECORD I/O ステートメントは、レコードの読み取りまたは書き込み時に発生する可能性のあるファイルの終わりからレコード転送エラーまで、さまざまな状況に対応するオプションを提供しないため、比較的単純な構文になっています。代わりに、これらの複雑さは、さまざまなファイル条件のONユニットで処理されます。AREAサブ割り当てとAREA条件にも同じアプローチが採用されています。
例外処理ONユニットの存在は最適化に影響を与える可能性がある。なぜなら、ONユニットでは変数を検査したり変更したりすることができるからである。文と文の間でレジスタに保持される変数の値は、文と文の間でストレージに戻す必要があるかもしれない。これについては、上記の実装の問題のセクションで説明されている。[82] : pp.249–376
固定されていないターゲットでのGO TO
PL/I には、COBOL および FORTRAN の特殊な GO TO ステートメントに対応するものがあります。
COBOL と FORTRAN の両方に、 GO TOの 2 つの特殊なタイプをコーディングするための構文が存在し、それぞれのターゲットは必ずしも同じではありません。
- ALTER (COBOL)、ASSIGN (FORTRAN):
ALTER paragraph_name_xxx TO PROCEED TO para_name_zzz(「変更されたgo to」)。[83]- これらには他にも役立つ制限があり、特に「プログラム内... RECURSIVE属性、メソッド内、または... THREADオプション」などがある。[83]
ASSIGN 1860 TO IGOTTAGO(「割り当てられた場所」)[84]GO TO IGOTTAGO- 組み込みドキュメントを追加する機能強化の1つは、
GO TO IGOTTAGO (1860, 1914, 1939)- (変数の値を「リスト内のラベルの1つ」に制限します。)[84]
- 組み込みドキュメントを追加する機能強化の1つは、
- 変数の添え字のような値に基づいて
GO TO ... を実行します。
GO TO (1914, 1939, 2140), MYCHOICE(「計算された移動」)[85]GO TO para_One para_Two para_Three DEPENDING ON IDECIDE(「に応じて行く」)。[86]
PL/Iには文ラベル変数(LABEL属性付き)があり、文ラベルの値を格納し、後でGOTO文で使用することができます。[87] [30] : 54 [30] : 23
LABL1: .... 。 。 LABL2: ... 。 。 。 MY_DEST = LABL1; 。 MY_DEST へ移動します。
プログラマーは、ステートメント ラベルに添え字を付けることで、静的ラベル定数の配列を作成することもできます。
GO TO HERE(LUCKY_NUMBER); /* マイナス 1、ゼロ、または ... */
HERE(-1): PUT LIST ("IO U"); 抽選へ移動;
ここ(0): リストを入力してください("現金なし"); 宝くじへ行きます;
ここに(1):リスト(「ドル紙幣」)を入れます。宝くじに進みます。
ここに(2):リスト(「2ドル」)を入れます。宝くじに進みます。
ステートメント ラベル変数は、呼び出されたプロシージャに渡され、呼び出しルーチン内の別のステートメントに戻るために使用できます。
サンプルプログラム
Hello World プログラム
Hello2 : proc options ( main ) ; put list ( 'Hello, World!' ) ; end Hello2 ;
文字列を検索する
/* 文字列を含む行を読み取り、
/* その後、その文字列を含む後続のすべての行を出力します。 */
find_strings :プロシージャオプション( main ) ;パターン文字( 100 )を可変として宣言;行文字( 100 )を可変として宣言; line_noを固定バイナリとして宣言;
ファイル終了時に( sysin )停止します。
get edit ( pattern ) ( L ) ; line_no = 1 ; do forever ; get edit ( line ) ( L ) ; if index ( line , pattern ) > 0 then put skip list ( line_no , line ) ; line_no = line_no + 1 ; end ;
find_stringsの終了;
参照
注記
- ^ 「IBMの変化」ニューヨークタイムズ、1984年6月20日。
- ^ シュトルム、エバーハルト (2009)。新しいPL/I。ビューエグ+トイブナー。ISBN 978-3-8348-0726-7。
- ^ ab Pugh, Emerson W.; Johnson, Lyle R.; Palmer, John H. (1991). IBM 360 および初期の 370 システム。マサチューセッツ州ケンブリッジ: MIT プレス。ISBN 978-0-262-16123-7。
- ^ 報告書が発表された時点で、委員会には実際には8名のメンバーがいた。彼らは以下の通りである。[要出典]
- ハンス・バーグ、ロッキード・バーバンク
- ジョージ・ラディン、IBM
- ジェームズ・コックス、ユニオン・カーバイド
- ブルース・ローゼンブラット、スタンダード・オイル・オブ・カリフォルニア会長。
- ダグラス・マキロイ、ベル研究所
- ロバート・シェパード、プロクター・アンド・ギャンブル。GUIDE組織より
- CW メドロック、IBM
- バーニス・ワイツェンホッファー、IBM。
- ^ 「Datamation in Business & Science MPPL IN FOR NPL」(PDF)。Datamation 。第 11 巻、第 4 号。FRANK D. THOMPSON。1965 年 4 月。17 ページ。
- ^ 「Datamation in Business & Science ANOTHER NEW NAME, MORE COMPILERS FOR NPL」(PDF) 。Datamation。第 11 巻、第 6 号。FRANK D. THOMPSON。1965 年 6 月。17 ページ。
- ^ SHARE 上級言語開発委員会報告書 II、1964 年 6 月 25 日
- ^ ラディン、G . ; H・ポール・ロゴウェイ(1965年1月)。 「新しいプログラミング言語のハイライト」。ACM の通信。8 (1): 9-17。土井:10.1145/363707.363708。S2CID 17133703。
- ^ ab Radin, G. (1978 年 8 月). 「PL/I の初期の歴史と特徴」. ACM SIGPLAN Notices . 13 (8): 227–241. doi : 10.1145/960118.808389 . S2CID 13925251.
- ^ 言語の管理は、3 か国のコンパイラ グループ (1973 年までに 6 グループ) の代表者を含む専用の言語管理グループと言語管理委員会に委ねられました。毎日の連絡はテレックスで行われました。変更と拡張は、数千の詳細なポイントに及ぶ言語ログを通じて行われました。管理レベルの言語レビュー委員会は、管理委員会によってエスカレートされた問題を解決しました。
- ^ ユニバーサル ランゲージ ドキュメント (ULD)。技術レポート TR25.081、TR25.082、TR25.083、TR25.0S4、TR25.085、TR25.086、TR25.087、IBM Corp ウィーン オーストリア 1968 年 6 月
- ^ 「Frederick P. Brooks Jr. - IEEE コンピュータ協会」IEEE コンピュータ協会。1989 年。
- ^ 「第 1 章: はじめに」(PDF)。NPL 技術レポート(PDF) (レポート)。IBM 。1964年 12 月。p. 11。2024年1 月 1 日に閲覧。NPL
は、科学、ビジネス、リアルタイム、システム プログラマーなど、非常に大規模なプログラマー グループのニーズに応えるように設計されています。
- ^一部のコンパイラでは、これらの識別子を予約するか、識別子として使用されているのが見つかった場合に警告を発することを選択しました。ただし、その後の case ステートメントの導入は、この原則の価値を示しています。
- ^ 母音、ロビン (2001) 。PL/I入門。RA母音。p. x. ISBN 978-0-9596384-9-3。
「PL/I は、科学計算、ビジネス データ処理、システム プログラミングに十分な機能を単一の言語で提供する最初の言語です」 - Jean Sammet、プログラミング言語の歴史に関するいくつかのアプローチと例証
- ^ ab ANS プログラミング言語 PL/I. X3.53-1976
- ^ ab ANSI X3.74-1981 (R1998)情報システム - プログラミング言語 - PL/I 汎用サブセット
- ^ IBM の関与に反応して、多くのメーカーは標準に関する取り組みを支持することに消極的でした。CLDG/X3J1 の当初の任務は、PL/I が標準化の適切な候補であるかどうかを調査することでした。共同作業により、言語またはテキストの変更に関する 3,500 件を超える提案が処理されました。
- ^ 「PL/I 言語仕様。GY33-6003」
- ^ 標準で定義されている PL/I マシンについては、「The Definition Mechanism for Standard PL/I. Michael Marcotty、Frederick G Sayward」で説明されています。
- ^ 1987 PL/I 汎用サブセット (ANSI X3.74-1987)
- ^ abc Krasun, Andy. 「Hursleyソフトウェアの最初の35年以上の歴史 1958-1993、ハードウェアに関する余談、個人的な記録」(PDF) 。 2020年5月5日閲覧。
- ^ IBM System/360 オペレーティング システム PL/I (F) コンパイラ プログラム ロジック マニュアル(PDF)。IBM。1966 年 12 月。セクション 2: コンパイラ フェーズ。Y28-6800-1。
- ^ これらは1966年にPL/Iで書かれた初期の最適化コンパイラ用に設計され、PL/IFコンパイラからブートストラップされる予定でした。
- ^ これらの輸送には多くの遅れがあったため、当時のPL/Iの一般的なジョークは、コンコルドが初飛行するまでラ・ゴードに輸送を禁じたというものだった。
- ^ IBM System/360 PL/I サブセットリファレンスマニュアル(PDF) . IBM. 1967. C28-8202-0.
- ^ ab RA Frieburghouse. 「Multics PL/1 コンパイラ」. Multicians.org .
- ^ Tom Van Vleck (編)。「PL/I の選択」。Multicians.org。
- ^ シリーズ 60 (レベル 66)/6000 PL/I リファレンス マニュアル。Honeywell。1976年。注文番号 DE05 。
- ^ abcd OS PL/I チェックアウトおよび最適化コンパイラ: 言語リファレンスマニュアル(PDF)。IBM。1976 年 10 月。GC33-0009-04。
- ^ ab "Microsoft.CodeAnalysis.CSharp A Binder は名前を変換します"。[永久リンク切れ ]
- ^ ab A. Endres (2013). 「IBM Europe における初期の言語およびコンパイラ開発」
- ^ RN Cuff (1972年5月). 「完全なPL/I用の会話型コンパイラ」.コンピュータジャーナル. 15 (2): 99–104. doi : 10.1093/comjnl/15.2.99 .
- ^ BL Marks (1973). 「チェックアウトコンパイラの設計」. IBM Systems Journal . 12 (3): 315–327. doi :10.1147/sj.123.0315.
- ^ 「VAX-11 PL/I、バージョン1.0」(PDF)。Digital。1980年10月。 2023年10月31日閲覧。
- ^ Uniprise PL/I for UNIX リファレンスマニュアル、 Uniprise Systems, Inc.、カリフォルニア州アーバイン、1995 年、p. xxi。
- ^ Tom Linden (2004-05-21). 「RE: Dave Cutler and VMS #2」。ニュースグループ: comp.os.vms。2021年6月14日時点のオリジナルよりアーカイブ。2021年2月26日閲覧。
{{cite newsgroup}}: CS1 メンテナンス: 不適切 URL (リンク) - ^ Cutler, Dave (2016-02-25). 「Dave Cutler Oral History」. youtube.com (インタビュー). Grant Saviers によるインタビュー。コンピュータ歴史博物館。2021-12-11 時点のオリジナルよりアーカイブ。2021-02-26閲覧。
- ^ Robin Vowels (2010-04-01). 「PL/I よくある質問 (FAQ)」.ニュースグループ: comp.answers.
- ^ ab "Kednos PL/I for OpenVMS and Tru64". kednos.com . 2016-11-02. 2021-03-14時点のオリジナルよりアーカイブ。 2021-03-30取得。
- ^ Richard C. Holt (1972 年 11 月 5 日)。「Teaching the Fatal Disease (or) Introductory Computer Programming Using PL/I」。2011 年 4 月 15 日時点のオリジナルよりアーカイブ。2010年5 月 30 日閲覧。
- ^ コンピュータサイエンス学部、「PL/C ユーザーズガイド - PL/I 用コーネルコンパイラ」、コーネル大学、イサカ、1977 年。
- ^ 「SL/1 (Student Language/One)」.
- ^ 「IBM 1130」。BobsPixels.com。
- ^ PLAGO/360 ユーザーズマニュアル、 Polytechnic Institute of Brooklyn。
- ^ JNP Hume と RC Holt、「PL/I と SP/k を使用した構造化プログラミング」、 Reston、Reston、1975 年。
- ^ Marvin Victor Zelkowitz、『PL/I Programming with PLUM』第2版、Paladin House、Geneva (Ill.)、1978年。
- ^ ab Robin A. Vowels (1996 年 3 月). 「PL/I for OS/2」. ACM SIGPLAN Notices . 31 (3). Association for Computing Machinery : 22–27. doi : 10.1145/227717.227724 . S2CID 24441291.
- ^ 「IBM PL/I コンパイラー・ファミリー」。IBM 。 2021年7月5日閲覧。
- ^ Burroughs Corporation、B 6700/B 7700: PL/I 言語リファレンスマニュアル、参照番号 5001530、デトロイト、1977 年。
- ^ Sperry-Univac Computer Systems、SPERRY UNIVAC 1100 シリーズ PL/I プログラマーリファレンス、 Reference UP-8277、1976 年。
- ^ Data General Corporation、AOS PL/I リファレンスマニュアル、注文番号 093-000204、1978 年頃。
- ^ Paul W. Abrahams. CIMS PL/I コンパイラ。1979 SIGPLAN コンパイラ構築シンポジウム。pp. 107–116。doi : 10.1145 / 800229.806960。ISBN 0-89791-002-8。
- ^ Control Data Corporation、PL/I リファレンスマニュアル、 1978 年、発行番号 60388100A。
- ^ OpenVOS PL/I 言語マニュアル (R009)。マサチューセッツ州マールボロ: Stratus Computer, Inc. 1995 年。OpenVOS PL/I。
- ^ IBM Series/1 PL/I 入門プログラム番号 5719-PL1 5719-PL3 (PDF) (初版)。IBM。1977 年 2 月。GC34-0084-0。
- ^ IBM Series/1 PL/I: 言語リファレンスマニュアル。IBM。GC34-0085-0。
- ^ abc Peter Norton (1984年5月15日). 「The Norton Chronicles」. PC Magazine . 2011年7月6日時点のオリジナルよりアーカイブ。 2010年1月25日閲覧。
- ^ 「Studio および Server Enterprise Edition 6.0 Service Pack 2 - Wrap Pack 1 の新機能」(PDF)。Micro Focus。p. 1。2017 年 11 月 7 日時点のオリジナル(PDF)からアーカイブ。
- ^ 「Enterprise > Micro Focus Studio Enterprise Edition for UNIX > ようこそ > 製品情報 > Studio Enterprise Edition for UNIX のインストール > システム要件」。Micro Focus。2017年 11 月 7 日のオリジナルからアーカイブ。2017年 11 月 5 日に取得。
- ^ 「IBM PL/I Set for AIX Version 1」。1995年9月19日。 2019年5月13日閲覧。
- ^ 「Iron Spring PL/I コンパイラ - プログラミング ガイド」. ironspring.com . 2020-09-15 . 2021-02-26閲覧。
- ^ Frank G. Soltis (1997)。AS/400 の内側、第 2 版。Duke Press。ISBN 978-1-882419-66-1。
- ^ Berg, William; Cline, Marshall; Girou, Mike (1995 年 10 月)。「OS/400 OO プロジェクトから学んだ教訓」。Communications of the ACM。38 ( 10): 54–64。doi : 10.1145 /226239.226253。S2CID 7492851 。
- ^ Pigott, Diarmuid. 「PL/MP」。オンラインプログラミング言語歴史百科事典。2020年8月2日時点のオリジナルよりアーカイブ。2021年2月24日閲覧。
- ^ レイフ・スヴァルガード (2003-10-08)。 「Re:Re:MIエミュレータ」。MI400 (メーリングリスト) 。2021年2月26日閲覧。
- ^ Dave McKenzie (2004-09-01). 「RE: Dave McKenzie の UNDELete ユーティリティ - 命の恩人!」Midrange Archive MI400 . 2021-05-24閲覧。
- ^ Dan Hicks (1998-08-21). 「UNIX vs AS/400?」.ニュースグループ: comp.sys.ibm.as400.misc.
- ^ Cocke, John; Markstein, Victoria (1990 年 1 月). 「IBM における RISC 技術の進化」(PDF) . IBM Journal of Research and Development . 34 (1): 4–11. doi :10.1147/rd.341.0004 . 2022 年 10 月 5 日閲覧。
その結果生まれたのが PL.8 言語であり、「.8」は PL/I の豊富さの約 80% を備えていることを意味しています。
- ^ ab W. Gellerich; T. Hendel; R. Land; H. Lehmann; M. Mueller; PH Oden; H. Penner (2004 年 5 月). 「GNU 64 ビット PL8 コンパイラー: ファームウェア開発のためのオープン スタンダード環境に向けて」(PDF) . IBM Journal of Research and Development . 48 (3.4). IBM: 543–556. doi :10.1147/rd.483.0543. S2CID 19020943. 2021 年 1 月 24 日の オリジナル(PDF)からアーカイブ。2021年 2 月 26 日取得。
- ^ Marc Auslander、Martin Hopkins (1982 年 6 月)。PL.8 コンパイラの概要(PDF)。SIGPLAN '82 Proceedings of the 1982 SIGPLAN symposium on Compiler construction。ACM。pp. 22–31。doi :10.1145/872726.806977。2021年2 月 26 日閲覧。
- ^ J. von Buttlar; H. Bohm; R. Ernst; A. Horsch; A. Kohler; H. Schein; M. Stetter; K. Theurich (2002 年 7 月). 「z/CECSIM: IBM eServer z900 用の効率的で包括的なマイクロコード シミュレーター」(PDF) . IBM Journal of Research and Development . 46 (4.5). IBM: 607–615. doi :10.1147/rd.464.0607. S2CID 12745372. 2020 年 2 月 11 日の オリジナル(PDF)からアーカイブ。2021年 2 月 26 日取得。
- ^ Pearkins, Jon E. (1995 年 12 月 1 日)。「Open PL/I: Liant が PL/I レガシー アプリケーションに対応」。Enterprise Systems Journal。2012年 11 月 3 日のオリジナルからアーカイブ。2010年2 月 3 日閲覧。Open
PL/I は、1995 年にメインフレーム レガシー アプリケーションの 20% が PL/I で、60% が COBOL であると推定しました。世界中に 300,000 人の PL/I プログラマーがいました。
- ^ Schultz, G.; D.Rose; C.West; J.Gray (1980 年 4 月)。「SNA の実行可能記述と検証」IEEE Transactions on Communications 28 ( 4): 661–677. doi :10.1109/TCOM.1980.1094695。
- ^ Clair Grant (2005 年 6 月)。「OpenVMS の HP Integrity サーバーへの移植」( PDF)。OpenVMS Technical Journal。6。
- ^ IBM Operating System/360に関するスライドで、Fred Brooks はOS/360 は PL/S やアセンブラではなく PL/I で記述されるべきだったと述べています。この記事は OS/360 プログラムの優れた要約です。「/360 アーキテクチャとそのオペレーティング システム」Wayback Machineで 2020-07-28 にアーカイブ、2001 年。
- ^ IBM System/360 オペレーティング システム PL/I (F) 言語リファレンス マニュアル(PDF) (第 5 版)。1972 年 12 月。第 15 章: マルチタスク。GC28-8201-4。
- ^ OS PL/I チェックアウトおよび最適化コンパイラ: 言語リファレンスマニュアル(PDF) (第 5 版)。1976 年 10 月。第 17 章: マルチタスク。GC33-0009-4。
- ^ 「第 8 章: プログラム制御」。Kednos PL/I for OpenVMS Systems リファレンス マニュアル。2007 年 1 月。2016 年 8 月 18 日時点のオリジナルよりアーカイブ。2017年 11 月 5 日に取得。
- ^ コンパイラは、代入の「=」または DECLARE の「;」に遭遇するまで、文が宣言文か多重代入文かを判断できません。これは数行後の場合もあります。この例では、DECLARE/DCL が予約されていないことが直接の原因です。フラグメント
DECLARE(I,J,K),L=とを比較してくださいDECLARE(I,J,K),L;。 - ^ Hart, Timothy P. (1963 年 10 月)。「LISP のマクロ定義」。人工知能メモ。第 57 号。hdl : 1721.1/6111。
- ^ abc Enterprise PL/I for z/OS PL/I for AIX Rational Developer for System z PL/I for Windows: 言語リファレンス(PDF) (第3版)。IBM。2012年9月。SC14-7285-02 。 2023年7月9日閲覧。
- ^ ab 「ALTER ステートメント」。IBM 2021 年 9月24 日。
- ^ ab 「GO TO (割り当て済み)」。
- ^ 「GO TO (計算済み)」。
- ^ 「COBOL の GO TO ステートメント」。
- ^ Digital Research PL/I 言語プログラマーズガイド。p. 103。
参考文献
教科書
- Neuhold, EJ & Lawson, HW (1971)。PL /I マシン: プログラミング入門。Addison- wesley。ISBN 978-0-2010-5275-6。
- Barnes, RA (1979)。プログラマのためのPL/I。ノースホランド。
- ヒューズ、ジョーン K. (1973)。PL /I プログラミング(第 1 版)。Wiley。ISBN 0-471-42032-8。
- ヒューズ、ジョーン K. (1986)。PL /I 構造化プログラミング(第 3 版) 。Wiley。ISBN 0-471-83746-6。
- Groner, GF (1971)。『PL/I Programming in Technological Applications』、Books on Demand、ミシガン州アナーバー。
- アンダーソン、ME (1973)。プログラマのためのPL/I。Prentice -Hall。
- Stoutemyer, DR (1971)。工学と科学のための PL/I プログラミング。Prentice-Hall。
- Ziegler, RR & C. (1986). PL/I: 構造化プログラミングと問題解決(第 1 版). West. ISBN 978-0-314-93915-9。
- Sturm, E. (2009)。『The New PL/I ... for PC, Workstation and Mainframe』。Vieweg-Teubner、ヴィースバーデン、ドイツ。ISBN 978-3-8348-0726-7。
- Vowels, RA (1997)。PL /I、アルゴリズム、構造化プログラミング入門(第 3 版)。RA Vowels。ISBN 978-0-9596384-9-3。
- Abrahams, Paul (1979). PL/I プログラミング言語(PDF) . ニューヨーク大学 Courant 数学およびコンピューティング研究所。
標準
- ANSI ANSI X3.53-1976 (R1998)情報システム - プログラミング言語 - PL/I
- ANSI ANSI X3.74-1981 (R1998)情報システム - プログラミング言語 - PL/I 汎用サブセット
- ANSI ANSI X3.74-1987 (R1998)情報システム - プログラミング言語 - PL/I 汎用サブセット
- ECMA 50プログラミング言語 PL/I、第 1 版、1976 年 12 月
- ISO 6160:1979プログラミング言語 - PL/I
- ISO/IEC 6522:1992情報技術 - プログラミング言語 - PL/I 汎用サブセット
リファレンスマニュアル
- Burroughs Corporation、「B 6700 / B 7700 PL/I 言語リファレンス」、5001530、デトロイト、1977 年。
- CDC。RA Vowels、「CDC Cyber 用 PL/I」。CDC Cyber 70 シリーズ用の最適化コンパイラ。
- Digital Equipment Corporation、「decsystem10 会話型プログラミング言語ユーザーズマニュアル」、DEC-10-LCPUA-AD。Maynard、1975 年。
- 富士通株式会社、「Facom OS IV PL/I リファレンス マニュアル」、70SP5402E-1、1974 年。579 ページ。PL/IF サブセット。
- Honeywell, Inc.、「Multics PL/I 言語仕様」、AG94-02。1981 年。
- IBM、IBM オペレーティング システム/360 PL/I: 言語仕様、C28-6571。1965 年。
- IBM、OS PL/I チェックアウトおよび最適化コンパイラ: 言語リファレンス マニュアル、GC33-0009。1976 年。
- IBM、IBM、「NPL テクニカル レポート」、1964 年 12 月。
- IBM、Enterprise PL/I for z/OS バージョン 4 リリース 1 言語リファレンス マニュアル、 Wayback Machineに 2020-07-28 にアーカイブ、SC14-7285-00。2010 年。
- IBM、OS/2 PL/I バージョン 2: プログラミング: 言語リファレンス、第 3 版、フォーム SC26-4308、サンノゼ。1994 年。
- Kednos PL/I for OpenVMS Systems。リファレンス マニュアル、Wayback Machineに 2004-03-04 にアーカイブ、AA-H952E-TM。2003 年 11 月。
- Liant Software Corporation (1994)、「Open PL/I 言語リファレンス マニュアル」、改訂版、Framingham (マサチューセッツ州)。
- Nixdorf Computer、「ターミナルシステム 8820 システムテクニッシャー テイル PL/I-サブセット」、05001.17.8.93-01、1976 年。
- Ing. C. Olivetti、「Mini PL/I リファレンス マニュアル」、1975 年、No. 3970530 V
- Q1 Corporation、「Q1/LMC システム ソフトウェア マニュアル」、Farmingdale、1978 年。
外部リンク
- z/OS、AIX、MVS、VM、VSE用の IBM PL/I コンパイラ
- Iron Spring Software、LinuxおよびOS/2用 PL/I
- Micro Focus のメインフレーム PL/I 移行ソリューション
- OS PL/I V2R3 文法 バージョン 0.1
- Pliedit、Eclipse 用 PL/I エディター
- パワー対アドベンチャー - PL/I と C、PL/I とCの並列比較。
- ソフトパノラマPL/1ページ
- PL/I言語
- SourceForge の PL1GCC プロジェクト
- 標識を印刷する PL/1 ソフトウェア、書籍形式のソース コード、David Sligar (1977) 著、IBM PL/1 F コンパイラ用。
- Windows NT 用のオープンソース PL/I コンパイラ
