Чому учасники змагань з програмування використовують C ++ та Java? [зачинено]


93

Після змагань та після цьогорічного конкурсу Google Code Jam я не міг не помітити неймовірну кількість [успішних] учасників, які використовували C / C ++ та Java. Розподіл мов, які використовуються протягом змагань, можна побачити тут .

Програмувавши C / C ++ протягом декількох років, я нещодавно закохався в Python за його читабельність / прямолінійність. Зовсім недавно я вивчив такі функціональні мови, як OCaml, Scheme і навіть логічні мови, як Prolog. Ці мови, безумовно, мають свої достоїнства, і, на мою думку, їх можна застосувати легше, ніж C ++ та Java для певних ситуацій. Наприклад, використання схеми call / cc схеми спрощує зворотний трекінг (інструмент, необхідний для відповіді на декілька проблем), а специфікація логіки Prolog, хоча і неефективна через характер грубої сили, може різко спростити (і навіть автоматично вирішити) певні проблеми, які важко вирішити обмотати мозок.

Зрозуміло, що учасник змагань повинен використовувати інструменти, які найкраще підходять для виклику. Навіть складання x86 Turing завершено - це не виправдовує вирішення проблем. У цьому випадку чому учасники, які використовують менш поширені мови, такі як Scheme / Lisp, Prolog і навіть Python, значно менш успішні, ніж учасники C / C ++ та Java? Сказано по-різному, чому успішні учасники змагань не використовують мови, які, хоч і можуть бути менш основними, але, напевно, кращі інструменти для роботи?

На моє запитання є кілька мотивів. Найголовніше, я хотів би стати кращим програмістом - і в практичному, і в аспекті конкуренції. Після ознайомлення з такими прекрасними парадигмами, як функціональне та логічне програмування, неприємно бачити, як багато людей відкидають їх на користь C / C ++ та Java. Це навіть змушує мене сумніватися у своєму захопленні згаданими парадигмами, переживаючи, що я не можу досягти успіху як програміст Ліспа / Схеми / Пролога на змаганнях з програмування.


11
Я думаю, швидкість виконання може бути фактором.
Закі

Цікаве запитання; було б непогано отримати відповіді від учасників, у Code Jam чи інших змаганнях (ACM тощо).
Часові

11
Динамічні мови мають величезну проблему з роботою: див. Орієнтир
NullUserException

Для Topcoder це суто тому, що у них є правило, яке забороняє використовувати що-небудь, крім стандартних бібліотек Python, що робить неможливим нічого, крім тривіальних завдань. Шукаєте астероїди на космічних знімках? Шкода, ви навіть не можете використовувати NumPy.
ендоліт

Відповіді:


68

Чудове питання! Оскільки хтось, хто сам поклопався в конкурсах програмування, я можу щось сказати.

[Давайте вийдемо зі стандартного відмови від відповідальності: конкурсне програмування лише слабко пов'язане з "програмуванням у реальному світі", і при цьому воно перевіряє алгоритмічні навички та навички вирішення проблем та можливість придумати швидкий робочий код без помилок у часовий тиск, це не обов'язково співвідноситься з можливістю створювати великі програмні проекти, писати постійний код тощо (за винятком того, що добре структуровані програми простіше налагодити).]

