プログラミング蚀語の優れた抂芁テスト

最近、私は再び2孊期の分野「アルゎリズム蚀語」の2幎生ず協力したした。 数十のプログラミング蚀語をレビュヌしたした。 生埒の䞀人であるVadim Shukalyukは、圌らのこずをより明確に把握するために、圌らをよりよく知りたいず思っおいたした。 圌は圌に少し研究をするように助蚀した。 よりも流されたした。 私は圌ず䞀緒に数ヶ月にわたっお行われた仕事に぀いおの私のレポヌトを提案したす。



各プログラミング蚀語には、長所ず短所がありたす。 任意の蚀語の翻蚳者の最も重芁な特城の1぀は、プログラムの実行速床です。 この実行速床を正確に芋積もるこずは非垞に困難であり、䞍可胜です。 リ゜ヌスhttp://benchmarksgame.alioth.debian.org/は、さたざたなタスクでこの速床を確認するためのゲヌムフォヌムを提䟛しおいたす。 しかし、このリ゜ヌスで衚される蚀語の数はかなり少ないです。 再垰蚈算の重芁な倀であるスタックの最倧容量は確認しやすいですが、トランスレヌタのバヌゞョンによっお異なり、システム蚭定に䟝存する堎合がありたす。



次のトランスレヌタヌがテストされたしたCgcc、clang、icc、アセンブラヌx86、x86-64、JavaOpenJDK、Pascalfpc、JavaScriptGoogle Chrome、Mozilla Firefox、Lispsbcl、clisp、Erlang、 Haskellghc、抱擁、dino [1]、aukgawk、mawk、busybox、lua、ruby、basicgambas、libre office、python-2、p-hi-p、postscriptgs、prolog swipl、gprolog、pearl、metapost、T E X、tickle、bash。 いく぀かの小さな、しかし時間のかかるアルゎリズムの実際の実行速床ず、次の䞡方を調査したした。







すべおの翻蚳者がテストされた最初のタスクずしお、定矩に埓った二重再垰によるフィボナッチ数の蚈算が遞択されたした。1ず2の数字は単䜍であり、埌続の数字は前の2぀の数字の合蚈です。 このアルゎリズムにはいく぀かの魅力的な機胜がありたす。



  1. n番目の数倀の蚈算時間がtの堎合、n + 1番目はt *φです。ここで、φは√5+ 1/ 2に等しい黄金比です。
  2. 自己蚈算されたneは、最も近い敎数φn /√5に切り䞊げられた倀に等しくなりたす。
  3. fibn + 1を蚈算するには、呌び出しのn番目のネストが必芁です。


最初の機胜により、翻蚳者のテストを短時間で行うこずができ、その速床は数十䞇回異なりたす。 2番目の機胜を䜿甚するず、蚈算の粟床をすばやく確認できたす。 3番目の機胜では、理論的にはスタックの容量を調査できたすが、スヌパヌコンピュヌタヌでもn> 50での蚈算が非垞に遅くなるため、この機胜を䜿甚するこずは事実䞊䞍可胜です。



次の衚1の2番目の列は、蚀語の名前、コンパむラヌの名前ずそのバヌゞョン、および䜿甚されおいる堎合は生成されたコヌドを最適化するオプションを瀺しおいたす。 3列目は、AMD Phenom II x4 3.2 GHzプロセッサでの盞察的な蚈算時間を瀺しおいたす。 テストはAMD FX-6100で同じ頻床で実斜されたしたが、結果は䞎えられたものず倧差ありたせん。 ナニットはbash蚀語で蚈算時間を芁するため、アヌランゞ蚈算はbashより玄20,000倍高速です。 4列目は、Intel Core i3-2100 3.1 GHzプロセッサヌでの盞察的な蚈算時間を瀺しおいたす。 プロセッサの比范は調査の目的ではなかったため、䞀郚の翻蚳者はIntelプラットフォヌムでテストされおいたせんでした。 5番目に、システムスタックサむズulimit -sが8192 KBの8 GBのRAMを搭茉したコンピュヌタヌでack1,1、nを蚈算するずきに、トランスレヌタヌがサポヌトする再垰呌び出しの最倧数の䞊限10の粟床。 䞀郚の翻蚳者は、䜿甚するスタックのサむズを決定する独自の蚭定を䜿甚したす-遞択したバヌゞョンの翻蚳者のデフォルト倀が垞に䜿甚されたす。 枬定はLinuxシステムで実行されたしたが、別のOSに移行しおも結果は倉わらないはずです。 デヌタは列3で゜ヌトされたす。 すべおの゜ヌスはここで衚瀺できたす 。



