すべての関数呼び出し/ブロックが個別のスレッドで実行されるプログラミング言語?[閉まっている]


26

私は現在、すべての関数呼び出し/新しいブロック(if句、ループなど)が別のスレッドで動作するという考え方で、楽しみのためにプログラミング言語を作成しています。新しいスレッドを作成する代わりに、標準では自動的にそれを行う必要があります。メインスレッドで実行する場合は、それを指定する必要があります。

私はマルチスレッドの並列プログラミングについて知らされていませんが、基本(未来、スレッドセーフオブジェクト)は知っています。したがって、そのような言語がどのように構文的に賢く見えるのか、そもそも可能であるのかと疑問に思っています 目標は、それを「有用」にすることではなく、それを楽しむことと学習体験のためのものです。

(投稿する場所が間違っている場合は申し訳ありません。もしそうであれば、私のような質問が許可されている適切な場所を教えていただければ幸いです。)


17
スレッドの作成は簡単です。マルチスレッドの秘trickは、お互いに話をしたり、同じリソースで作業したりする必要がある場合です。言い換えれば、タフなのはフォークではなく、結合です。解決する必要がある主な問題は、それをどのように制御するかです。
ジミージェームズ

20
IMO、「関数」という言葉や「スレッド」という言葉の通常の定義を真剣に伸ばさずにそれを行うことはできません。俳優についてまだ詳しくない場合は、俳優について読むことをお勧めします。en.wikipedia.org
ソロモンスロー

9
十分にきめ細かくなると、ソフトウェア開発者に余分な負担をかけることなく、CPUがすでに命令を自動的に並列化していることがわかります。Out-of-order Execution and Superscalar Processorを参照してください。
8ビットツリー

8
それは実際にある種恐ろしく聞こえます。私はその理由を説明するつもりだったが、カール・ビーレフェルトはすでにそうしていた。
メイソンウィーラー

1
あなたの言語でどのようなパラダイムをサポートしたいですか?命令的または機能的である必要がありますか?すべてのステートメントが同時に実行される、つまりthen / else-blocksとそれらの後に続くものが実行されると言っていますか?
ベルギ

回答:


39

すべての関数呼び出し/新しいブロック(if句、ループなど)は個別のスレッドで動作します。

詳細についてはたくさん読んで継続し、継続渡しスタイル(およびスレッドやコルーチンとの関係を)私は読むことをお勧めSICPLispでは小片を。また、Programming Language Pragmaticsはいくつかの言語の有用な概要を提供し、独自の言語を設計するのに役立ちます。

したがって、私はそのような言語がどのように構文的に見えるのか疑問に思っています

構文は、アイデアを探索するために重要ではありません。セマンティクスはもっと重要です。最初に、S-exprのような構文を採用することをお勧めします(そのため、Schemeとそのcall / ccを使用してプロトタイプを作成できます)。