Тепер для деяких відповідей:

  • C ++ / Java також є більш поширеними, ніж інші мови в реальному світі, тому ви очікуєте, що ви побачите більшу частку в будь-якому місці. (Але це ще більше серед населення конкурсу.)

  • Багато з цих учасників є студентами або потрапляють на конкурси як студенти, а C ++ / Java є більш поширеними "першими мовами", які вивчають студенти. (Студенти з нижчими класами в ці дні можуть починатись із програми Scheme, Haskell, Python тощо), але рідше вчені (найчастіше самоучки) рідше.) Насправді багато учасників Східної Європи все ще використовують Паскаль і з цим дивуються. ніж решта з нас коли-небудь з будь-якою мовою.

  • Конкурси на рівні шкіл та коледжів зазвичай використовують ці мови. Міжнародна олімпіада з інформатики (IOI) дозволяє лише C, C ++ і Pascal (а може, це дозволяє Java зараз; я не встигла), а конкурс міжколегіального програмування ACM (ACM ICPC) допускає лише C, C ++ та Java. TopCoder дозволяє використовувати C ++, Java, C # і VB (дійсно: p); а останнім часом - Python. Отже, ви можете сказати, що "екологічна система конкуренції" має більше програмістів на C ++ / Java. Google Code Jam і IPSC є одними з небагатьох конкурсів, які дозволяють отримати код будь-якою мовою.

  • Тепер питання полягає в тому, що в GCJ, де учасники конкурсу вільні вибирати мову, чому б вони не обрали Python чи схему? Найбільш релевантним фактором є те, що ці мови повільні . Звичайно, для більшості програм реального програму вони досить швидко, але для жорстких циклів, які часто беруть участь у тому, щоб програма запускалася за межами n-секунди для всіх тестових випадків, ці мови не дозволяють скоротити її для жодної з алгоритмічно більше пов'язані з проблемами. (Проблема, розроблена для прийняття O (n log n) рішень, але не Θ (n 2 ) рішень для C / C ++, часто виключає навіть оптимальні рішення O (n log n) на більш повільних мовах. Навіть Java раніше не давали перешкод на USACO; я не впевнений, що це все одно.)

  • Ще один фактор - це бібліотеки: у C ++ та Java є кращі бібліотеки для часто корисних алгоритмів та структур даних (наприклад, червоно-чорні дерева, C ++ - next_permutation), тоді як бібліотеки Python (досить хороші для реального світу) тут менш корисні, а Prolog та Scheme ... Я не знаю про їхні бібліотеки. Це порівняно незначний фактор, оскільки ці програмісти можуть писати власний код при необхідності. :-)

  • Багатомовні парадигми загального призначення є більш корисними для того, щоб просто виконати справи протягом обмежених строків змагань, ніж мови, які змушують філософію чи спосіб робити на вас справи. Ось чому Prolog завжди залишатиметься непопулярним, наприклад. (Загальна філософія: деякі мови "дозволяють" мовам, які дозволяють вам робити що завгодно, включаючи стрілянину в ногу, деякі "спрямовують", що змушує вас робити все правильно. Java в цілому учасників конкурсу та набагато популярніша серед найкращих учасників конкурсу. Оскільки код не повинен читати ніхто інший, це нормально і навіть корисно мати макроси циклуFOR(i,n)(менше коду для введення, а ще важливіше менше шансів зробити помилку, коли поспішає). Нічого не проти Java, є кілька топ-програмістів, які також використовують Java. :-)

  • Нарешті, хоча багато хто з цих топ-програмістів можуть мати C ++ / Java / Pascal як свою "першу мову", вони не є гарними через свою мову, тому вам не доведеться впадати у відчай. Багато цих самих програмістів вигравали такі конкурси, як конкурс ICFP, навіть навмисно використовуючи шалені мови, такі як сценарії оболонки, m4 (використовується в autoconf) та збори (команда під назвою "You Can't Spell Awesome Without ASM").


2
Я згоден; як я вже говорив, існування бібліотек є відносно дуже незначним питанням. Я можу його видалити, якщо ви думаєте, що я завищив його.
ShreevatsaR

2
Це трохи про Яву в останній до останньої точки кулі не зовсім вірно. Багато хто з найкращих учасників GCJ використовують Java.
NullUserException

1
[Інший учасник фіналу ("лінгво") використовував Python, і через змагання використовував мови, включаючи LOLCODE, Piet, FALSE, Whitespace та FRACTRAN!]
ShreevatsaR

