Javaの主な焦点は何ですか?新機能を入手するのになぜこんなに時間がかかるのですか?


10

私は、ラムダ式、拡張メソッド、新しいストリームAPIなど、JDK8の新機能を調査しています。

明らかに、これらの機能のどれもプログラミングの世界で新しいものではないので、なぜ今までこれらすべての機能がJavaで利用されているのか不思議に思いました。

Lisp(1958)、SML(1973)、Haskell(1990)、Python(1991)、JavaScript(1994)、Ruby(1995)、Scala(2003)、C#(2007)、およびLispの55年後にラムダ式があり、 Java(2013)では実質的に他のすべての人。

そして、私はSIC(1996)のストリームについて読みました。

なんで今なんだろう?証拠は、他の言語との競争が動機ではないことを示唆しています。

このリリースのJavaの優れた新機能はすべて、並列処理の実装の副産物にすぎないようです。ラムダは、並列アルゴリズムの記述を簡単にするためにあり、ラムダ式が必要とする変更などをサポートするためにそれらを必要とするため、拡張メソッドがあります。

したがって、私の質問は、このJavaの次のリリースのメイントピックが実際に並列処理であることを安全に確認できるでしょうか。それとも、今までJavaで本の中で最も古いトリックが登場した他の理由を正当化できるでしょうか。


4
このすべてが起こり得るのは、Javaの時代遅れの問題に関する炎上です。
マイケルK

5
The evidence suggests-あなたの研究を共有してください。

2
Java、JVM、JREのいずれの機能も新しいものではありません。そして、機能の組み合わせは新しいものではありませんが、エッフェルは1985年にそれらすべてを備えていました(GC、OO、型保証、Javaが2003年まで取得しなかったGenericsも)。実際、新しいものを導入しないことがJava設計者の明確な目標でした。
イェルクWミッターク

2
@MichaelK-これが炎の戦争になりかねないことに同意します。また、Sunの挑戦的な歴史に関する有効な回答になる可能性もあります。OracleによるSunおよびJavaの買収。そして、Javaの現在のメンテナがどのように言語を推進しようとしているのか。私の希望は、回答がこの質問の建設的な側面に焦点を当てることです。

@MichaelT:それが炎上戦争にならず、いくつかの興味深いアイデアが浮かび上がることを願っています。たとえば、常に進化しない言語は時代遅れであると私たちはしばしば想定します。IMOは、言語の進化が線形であることを前提としているため、これは当てはまりません(人気のあるすべての新機能は優れており、すべての最新の言語で採用する必要があります)。しかし、言語のメンテナは、新しい機能が他の言語に適合しないと判断する可能性があります。また、時代遅れになっていない標準化された安定した言語(Common Lispなど)があることも考慮してください。
Giorgio

回答:


12

Javaが最初に設計されたとき、匿名関数を除外することが適切であると考えられていました。私は2つの理由を考えることができます(ただし、公式の理由とは異なる場合があります)。

  1. Javaは関数のないオブジェクト指向言語として設計されたため、関数のない言語で匿名関数を使用することはあまり自然ではありませんでした。または、少なくとも、これは言語の設計に大きな影響を与えたでしょう。
  2. 匿名関数は、Javaが引き付けるつもりだったプログラマーコミュニティ(C、C ++、Pascal?)では人気がありませんでした。今でも、多くのJavaプログラマーはこれらの機能を非常にエキゾチックだと考えているようです(しかし、これはおそらくJava 8で非常に急速に変わるでしょう)。

その後の数年間、Robert Harveyが説明したように、Sunのポリシーは常にJavaの下位互換性と非常に安定した状態を維持することでした。

