Почему программисты-конкурсанты используют С++ и Java?

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

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

Понятно, что участник конкурса должен использовать инструменты, которые лучше всего подходят для решения проблемы. Даже сборка x86 полностью завершена в Turing - это не оправдывает решение проблем с ней. В этом случае почему участники, которые используют менее распространенные языки, такие как Scheme/Lisp, Prolog и даже Python, значительно менее успешны, чем конкурсанты, которые используют C/С++ и Java? Слово по-другому, почему успешные конкурсанты не используют языки, которые, хотя могут быть менее распространены, являются, возможно, лучшими инструментами для работы?

Есть несколько мотивов моего вопроса. Самое главное, я хотел бы стать лучшим программистом - как в практическом аспекте, так и в аспекте конкуренции. После введения таких прекрасных парадигм, как функциональное и логическое программирование, не рекомендуется видеть, как многие люди отбрасывают их в пользу C/С++ и Java. Это даже заставляет меня подвергнуть сомнению мое восхищение указанными парадигмами, беспокоясь, что я не могу быть успешным программистом Lisp/Scheme/Prolog в соревновании по программированию.

Ответ 1

Отличный вопрос! Как кто-то, кто немного потрудился в программировании, я могу что-то сказать.

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

Теперь для некоторых ответов:

  • С++/Java более распространены, чем другие языки в реальном мире, поэтому вы ожидаете увидеть более высокую пропорцию в любом месте. (Но он еще выше среди участников конкурса.)

  • Многие из этих участников являются студентами или участвуют в конкурсах как студенты, а С++/Java - более распространенные "первые языки", которые учащиеся учатся. (Студенты-андерграды в эти дни могут начинать с Схемы, Хаскелла, Питона и т.д., Но более старшеклассники (часто самоучки) реже). На самом деле многие восточноевропейские участники по-прежнему используют Паскаль и более изумительны с ним чем остальные из нас будут когда-либо на любом языке.

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

  • Теперь вопрос в GCJ, где конкурсанты могут свободно выбирать язык, почему бы им не выбрать Python или Scheme? Наиболее важным фактором является то, что эти языки медленные. Конечно, для большинства программ реального мира они достаточно быстры, но для жестких циклов, которые часто участвуют в том, что программа запускается под n-секундным лимитом для всех тестовых случаев, эти языки не разрезают ее ни на один из алгоритмически более вовлеченные проблемы. (Проблема, предназначенная для принятия решений O (n log n), но не решений Theta (n 2) для C/С++, часто исключает даже оптимальные решения O (n log n) в более медленных языках. Раньше Java был помечен в USACO, я не уверен, что это все еще так.)

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Еще одна причина - скорость. Хотя это не проблема для Google Code Jam, почти во всех конкурсах 2x разрыва в скорости - разница между приговорами "Принято" и "Ограничение времени".
Другими словами, если оптимальный алгоритм в С++ работает в 10 раз быстрее, чем в Ruby, это может означать, что субоптимальный алгоритм в С++ все же будет быстрее, чем хороший в Ruby. Авторы конкурса обычно не хотят допускать представления O (n ^ 2), если O (n * logn) может быть достигнуто.

Ответ 4

Во-первых, я бы поставил под сомнение вашу предпосылку [edit: или то, что я принимаю, чтобы быть посылкой), что конкурсанты, использующие С++ и Java, имеют одинаковое значение]. Например, здесь, какие языки были использованы для записей, которые вошли в первые 100, а last 100 в недавнем конкурсе ИИ в Google:

alt text

Конкурсанты, использующие С++ и Java, по-видимому, не были так близки к одинаково успешным в этом конкурсе. Конкурсанты, использующие Python, тоже не очень хорошо себя чувствовали, хотя их было значительно меньше, что ослабило любые выводы в этом отношении.

Во-вторых, конечно, очень много объяснений (как указывали другие) - это, несомненно, просто количество людей, знакомых с каждым языком. Вероятно, сейчас больше людей ходят по курсу в Java, чем общее число людей, которые когда-либо писали какие-либо Lisp, Scheme или Prolog.

Изменить: я думаю, что третья возможность - это просто универсальность. Чтобы выбрать крайний пример, Prolog очень хорошо подходит для нескольких проблем, но в равной степени плохо подходит для многих других. Немногие могут (или, по крайней мере, делать) учиться более чем на одном или двух языках, чтобы использовать их в конкурсе, поэтому большинство людей, которые интересуются такими вещами, скорее всего, будут выбирать языки, которые могут работать разумно хорошо практически для любого, а не пытаясь изучить специализированный язык для каждой проблемы, которая может быть выбрана.

Ответ 5

Почти во всех раундах Google Code Jam больше кода более высокопроизводительных участников на С++.

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

