プログラミング競技者がC ++とJavaを使用するのはなぜですか?[閉まっている]


93

今年のGoogle Code Jam コンテストに出場した後、C / C ++とJavaを使用した驚くほど多くの[成功した]参加者に気づかざるを得ませんでした。コンテスト全体で使用される言語の分布はここで見ることができます

数年間C / C ++でプログラミングした後、私は最近、Pythonの可読性/わかりやすさの性質が好きになりました。最近では、OCaml、Schemeなどの関数型言語や、Prologなどの論理言語も学びました。これらの言語には確かにメリットがあり、私の意見では、特定の状況ではC ++やJavaよりも簡単に適用できます。たとえば、Schemeのcall / ccの使用は、バックトラッキング(いくつかの問題に答えるために必要なツール)を簡素化し、Prologのロジック仕様は、ブルートフォースの性質により非効率的ですが、困難な特定の問題を大幅に簡略化(そして自動的に解決)することができます脳を包み込む。

競技参加者は、チャレンジに最も適したツールを使用する必要があることは明らかです。x86アセンブリでさえチューリング完全です-それはそれで問題を解決することを正当化しません。この場合、Scheme / Lisp、Prolog、Pythonなどのあまり一般的でない言語を使用する競技者は、C / C ++およびJavaを使用する競技者よりも成功率が大幅に低いのはなぜですか?言い換えれば、成功した競技者は、主流ではないかもしれませんが、間違いなく仕事に適したツールである言語を使用しないのですか?

私の質問にはいくつかの動機があります。最も重要なこととして、私はより良いプログラマーになりたいと思っています-実用面と競争面の両方で。関数型プログラミングや論理プログラミングなどの美しいパラダイムを紹介した後、C / C ++やJavaを支持して多くの人々がそれらを破棄するのを見るのは残念です。プログラミングの競争でLisp / Scheme / Prologプログラマーとして成功することができないのではないかと心配して、上記のパラダイムに対する私の賞賛に疑問を投げかけることさえあります。


11
実行速度が要因かもしれませんね。
Zaki

興味深い質問。Code Jamまたは他のコンテスト(ACMなど)の参加者からいくつかの回答を得るとよいでしょう。ただし、実行時間の制限はインタープリター言語に偏る可能性があります...
tzaman

11
動的言語には大きなパフォーマンスの問題があります。ベンチマークを参照してください
NullUserException 2010

Topcoderの場合、それは純粋にPython標準ライブラリ以外の使用を禁止するルールを持っているためであり、些細なタスク以外のことを不可能にします。宇宙画像で小惑星を検索していますか?残念ながら、NumPyを使用することもできません。
内部石2014

回答:


68

すばらしい質問です。プログラミングコンテストに手を出してきた人がいるので、何か言いたいことがあります。

[標準の免責事項を片付けましょう:コンテストプログラミングは「現実世界でのプログラミング」に大まかに関連しているだけであり、アルゴリズムと問題解決のスキルと、バグのない高速な作業コードを思いつく能力をテストします時間のプレッシャーは、大規模なソフトウェアプロジェクトを構築したり、保守可能なコードを記述したりできることと必ずしも相関しているわけではありません(適切に構造化されたプログラムの方がデバッグが容易であるという事実を超えています)。]

