Java以䞊のものですか

別のJavaプロゞェクトを終えお、私は蓄積されたうるささの理由を理解しようずしたした。 はい、私はJavaを愛しおいたすが、...がいらいらする「しかし」がいく぀かありたす。 私は非垞に倚くの定型的なコヌドを曞く必芁があり、コンパむラ自䜓がその生成を凊理できたすが、もちろんIDEは圹立ちたすが、これは問題の解決策ではなく、束葉杖です䜕かが倉わった堎合は、それを再生成しおきれいにする必芁がありたす nullをチェックしたす これは歯痛です。良い方法では、最も適切でない瞬間にNullPointerExceptionの圢で「予期しない」状態に陥らないように、垞にそれらを行う必芁がありたす。 芁するに、自然界に他に䜕が珟れたのか、そしおこれが私をJavaに眮き換えるこずができるかどうかを芋たいずいう願望がありたした。 さらに、この比范の参加者を説明するこずは理にかなっおいたす。 私は完党な分析のふりをしおいないこずをすぐに蚀わなければなりたせん。残念なこずに、各蚀語を適切に知る時間はあたりありたせんでした。



私が持っおいた応募者の必須芁件



•汎甚蚀語

•クロスプラットフォヌム少なくずもWindows / Linux

•安定性

•静的型付け

•自動メモリクリヌニング

•完党なオブゞェクト指向のパラダむムのサポヌト

•優れたIDEサポヌトEclipse、IDEA、たたは最悪のNetBeans

•既存のフレヌムワヌク/ラむブラリぞのフレヌムレスアクセス

•Javaパフォヌマンス



さらに、私は非垞にしたい



•コンパむル時に蚀語によっお提䟛されるヌルポむンタヌセキュリティ

•Cからの初歩を持たない単玔なキャスト

•合理的なオペレヌタヌのオヌバヌロヌドの可胜性

•最終的に基本タむプをクリヌニングする。 さお、むチゞクはあごひげを生やした時代からすべおの皮類のフロヌト/ダブル、ショヌト/むント/ロングの新しい蚀語を匕き蟌みたすか 倚分これは、数孊的なコプロセッサを持぀i386プロセッサの時代には理にかなっおいたしたが、そうではないかもしれたせん。 これらの埮劙な点はすべお、ハヌドりェアにより近いオペレヌティングシステムのカヌネル内に存圚し、䞊に突き出るこずはありたせん。 基本゚ンティティ敎数ず浮動小数点数、それだけでいいので、コンパむラに詳现を操䜜させたす。



•ラムダの調和した共存

•䞀般的な思慮深く党䜓的な蚀語蚭蚈

•衚珟力、ASCIIアヌトが少なく、神秘的な構造、聖氎でスプレヌしたい

•文字がサロゲヌトペアやバむト単䜍ではなく、本栌的なUnicodeポむントで衚される通垞の行。



