EclipseでJavaでソートしようとしたところ
java
1int[] x = new int[128]; 2x.parallelSort();
というものがありました。
C++の17のSTLの記事を読んでいてて
STLの並列があると見つけて読んでみた
ここで、Javaが登場してたころに コンテナに対して
並列処理をライブラリで提供できていたのに対して
やっとC++17になって 並列処理が標準で導入された
ってことは、C++はJavaより遅れてるってことでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/06 02:04
回答2件
0
ベストアンサー
たった一つの機能を以て進んでいる・遅れているというのはいささか疑問に残る所ではありますが、マルチスレッドを言語標準で組み込んだ時期がいつかというとC++はJavaに比べてずっと後です。
Javaでマルチスレッドを実装するためのクラスThread
は1996年リリースのJDK1.0のときから既に存在していました。つまり、この時期には並列処理が標準で使用できることを言語側が保証していたと言うことです。
対して、1996年頃のC++は標準規格すら無い状態でした。最初の国際規格は1998年のC++98です。このときSTLと言われる標準ライブラリが数多く追加されますが、その中にマルチスレッドに関するものはありませんでした。マルチスレッドを実現するためのクラスstd::thread
等の登場は2011年のC++11まで待たなくてはなりません。
では、C++では2011年まで並列処理ができなかったのかというとそうではありません。ほとんどのOSの環境ではマルチスレッド用のライブラリを用意していました。例えばPOSIX環境(UNIXおよびLinux)ではpthreadライブラリが使えるようになっていました。pthreadライブラリはPOSIX標準のマルチスレッドライブラリで、POSIXに準拠しているOSであれば使えます。POSIXではないOS、例えばWindowsの場合は、OSのカーネルにマルチスレッドの機能は搭載しており、CreateThread
等のWindows APIを用いてスレッドを作る必要がありました。つまりは、OS毎にマルチスレッドを書いている部分をかき分ける必要があったと言うことです。
C++ではもともとOS依存というものは回避が難しく、書き分けることが普通でしたので、それほど混乱は無かったと思われます。しかし、コードのポータビリティー性という意味では、非常に低い状態と言えます。そこでstd::thread
が出てくるのですが、登場当初はバグのある環境等もあって、安定して使えるまで数年ぐらいは必要だったようです。(現在は、最新版のコンパイラを使う限り、問題はないようです)
なお、言語規格としては未だにマルチスレッドが無い言語もあります。JavaScriptの言語規格であるECMAScriptはマルチスレッドではなく常にシングルスレッドです。最近のブラウザにはWorkerというマルチスレッドを行う仕組みがありますが、ブラウザという環境において使えるものであり、C++とpthreadの関係に近いと言えるでしょう。では、JavaScriptが遅れた言語かというと…そこら辺の判断は読者にお任せします。
投稿2019/12/05 22:23
編集2019/12/06 09:36総合スコア21737
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
raccy さん回答の通り、プログラミング言語仕様による並列処理サポートという観点では、Java は C++ よりも明らかに先行しています。
(個人的な見解に基づきますが)広く普及しているプログラミング言語としては、Java の並列処理サポートはかなり先進的と思います。
Java言語は1.0版リリース当時(1996年)からThread
クラスを提供してはいましたが、(今から振り返ると)根本的な問題をかかえており並列処理を“正しく”記述できませんでした。
Java 5(2004年)へのバージョンアップ時に、JSR 133 によって問題点が整理され、「Memory Model(メモリモデル)」が仕様化されたことで真に並列処理をサポートしました。
このJava言語における功績は、他の後発プログラミング言語におけるマルチスレッド並列処理サポートに強い影響を与えており、(並列処理にとって)エポックメイキングなバージョンアップと言えると思います。
また標準ライブラリとしてのマルチスレッド並列処理サポートという観点でも、Java言語は新しい機能を提供し続けています。代表的なものでは:
- スレッドセーフ・コンテナ [Java 1.2以降]
- タイマー [Java 1.3以降]
- 豊富な並行コンテナクラス [Java 1.5以降]
- 高度な同期プリミティブ [Java 1.5以降]
- アトミック変数 [Java 1.5以降]
- Executorsフレームワーク [Java 1.5以降]
- Fork/Joinフレームワーク [Java 1.7以降]
- CompletableFuture API [Java 1.8以降]
- Streams API [Java 1.8以降]
Java言語での先進的な並列処理サポートは、JSR 166を主導するDoug Lea氏の功績が非常に大きいと思います。
投稿2019/12/06 02:17
編集2019/12/06 02:25総合スコア6191
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。