今いくつかの答えのために:

  • C ++ / Javaは、現実の世界の他の言語よりも一般的であるため、どこでも高い比率で表示されると予想されます。(しかし、それはコンテストの人口ではさらに高いです。)

  • これらの参加者の多くは学生であるか、学生としてコンテストに参加しています。C++ / Javaは学生が学ぶより一般的な「第一言語」です。(最近の学部生は、Scheme、Haskell、Pythonなどで始まる可能性がありますが、高校生(独学)の頻度は低くなっています。)実際、東ヨーロッパの参加者の多くはまだPascalを使用しており、Pascalの方が優れています他の誰よりもどんな言語でも

  • 学校および大学レベルのコンテストでは通常、これらの言語が使用されます。International Olympiad in Informatics(IOI)では、C、C ++、およびPascalのみが許可されます(または、現在はJavaが許可されています。私はついていません)。ACMIntercollegiate Programming Contest(ACM ICPC)では、C、C ++、およびJavaのみが許可されます。TopCoderはC ++、Java、C#およびVB(実際には:p)を許可します。そして最近、Python。したがって、「コンテストエコシステム」には、C ++ / Javaプログラマがより多く含まれていると言えます。Google Code JamとIPSCは、実際にはあらゆる言語のコードを許可する数少ないコンテストの1つです。

  • ここで問題は、参加者が言語を自由に選択できるGCJで、なぜPythonまたはSchemeを選択しないのかということです。最も関連する要素は、これらの言語が遅いことです。確かに、ほとんどの現実世界のプログラミングでは十分に高速ですが、すべてのテストケースでプログラムをn秒の制限の下で実行することにしばしば関与するタイトなループの場合、これらの言語はいずれの場合にもそれを削減しません。アルゴリズム的に複雑な問題。(C / C ++のO(n log n)ソリューションを受け入れるがΘ(n 2)ソリューションを受け入れないように設計された問題は、低速の言語で最適なO(n log n)ソリューションさえも除外することがよくあります。Javaでさえハンディキャップが与えられていましたUSACO;これがまだ当てはまるかどうかはわかりません)。

  • もう1つの要因はライブラリです。C++とJavaには、頻繁に役立つアルゴリズムとデータ構造(赤黒木、C ++のnext_permutationなど)に適したライブラリがありますが、Pythonのライブラリ(現実の世界では十分良い)はここではあまり役に立ちません。PrologとScheme ...私は彼らのライブラリについて知りません。これらのプログラマーは必要に応じて独自のコードを作成できるため、これは比較的小さな要因です。:-)

  • 汎用のマルチパラダイム言語は、哲学ややり方を強制する言語よりも、コンテストの時間的制約の範囲内で物事を成し遂げるために便利です。これが、たとえばPrologが常に不人気である理由です。(一般的な哲学:一部の言語は、足で自分を撃つことなど、あらゆることを可能にする「可能にする」言語であり、一部は、正しい方法で行うことを強制する「指示する」言語です。)これは、C ++が3倍人気がある理由でもあります。一般的なコンテスト参加者のJava、そして上位の参加者の間ではるかに人気があります。コードを他の人が読む必要がないので、次のようなループマクロを用意しても問題ありません。FOR(i,n)(入力するコードが少なく、さらに重要なことに、急いでいるときにバグが発生する可能性が低くなります)。Javaに反することは何もありません。Javaを使用するトッププログラマーもいます。:-)

  • 最後に、これらのトッププログラマーの多くは、「第1言語」としてC ++ / Java / Pascalを持っているかもしれませんが、彼らの言語のために良くないので、それについて絶望する必要はありません。これらの同じプログラマーの多くは、意図的にシェルスクリプト、m4(autoconfで使用)、アセンブリ(「ASMなしで素晴らしいスペルはできない」という名前のチーム)などのクレイジー言語を使用していても、ICFPコンテストのようなコンテストで優勝しています。


2
同意する; 私が言ったように、図書館の存在は比較的非常に小さな問題です。誇張していると思われる場合は削除できます。
ShreevatsaR 2010

2
最後から2番目の箇条書きのJavaについては、それほど正確ではありません。GCJのトップコンテスト参加者の多くはJavaを使用しています。
NullUserException

1
[(「linguo」)決勝で、他の参加者は、Pythonを使用して、コンテストを通じてLOLCODE、ピート、FALSE、空白、およびFRACTRANなどの言語を使用しました!]
ShreevatsaR

4
速度の部分に少し追加したいと思います。GCJのようなコンテストの「速度」は、コードの実行時の複雑さ(つまり、big-O)です。GCJでは通常、遅い言語でも正しいアルゴリズムが受け入れられます(そのため、受け入れられたPythonの送信はたくさんあります)一方で、遅いアルゴリズムはasmでも永遠にかかります。例外はありますが、一般に正しいアルゴリズム/手法を使用すれば、遅い言語でも安全です。
MAK、2010