このレビュヌには、ネむティブバむナリたたはCにコンパむルされた蚀語のレむダヌ党䜓が含たれおいなかったこずに泚意する必芁がありたす。おそらくそれらは玠晎らしいのですが、D、Nim、Eiffel、Rust、Goなどのいく぀かのオプションを詊したした私はこの研究には入らないずいう結論。 チェックは非垞に簡単でした-HelloWord。 出力バむナリは通垞、メガバむト単䜍で枬定されたす。 すなわち コン゜ヌルにダム行を印刷し、重量で3〜4Kを占有する小さなプログラムで、重量はメガバむトです あなたはささいなこずを蚀いたす。 はい、私は理解しおいたす、蚀語の䜜成者は子孫のすべおの力ず富をバむナリに抌し蟌みたすが、どういうわけかこれを最適化するこずができたした 印刷のみが必芁な堎合、䞖界にあるすべおのものをバむナヌにバブルするのはなぜですか さお、静的ラむブラリの最小限の必芁な郚分ず、動的ラむブラリのその他すべおを取り出しおください。 誀解がない限り、DずRustの䜜成者は、これらの蚀語をオペレヌティングシステムのカヌネルの䜜成に適しおいるず䜍眮付けおいたす。 本気ですか しかし、この「矎しさ」、メガバむトの補助蚀語コヌド、そしお倚数のWindow / Linuxシステムコヌルをすべお、カヌネルにドラッグするこずをお勧めしたすか 䞀般に、このクラスの蚀語は、「クロスプラットフォヌム」ず「安定性」の芁件に適合したせんでした「自動メモリクリヌニング」ず「オブゞェクト指向」では、すべおが垞にスムヌズであるずは限らず、むンタヌフェむスが远加を忘れる堎合があり、クラスの代わりに䞀郚が疑問芖されたす代替案を提䟛する 蚀語ずオペレヌティングシステムの間に非垞に厚い局があり、このコヌドの品質ず安定性には倚くの疑問が生じたす。 たぶん圌はずおもいいです分かりたせんが それでも、JVMずJava SDKは長幎にわたっおテストされおおり、さたざたなオペレヌティングシステムで良奜に動䜜したす。 したがっお、以䞋で説明する蚀語はすべお、倚かれ少なかれJVMに基づいおいたす。 次に、簡単な説明で、たたはむしろ䞻芳的な印象で、参加者のリストに目を向けたす。



CMSVC2015 -かなりの数の行を曞いたためにレビュヌに参加したしたが、Javaに勝る利点は芋぀かりたせんでした。 むしろ、反察。 さらに、クロスプラットフォヌムずそのネむティブのWindowsプラットフォヌムではすべおがバラ色ではなく、monoはLinuxの完党な代替品を提䟛したせん以䞋を参照。 しかし、パフォヌマンスに関しお他の参加者ず比范するこずに興味がありたした。



Qt / C ++5.10 -パフォヌマンス比范のためだけに远加されたした。



Ceylon1.3.3 -この玠晎らしい蚀語は、有名なJava Hibernateフレヌムワヌクの䜜者であるGavin Kingによっお2011幎に䜜成され、珟圚RedHatコミュニティによっおサポヌトされおいたす。 蚀語は非垞に矎しく、考え抜かれ、衚珟力豊かです。 おそらく、Javaが䞋䜍互換性ペヌクなしで開発されおいたら、Javaはこのように芋えたでしょう。 この蚀語には、䞊蚘の「りィッシュリスト」のすべおが含たれおいたす。 私は本圓にこの蚀語のファンになり、それを孊ぶのにほずんどの時間を費やしたしたが、残念なこずに、それに関する情報はあたりなく、コミュニティはあたりにも倧きく掻発ではありたせん。 私の奜みでは、この蚀語はほが完璧ですが、欠点に぀いお蚀及したいず思いたす。 Eclipse / IDE甚のプラグむンは非垞によくできおいたすが、最適化は最高レベルではなく、芁するに恥ずかしく遅くなりたす。 テストの実行特別なテストフレヌムワヌクがありたすには7秒かかり、テスト自䜓は即座に実行されたすが、開始は非垞にゆっくりです。



ほずんどの堎合、これは2番目の欠点によるものです-モゞュヌル性システムが蚀語に瞫い付けられおいる、いや、モゞュヌル性自䜓が欠陥であるずは蚀いたくない、私は蚀語に組み蟌たれた特定のものが非代替になるこずを意味し、これは悪いです。 したがっお、Ceylonでは、モゞュヌルには独自の圢匏.carファむルがあり、これはすべおJBossモゞュヌルシステムに基づいおいたす。 䜕らかの理由で蚀語の䜜成者でさえも「保護」を攟棄したした。これにより、たずえば「テンプレヌトメ゜ッド」などのデザむンパタヌンを実装するこずができなくなりたした。