4
Я просто хотів би трохи додати частину швидкості. "Швидкість" у змаганнях типу GCJ - це складність виконання коду (тобто big-O). У GCJ зазвичай правильний алгоритм приймається навіть у повільній мові (отже, існує багато прийнятих подань Python), тоді як повільний алгоритм буде вічно навіть у ASM. Винятки є, але, якщо ви користуєтесь правильним алгоритмом / технікою, ви безпечні навіть при повільній мові.
MAK

1
@EvgeniSergeev Те, що ви говорите, справедливо для більшості конкурсів програмування, таких як IOI / TopCoder, але конкретно в GCJ, часові обмеження зазвичай складають 8 хвилин для великого вводу, а проблеми, як правило, розроблені так, що рішення Python можуть також проходити. Ще 10 років тому правило великого пальця становило ~ 10 ^ 9 "простих" операцій в секунду, тому, наприклад, для відрізнення O (n ^ 2) від Ω (n ^ 3), нам просто потрібно n ^ 2 <10 ^ 9 * 60 * 8 <n ^ 3, або приблизно 8000 <n <692000. Ви можете взяти n = 20000, а n ^ 2 algo навіть у 400х повільнішій мові (10 ^ 9/400 за с) займе лише 160 секунд, тоді як навіть швидкий n ^ 3 займе 8000 секунд.
ShreevatsaR

14

Мені сподобалась ідея Джеррі Коффіна, щоб побудувати учасників конкурсу Google AI, тому я взяв усі результати та накреслив їх (обчислив середнє значення, стандартне відхилення, а потім зрозумів звичайні криві розподілу в Excel).

З Lua та JS отримали:

Без (учасників було небагато, тому, можливо, результати перекошені):

Схоже, учасники Java помітно гірші за решту, в той час як Go, Common Lisp і C на кращому кінці.


Однак питання, яке задається про Jam Code Jam, а не про конкурс Google AI (ваша відповідь - це перше місце, про яке я чую), тому може бути більш релевантним скласти ці графіки для Google Code Jam. Насправді, питання вже згадує таку статистику (2010 р.) ; див. також 2011 , 2012 , 2013 та 2014 роки (зараз триває) .
ShreevatsaR

12

Чому всі ми розмовляємо англійською, а не есперанто ? Ну, просто так сталося. Навіть незважаючи на те, що англійська мова є непослідовною та роздутою, і есперанто навмисно розроблено як «кращий інструмент».

Таким чином, одна причина - це традиція. У більшості шкіл програмування все ще викладають на C / C ++, Java, Pascal або навіть Basic. І беруть участь у конкурсах переважно студенти, які обирають мову, яку вони краще знають.
Також можна помітити, що більшість алгоритмічних книг мають псевдокод у стилі Паскаль чи Ада, а дуже рідко - Лісп. Не знаю чому, можливо, теж традиція. А може, це просто не так добре для алгоритмів.

Ще одна причина - швидкість. Хоча Google Code Jam не є проблемою, майже у всіх змаганнях 2x розрив у швидкості є різницею між рішеннями "Accepted" та "Time Limit".
Іншими словами, якщо оптимальний алгоритм в C ++ працює в 10 разів швидше, ніж у Ruby, це може означати, що неоптимальний алгоритм в C ++ все одно буде швидшим, ніж хороший в Ruby. А автори конкурсу зазвичай не хочуть дозволити подання O (n ^ 2), якщо O (n * logn) можна досягти.


7
Лише коментар до вашої аналогії: есперанто невдало провалюється у своїх цілях. Її звуки є майже такими, як звук польського діалекту Заменгофа, а його граматика неприродна і складна. Це жодним чином не є доброю універсальною мовою; Клінгсон багато в чому робить кращу роботу, схожу на природну людську мову. Можливо, я можу стверджувати, що в цьому є подібність до C ++ та Java, але це було б несправедливо :) (Див. Також xibalba.demon.co.uk/jbr/ranto .)
Antal Spector-Zabusky,