1
@EvgeniSergeevあなたが言うことは、IOI / TopCoderのようなほとんどのプログラミングコンテストに当てはまりますが、特にGCJでは、時間制限は通常、大きな入力に対して8分であり、問​​題は通常、Pythonソリューションも通過できるように設計されています。10年前でも、経験則は1秒あたり〜10 ^ 9の「単純な」操作でした。たとえば、O(n ^ 2)とΩ(n ^ 3)を区別するには、n ^ 2 <10 ^ 9 * 60が必要です。 * 8 <n ^ 3、またはおよそ8000 <n <692000。n= 20000をとることができ、400xより遅い言語(1秒あたり10 ^ 9/400)でもn ^ 2アルゴは160秒しかかかりませんが、高速n ^ 3は8000秒かかります。
ShreevatsaR 2015年

14

Google AIコンテストの出場者をプロットするというジェリーコフィンのアイデアが好きだったので、すべての結果を取り、それらをプロットしました(平均値、標準偏差を計算してから、Excelで正規分布曲線をグラフ化しました)。

LuaとJSで、これを得た:

なし(出場者が少なかったため、結果が歪んでいる可能性があります):

Javaの参加者は他の参加者よりも著しく劣っていたように見えますが、Go、Common Lisp、およびCはより良い方向にあります。


ただし、質問はGoogle AIコンテストではなく、Google Code Jamについての質問でした(あなたの答えが最初に聞いた場所です)。そのため、Google Code Jamについてこれらのグラフを描く方が適切かもしれません。実際、質問はすでにそのような統計に言及しています(2010)2011年2012年2013年2014年(現在進行中)も参照してください。
ShreevatsaR 2014年

12

なぜ私たちは皆エスペラント語ではなく英語を話すのですか?まあ、それはちょうど起こった。英語は一貫性がなく膨らんでいて、エスペラントは意図的に「より良いツール」として設計されています。

したがって、1つの理由は伝統です。ほとんどの学校では、プログラミングは依然としてC / C ++、Java、Pascal、またはBasicでさえ教えられています。そして、彼らがよりよく知っている言語を選択するそれらのコンテスト、主に学生に参加します。
また、ほとんどのアルゴリズムの本にはPascalまたはAdaのスタイルのpsedudocodeがあり、ごくまれにLispが使用されています。なぜか、おそらく伝統もわかりません。または、それはアルゴリズムにとってあまり良くないかもしれません。

もう1つの理由は速度です。これはGoogle Code Jamの問題ではありませんが、ほとんどすべてのコンテストで、2倍の速度ギャップは「承認済み」と「時間制限」の判定の違いです。
つまり、C ++の最適なアルゴリズムがRubyの10倍の速度で実行される場合、C ++の次善のアルゴリズムがRubyの優れたアルゴリズムよりも高速であることを意味する場合があります。また、O(n * logn)を達成できる場合、コンテストの作成者は通常、O(n ^ 2)の送信を許可しません。


7
あなたの類推についてのコメント:エスペラントはその目標に無残に失敗します。その音は、ほぼ正確にザメンホフのポーランド語の方言のものであり、その文法は不自然で複雑です。それは決して良い普遍的な言語ではありません。クリンゴン語は、多くの点で、自然な人間の言語のように見えるというより良い仕事をします。これにはC ++やJavaとの類似点があると思うかもしれませんが、それは不公平です:)(xibalba.demon.co.uk/jbr/rantoも参照してください。)
Antal Spector-Zabusky

1
@Antalさて、アナロジーには欠陥があるかもしれませんが、あなたは私の主張を理解しています。あなたと私の間では、エスペラント語も話せません :)
Nikita Rybak

(自然)言語は部族のメンバーシップのバッジであり、プログラミング言語は同じ圧力の多くの影響を受けます
台形

12

最初に、私はあなたの前提に疑問を投げかけます[編集:または私が前提とするもの-C ++とJavaを使用している競技者は同等にうまく機能します]。たとえば、Googleの最近のAIコンテストで、最初の100か所と最後の 100か所のエントリに使用された言語は次のとおりです。