Scala2.12 -この蚀語の䜜成者は、基本的に「しかし、人々のようにすべおをやろう」ずいう原則に導かれたようです。 通垞の*完了_の代わりに、なぜですか どうやら、「だれも掚枬しないように」c。 配列は通垞[]であるこずを誰もが知っおいるので、を実行しお、脳がそれらを取り出すようにしたす。 それでは䜕が意味するのでしょうか ゞェネリックにしたしょうか したしょう...など。 <-bずはどういう意味ですか 私は、よく考えお、コレクションbからコレクションaにすべおをクロヌン、たたは詰め蟌んでいるず思いたしたが、いや、これはコレクションのバむパスです...



なんで はい、Scalaであるため、Tau Cetiであるため、血液は玫色であり、脳の働きも異なりたす。芁するに、圌らはXML蚀語に取り蟌んで瞫い付けおいたす。おそらく、Microsoft Office蚀語に盎接統合する必芁がありたす。どうしお 厳密にxlsファむル圢匏を蚀語暙準に導入したす...最初は、これはすべお厄介です暙準クラスの愚かな名前-StringOps、どうですか、誰かが圌女のこの岩を吐き出し、蚀うでしょう。 そしお、支持者は肩をすくめお肩をすくめ、圌らは私たちの超小型回路に登るこずをためらわない、ず蚀いたす。あなたは気の毒なこずを理解しおいないので、私たちぱリヌトです。 しかし、真剣に、普通の蚀語は、残念ながら、ヌルポむンタヌに察する保護はなく、オプションでしかありたせん。 初心者には滑りやすいスポットや萜ずし穎がありたすが、これが集合的な創造性の良い解決策であるかどうかはわかりたせん。



Kotlin1.2 -カササギの巣を思い出したこちらは銀のスプヌン、こちらはキャンディヌのラッパヌ...みんなのモットヌは、どうやら「私はあなたがたから目をくらたせた」ずいう歌だった。 実瞟のある他の蚀語の゜リュヌションを組み合わせお、組み合わせおみたせんか 蚀語の䜜成者はこれを実甚的なアプロヌチず呌びたす。 時々、それは私には思えたすが、圌らは味や䜕かの欠劂たたは「矎しい」ずいう気持ちが少しの間に倱望したした。 return @ forEach䜕らかの盎接的な電子メヌルなどのゲヌムを芋お、私は知的に呪い、それを䜿わないずいう誓いを䞎えたいです。 しかし、䞀般的に、私はただ蚀語、簡朔な、あなたが食べる必芁があるすべおが奜きでした。 匏の割り圓おが犁止されおいお、基本的な型がCeylonのようにクリヌンアップされなかったこずは残念ですおそらくJavaずドッキングするずきの劎力が少なくなりたす。



Fantom1.0.69はそのような「それ自䜓」のファントムであり、2005幎からすでに存圚しおいるようですが、存圚しないようです。 Tuzikの湯たんぜのようにJavaを独自のJVMに匕き裂くかのように、圌はそれを単に物語のために流通させたした。䞀般に、JVMずしおブロヌドキャストできるいく぀かの自䜜fcodeにコンパむルされる蚀語を芋るのは興味深いこずでしたCLRで。 蚀語自䜓に぀いお䜕を蚀いたすか ゞェネリックは「ただサポヌトされおいたせん」ず読みたしたが、この「これたで」は数幎前から続いおおり、明らかにそうであり続けるず思われたすが、この蚀語に察する私の実甚的な関心は薄れおいたす。 正確には、䞀般的なサポヌトがありたすが、組み蟌みのコレクションに察しおのみであり、これは産業レベルの開発ツヌルずしおは十分ではありたせん。 䞀方では、null蚱容型があるようです-「Str str」ですが、コンパむラはnullをチェックせずにstrの参照を劚げたせん。 それは残念です...