è¡š1

N 蚀語 AMD Intel スタック
1 C / C ++gcc 4.7.2、-O5 354056 493533 790000
2 C / C ++clang 3.0-6.2、-O3 307294 270000
3 C / C ++icc 14.0.3、-fast 250563 232665 530000
4 アセンブラヌx86-64 243083 271443 350,000
5 アセンブラヌx86 211514 301603 700,000
6 JavaOpenJDK 1.7.0_25 186401 239659 8000
7 パスカルfpc 2.6.0、-O3 170604 186401 180,000
8 C / C ++gcc 4.7.2、-O0 159672 173261 180,000
9 C / C ++clang 3.0-6.2、-O0 146726 110000
10 C / C ++icc 14.0.3、-O0 136862 156602 530000
11 JavascriptMozilla Firefox 25 121979 4200
12 JavascriptGoogle Chrome 31 92850 10,000
13 Lispsbcl 1.0.57 54925 51956 31000
14 アヌラン5.9.1 19845 18589 制限なし
15 Haskellghc 7.4.1、-O 18589 22946 260,000
16 Awkmawk 1.3.3 6621 6306 44000
17 ルア5.2 6420 7075 150,000
18 ルビヌ1.9.3 5297 6969 6600
19 ディノ0.55 5024 6420 190000
20 基本Gambas 3.1.1 3968 4373 26000
21 Python2.7.3 3678 4013 1000
22 PHP5.4.4 2822 3720 制限なし
23 Awkgawk 4.0.1 2648 2547 制限なし
24 ポストスクリプトgs 9.05 2355 3246 5000
25 プロロヌグswipl 5.10.4 1996 2407 2,300,000
26 Perl5.14.2 1516 1670 制限なし
27 プロロヌグgprolog 1.3.0 1116 1320 120,000
28 Lispクリップ2.49 998 1023 5500
29日 Awkbusybox 1.20.2 981 1113 18000
30 T E X3.1415926 239 333 3400
31 メタポスト1.504 235 470 <4100
32 Tcl8.5 110 123 1000
33 ハスケル抱擁98.200609.21 82 121 17000
34 基本LibreOffice 3.5.4.2 20 35 6500
35 bash4.2.37 1 0.77 600




フォヌムのアッカヌマン関数は、すべおの算術挔算がそれに削枛されるずき、2番目のタスクずしお遞択されたした。぀たり、ack1、x、y= x + y、ack2、x、y= x * y、ack 3、x、y= x y 、ack4、x、yはxずyの四等分です。







この関数は、nの増加ずずもに非垞に急速に成長したす数倀ack5,5,5は非垞に倧きいため、この数倀の桁の数は、宇宙の芳枬された郚分の原子数よりも䜕倍も倧きいですが、非垞に遅いず考えられおいたす。 埌者のプロパティは、パフォヌマンスのテストに理論的に䟿利です。 ただし、この関数の蚈算にはかなりの数の再垰呌び出しが必芁であり、テストされたほずんどの蚀語では、顕著な持続時間を持぀蚈算に察しおそれらをサポヌトできたせんでした。 この関数の蚈算を反埩に枛らすこずはできないこずが知られおいたす。 この問題の蚈算により、調査した蚀語のスタックの最倧容量を調査するこずができたした。ack1,1、n-1の蚈算には、呌び出しのn番目のネストが必芁で、非垞に高速です。 次の衚2は、スタックが耐えるこずができた蚀語呌び出し65539の入れ子のペネテヌションack5,2,3の蚈算結果を瀺しおいたす。 速床の単䜍では、-O5オプションを䜿甚したgccの動䜜時間が遞択されたした。぀たり、phpは玄420倍遅くなりたす。



è¡š2。

gcc -O5 1
asm x86 2.15
icc -fast 2.18
asm x86-64 2.36
clang -O3 2.76
fpc -O3 4.44
gcc -O0 7.75
icc -O0 8.36
clang -O0 9.64
アヌラン 18.51
ghc -O 50.18
ルア 122.55
php 423.64
ガック 433.82
スむプル 766.55
恐竜 915.64




䞊蚘の2぀のタスクを䜿甚するずいうアむデアは、B。V. KerniganずR. Pikeの「Unix-ナニバヌサルプログラミング環境」の仕事から借りたもので、そこではホック蚀語のテストに䜿甚されたした[2]。



もちろん、䞻に暙準ラむブラリの手段を䜿甚したより耇雑な蚈算では、翻蚳者の速床の差ははるかに小さくなりたす。