1
@Antal Ну, аналогія може бути помилковою, але ви зрозумієте мою думку. Між вами і мною я не розмовляю на есперанто :)
Микита Рибак

(природна) мова - це знак племінної приналежності , і на мови програмування впливає багато однакових тиск
трапеція

12

По-перше, я б поставив під сумнів ваше приміщення [редагувати: або що я вважаю передумовою - що учасники, які використовують C ++ та Java, приблизно однаково добре]. Наприклад, ось які мови використовувались для записів, які з’явилися на перших 100 місцях та останніх 100 місцях у недавньому конкурсі AI від Google:

alt текст

Учасники змагань, що використовують C ++ та Java, не здаються близькими до однаково успішних у цьому змаганні. Учасники змагань, які використовують Python, теж не виглядають особливо добре, хоча їх було значно менше, що послаблює будь-який висновок з цього приводу.

По-друге, звичайно, надзвичайно багато пояснень (як уже вказували інші) - це, безсумнівно, лише кількість людей, які знайомі з кожною мовою. Зараз, мабуть, більше людей проходять курс навчання на Java, ніж загальна кількість людей, які коли-небудь писали будь-які програми Lisp, Scheme або Prolog.

Редагувати: Я думаю, що третя можливість - це просто універсальність. Щоб вибрати крайній приклад, Prolog дуже добре підходить до кількох проблем, але однаково погано підходить для багатьох інших. Мало хто може (або принаймні зробити) вивчити більше однієї або двох мов, достатньо добре, щоб використовувати їх у конкурсі, тому більшість людей, які цікавляться такими речами, швидше за все, виберуть мови, які можуть працювати досить добре майже для чого завгодно, а не намагання вивчити спеціалізовану мову для кожної обраної проблеми.


1
Що ж, здається, що більшість найкращих учасників використовували C ++ / C #, і менша кількість з них використовувала Python / Haskell / Lisp / Scheme / Ruby / Prolog, що посилює передумови питання, чи не так? Питання полягало не в тому, щоб порівнювати C ++ та Java між собою (хоча це цікаво, дякую), а щось на кшталт: "Чому" приємні "мови менш успішні вгорі? Чому б хороші учасники (які, мабуть, знають багато мов) не вибрали одну з них? " Але я згоден, що знайомство - одна з головних причин.
ShreevatsaR

Моє враження (можливо, помилкове) полягало у тому, що питання передбачало, що учасники, які використовують C ++ та Java, виявилися однаково успішними. Це може бути правдою в деяких конкурсах, але, звичайно, не було цього. Хоча, безумовно, правда, що їх було менше, учасники, які використовують Go, Haskell, Lua та CL, здавались більш успішними, ніж ті, хто використовує Java (хоча, правда, за рівнем успішності C ++, безумовно, домінував, принаймні у конкретний випадок).
Джеррі Труну

5
Вибачте мою ніт-пікіровку, але це справді має бути гістограма, а не лінійний графік ...
tzaman

О Боже. Я намагаюся скласти графік, який має сенс протягом години, і я не прогресую. Електронні таблиці Excel та Google роблять мене дурним.
Тетяна Рачева

Неможливо Lisp технічно використовувати як C / C ++ макропропроцесор, хоча ...? Ви можете зробити так, що ви подали програму на C ++, але насправді ви зашифрували в Lisp!
aoeu256

12

Майже у всіх раундах Google Code Jam більшість найефективніших кодів учасників в C ++.

Нижче наведені мовні статистичні дані з Google Code Jam 2012, раунд 1A, 1B та 1C (перераховані згори донизу). Кількість учасників у кожному турі - 3 686, 3 281 та 3189 відповідно.

Мовна статистика з Google Code Jam 2012, раунд 1А Мовна статистика з Google Code Jam 2012, раунд 1Б Мовна статистика з Google Code Jam 2012, раунд 1С


8

цікаве питання, напевно, має бути вікі спільноти.