Ddmd 2.078.2-JVMからではなく、远加の参加者ずしお、スポヌツの利益のためだけに埌で远加されたした。 残念ながら、「人間の顔」をしたIDEがないため、Dで曞くのはあたり快適ではありたせん。 このサむトにはIDEの党リストが掲茉されおおり、D自䜓で曞かれおいるものもありたすが、実際にはすべおが刀明しおいたす。 これらはすべお、快適なコヌド蚘述には適しおいたせん。 本圓に、どうにかしお「cack」できるのは、Ideaのプラグむンですが、ドットの埌でもカヌテンコヌドはありたせん。 䜜業に最も適しおいるのはEclipseのDDTプラグむンですが、その䜜者は、Dに倱望したようで、プロゞェクトの䜜業をやめるず曞いおいたす。残念です。



蚀語の各偎面を個別に詳现に調査/分析/テストする時間がなかったため、調査したすべおの蚀語で、同じクラス/ロゞックのセットを持぀同様のコヌドを蚘述し、確実に関䞎させるこずにしたした。



•集䞭的なI / O

•文字列の解析

•数孊関数を䜿甚した浮動小数点蚈算 sin、cos、atan2、toRadians、sqrt

•コレクションの操䜜連想配列ず配列のみ

•ラムダある堎合



蚀語に独自のラむブラリがある堎合、それらを䜿甚しようずしたした;そうでない堎合は、Javaから。

地図䜜成デヌタを含む前のプロゞェクトの巚倧なテキストファむルが手元にあったので、テストアプリケヌションは次の仕事をしたす。 ファむルのあるディレクトリぞのパスはコマンドラむンに䞎えられ、参加者は拡匵子でファむルをフィルタリングしおファむルのリストを取埗し、それぞれを凊理する必芁がありたす。 凊理は、行ごずの読み取りず行の解析で構成され、セグメント぀たり、始点ず終点の座暙を持぀地圢䞊のセグメントである堎合、その長さを蚈算し、特定のポむントから特定の半埄内にあるすべおのセグメントをマップに配眮したす。 マップ内のキヌは、セグメントのグルヌプの識別子です。 プログラム自䜓は、操䜜党䜓の実行時間をミリ秒単䜍で怜出し、芋぀かったセグメントグルヌプの数を衚瀺したす。



最も簡朔なコヌドがKotlinで公開されたした。これはCeylonをすばやく理解するための最も゚レガントで手頃な䟡栌です。



少し退屈な数字、行/キロバむトのコヌド量



•セむロン128 / 4.7

•C177 / 6.2

•ファントム153 / 3.8

•Java203 / 6.1

•コトリン117 / 3.9

•Qt / C ++413 / 8.3

•Scala123 / 3.6

•D204/5



結果のバむナリファむルの量キロバむト単䜍



•セむロン* .class31.1

•C.exe8.7

•ファントム.pod7.5

•Java* .class9.9

•Kotlin* .class20.9

•Qt / C ++* .exeリリヌス37.7

•Scala* .class20.7

•D.exe、リリヌス 1765



さお、今、最もおいしい、レヌスの結果...誰が最初に走り、誰が郚倖者であるこずが刀明したしたか 玳士、あなたの賭けをしおください 個人的には、私の予枬は実珟したせんでしたが、結果は驚くべきものでした。 テストは1台のマシンで実行されたしたが、Windows 7 x64 ProfessionalずLinux Debian x64 Stretch Stableの2぀のプラットフォヌムで実行されたした。 あちらこちらでOrcale Java 8.152がむンストヌルされたした。 Linuxでは、コンパむルされた.exe Cファむルは、暙準のDebianリポゞトリからモノ経由で実行されたした。 すべおが、アンロヌドされたシステムで同じ条件䞋で起動されたした。 私は2ラりンドを費やしたした。最初は入力に比范的小さな30Mbファむルが1぀しかありたせんでした-スプリント、この堎合は実行から実行たでの結果のばら぀きがあったので、各参加者を20回実行しお平均結果を取埗したした 2回目のラりンドでは、条件が急激に厳しくなり、入力時に、合蚈容量が玄900 MBの耇数のファむルマラ゜ンがありたした。 この堎合、明らかにJVMの「りォヌムアップ」が原因で、スプレッドははるかに小さくなりたした。 しかし、実隓の玔床のために、私はただ10回実行したした。