時間は暙準時間コマンドで枬定され、䞍可胜な堎合javascript、office basic、蚀語に組み蟌たれたツヌルが䜿甚されたした。



研究の結果によるず、以䞋の結論が出されたしたが、その䞀郚はやや予想倖でした



  1. アセンブラヌのプログラムの速床は、最倧限の最適化でコンパむルされたC / C ++のプログラムよりも50以䞊遅くなる可胜性がありたす。
  2. バむトコヌドを䜿甚した仮想Javaマシンの速床は、倚くの堎合、高氎準蚀語の翻蚳者が受け取ったコヌドを䜿甚したハヌドりェアの速床を䞊回りたす。 Javaマシンの速床は、アセンブラヌず最適な最適化トランスレヌタヌに比べお劣っおいたす。
  3. 人気のあるブラりザヌでのjavascriptのプログラムのコンパむルず実行の速床は、最高の翻蚳者に比べお2〜3倍だけ䜎く、䞀郚の高品質のコンパむラヌをも䞊回りたす。プログラム実行速床の点では、他のスクリプト蚀語などのほずんどの翻蚳者を確実にはるかに䞊回る10倍以䞊;
  4. IntelのC蚀語コンパむラによっお生成されたコヌドの速床は、GNUコンパむラ、堎合によっおはLLVMの速床よりも著しく遅いこずが刀明したした。
  5. アセンブリx86-64コヌドの速床は、類䌌のx86コヌドの速床よりも玄10遅くなる堎合がありたす。
  6. コヌドの最適化は、Intelプロセッサでより適切に機胜したす。
  7. Lisp、Erlang、Aukgawk、mawk、およびBash蚀語を陀き、Intelプロセッサでの実行速床はほが垞に高速でした。 キャッシュの速床の違いは、実際のトランスレヌタやハヌドりェアではなく、テスト察象のシステムの異なる環境蚭定が原因である可胜性がありたす。 Intelの利点は、特に32ビットコヌドで顕著です。
  8. テストされたほずんどの蚀語、特にJavaずJavascriptのスタックは、非垞に限られた数の再垰呌び出しのみをサポヌトしたす。 䞀郚のトランスレヌタヌgcc、icc、...では、ランタむム環境たたはパラメヌタヌの倉数を倉曎するこずにより、スタックのサむズを増やすこずができたす。
  9. 考慮されおいるgawk、php、perl、bashのバヌゞョンでは、すべおのコンピュヌタヌのメモリを䜿甚できる動的スタックが実装されおいたす。 しかし、perlず、特にbashはスタックを非垞に広範囲に䜿甚するため、8〜16 GBではack5,2,3を蚈算するには䞍十分です。 バヌゞョン5.4.20では、phpスタックは玄200,000回の呌び出しに制限されおいたした。




結論ずしお、プログラミングの技術を習埗し始めた孊生からのいく぀かの蚀葉。



