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


94

После участия в конкурсе 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 и т. д.). Однако ограничения по времени
выступления

11
У динамических языков огромная проблема с производительностью: см.
Тест

Для Topcoder это просто потому, что у них есть правило, запрещающее использование чего-либо, кроме стандартных библиотек Python, что делает невозможным все, кроме тривиальных задач. Ищете астероиды на космических снимках? Жаль, что вы даже не можете использовать NumPy.
Эндолит

Ответы:


69

Отличный вопрос! Как человек, который сам немного пробовал себя в соревнованиях по программированию, мне, возможно, есть что сказать.

[Давайте избавимся от стандартного заявления об отказе от ответственности: соревновательное программирование очень слабо связано с «программированием в реальном мире», и хотя оно проверяет алгоритмические навыки и навыки решения проблем, а также способность создавать быстрый, безошибочный рабочий код под нехватка времени, это не обязательно коррелирует со способностью создавать большие программные проекты, писать поддерживаемый код и т.д. (помимо того, что хорошо структурированные программы легче отлаживать).]

Теперь несколько ответов:

  • 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 или Scheme? Наиболее важным фактором является то, что эти языки медленные . Конечно, для большинства реальных программ они достаточно быстры, но для жестких циклов, которые часто используются для запуска программы ниже n-секундного лимита для всех тестовых примеров, эти языки не подходят ни для одного из алгоритмически более сложные задачи. (Задача, предназначенная для принятия решений O (n log n), но не решений (n 2 ) для C / C ++, часто исключает даже оптимальные решения O (n log n) на более медленных языках. Даже Java раньше имела затруднения в USACO; я не уверен, что это все еще так.)

  • Еще одним фактором являются библиотеки: C ++ и Java имеют лучшие библиотеки для часто используемых алгоритмов и структур данных (например, красно-черные деревья, next_permutation С ++), в то время как библиотеки Python (достаточно хорошие для реального мира) здесь менее полезны, а Prolog и Scheme ... Я не знаю об их библиотеках. Это относительно незначительный фактор, потому что эти программисты могут при необходимости писать свой собственный код. :-)

  • Универсальные мультипарадигмальные языки более полезны для того, чтобы просто выполнять задачи в рамках ограничений по времени конкурса, чем языки, которые навязывают вам какую-то философию или способ делать что-то. Вот почему, например, Пролог всегда будет оставаться непопулярным. (Общая философия: некоторые языки «разрешают» языки, которые позволяют вам делать что угодно, в том числе стрелять себе в ногу, некоторые «руководят», заставляя вас поступать правильно.) Вот почему C ++ в три раза популярнее, чем Java в целом среди участников конкурса и намного популярнее среди топ-участников. Поскольку код не должен читать кто-либо еще, вполне нормально и даже полезно иметь макросы цикла, такие какFOR(i,n)(меньше кода для ввода и, что более важно, меньше шансов сделать ошибку, когда вы спешите). Ничего против Java, есть несколько лучших программистов, которые тоже используют Java. :-)

  • Наконец, хотя многие из этих лучших программистов могут использовать C ++ / Java / Pascal в качестве «первого языка», они не очень хороши из- за своего языка, так что вам не нужно отчаиваться. Многие из этих же программистов выиграли соревнования, такие как соревнование ICFP, даже с намеренным использованием безумных языков, таких как сценарии оболочки, m4 (используется в autoconf) и ассемблер (команда под названием «Вы не можете писать великолепно без ASM»).


2
Согласен; как я уже сказал, существование библиотек - относительно очень незначительная проблема. Я могу удалить это, если вы думаете, что я преувеличил.
ShreevatsaR 01

2
То, что говорится о Java в предпоследнем пункте, не совсем верно. Многие из лучших участников GCJ используют Java.
NullUserException 02

1
[Другой участник финала («linguo») использовал Python, а в ходе конкурса использовал такие языки, как LOLCODE, Piet, FALSE, Whitespace и FRACTRAN!]
ShreevatsaR

4
Я просто хочу добавить немного о скорости. «Скорость» в соревнованиях, подобных GCJ, - это сложность кода во время выполнения (т.е. большой О). В 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 даже на более медленном языке в 400 раз (10 ^ 9/400 в секунду) займет всего 160 секунд, в то время как даже быстрый n ^ 3 займет 8000 секунд.
ShreevatsaR

14

Мне понравилась идея Джерри Коффина составить график участников конкурса Google AI, поэтому я взял все результаты и построил их (рассчитанное среднее значение, стандартное отклонение, а затем построил кривые нормального распределения в Excel).

С Lua и JS получил следующее:

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

Похоже, участники Java показали заметно худшие результаты, чем остальные, в то время как Go, Common Lisp и C оказались лучше остальных.


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

12

Почему мы все говорим на английском, а не на эсперанто ? Ну так уж вышло. Несмотря на то, что английский непоследовательный и раздутый, а эсперанто намеренно разработан как «лучший инструмент».

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

Еще одна причина - скорость. Хотя для Google Code Jam это не проблема, почти во всех соревнованиях двукратный разрыв в скорости - это разница между вердиктами «Принято» и «Ограничение по времени».
Другими словами, если оптимальный алгоритм в 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 мест в недавнем конкурсе Google AI:

альтернативный текст

Конкурсанты с использованием 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
Простите за придирку, но это действительно должна быть гистограмма, а не линейный график ...
цаман

О боже. В течение часа я изо всех сил пытался составить диаграмму, которая имела бы смысл, и у меня нет прогресса. Таблицы Excel и Google заставляют меня чувствовать себя глупо.
Татьяна Рачева

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

12

Почти во всех раундах Google Code Jam большинство наиболее эффективных участников кодируют на C ++.

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

Языковая статистика из Google Code Jam 2012, раунд 1A Языковая статистика из Google Code Jam 2012, раунд 1B Языковая статистика из 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на соревнованиях вы должны любить это. Я не думаю, что там так много людей. Поправьте меня, если я ошибаюсь. И, честно говоря, профессионалы, о которых вы упомянули, упрощают поиск с возвратом: на любом языке выполнить поиск с возвратом легко - объявите метод и просто вызовите его снова для всех возможных результатов. Нет ничего проще. До сих пор я не чувствовал, что язык, который я использую, пытается подставить мои ноги для соревнований по программированию.


Множественное число от анекдота не может быть данными, но я выучил Scheme как свой первый язык, и мой вводный курс CS был на Haskell. Я согласен с тем, что это кажется необычным: C / C ++ / Java / Python кажутся популярными.
Ван

Хорошая точка зрения; Я думаю, это касается самой сути дела. Для программистов, имеющих достаточно практики в выполнении часто возникающих задач, на других языках нет особой пользы. (И такие функции, как, скажем, способность Perl к обработке текста, редко используются в этих соревнованиях.)
ShreevatsaR, 01

3

OMG ... Люди все просматривают статистику и цифры !!

Давайте не будем забывать основы .. Это единственные два языка (в основном), которым учат людей в колледжах / школах ...!

Это могло бы ответить на тяжелый натиск!


3

Важной причиной может быть то, что все конкурсы не поддерживают такие языки, как python или пролог. Специально ACM ICPC World Finals поддерживает 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.