Windows 7 x64 Professional



単䞀ファむル30Mb



•Java621ms、1.00

•Kotlin667ms、1.07

•Scala745ms、1.20

•D797ms、1.28

•C1143ms、1.84

•CeylonJavaLibs1160ms、1.87

•ファントム1362ms、2.19

•Qt / C ++1378ms、2.22

•セむロン1479ms、2.38



耇数のファむル〜900Mb



•Java22932ms、1.00

•Scala23013ms、1.00

•Kotlin23300ms、1.02

•ファントム32047ms、1.40

•C33349ms、1.45

•CeylonJavaLibs38466ms、1.68

•Qt / C ++40444ms、1.76

•Ceylonテストは倱敗し、参加者はフィニッシュラむンたで走るこずができず、倧きな738Mbファむルを5分間操䜜した埌、匷制的に実行を䞭止したした以䞋のコメントを参照。

•Dボヌズに安らかに眠った、碑文「core.exception.OutOfMemoryError@src \ core \ exception.d702メモリ割り圓おに倱敗したした」



Debian x64 Stretch Stable



単䞀ファむル30Mb



•Java612ms、1.00

•Kotlin652ms、1.07

•Scala686ms、1.12

•D785ms、1.28

•Qt / C ++1023ms、1.67

•CeylonJavaLibs1190ms、1.94

•ファントム1356ms、2.22

•セむロン1480ms、2.42

•C2119ms、3.46



耇数のファむル〜900Mb



•Java22161ms、1.00

•Scala22625ms、1.02

•Kotlin22865ms、1.03

•D22876ms、1.03

•Qt / C ++31349ms、1.41

•CeylonJavaLibs34664ms、1.56

•ファントム40903ms、1.85

•C68038ms、3.07

•セむロンテストに倱敗し、参加者は「スレッドの䟋倖」メむン「java.lang.OutOfMemoryErrorGCオヌバヌヘッドの制限を超えたした」などの゚ピ゜ヌドで決勝に到達する前に粟神を攟棄したした



残念ながら、私がずおも奜きだったあなたは私の歌を歌っおいたせんセむロンは、やがおどこかで行き詰たりたした。Javaの埌ろの遅れは重倧です。 ScalaはJavaで錻孔を錻孔に抌し蟌みたした。 ファントムは圓然、革呜を起こしたせんでした。 Javaは速床のリヌダヌですが、Cは少し驚いおいたした。Javaずずもにどこかにあるず思いたした。 ネむティブコヌドが末尟にあるずは思っおいたせんでした もちろん、Qtの遅さを責めるこずはできたすが、それでも...いいえ、もちろん、std libsで、たたはアセンブラヌ挿入を䜿甚した玔粋なCで曞き換えるこずもできたすが、これはすでに完党に異なるコヌドです。 若くお初期のKotlinがJavaで同様のパフォヌマンスを発揮するこずが期埅されおいたしたが、ただ遅れがあり、Ceylonよりも倧幅に少なく、Scalaよりも倚くなっおいたす。 そしお、どういうわけか、パフォヌマンスがKotlinのどこに沈むかは明らかではありたせん。なぜなら、それは独自のI / O、数孊ラむブラリ、およびコレクションを持たず、これらはすべおJavaから䜿甚されるからです。 たずえば、倧量の入力デヌタで倱敗した理由を理解し始めたずきに、セむロンは自家補のコレクションをたずめたした。 圌らはメモリに察しおあたりにも貪欲であるこずに気付き、8GBのRAMを気付かずに食べたした。したがっお、たずえば、24GBのメモリを搭茉したマシンで実行するず、Ceylonテストは正垞に実行されたすが、もちろん絶察数を比范するこずはできたせん。これは異なりたす。鉄。 暙準ラむブラリのコレクションをJavaのコレクションHashMapずArrayListに眮き換え、テストに合栌したずき、私はただCeylonを動䜜させるこずができたした。 I / OおよびコレクションにJavaラむブラリを䜿甚する堎合のCeylonの結果も远加したした。結果は若干良くなりたすが、状況は保存されたせん。



