スタックベースのプログラミング言語を同時に実行することはできますか?


14

FORTHCatなどのスタックベースのプログラミング言語について読んでいますが、その性質を考えると、パラダイムに関係なく、一度に1つのアクションしか実行できないようです(FORTHは必須ですが、Catは機能的です)。

命令型言語はスタックを変更し、Joyなどの純粋に機能的な言語は新しいスタックを返しますが、ポイントは一度に1つのスタックのみが使用されることです。

それでは、スタックベースのプログラミング言語は並行することができますか?複数のスタックを同時に使用するなどして、並行性を実現できますか?

スタックベースのプログラミング言語で遅延評価を実装することは可能ですか?

上記の言語と概念について誤解している場合は修正してください


5
命令型言語はどのように並行できますか?
ベルギ


あなたは本当に並行性(達成するのはそれほど難しくない、独立したスタックと共有メモリで実行されている複数のスレッドを使用する)または並列性を意味しますか?
ダニエルジュール

@DanielJourよく理解すれば、並列処理は同時実行を意味し、並行処理は独立した実行を意味するので、はい、並行処理を意味します。各スレッドの独立したスタックについて詳しく説明していただけますか?
アルマンドH.

回答:


16

それでは、スタックベースのプログラミング言語は並行することができますか?

承知しました。

複数のスタックを同時に使用するなどして、並行性を実現できますか?

すでに通常の言語では、マルチスレッドは通常、複数の「呼び出し」スタックを持つことを意味します。各スレッドに独自のデータスタックを与えることは完全に自然です。たとえば、スタックベースの言語のコードによって実装されたボディを持つアクターを使用するのは簡単です。GHCのpar注釈に沿った明示的な並列処理は、合理的で簡単なはずです。物事を並行して実行する場合の主な問題は、実行するまでコードのスタック効果がどうなるかわからないことです。ただし、Joyのような構文を使用すると、次のように[a b c] par実行できます。a b c空のスタックまたはスタックのコピーに対して、完了時にスタックの最上位要素のみを保持します(または、スタックが空の場合はダミー値をプッシュします)。バリエーションを想像できます。暗黙的な並列処理は、純粋に関数型の言語と比較して単純に行うのは困難ですが、同様に行うこともできます。ユーザー定義のコンビネーターのコンパイルされたコードは、多くの場合、「通常の」コードとそれほど違いはありません。

スタックベースのプログラミング言語で遅延評価を実装することは可能ですか?

未知のスタック効果もやはり厄介な部分です。すべてのスタック効果を静的に決定できるように言語を設計すれば、それほど難しくないように思えます。あなたが怠haveを明示している場合、それはまた比較的簡単に見え、ジョイの引用とのように見えますi。それ自体を遅延連結言語と呼ぶ1つの言語は、私が言えることから、上記のアプローチの両方の混合を行うようです。暗黙的に怠zyな連結言語が動的スタック効果に直面して、少なくとも漠然と使用可能な方法でどのように機能するかは実際にはわかりませんが、それは私の想像力の欠如かもしれません。

ちなみに、スタックベースの言語が複数のスタックを持つことは珍しいことではありません。たとえば、Forthには、任意のデータを配置できるデータスタックとリターンスタックがあります。


8

私はFORTHについて少し知っているので、それに限定します。これは低レベルの言語であり、プログラマーとしてすべてのハードウェアリソースにアクセスできます。だからあなたは好きなことをすることができます。

並行性

parallellプログラム(編集:実際の並行プログラムを言うために使用)を使用するには、少なくとも2つの実行ユニット(CPU)が必要です。たとえば、「これらの2つの引数を使用してプロセッサ2でこの単語を実行する」と言うFORTHの単語を実装するのは簡単です。ワードはプロセッサ2に必要な2つのスタックを割り当て、ワードの実行を開始します。そのプログラムで使用できるコンストラクトを厳密に制限する必要があります。

並行プログラムの数が実行ユニットの数よりも大きい場合は、「疑似並列」プログラムを使用します。基本的には、コルーチンまたはプリエンプティブマルチタスクの2つの方法があります。いずれにせよ、これを実現する方法は可能ですが(簡単ではありませんが、文献に詳しく説明されています)、FORTHを使用すると、必要なすべての低レベルのものにアクセスできます。

遅延評価

もちろん、ほぼすべてのプログラミング言語と同様に、FORTHでこれを行うことができます。Haskellのようにエレガントでも「組み込み」でもありません。非常に素朴な例を使用します。

考え方は、一連の物を返す「関数」(ここでは大まかに使用)を定義することです。1つの例は、すべての整数を返す関数です。次に、このセットに対して操作を行い、完了したら結果を返します。例として、合計が1000を超えるまですべての整数を合計することができます。非遅延評価では、最初にすべての整数がセットとして割り当てられますが、整数が無限にあるため不可能です。その後、このセットで作業を開始します。遅延実装には、「セット内の次の値を与える」方法があります。これを行うには、「最後の値を与える」機能の変数が1つだけ必要です。

Haskellはこのように物事を行います。もちろん、より複雑な状況を処理しますが、考え方は同じです。プログラマーとして、問題の解決方法ではなく、問題に集中できるように評価をシュガーコートします。


4
「実際の並行プログラムを使用するには、少なくとも2つの実行ユニットが必要です」。これは単に実装の問題です。プログラミング言語の観点から見ると、単一のCPUまたは2つのCPUで実行される2つのスレッドにほとんど違いはありません。ある意味では、各スレッドはそれ自体の「実行ユニット」と見なすことができます。
離散トカゲ

1
場合によっては、インプリメンテーションの詳細を考慮する必要があります。1つの例は、実際のコンピューターの外部の実際の世界とのインターフェースです。ハードリアルタイムでは、「遅すぎる正しい答えは間違っています」に従って、2つの実行ユニットでの実行と1つのユニットでの混合実行を比較すると、タイミングが異なる場合があります。
シェルキスト

時々する。しかし、私はこれがそのようなケースだとは思わない。たとえば、質問ではリアルタイムのスケジューリング要件について言及していません。
離散トカゲ

3
「並行性」!=「並列処理」。シングルCPUマシン上で実行されている複数のスレッドは、並列処理が発生していない場合でも、互いに同時に実行されていると言えます。
ソロモン遅い

並行性と並列性についてのポイント。テキストを変更します。
シェルキスト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.