代替テキスト

C ++とJavaを使用している競技者は、そのコンテストで同等に成功するほど近いところはなかったようです。Pythonを使用している競技者も特にうまくいくようには見えませんでしたが、かなり少ないので、その点についての結論は弱体化しました。

第二に、もちろん、(他の人が指摘したように)非常に多くの説明は間違いなく、各言語に精通している人々の数だけです。Lisp、Scheme、またはPrologを書いたことのある人の総数よりも、おそらく現在Javaのコースを受講している人の方が多いでしょう。

編集:私は3番目の可能性は単に汎用性だと思います。極端な例を選択するには、Prologは非常にされていくつかの問題に適していますが、同じように悪い多くの人に適しています。コンテストでそれらを使用するのに十分なほど1つまたは2つ以上の言語を習得できる人(または少なくともそうする人)はほとんどいないため、そのようなことに関心があるほとんどの人は、ほとんどすべての言語に適した言語を選択します。選択される可能性のあるすべての問題に特化した言語を学習しようとします。


1
さて、トップ参加者のほとんどがC ++ / C#を使用し、Python / Haskell / Lisp / Scheme / Ruby / Prologを使用する参加者は少ないようです。これにより、質問の前提が強化されますね。問題は、C ++とJavaを比較することではありませんでした(これは興味深いものですが、感謝します)。たとえば次のようなものです。(おそらく多くの言語を知っている)優れた競技者がこれらの1つを選択しないのはなぜですか。」しかし、親しみやすさが主な理由の1つであることに同意します。
ShreevatsaR 2010

私の印象(多分間違っている)は、C ++とJavaを使用している競技者がほぼ同じくらい成功していると仮定した質問でした。これは一部のコンテストでは当てはまるかもしれませんが、確かにこのコンテストではそうではなかったようです。確かにその数は少なかったが、Go、Haskell、Lua、CLを使用した競技者は、Javaを使用した競技者よりも成功しているように思われた(確かに、成功率の点では、C ++は確かに、少なくともこの特定のケース)。
ジェリーコフィン

5
私のnit-pickin 'を
許して

ああ。私は1時間理にかなったチャートを作るのに苦労してきました、そして私は進歩していません。ExcelとGoogleスプレッドシートは私を愚かに感じさせます。
Tatiana Racheva

Lispは技術的にはC / C ++マクロプリプロセッサとして使用できません...?C ++プログラムを提出したように見せることもできますが、実際にはLispでコーディングしました。
aoeu256

12

ほぼすべてのGoogle Code Jamラウンドで、C ++のより高性能な競技者コードの多く。

以下は、Google Code Jam 2012 Round 1A、1B、1Cの言語統計です(上から下に記載)。各ラウンドの出場者数は、それぞれ3,686人、3,281人、3,189人です。

Google Code Jam 2012 Round 1Aの言語統計 Google Code Jam 2012 Round 1Bの言語統計 Google Code Jam 2012 Round 1Cの言語統計


8

楽しい質問です。おそらくコミュニティwikiである必要があります。

国別のファイナリストの数を見てください:http : //www.go-hero.net/jam/10/regions。東ヨーロッパとロシアからの人々の数に注意してください。これらの場所には、さまざまな理由でJavaと同様に非常に強力なC ++コミュニティがあります。

修飾子の数の言語を見てくださいhttp : //www.go-hero.net/jam/10/languages/0と決勝戦:http : //www.go-hero.net/jam/10/languages/6。C ++は半分以下で始まり、ファイナルで75%を占めています。優れたプログラマーはC ++を好むか、C ++がプログラマーを作ります。おそらく、C ++をマスターする頃には、他のことはささいなことになります。

ただし、自分で結論を出すことは自由です。


5

