| パラダイム | 同時的、命令的、構造化された |
|---|---|
| 家族 | ヴィルト・ パスカル |
| デザイン: | ペル・ブリンチ・ハンセン |
| 初登場 | 1993年 |
| 安定版リリース | 1 / 1993 |
| タイピングの規律 | 強い |
| Webサイト | brinch-hansen.net |
| 影響を受けた | |
| 通信シーケンシャルプロセス、パスカル、並行パスカル、ジョイス、オッカム | |
SuperPascalは、 Per Brinch Hansenによって開発された命令型の並行コンピューティング プログラミング言語です。[1]これは、並列プログラミングの概念を明確かつ簡潔に表現できるようにする思考ツールである出版言語として設計されました。これは、マシンの詳細や歴史的な慣習で複雑になることが多い実装言語とは対照的です。当時の並列出版言語のニーズに応えるために作成されました。おそらく、今日では、思考ツールとして使用できるほど表現力があり簡潔な言語はほとんどありません。
歴史と発展
SuperPascalは、ニクラウス・ヴィルトの逐次言語Pascalをベースに、安全で効率的な並行処理のための機能を拡張したものです。Pascal自体は1970年代に出版言語として多用されました。構造化プログラミングの実践を教えるために使われ、例えばコンパイラ[2]やプログラミング言語[3]の教科書にも登場しました。ハンセンはそれ以前に、オペレーティングシステムやリアルタイム制御システムの設計のための最も初期の並行処理言語の1つであるConcurrent Pascal [4]という言語を開発していました。
SuperPascalの要件は、コンピュータサイエンスの一般的な問題に対する手法を実装した一連のモデル並列プログラムの開発でハンセンが3年間にわたって得た経験に基づいていました。[5]この実験により、彼は科学的並列コンピューティングの将来について次のような結論を導き出しました。
- 将来の並列コンピュータは汎用的なものとなり、プログラマーは問題指向のプロセス構成で考えることができるようになる。これは、配列、ツリー、ハイパーキューブに接続できる汎用プロセッサであるトランスピュータのネットワークをプログラミングした経験に基づいている。
- 計算科学における通常の問題では、決定論的な並列性のみが必要です。つまり、複数のチャネルではなく、特定のチャネルからの通信が期待されます。
- 並列科学アルゴリズムは、洗練された公開言語で開発し、シーケンシャルコンピュータでテストできます。アルゴリズムが機能することが確認されると、並列実装言語で簡単に実装できます。
これらにより、並列出版言語には次のような要件が生まれました。
- この言語は、広く使用されている標準言語を決定論的並列性とメッセージ通信で拡張する必要があります。拡張は標準言語の精神に沿ったものでなければなりません。
- この言語は、通信チャネルによって接続された並列プロセスの任意の構成をプログラムできるようにする必要があります。これらの構成は反復的または再帰的に定義され、動的に作成されます。
- 言語は、並列プロセスが時間依存的に干渉しないことをシングルパスコンパイラでチェックできるようにする必要があります。
特徴
SuperPascalの設計における重要なアイデアは、並列処理の抽象概念を備えた安全なプログラミングを提供することでした。[6] [7]
安全
SuperPascal は、言語概念が破綻して意味のない結果を生み出すケースをコンパイラとランタイムシステムが可能な限り多く検出できるようにすることで安全です。 [8] SuperPascal は変数の使用に制限を設けており、プロセスがグローバル変数を持つプロシージャを使用していても、単一パスコンパイラが並列プロセスが互いに独立していることをチェックできるようにし、時間依存のエラーを排除します。ラベルやステートメント、ポインタ、前方宣言など、Pascal のいくつかの機能はあいまいまたは安全でなかったため、SuperPascal から省略されました。[6]goto
並列処理
SuperPascalの並列機能は、動的プロセス配列と再帰的並列プロセスの一般性が追加されたOccam 2のサブセットです。[7]
ステートメントparallelは、そこに含まれる一定数のステートメントを並列に実行する必要があることを示します。例:
平行
ソース() |
シンク()
終わり
ステートメントforallは、動的な数のプロセスによるステートメントの並列実行を表します。次に例を示します。
forall i := 0 から 10 まで
何か()
チャネルとコミュニケーション
並列プロセスは、動的に作成されたチャネルを介して型付きメッセージを送信することで通信します。チャネル自体は変数ではありませんが、チャネル参照と呼ばれる一意の値によって識別され、チャネル変数によって保持されます。チャネルは、たとえば宣言によって宣言されます。
type channel = * ( boolean , integer ) ; var c : channel ;
これは、 channelという名前の新しい (混合) 型と、この型のcという名前の変数を定義します。混合型チャネルは、指定された型 (この場合はブール値と整数値) のみを送信するように制限されています。チャネルc は、次のステートメントによって初期化されますopen。
オープン(c)
send(channel, value)メッセージ通信は、およびステートメントを使用して実現されますreceive(channel, variable)。 の値を提供する式または変数send、および の変数は、両方とも最初のチャネル引数と同じ型である必要があります。次の例は、左のチャネルから値を受信し、それを右のチャネルに出力するreceiveプロセスでこれらの関数を使用する方法を示しています。
var left , right :チャンネル; a :数値;受信( left , a ) ;送信( right , a )
関数sendと関数は、receiveそれぞれ複数の入力引数と出力引数を取ることができます。
送信(チャネル、e1、e2、...、en); 受信(チャネル、v1、v2、...、vn)
次のランタイム通信エラーが発生する可能性があります。
- チャネルの競合は、 2 つの並列プロセスが同時に同じチャネルで送信または受信を試行したときに発生します。
- 2 つの並列プロセスが同じチャネルを介して通信しようとし、出力式と入力変数の型が異なる場合に、メッセージ タイプ エラーが発生します。
- 送信または受信操作が完了するまで無期限に待機すると、デッドロックが発生します。
並列再帰
再帰parallelプロシージャをおよびステートメントと組み合わせてforall、並列再帰プロセスを作成できます。次の例は、ステートメントを使用してプロセスのパイプラインを再帰的に定義する方法を示していますparallel。
手順pipeline ( min 、max :整数; left 、right :チャネル) ; var middle :チャネル; begin if min < max then begin open ( middle ) ; parallel node ( min 、left 、middle ) | pipeline ( min + 1 、max 、middle 、right ) end end else node ( min 、left 、right ) end ;
もう 1 つの例は、プロセスツリーの再帰定義です。
手順tree ( depth : integer , bottom : channel ) ; var left , right : channel ; begin if depth > 0 then begin open ( left , right ) ; parallel tree ( depth - 1 , left ) | tree ( depth - 1 , right ) | root ( bottom , left , right ) end end else leaf ( bottom )
干渉制御
並行プログラミングの最も難しい点は、時間依存のエラーによって発生する予測不可能な、または再現不可能な動作です。時間依存のエラーは、変数の更新やチャネルの競合による並列プロセス間の干渉によって発生します。変数を共有するプロセスが予測できないタイミングで変数を更新する場合、結果として生じるプログラムの動作は時間依存になります。同様に、2 つのプロセスが共有チャネルで同時に送信または受信を試みた場合、結果として生じる影響は時間依存になります。
SuperPascal は、時間依存のエラーを最小限に抑える、または排除するために、変数と通信の使用に一定の制限を課しています。変数に関しては、並列プロセスは互いに素な変数セットのみを更新できるという単純なルールが必要です。[1]たとえば、parallelステートメントでは、ターゲット変数は複数のプロセスによって更新できませんが、式変数 (更新できません) は複数のプロセスで使用できます。状況によっては、配列などの変数が複数の並列プロセスのターゲットであり、その要素ごとの使用が互いに素であることをプログラマが知っている場合、先行するステートメントによってこの互いに素な制限を上書きできます[sic]。
構造と構文
SuperPascal はブロック構造の言語で、Pascal と同じ基本構文を持っています。プログラムは、ヘッダー、グローバル変数定義、関数またはプロシージャ定義、およびメインプロシージャで構成されます。関数とプロシージャはブロックで構成されます。ブロックはステートメントのセットです。ステートメントはセミコロンで区切られます。CやJavaなどの言語ではステートメントはセミコロンで終了します。
以下は、100 個のノードを持つパイプライン通信構造を構築する完全な SuperPascal プログラムの例です。マスター ノードは最初のノードに整数トークンを送信します。このトークンはパイプラインに沿って渡され、各ステップで増分され、最終的にマスター ノードによって受信されて出力されます。
プログラムパイプライン;
定数
len = 100 ;
タイプ
チャネル= * (整数) ;
var
left 、right :チャネル;値:整数;
手順node ( i :整数; left 、right :チャネル) ; var value :整数; begin receive ( left 、value ) ; send ( right 、value + 1 ) end ;
手順create ( left , right : channel ) ; type row =チャネルの配列[ 0 .. len ] ; var c : row ; i : integer ; begin c [ 0 ] := left ; c [ len ] := right ; for i := 1 to len - 1 do open ( c [ i ] ) ; forall i := 1 to len do node ( i , c [ i - 1 ] , c [ i ] ) end ;
開き始めます(左、右);
並列
送信(左、0 ) |作成(左、右) |受信(右、値)終了;
writeln ( '結果の値は ' 、value ) end 。
実装
SuperPascal ソフトウェアは、Brinch Hansen アーカイブから無料でアクセスできます。[9]これは、通常のシーケンシャル Pascal (ISO レベル 1 標準 Pascal) で書かれたコンパイラとインタープリタで構成されています。これは、GNU Pascal コンパイラと、スイッチ付きの新しいバージョンのFree Pascalコンパイラ (2.7.1+)によってサポートされており-Miso、コードに次の小さな変更が加えられています。
GPC の場合、ファイルはinterpret.p非標準clock関数 (行 1786) を使用してシステム時間を取得します。代わりに、型の変数を宣言し、 を使用して現在の時刻を設定し、のフィールドを変数 に割り当てることで、拡張 PascalgetTimeStamp関数 (GNU Pascal コンパイラでサポートされています) を使用できます。
TimeStampgetTimeStampSecondTimeStampt
Free Pascal では、上記の「クロック」問題に対する解決策も必要です (Windows では、gettickcount を「クロック」という名前で外部として宣言するだけです)。さらに、ソース コードで非標準としてマークされているリセット/書き換えは、割り当て/リセット (または書き換え) ペアに変更する必要があります (GPC は、厳密なフラグを有効にした場合にのみ、これに関してエラーを発します)。また、C プリプロセッサ コマンド #include 'xx' は {$include 'xx'} に変更する必要があります。
{ Unix システム上の Freepascal の readtime のタイム コード }
Function FpTime ( var tloc : integer ) : integer ;外部名'FPC_SYSC_TIME' ;
手順readtime ( var t : integer ) ; begin { 非標準関数は プロセッサ時間をミリ秒単位で読み取ります } t := fptime ( t ) ; end ;
参考文献
- ^ ab Hansen, Per Brinch (1993)、SuperPascal: 並列科学計算のための出版言語
- ^ ウェルシュ、ジム (1980)。構造化システムプログラミング。アッパーサドルリバー、ニュージャージー州、米国: Prentice-Hall。ISBN 0-13-854562-6。
- ^ Tennent, RD (1981).プログラミング言語の原則。アッパーサドルリバー、ニュージャージー州、米国: Prentice- Hall。ISBN 0-13-709873-1。
- ^ ハンセン、ブリンチ(1977)。並行プログラムのアーキテクチャ。プレンティス・ホール。ISBN 978-0130446282。
- ^ ハンセン、ブリンチ(1993年5月)、「計算科学のためのモデルプログラム:マルチコンピュータ向けプログラミング方法論」、並行性:実践と経験、pp. 407–423
- ^ ab Hansen, Brinch (1994). 「プログラミング言語 SuperPascal」.ソフトウェア: 実践と経験. 24, 5 : 399–406.
- ^ ab ハンセン、ブリンチ(1977)。同時プログラミングの発明。ニューヨーク: Springer-Verlag。ISBN 0-387-95401-5。
- ^ Hoare, CAR (1974). 「プログラミング言語設計のヒント」.コンピュータシステムの信頼性: 505–534.
- ^ Hayden, CC (2008-06-11). 「Per Brinch Hansen Archive」. 2020年3月3日閲覧。
外部リンク
- 公式ウェブサイト、Brinch Hansen アーカイブ、彼の論文集、および圧縮ファイルでダウンロードできる SuperPascal ソフトウェア。完全な言語仕様と便利なドキュメントが含まれています。
- superpascal on GitHub、Christopher Long によるオリジナルの SuperPascal 実装の修正版。最新の Free Pascal でコンパイルおよび実行可能。プログラム実行は Perl 5 や 6 よりも高速で、Python 3 とほぼ同等の速度。