一方、他の競合する言語が登場しました(最も重要なのはC#です。これはJavaクローンとして生まれ、独自の開発の方向性を示しました)。

競合する言語は、次の2つの理由でJavaに圧力をかけています。

表現力

新機能により、特定のプログラミングイディオムを簡単に記述できるようになり、プログラマにとって魅力的な言語になります。通常、言語によって提供される機能のセットは、表現力、言語の複雑さ、設計の一貫性の間の妥協です。機能を追加すると、言語の表現力が向上しますが、習得がより複雑で困難になります。

とにかく、ここ数年、Javaの競合他社はJavaにはなかった多くの新機能を追加しましたが、これは利点と見なすことができます。

誇大広告

はい、残念ながら、これは少なくともプログラマーとしての日々の経験で見ることができることから、テクノロジーの選択における要因です:チームのほとんどのメンバーがその使用方法を知らなくても、ツールには特定の機能が必要ですそれを使用できる人はほとんどの場合それを必要としません。

誇大広告は、特定のプロジェクトのプラットフォームを決定するマネージャーなど、技術者以外の人々にとってさらに重要になる可能性があります。マネージャーは、ラムダ、並列処理、マルチコア、関数型プログラミング、クラウドコンピューティングなどの一部のキーワードしか覚えていない場合があります...選択したテクノロジにリストの各項目に緑色のマークが付いている場合、最新の状態です。

したがって、しばらくの間IMOはJavaを

  • 言語の安定性とデザインのシンプルさの元のポリシー、一方では巨大なコードベースと開発者コミュニティ、そして
  • 最初にJavaプログラマー、C#、次にScala、Clojure、F#を引き付ける可能性のある競合する言語のプレッシャー(私が知っているものには名前を付けますが、他にもあるかもしれません)。

最終的に、OracleはJavaをアップグレードして競争力を高めることを決定しました。私の意見では、新機能は、C#に切り替えたくなる可能性があり、ScalaやClojureなどの他の言語がJavaとあまりにも異なると考えるJavaプログラマーを特に対象としています。一方、関数型プログラミングの経験があり、それでもJVMを使用したい開発者は、おそらくすでにScala、Clojure、または別の言語に切り替えています。

したがって、新しいJava 8機能は言語としてJavaをより強力にし、宣言された焦点は並行および並列プログラミングですが、アップグレードはマーケティングの側面にも対応しているようです(OracleのJavaのチーフアーキテクトであるMark Reinholdは次のように述べています:ラムダ式を追加するだけでクールな子供たちに追いつくために、そこにいくつかの真実が、その中だが、本当の理由は、マルチコアプロセッサであると言う、それらを処理するための最良の方法は、「ラムダであり、参照この記事を)。

つまり、はい、多くの(すべての)Java 8機能はすでによく知られていますが、機能が言語に追加される理由と時期は、対象読者、既存のコミュニティ、既存のコードベース、競合他社、マーケティングなど、多くの要因に依存します。

編集

「SICのストリームについて読みました(1996)」に関する短いメモ:ストリームを実装するためにJava 8ラムダが必要であることを意味しますか?実際には、匿名の内部クラスを使用してそれらを実装できます。


+1そして、これがこれまでの質問に対する最良の答えであるため、もっと多くのポイントを与えたいと思います。
edalorzo 2013年

あなたの答えに基づいて、私はマーク・ラインホールドが私に興味深い記事を見つけたと言ったことについてさらに調査しました。今後の参考のために、回答を添えてここに掲載します:Closures for Java by Mark Reinhold
edalorzo 2013年

そして、その記事は実際には、この別のJavaのクロージャーについて言及しています
edalorzo 2013年

1
あなたが送ったリンクから、私はこのibm.com/developerworks/java/library/j-jtp03048/index.html#4.0を見つけました。Javaは匿名の内部クラスを使用できると言っていますが、これらは冗長すぎます。それでも、Java 8のクロージャーは、匿名の内部クラスの単なる構文上の砂糖ではありません。そのため、Javaには2つの(意味的に)異なる種類のクロージャー(匿名の内部クラスとラムダ式)があります。
Giorgio

11

Javaは時間とともに焦点を変えました。最初は、「強力で複雑な」C ++への反応として、単純で強力な言語として設計されました。演算子のオーバーロード、テンプレート、列挙型など、C時代の複雑すぎる、または遺物であると見なされたC ++の一部の機能は意図的に除外され、OOPは人気のピークにあり、すべてが単一のオブジェクトになりましたパラダイムの世界観。現時点でのラムダは、Java 1.1での匿名/内部クラスの導入以来、単に「不要」と見なされていました。構文がはるかに冗長であるという事実は、ほとんど機能と見なされていました。

Javaが公開されたため、Javaの設計ミスの教訓から学び、一連の新しい言語機能を発表したC#がMicrosoftに導入されるまで、変更するインセンティブはありませんでした。それらは後方互換性による制約を受けませんでした。Javaのコンセプト作成者はC#の競争の危険を認識し、ジェネリックスや列挙型などでJava 5をリリースしたと思います。

Javaにラムダを含めることは、それ以来議論されており、関数型プログラミングの現在の傾向によって悪化しただけです。しかし、このようなことを正しく行うには時間がかかり、初めて正しくなければなりません。私の意見では、Javaは、下位互換性が構文糖子にすぎないものとして実装する理由であると考えられていたため、型消去を伴うジェネリックを台無しにしました。クロージャーはより徹底的に考えられて現れ、それは単なる構文上の糖衣ではありません。

結論として、Java 8の主なトピックは何ですか?言語バージョンにトピックがあるとは思いません。C ++ 11として、Java 8の存在意義は、現在ますます多くのプログラマーが当たり前になっていることを言語で紹介することによって競争に追いつくことです。Lispは1958年以来ラムダを持っている可能性があり、その人気は現在数十年間頭打ちになっており、関数型プログラミングは「主流」プログラミング(真の意味での言葉がないため)について真剣に検討されています。


「Lispは1958年以来ラムダを持っているかもしれません、その人気は今数十年間横ばいになり、つい最近まで関数型プログラミングが「主流」プログラミングのために真剣に考えられてきました:言語の人気はその有効性の良い指標とは思われません。関数型プログラミングは長年提唱されてきましたが、業界のほとんどの人々は、博士論文を書くために研究者がそれをいじりたいものだと考えていました。今や突然、業界は目覚め、それにチャンスを与えています。おそらく、OOPが主流になったため、彼らは次の大きなものを探しています。
Giorgio

1
クロージャがもともとJavaに含まれていなかった理由:クロージャの議論の理解。ジェームズゴスリング氏は、次のように述べています。「時間のプレッシャーが原因で、最初は閉鎖がJavaから除外されていました。Javaの初期の頃、閉鎖の欠如はかなり痛かったので、内部クラスが生まれました。多くの困難な問題があります。しかし、多くの設計の問題では通常のことですが、単純化によって問題が実際に解決されることはなく、単に問題が解決されました。」
edalorzo 2013年

「Javaでのラムダの組み込みについては、それ以来議論されており、関数型プログラミングの現在の傾向によって悪化しただけです。」:一部のコミュニティ(C ++、Javaなど)では、「ラムダの使用」がしばしば「関数型プログラミングを行う」。
ジョルジオ

8

明らかに、これらの機能のどれもプログラミングの世界で新しいものではないので、なぜ今までこれらすべての機能がJavaで利用されているのか不思議に思いました。

Javaは、「委員会による設計」に似たプロセスでいくつかの高い視認性の利害関係者が関与する承認プロセスを通過する必要があり、そのプロセスには時間がかかるため、それだけです。

それを他の言語と比較すると、慈悲深い独裁者か、緊密に連携して企業の利益に結び付けられていない言語デザイナーの小さな委員会を見つけるでしょう。

これを、下位互換性を維持する必要のある数百万行のJavaコードの確立されたコードベースと組み合わせると、変更のすべての要素を氷河期のペースで得ることができます。


1
OTOH、あなたには、本当に強くて広く受け入れられている基準のための成分もあります。たとえば、JPAとPHPの状況を比較してください。すべてのWebフレームワークには独自の半端ORMがあります。
Michael Borgwardt 2013年

私は間違っているかもしれませんが、私の理解では、Haskellは「委員会による設計」言語でもあり、それは最先端の言語です。それで、それがJavaを妨げているのではないでしょうか?
Andres F.

@AndresF。はい。しかし、Haskell委員会に大規模なモノリシック企業がいないと思います。こちらのコメントの会話もご覧ください。
Robert Harvey

1

プログラミング言語の最も重要な目的は使用することだと私は言うでしょう。現在、CとJavaにはラムダ式がなく、最もよく使用される言語です(たとえばTIOBEによると)。

そして質問に答えるために、私はJavaが企業に向けられていると信じています。この領域では、物事は非常に安定していて信頼性が高い必要があります。たとえば、Java 7はほぼ2年前から登場していますが、Java 7のプロジェクトは直接知りません。また、企業にとって非常に重要な下位互換性も重要です。


私はあなたに同意します(+1):私はJavaを(言語としておよびその巨大なエコシステムのために)非常に評価しますが、Java 6で言語を凍結する方が適切だと思います。私は学習に力を入れません。 Java 7または8(Java 7または8が必須である非常に興味深いプロジェクト)を強制されない限り、むしろScalaとClojureの学習に時間を費やしています。
ジョルジオ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.