まず、あなたが指摘C++したようにJava、主流の言語です。これらは自動的にプログラミング競技を始めた人々が最初に紹介されることを意味します- Lisp第一言語として学ぶ方法によって:)私はまたそのような競技に定期的に参加します-私C++は好きな言語ですが、競争に慣れていJavaます。それは別の言語を練習したいだけですJava-またC++少し冗長ではなく、より高速に実行されます。これはプログラミングの競争にとって重要です。今私のポイントに-人々は主流の言語の最初の専門家になります。プログラミングコンペに参加するには、使用している言語を十分に理解している必要があります。構造を忘れたなど、愚かなことをインターネットで検索する時間がありません。速度が重要な要素であるということです。使用するにはLisp競争では、あなたはそれが好きでなければなりません。そんなに多くの人がいるとは思いません。私が間違っていたら私を訂正してください。そして正直に言って、あなたが言ったような長所はバックトラックを単純化します:どの言語でもバックトラックは簡単です-メソッドを宣言し、すべての可能な結果に対してもう一度呼び出すだけです。それはもっと簡単なことではありません。私が使用している言語がプログラミング競技のために足をつまずかせようとしていることを今まで感じていません。


逸話の複数形はデータではないかもしれませんが、私は最初の言語としてSchemeを学び、私のイントロCSコースはHaskellでした。ただし、これは珍しいようであることに同意します。C/ C ++ / Java / Pythonが人気があるようです。
Wang

いい視点ね; これは問題の核心に達したと思います。頻繁に出てくることをするのに十分な練習をしているプログラマーにとって、他の言語には本当に大きな利点はありません。(そして、たとえば、Perlのテキスト処理機能など​​の機能は、これらのコンテストではほとんど使用され
ません

3

OMG ...人々はすべて統計と数字を通過しています!!

基本を忘れないでください。これらは、大学/学校の人々に教えられる(主に)2つの言語だけです...!

それは激しいラッシュに答えるかもしれません!


3

重要な理由は、すべてのコンテストがpythonやprologなどの言語をサポートしていないことです。特にACM ICPC World FinalsはC / C ++とJavaをサポートしています。また、TopCoderはC ++、Java、C#、VB、および現在のPythonのみもサポートしています。すべてのコンテストで利用できる1つの言語を選択するのは、当然です。別の理由は実行速度かもしれません。そして、はい、もう1つの理由は、これらの言語がほとんどの人が最初に学習する言語であることです。


2

大きなライブラリは、ACM ICPCにおけるJavaのセールスポイントでした。ランダムなデータ構造またはアルゴリズムが必要であり、それを標準ライブラリから取り出すだけであることがわかると便利です。


2

C ++はすべての競技者の中で過半数であるだけでなく、ラウンドが進むにつれて、そのパーセンテージが維持され、改善され続けることに留意してください。

参加者のほとんどが学生であることは事実だと思います(ただし、これはGoogleへの面接の機会があるオープントーナメントなので、参加する多くの人が卒業していることを考慮する必要があります)。しかし、最新のラウンドは、経験が豊富な人のみを対象としています。彼らは、C ++ / Javaでのコーディングを学んだばかりの学生ではありません。

もちろん、学生の主張は、LISPやOcaMLやProLogなどの言語に対しても有効です。それはAI分野で多く使用されている言語ですが、主流の世界では、学生がそれらを学習して使用する可能性が最も高いです。

google以外の大きなコンテストはいくつかの言語をサポートしていますが、それでもPascalや.netがJavaのレベルに近くない理由は説明されません(主要なコンテストイベントでも同様にサポートされる傾向があるため)。

これらのコンテストの優秀なコーダーの多くは、多くの言語を知っています。しかし、彼らはまだラウンド中にC ++を使用することを好みますが、それは最初に「学習されたC ++」よりも大きな理由があるはずです。

私はC ++やJava以外の言語が仕事のためのより良いツールであるという主張に反対します。ファイナリストがC ++とJavaを使用する可能性が高いと直接データが述べている場合、それはその主張に直接矛盾します。

Google AIの競争データは、コードジャムに関する前提と実際には矛盾しません。それは実際にそれが仕事のために本当により良いツールであるとき、トップコーダーがCommon Lispのような言語を使うことができることを実際に示します。このデータを使用して、CLISPがAIコンテストの優れたツールであると想定する場合は、C ++がGCJのようなアルゴリズム競技の優れたツールであると想定する必要もあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.