任意の蚀語で必芁な蚈算甚のプログラムを䜜成するには、たず特定の蚀語で倉数が宣蚀される方法、if-else型の構造を構築する方法、および再垰を敎理する方法を理解する必芁がありたす。 単玔な蚀語Pascalを䜿っお仕事を始めたした。圓時は誰よりもそれをよく知っおいたからです。 Pascalの埌、構文がだいたい䌌おいるので、C、Java、Dinoを䜿いたした。 Cは非垞に興味深く、シンプルであるず同時に、盎感的な挔算子を備えおいるこずが刀明したした。 JavaはC / C ++よりも䟿利ではないように思われたす-あなたは倚くの無関係なこずを曞く必芁がありたす。 たた、同じクラス名ずファむル名が必芁になる瞬間に負担をかけたした。 Haskellは肯定的な感情のみを残したした。 䟿利で、明確で匷力です。 Webアプリケヌションを開発するための蚀語であるPHPは、Cに非垞に䌌おいたす。最小限の倉曎でCコヌドを挿入するだけで、すべおが正垞に機胜したす。 Erlangの構文はHaskellに䌌おおり、Prologにも少し䌌おいたす。 たた、非垞に快適で理解しやすい蚀語であり、困難は生じたせんでした。 JavaScript構文はJavaたたはCに䌌おいたす。OfficeバヌゞョンずGAMBASバヌゞョンの䞡方のVisual Basicは、やや角床があり䞍䟿な構文を持っおいたすが、䞀般的にはそれほど難しくありたせんでした。 次に、CずJavaの基本的な構文の知識を習埗した埌、PythonはCに䌌おいるため、Pythonコヌドを非垞に迅速に蚘述するこずができたした。Luaずそのかなり匷力で柔軟な構造では問題は発生したせんでした。 たた、AwkはCず同様の構造を持ち、すぐにそれを圧倒したした。 Lispでは、たずえば接頭蟞衚蚘法の基本的な理解でC蚀語に䌌た蚀語を以前に研究したこずがある人のように、いく぀かの困難が生じたした。 これは、わずかな開発コストの埌、非垞に䟿利で、論理的で、矎しいように芋えたした。 その埌、論理プログラミング蚀語であるPrologに切り替えたした。Prologは具䜓的でしたが、非垞に興味深く、基本的なものでした。 Ruby-オブゞェクト指向プログラミングを匷力にサポヌトし、アむコンに非垞に矎しい明るい赀ルビヌを備えた蚀語は、優れた蚀語であるこずが刀明したした。䜙分な括匧、セミコロン、その他の䞍芁な文字はありたせん。 最も蚘憶に残るものの䞀぀。 OOP蚭蚈を陀き、Pythonも同様に簡朔です。 Perl-「真珠」ずいう名前が付けられおいたすが、ラクダは舌のシンボルです。これは、ラクダがあたり矎しくないが、ハヌドワヌクを実行できる非垞に䞈倫な動物であるずいう事実ぞの参照です。 Rubyの埌にドル、カッコ、セミコロンを再び眮くこずはあたり良くありたせんでした。 䞀郚の堎所の構文は、タヌミナルシェル蚀語のBashの構文に䌌おいたす。 その埌、アセンブラヌを取り䞊げたした。 特定の困難があり、プロセッサずそのレゞスタを理解する必芁がありたした。 Cがアセンブラヌであるマシンコヌドよりも高速に蚈算を凊理するこずが刀明したずき、サプラむズは限界を知りたせんでした Bashには問題はありたせんでしたが、倚額のドルを賭け、蚈算ず括匧を䜿う必芁がありたした。 Metapost / Metafont蚀語はいく぀かの問題を匕き起こしたした-そこにサポヌトされおいるのは数字のみで、4096以䞋です。その構文は非垞に䌝統的ですが。 TickleTCLにもかなり䌝統的な構文がありたすが、行指向です-このセマンティクスずbashのようなセマンティクスは、最初は非垞に混乱しおいたした。 PostScriptは最も難しいように芋えたした。 この蚀語の構文は非垞に具䜓的であり、準備なしでは盎感的に䜕も曞くこずができないため、関連する文献を研究し、最も単玔なプログラムでトレヌニングを開始する必芁がありたした。 PostScriptは実際のテストでした。RubyずCのすべおのツヌルず機胜に慣れた埌、スタックのみを䜿甚しお二重再垰接尟蟞を蚘述するのは問題がありたした。 ポストスクリプトでアッカヌマンの機胜を曞いおテストするこずは、歯ブラシで壁を塗ろうずするようなものです。 しかし、耇雑さの点で最初の堎所は間違いなくT E Xで占められおいたす。これ以䞊難しいものは芋おいたせん。 そしお、教垫の盎接の助けがなければ、この蚀語を克服するこずは䞍可胜でしょう。



奜奇心は蚀語のスタックのサむズに関するデヌタでした。 蚀語のスタックが倧きいほど、Ackermanの機胜に察応できる可胜性が高くなりたす。 しかし、ある蚀語のプログラムがack5,2,3の蚈算に察凊できなかった堎合、これはその蚀語が悪いず䞍快であるこずを意味したせん。 この蚀語は、MetapostやPostscriptなどの他の䟿利な目的のために䜜成される可胜性がありたす。



䞀般的に、この䜜品は非垞に興味深く、非垞に認知的でした。たずえば、20の異なる方法で同じ論理的な順番を曞いおいたす。 たた、スタックず3぀の操䜜スタックの远加、削陀、スクロヌルのみを䜿甚しお、プロセッサレゞスタの動䜜原理を理解し、二重再垰関数を蚘述するず、芖野が倧きく広がりたした。



圌の孊生の結論のいく぀かは、教垫にはあたりにもカテゎリヌ的であるように芋えたが、圌は自分の結論ず比范しおそれらをより新しいものに保぀こずに決めた。






[1]-ロシアで開発されたプログラミング蚀語 。 珟圚、その著者はRed Hatの埓業員であり、gccコンパむラのコレクションの改善に取り組んでいたす。 dinoの最新バヌゞョンは2007幎にリリヌスされたした。

[2]-この蚀語もテストされ、mawkずghcの間で速床の結果が瀺されたした。



All Articles