質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

STL

STL(Standard Template Library)は、ジェネティックコンテイナー、イテレーター、アルゴリズム、そして関数オブジェクトのC++ライブラリーです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

654閲覧

並列処理の優劣(C++,Java)どっちが早く導入した?

yukkuri_55

総合スコア240

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

STL

STL(Standard Template Library)は、ジェネティックコンテイナー、イテレーター、アルゴリズム、そして関数オブジェクトのC++ライブラリーです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

2クリップ

投稿2019/12/05 14:59

EclipseでJavaでソートしようとしたところ

java

1int[] x = new int[128]; 2x.parallelSort();

というものがありました。

C++の17のSTLの記事を読んでいてて
STLの並列があると見つけて読んでみた

ここで、Javaが登場してたころに コンテナに対して
並列処理をライブラリで提供できていたのに対して
やっとC++17になって 並列処理が標準で導入された
ってことは、C++はJavaより遅れてるってことでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2019/12/05 15:33

そのコード、コンパイル通らないと思いますよ。
m.ts10806

2019/12/06 02:04

聞いてどうしたいんでしょ
guest

回答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
raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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
yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問