Language Stats from Google Code Jam 2012 Round 1ALanguage Stats from Google Code Jam 2012 Round 1BLanguage Stats from Google Code Jam 2012 Round 1C

Ответ 6

забавный вопрос, вероятно, должен быть вики сообщества.

Посмотрите количество финалистов по странам: http://www.go-hero.net/jam/10/regions. заметьте количество людей из Восточной Европы и России. эти места имеют очень сильные сообщества С++, а также Java по ряду причин.

Посмотрите на числовые языки в квалификаторах: http://www.go-hero.net/jam/10/languages/0 и финалы: http://www.go-hero.net/jam/10/languages/6. С++ начинается меньше половины и имеет 75% в финале. либо хорошие программисты предпочитают С++ или С++ программистов. Вероятно, к тому моменту, когда вы освоите С++, другие вещи станут тривиальными.

Вы можете сами сделать свои выводы.

Ответ 7

Прежде всего, поскольку вы указали C++ и Java основные языки. Это автоматически означает, что люди, которые начинают делать конкурсы программирования, будут представлены им сначала - кстати, кто учится Lisp как первый язык:) Я также регулярно участвую в таких соревнованиях - я использую C++, чтобы конкурировать, хотя мой любимый язык Java. Просто я хочу попрактиковаться на другом языке, кроме Java - также C++ немного менее подробный и работает быстрее, что важно для соревнований по программированию. Теперь, по моему мнению, люди становятся экспертами в первую очередь на основных языках. Чтобы участвовать в соревнованиях по программированию, вы должны хорошо понимать язык, который используете. У вас нет времени искать в Интернете глупые вещи - вроде забыл конструкцию. Именно эта скорость является важным фактором. Чтобы использовать Lisp в соревновании, вы должны его любить. Я не думаю, что таких людей много. Поправьте меня, если я ошибаюсь. И, честно говоря, плюсы, о которых вы упоминали, упрощают обратное отслеживание: на любом языке обратное отслеживание легко - объявите метод и просто назовите его снова для каждого возможного результата. Это не могло быть проще. Я до сих пор не ощущал, что язык, который я использую, пытается поднять ноги для соревнований по программированию.

Ответ 8

Существенной причиной может быть то, что в каждом конкурсе не поддерживаются такие языки, как python или пролог. Специально ACM ICPC World Finals поддерживает C/С++ и Java. И TopCoder также поддерживает только С++, Java, С#, VB и теперь Python. Для участников естественно, что они выберут один язык, который доступен в каждом конкурсе. Другой причиной может быть скорость выполнения. И да, еще одна причина - это языки, которые большинство людей изучают в первую очередь.

Ответ 9

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

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

Это может ответить на тяжелый порыв!

Ответ 10

Большие библиотеки были точкой продажи Java в ACM ICPC. Это удобно для того, чтобы понять, что вы хотите создать какую-либо структуру данных или алгоритм, и просто вытащить его из стандартных библиотек.

Ответ 11

Имейте в виду, что С++ является не только большинством среди всех участников, но по мере продвижения раундов его процент просто сохраняется и продолжает улучшаться.

Я бы сказал, что это правда, что большинство участников - студенты (однако, поскольку это открытый турнир с шансами на собеседование с Google, тогда вы должны учитывать, что многие из тех, кто участвуют, окончились). Но последние раунды предназначены только для людей с большим опытом. Это не просто студенты, которые только что научились программировать на С++/Java.

Конечно, аргумент ученика также работает против таких языков, как LISP и OcaML или ProLog. Это языки, которые много используются в областях искусственного интеллекта, но в основном мире студенты, скорее всего, будут учиться и использовать их.

Большие конкурсы, кроме Google, поддерживают несколько языков, но это все равно не объяснит, почему Pascal или .net не находятся рядом с уровнем Java (поскольку они, как правило, одинаково поддерживаются в основных событиях конкурса).

Многие из лучших кодеров в этих конкурсах знают много языков. Но они по-прежнему предпочитают использовать С++ во время раундов, это должно быть по большей причине, чем сначала "выучить С++".

Я бы возразил против утверждения, что языки, отличные от С++ или Java, являются лучшими инструментами для работы. Если прямые данные говорят о том, что финалисты чаще используют С++ и Java, это прямое противоречие с этим утверждением.

Данные соревнований Google AI на самом деле не противоречат какой-либо предпосылке относительно замятия кода. Фактически это показывает, что топ-кодеры могут использовать языки, такие как Common LISP, когда это действительно лучший инструмент для работы. Если мы хотим использовать эти данные, чтобы предположить, что CLISP - отличный инструмент для соревнований по ИИ, то мы также должны предположить, что С++ - отличный инструмент для соревнований алгоритмов, таких как GCJ.