| パラダイム | マルチパラダイム:構造化、反省的、手続き的 |
|---|---|
| 家族 | Lisp : POP |
| デザイン: | ロビン・ポップルストーン、ロッド・バーストール、スティーブ・ハーディ、ロバート・レイ、アラン・ラムゼイ |
| 開発者 | エディンバラ大学 サセックス大学 |
| 初登場 | 1970年 |
| 安定版リリース | 1975年 / 1975年 |
| タイピングの規律 | 動的 |
| 実装言語 | 組み立て |
| プラットフォーム | エリオット 4130、ICT 1909、BESM-6、PDP-10、PDP-11 |
| OS | ジョージ、TOPS-10、Unix |
| ライセンス | 独自 |
| 主な実装 | |
| ポップ | |
| 方言 | |
| ポップ-10 | |
| 影響を受けた | |
| Lisp、ALGOL 60、COWSEL(POP-1に改名) | |
| 影響を受けた | |
| ポップ-11 | |
POP-2(POP2とも呼ばれる)は、 1970年頃にエディンバラ大学のロビン・ポプルストーンとロッド・バーストールによって、以前の言語POP-1(1968年にロビン・ポプルストーンによって開発され、当初はCOWSELと呼ばれていた)から開発されたプログラミング言語である。この言語は、 Lisp言語やALGOL 60言語、ピーター・J・ランディンの理論的アイデアなど、多くのソースから派生したものである。増分コンパイラを使用しており、これにより、実行時に新しい関数定義を許可したり、プログラム実行中に関数定義を変更したりするなど(どちらも動的コンパイルの機能である)、インタープリタ言語のオーバーヘッドなしで、インタープリタ言語の柔軟性の一部を実現している。[1]
説明
スタック
POP-2の構文はALGOLに似ていますが、代入の順序が逆になります。
3 := 3;
ある人はこう書いている
3 -> ;
その理由は、言語にはオペランド スタックという明示的な概念があるためです。したがって、事前の割り当ては 2 つの別々のステートメントとして記述できます。
3;
これは値3を評価してスタックに残し、
-> ;
これはスタックの一番上の値をポップし、それを変数「a」に代入します。同様に、関数呼び出し
関数 f(x, y, z);
次のように書くことができる
x, y, z; f();
(カンマとセミコロンはほぼ互換性がある)あるいは
x、y、zf;
または
(x, y, z).f;
スタックベースのパラダイムのため、文と式を区別する必要はない。したがって、2つの構造は
a > bの場合
c -> e
それ以外
d -> e
近い;
そして
a > bの場合
c
それ以外
d
閉じる -> e;
は同等です(close、の使用はまだendif一般的な表記法になっていませんでしたend-of-if-clause)。
配列とダブレット関数
一般的に理解されているような配列やレコード構造を作成するための特別な言語構造はありません。代わりに、これらは特別な組み込み関数、たとえばnewarray[2] (任意のタイプの項目を含むことができる配列用) やnewanyarray[3] (制限されたタイプの項目を作成する) の助けを借りて作成されます。
したがって、配列要素とレコードフィールドのアクセサは、単に二重関数の特別なケースです。これは、割り当ての受信側で呼び出される別の関数がアップデータとして接続された関数です[4]a 。したがって、変数に配列が含まれている場合、
3 -> a(4);
は、
アップデータ(a)(3, 4);
組み込み関数は、updaterダブレットのアップデータを返します。もちろん、updaterはダブレットであり、ダブレットのアップデータ コンポーネントを変更するために使用できます。
機能
変数は、関数を含むあらゆる型の値を保持できます。関数はファーストクラスオブジェクトです。したがって、次の構造は
関数 max xy; x > y の場合 x、そうでない場合は y を閉じます。
そして
変数最大値; lambda xy; x > y の場合 x、そうでない場合は y を閉じる end -> max;
同等です。
関数に対する興味深い操作は、部分適用(カリー化と呼ばれることもあります)です。部分適用では、関数の右端の引数(関数が使用される前にスタックに最後に置かれた引数)のいくつかが指定された値に固定され、引数の数が少ない新しい関数が生成されます。これは元の関数の閉包です。たとえば、一般的な 2 次多項式を計算する関数を考えてみましょう。
関数 poly2 xabc; a * x * x + b * x + c 終了;
これは、例えば次のようにバインドできます。
変数 less1squared; poly2(% 1, -2, 1%) -> less1squared;
表現
1平方未満(3)
は、3つの引数を固定したpoly2の閉包を引数3に適用し、(3 - 1)の2乗である4を返します。部分的に適用された関数の適用により、固定された値(この場合は1、-2、1)がスタックに既にあるもの(この場合は3)に追加され、その後、元の関数poly2が呼び出されます。次に、スタックの上位4つの項目を使用して、次の式と同じ結果を生成します。
ポリ2(3, 1, -2, 1)
つまり
1*3*3 + (-2)*3 + 1
演算子の定義
POP-2では、新しい演算(現代の用語では演算子)を定義することが可能であった。[5]
vars 操作 3 +*;
lambda xy; x * x + y * y 終了 -> 非演算 +*
最初の行は、優先順位 3 の新しい演算 +* を宣言します。2 行目は、関数 f(x,y)=x*x+y*y を作成し、それを新しく宣言した演算 +* に割り当てます。
歴史
POP-2のオリジナルバージョンは、エディンバラ大学のElliott 4130コンピュータ(RAMは64KBのみ、1972年に128KBに倍増)に実装されました。 [6]
POP-2 は、 1968 年にランカスター大学のジョン スコットによって 1909 のICT 1900 シリーズに移植されました。
1970 年代半ばに、POP-2 はBESM-6 (POPLAN システム) に移植されました。
1978年、ハミッシュ・デュワーは、 EMASオペレーティングシステムを使用して、エディンバラ大学のAI2(人工知能、2年生レベル)クラスの学部生向けにPOP-2のバージョンを実装しました。この実装は、エディンバラプログラミング言語IMPでゼロから書かれました。[7]
その後のバージョンは、Computer Technology Limited (CTL) Modular One、PDP-10、ICL 1900 シリーズ( Georgeオペレーティング システムを実行) 向けに実装されました。エディンバラの Julian Davies は、TOPS-10を実行する PDP-10 コンピュータ上でPOP -2 の拡張バージョンを実装し、これを POP-10と名付けました。これは、識別子名の大文字と小文字を区別し、ほとんどのシステム識別子に小文字を使用し、8 文字を超える長い識別子をサポートする、POP-2 の最初の方言でした。
その後まもなく、研究評議会の資金提供を受けたプロジェクトで、エディンバラの Robert Rae と Allan Ramsay によってWPOP (WonderPop の略) と呼ばれる新しい実装が実装されました。そのバージョンでは、ケージド アドレス空間、コンパイル時の構文型付け (整数や実数など)、さまざまなデータ構造で使用するためのパターン マッチング構造が導入されました。
それと並行して、サセックス大学のスティーブ・ハーディはPOP-2 のサブセットを実装し、これをPOP-11と名付け、デジタル・イクイップメント・コーポレーション(DEC) の PDP-11/40 コンピュータで実行できるようにした。当初は DEC オペレーティング・システム RSX-11D で、教育用にタイムシェアリング・モードで実行するように設計されたが、多くの問題が発生したため、代わりにUnixの初期バージョンがインストールされて使用された。そのバージョンの Pop-11 は Unixアセンブリ言語で書かれ、コードは段階的に中間バイトコードにコンパイルされ、それが解釈された。その移植は 1976 年頃に完了し、その結果、Pop-11 は教育用のさまざまな場所で使用されるようになった。教育機能をサポートするために、POP-2 の構文上の特徴の多くが変更された。たとえば、POP- 2 で for allループが使用されていたのに対し、開き括弧と一致する閉じ括弧を持つより多様なループ構造が に置き換えられたり追加されたりしfunction ... endた。 Pop-11 ではリスト構造のパターン マッチャーも導入され、人工知能(AI) プログラミングの指導がはるかに簡単になりました。
define ... enddefineclose
1980年頃、Steve HardyとJohn GibsonによってPop-11がVAX-11/780コンピュータに移植され、その後すぐに完全な増分コンパイラ(解釈された中間コードの代わりにマシンコードを生成する)に置き換えられました。実行時にコンパイラとそのすべてのサブルーチンが存在することで、マクロで可能なものよりもはるかに豊富な言語拡張をサポートできるようになりました。その結果、Steve Hardy、Chris Mellish、John GibsonによってPop-11が使用され、Prologの標準構文を使用したPrologの実装が作成されました。この組み合わせたシステムはPoplogとして知られるようになり、後にCommon Lisp とStandard MLが追加されました。このバージョンは後にさまざまなマシンとオペレーティングシステムに移植され、その結果Pop-11はPOP-2の支配的な方言となり、現在でもPoplogシステムで利用可能です。
1986 年頃、新しい AI 企業である Cognitive Applications Ltd. がサセックス大学のメンバーと共同で、Apple Macコンピューターで動作する統合グラフィックを備えたAlphaPopという Pop-11 の派生版を制作しました。これは多くの商用プロジェクトで使用され、いくつかの大学で AI プログラミングを教えるために使用されました。これは C の初期の言語で実装され、特異なコンパイラを使用していたため、Mac オペレーティング システムの保守と新バージョンへのアップグレードが非常に困難でした。また、AlphaPop は、オブジェクトのタイプを示すタグ ビットとして上位アドレス ビットを使用していたため、「 32 ビットクリーン」ではありませんでした。これは、後の Macintosh での 8 MB を超えるメモリの使用とは互換性がありませんでした。
参照
参考文献
- 一般的な
- Burstall, R.; Collins, J.; Popplestone, R. (1968). 『Pop-2 でのプログラミング』 エディンバラ: エディンバラ大学出版局。
- Davies, DJM (1976). 「POP-10 ユーザーズマニュアル」.コンピュータサイエンスレポート(25).
- Smith, R.; Sloman, A.; Gibson, J. (1992)。「POPLOG の対話型言語に対する 2 レベル仮想マシン サポート」。D . Sleemanおよび N. Bernsen (編)。認知科学の研究方向。第 5 巻: 人工知能。Lawrence Erlbaum Associates。pp. 203–231。
- POP参照
- 列をなして
- ^ Burstall, RM ; Collins, JS; Popplestone, RJ (1968). POP-2 論文(PDF) . ロンドン: The Round Table.
- ^ Rubinstein, Mark; Sloman, A. (1985年10月 – 1989年4月). 「Help Newarray」.バーミンガム大学. 2024年3月22日閲覧。
- ^ ハーディ、スティーブン、ウィリアムズ、A. スロマン(1978年1月-1986年4月)。「ヘルプニューアニーアレイ」バーミンガム大学。2024年3月22日閲覧。
- ^ Sloman, A. (1985年4月). 「Help Updater」.バーミンガム大学. 2024年3月21日閲覧。
- ^ POP-2リファレンスマニュアル、217ページ、およびDavid William Barron著『プログラミング言語研究入門』、75ページ
- ^ Dunn, Raymond D. (1970 年 2 月). 「POP-2/4100 ユーザーズ マニュアル」(PDF) .人工知能学部. エディンバラ大学. 2022 年6 月 3 日閲覧。
- ^ Dewar, Hamish. 「EMAS Pop-2 ソースコード」。
外部リンク
- POPの初期開発
- コンピュータと思考: 人工知能の実践的入門
- PM Burstall と JS Collins による POP-2 プログラミング言語入門。PM Burstall と JS Collins による POP-2 リファレンス マニュアル。