いくつかの実験の後、アイデアがより明確になったら、lambda-the-ultimateでそれらを議論するかもしれません(よりセクシーな構文を定義できます(実際に人々があなたの言語を採用したい場合に重要です、そしてまた重要なのは品質です実装、フリーソフトウェアのサンプル実装、ドキュメント、標準ライブラリ、外部関数インターフェイスなど)


25
シンタックスが無関係である理由について言及するために+1。構文が非常に重要である理由を説明できるなら、もう1つです。
ヨルグWミットタグ

良い提案ですが、LtUについて議論するにはアカウントが必要です。私の経験からアカウントを取得するのは簡単ではありません。
マエル

1
スレッドプールを使用してオーバーヘッドを削減する必要があります。en.wikipedia.org/wiki/Thread_pool
shawnhcorey

37

データ並列Haskellの研究について読むことに興味があるかもしれません。youtubeで検索すると、Simon Peyton Jonesがこのテーマに関連する興味深い講演を行っています。

純粋な関数型プログラミングでの彼の講演から正しく思い出せば、スレッドを作成する機会を見つけることはほとんど簡単です。彼の研究における彼の主な問題は、あまりにも多くの短命であり、スレッドを作成して結果を通信するオーバーヘッドが並列処理の利点を本質的に上回っていることです。たとえば、コンパイラーに100個のスレッドをスピンアップして計算するように教えるのは簡単sum $ fmap (+1) <100 length vector>ですが、オーバーヘッドが価値があるのでしょうか?

そのための秘Theは、スレッドを手動で示すためにプログラマに負担をかけることなく、スレッドを有益なサイズに統合することです。これは、数千のコアを持つ将来のPCを効果的に使用するためにクラックする必要がある難しい問題です。


8
私はすでに...コアの唯一の何百ものオールド・ファッションドPCとの仕事に満足しているだろう
ハーゲン・フォン・Eitzen

8
重度のデータ並列設計の場合、すでに多くの並列化を非常に効果的に行っていることに注意してください。GPUは基本的に200〜1000のコアマシンです(独自のメモリ階層もあります)。
Delioth

4
@HagenvonEitzen:Azul Vega JCA(Java Compute Appliance)には、合計864コアでそれぞれ54コアの16個のCPUがありました。これは、研究レベルまたはプロトタイプのマシンではなく、実際の製品でした。また、建物全体や部屋全体を埋めることはできませんでした。デスクサイドサイズのアプライアンスでした。そして、それは9年前に入手可能だった。GPUについては既に述べましたが、これは864 個の汎用 CPUコアを備えたマシンでした。
ヨルグWミットタグ

3
もちろん、今日ではこれらの大規模なデータ並列GPUがありますが、デスクトップ用の大規模なマルチコアCPUではないのには理由があります。前者は商業的に実行可能ですが、後者はそうではありません。それは、それらを効率的にプログラムできなかったからです。
–MSalters

@MSalters必要なサルの数は無限ですか?または、各ステップで可能なすべての操作を単純に実行するQuantumプログラムですか?

15

これはまさにErlangが行うことです。主にキューを使用してスレッドの再結合を処理します。それは素晴らしい概念ですが、背景が手続き型の言語である場合、最初は頭を包むのが少し難しいです。調べることを強くお勧めします。


4

まず、モデルチェッカーがすべての実行を総当たりして、不正な動作がないことを確認できるように、並行アルゴリズムを記述するために使用される言語であるPROMELAを参照することをお勧めします。(並行プログラミングは悪名高いですハードな検証技術が重要な理由である、権利を取得する。)これは、別のスレッドですべての構築を実行しませんが、その焦点があるので、それはかなり奇妙な構文と意味を持っている非決定性並行プログラムの。

さらに抽象化すると、π計算は、並列計算をモデル化するための美しいアプローチです。Robin Milner 著の「Communicating and Mobile Systems:The Pi Calculus」という本を入手しない限り、頭を動かすのは困難です。「共有メモリにアクセスする複数のスレッド」というより広い意味での並列計算について考えるのに役立ちました。条件文、「gotos」などを、より単純で自然に並列なプリミティブからどのように構築できるかは非常に興味深いです。

構文に関して...これを解決する最善の方法は、いくつかのサンプルプログラムを書くことです。配列を並べ替えるプログラムを作成するか、複数のサーバーに同時にpingを実行して、どれが最速に応答するかを報告するか、並行して迷路を解こうとします。これを行っている間、構文に欠けているものが明らかになり、それらを追加できます。いくつかの項目を追加した後、それらに共通点があるかどうかを自問します。もしそうであれば、複数の目的に役立つ簡単なアプローチを見つけることができます。


4

同様のプロジェクトが過去に試みられました。古典を読んでアイデアを略奪することをお勧めします。(すべてのリンクはウィキペディアに移動します)

  • Unity この言語は、並列プログラミングを教えるために使用されました。実際に実装されたとは思わない。構文はやや不可解ですが、基本的には、未知の順序で実行されるステートメントのコレクションがあり、それ以上の処理がなくなるまで繰り返し実行されます。これはあなたが求めるものに最も近いものです。

  • Occam この言語は、実際に使用するために設計されましたが、実際に普及することはありませんでした。ここには、PARのキーワードがあります。これは、ステートメントのリストを並行して実行する必要があることを意味します。

  • Erlang別の実世界の言語。これは通信会社のエリクソンによって使用されており、かなりの支持を得ています。彼らは、並列処理を実用的で使いやすいものにすることに多大な労力を費やしました。

  • Google GOこれは私のお気に入りです。概念的にはErlangとほぼ同じですが、構文とGoogleの重みが優れています。何が間違っている可能性がありますか?

最後に警告を表示します。並列処理を正しく行うのは非常に困難です。現代のプログラムのほとんどのバグは、それを間違えた結果です。本当に行きたいですか?


私のリストに載っていない言語に対する攻撃はありません。それは私の知識が限られているということです。
スティグヘマー

3

可能ですが、考えられるすべてのアプリケーションの99%以上には役立ちません。ロジックは典型的にはシーケンスにバインドされており、フローです。ほとんどの場合、1つのステップの出力が次のステップの入力となるため、問題の解決策にたどり着くと、ステップの順序が重要になります。

いくつかの場合、互いに独立して実行できる多くのタスクがありますが、通常、それらを並列に実行する前に順番に設定する方が安価です。

だから、あなたの時間はあなたの好きなプログラミング言語でマルチスレッド機能を使用する方法を学ぶことに費やした方が良いと思う。


5
これは、別の質問に対する優れた回答です。OPは、そのようなスキームの知恵について尋ねているのではなく、単にそれができるかどうか、そして「構文」がどのように見えるかについて尋ねています。
DepressedDaniel

9
それを求めない人は、私の知恵を最も必要としている。誰かがショッピングカートの丘を降りることができるかどうかを尋ねた場合、最良の答えは「あなたは賭けます!必ず車輪をグリースアップしてください!」ではありません。「ええ、はい、しかし...」のようなものです。
マーティンマート

古いEIAOアセンブリ言語の命令であるExecute In Any Orderを思い出させます。(とにかくそのキーはどこにありますか?)

@MartinMaat誰も楽しみのためにプログラミング言語を書いて自殺するつもりはない
-user253751

2

Clojureは、いくつかのアイデアを見る価値があります。

http://clojure-doc.org/articles/language/concurrency_and_parallelism.html

独立して実行できる計算単位をタスクと呼ぶ場合:1.タスクは独立しているため、同時に実行できます2.異なるタスクが異なるリソースを必要とし、実行に異なる時間がかかる最大スループット4。スケジューラーとして機能する位置にある唯一のプログラムは、オペレーティングシステムです。

りんごグランドセントラルディスパッチのようなものは、そのようなスケジューラを提供する試みです。

上記は、タスクを実行する責任は必ずしもプログラミング言語の責任ではないことを意味します。

2番目の考えは、並列システムのプログラミングの負荷をできるだけ減らすことです。これを行う唯一の方法は、プログラムから何かを行う方法の指定を削除することです。プログラムは何をすべきかを指定するだけで、残りは自動的に行われるべきです。

上記のことは、おそらく動的言語とジャストインタイムコンパイルが道であることを意味します。


2

探しているものは暗黙的な並列化と呼ばれ、Sun / OracleのFortressなど、この概念を検討した言語があります。とりわけ、(潜在的に)並列にループを実行します。

残念ながら、それは廃止、そこには多くのデッドリンクがありますが、十分にグーグルでグーグル検索を行った場合、いくつかのPDFがまだそこに浮かんでいます。

https://www.eecis.udel.edu/~cavazos/cisc879-spring2008/papers/fortress.pdf(言語仕様)

http://stephane.ducasse.free.fr/Teaching/CoursAnnecy/0506-Master/ForPresentations/Fortress-PLDITutorialSlides9Jun2006.pdf

http://www.oracle.com/technetwork/systems/ts-5206-159453.pdf

http://dl.acm.org/citation.cfm?id=1122972(有料)

スレッドの作成と起動にはコストがかかる傾向があるため、通常、すべてのステートメント/式に対して実際のスレッドを開始したくないということに注意してください-代わりに、実行する必要のある作業を投稿するスレッドのプールがあります。しかし、それは実装の詳細です。


1
要塞に言及するための+1 ...私は言語のアイデアがとても好きでした。彼らは開発を中止したことを発表したとき、私は本当に悲しかった...
ローランドTEPP

2

プログラミング言語ではありませんが、VHDLをご覧ください。これは、デジタル回路を記述するために使用されます。デジタル回路は、特にシリアルで実行するように指定しない限り、すべてを自然に実行します。それは、あなたの言語を設計する方法と、それがどのような種類の論理に適しているかの両方のアイデアをあなたに与えるかもしれません。


0

これはC ++で簡単にシミュレートできます。"every" *関数呼び出しがで実装されていることを確認してくださいstd::future。戻り値の処理は、単に.get()将来を呼び出すことによって行われます。

したがって、C ++にコンパイルして言語をプロトタイプ化できます。これはまた、構文がどのようになるかを示しています。主な違いは、呼び出しポイント(入力引数が提供される)と戻りポイント(関数出力が使用される)を分離することです。

(*)私は「すべての機能」と言いますが、機能として数えるのはあなた次第です。あるmemset真性または機能は?整数の割り当て、またはユーザー定義型の割り当ては関数呼び出しですか?


また、質問への回答を十分長く延期すると、通常、回答の必要性はなくなります。これは「Lazy Existing」と呼ばれます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.