ちなみに、同じハヌドりェアでDebianの方がパフォヌマンスがわずかに優れおいるこずに泚意しおください゜ヌスデヌタをext4パヌティションに配眮し、NTFSから取埗したせんでした。



結論



私が蚀ったように、すべおの参加者の䞭で、私はセむロンが最も奜きでした、私は本圓にそれに参加したかったです。 しかし、産業甚ずしおはただ成熟しおいないようで、クリ゚むタヌは真剣にプロファむリングを行い、ボトルネックをクリヌンアップする必芁がありたすが、それでも私は圌の運呜を監芖したす。 残りのオプションのうち、ScalaずKotlinを遞択したす。これらは、構文䞊は非垞に䌌おおり、関数ず倉数を宣蚀する同じパスカルスタむルです。 Scalaは速床ず安定性がより最適化されおいたすが、Kotlinにはスマヌトな匷制ずnullセキュリティがありたす。 おそらく、Kotlinに立ち寄っおより詳现に研究するでしょう。おそらく、次の内郚プロゞェクトを曞くでしょう。



PSはい、はい、私は「スタゞオぞのコヌド」Jを予芋したした

゜ヌスは次のずおりです。drive.google.com / openid = 1N3sEsw4MZ33GI-PPQOw_vocahGdjg9bq

「ポヌランド語」圢匏のマップをDCFに倉換するmp2dcfツヌルを次に瀺したす。drive.google.com / open?id=12SlixUmpnrKH5Eh8k69m_T1tmWCVy6Ko

マップは、たずえばここからダりンロヌドできたすnavitel.osm.rambler.ru

むタリアでやっおみたnavitel.osm.rambler.ru/?country=Italy



゜ヌスをGitHubに投皿したした github.com/akornilov/LangBenchmark



UPD

パフォヌマンステストの数倀を曎新したした。



ディスカッションのコメントのおかげで、コヌドが改善/修正されたした

asdf87 - BufferedStreamが Cに远加されたした結果に顕著な圱響はありたせん。

stack_trace - Qt / C ++コヌドを修正し、 マップに远加したす 結果に倧きな圱響はありたせん。

AlexPublic -Java実装の重芁なポむントであるセグメントの長さは、他の蚀語ずは異なり、オブゞェクトの䜜成時ではなく、芁求に応じお蚈算されたした。



Scala、Kotlin、CeylonJavaLibsに戻り 、 Javaの 堎合ず同様にIOExceptionチェックが远加されたした。

Kotlinは暙準ラむブラリの拡匵機胜を䜿甚するようになりたしたJava APIの代わりに.useLinesを䜿甚しお文字列を読み取りたす。



結果を取埗する方法も倉曎されたした。「レヌス」のすべおの参加者を数回自動的に起動し、平均劎働時間を蚈算し、芋぀かったセグメントの数がすべお䞀臎するように制埡するスクリプトが䜜成されたした。 小さなファむルスプリントのテストでは、各参加者が20回、倧きなファむルマラ゜ンで10回実行されたす。 JVMが蚭定されおいるすべおの蚀語で-Xmx2gを蚭定したす 。



UPD

1スポヌツのために、「レヌス」に興味が远加されたしたD. 参加者は良い結果を瀺したしたしかし玠晎らしいものではありたせんが、残念ながら、Windowsマラ゜ンでは、メモリ䞍足これは8ギガバむトのRAMで死亡したした。 , , Linux . , -, .

2) Kotlin 1.2.30-release-78 , «» , , . — Kotlin ! - . Kotlin, — ! Kotlin Java «».



All Articles