Перегляньте кількість фіналістів країн: http://www.go-hero.net/jam/10/regions . помітити кількість людей зі Східної Європи та Росії. в цих місцях є дуже сильні спільноти C ++, а також Java з ряду причин.

подивіться на мовах номерів у кваліфікаціях: 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у змаганнях ти мусиш полюбити це. Я не думаю, що там так багато людей. Виправте мене, якщо я помиляюся. І чесно кажучи, плюси, про які ви згадали, спрощують зворотний трек: На будь-якій мові зворотний трек є легким - оголосіть метод і просто зателефонуйте ще раз для кожного можливого результату. Це не могло бути простішим. Я досі не відчував, що мова, якою я користуюся, намагається піднятися на ноги для змагань з програмування.


Множина анекдоту може не бути даними, але я дізнався Схему як свою першу мову, і моє вступне курси CS було в Haskell. Я згоден, що це здається незвичним: хоча C / C ++ / Java / Python, здається, є популярними.
Ван

Гарна думка; Я думаю, що це потрапляє до суті справи. Для програмістів з достатньою практикою робити те, що часто виникає, в інших мовах немає великої користі. (І такі функції, як, скажімо, здатність Perl для обробки тексту рідко
корисні

3

OMG ... Люди все проходять статистику та цифри !!

Не забувайте про основи. Це єдині дві мови (в основному), які викладають людям у коледжах / школах ...!

Це може відповісти сильному поспіху!


3

Важливою причиною може бути те, що кожен конкурс не підтримує такі мови, як python чи prolog. Спеціально для світових фіналів ACM ICPC підтримуються C / C ++ та Java . І TopCoder також підтримує лише C ++, Java, C #, VB і тепер Python . Цілком природно, що учасники конкурсу обирають одну мову, доступну для кожного конкурсу. Іншою причиною може бути швидкість виконання. І так, ще одна причина - це мови, які більшість людей вивчають першими.


2

Великі бібліотеки були продажем для Java в ACM ICPC. Це зручно, щоб можна було зрозуміти, що ви хочете отримати якусь випадкову структуру даних або алгоритм, і просто витягнути їх із стандартних бібліотек.


2

Майте на увазі, що C ++ - це не лише більшість серед усіх учасників, але по мірі проходження турів, його відсоток просто продовжує і постійно покращується.

Я б сказав, що це правда, що більшість учасників є студентами (Однак, оскільки це відкритий турнір, який має шанси на співбесіду з google, то вам доведеться врахувати, що багато хто з учасників закінчив). Але останні раунди призначені лише для людей з тоном досвіду. Вони не просто студенти, які тільки навчились кодувати на C ++ / Java.

Звичайно, аргумент студента також працює проти таких мов, як LISP та OcaML або ProLog. Тобто мови, які багато використовуються в районах ШІ, але в основному світі студенти, швидше за все, навчаються та користуються ними.

Великі конкурси, окрім програми Google, підтримують декілька мов, але це все ще не пояснює, чому Pascal або .net не на рівні Java (оскільки вони, як правило, підтримуються в основних змагальних змаганнях).

Дуже багато кращих кодерів на цих конкурсах знають багато мов. Але вони все ж вважають за краще використовувати C ++ під час раундів, це має бути з більшої причини, ніж спочатку "засвоїли C ++".

Я заперечую проти твердження, що інші мови, крім C ++ або Java, є кращими інструментами для роботи. Якщо прямі дані говорять про те, що фіналісти скоріше використовують C ++ та Java, це прямо суперечить цій заяві.

Дані конкуренції Google AI насправді не суперечать жодній передумові щодо обмеження коду. Це насправді показує, що топ-кодери можуть використовувати такі мови, як Common Lisp, коли це справді кращий інструмент для роботи. Якщо ми хочемо використовувати ці дані для того, щоб припустити, що CLISP - це чудовий інструмент для змагань з інтелектуальної власності, тоді ми також повинні вважати, що C ++ є чудовим інструментом для змагань з алгоритмів, таких як GCJ.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.