Блог пользователя fedor.birjukov

Автор fedor.birjukov, 15 лет назад, По-русски
Цель этой статьи: Пролить свет и обобщить многочисленные дискуссии о языках программирования. Она больше касается сферы соревнований по программированию, но я стараюсь писать мои замечания как можно более конкретно, улучшать и добавлять что-то в процессе своего развития и развития языков программирования. Сегодня 18ое апреля 2010го года.

 

Pascal (императивный, структурированный)

За: очень простой язык со строгим синтаксисом – прост для начинающих – на нем просто писать программы и отлаживать их.

Против: отсутствие стандартных библиотек (в сравнении с библиотеками C++ и Java).

 

C++ (поддерживает много парадигм(multi-paradigm) : объектно-ориентированное, обобщённое, процедурное, метапрограммирование)

За: STL (стандартная библиотека шаблонов) – много стандартных типов данных и алгоритмов. Большая “свобода” – можно реализовать одни и те же вещи по-разному. Хорошая производительность скомпилированного кода. Хорошая поддержка C++ сегодня.

Против: Отсутствие BigInteger и BigDecimal (они есть в библиотеках Java и C#). Возможны различные ошибки, вызванные непониманием между компилятором и программистом. Вы можете найти много тем об этом, но это не проблема языка. Но из-за очень большой свободы может быть сложнее писать и отлаживать программы на C++.

 

Java (объектно-ориентированный, структурный, императивный)

За: более строгий синтаксис, чем в C++ – более простое чтение кода – быстрая и простая отладка. Подсказки об ошибках и неиспользуемом коде. Очень много библиотек различного типа. Сборщик мусора. Новые возможности в последних версиях явы(пр.: вариации цикла for).

Против: Медленная работа программ (в 3-4 раза медленнее чем C/C++), длинный (постоянно длинный) код, но набор кода быстрый, потому что присутствует автодополнение.

Opinion of Petr: I think Java/C# (I don't see much difference between them except speed) are best suited for programming contests, since it's so much harder to make a mistake and so much easier to find and fix a mistake in a Java program than in a C/C++ program.

Much more strict type checking (implicit casts from long long to int and from int to bool??), out-of-range checking, code flow checking (allowing to read from uninitialized variables? why would a language allow that?), fantastic IDE which finds a lot of other mistakes for you, fantastically convenient debugging, more explicit syntax (a language with less power actually leads you to writing more readable programs), more explicit error messages (and the errors are always reproducible!) - to name a few advantages, but I've probably missed some more.

I think that writing correct programs and fixing them quickly when they're not correct far outweigh the disadvantages mentioned above (slower execution, longer programs). Even a 2x slowdown is almost never important in programming competitions, while a WA always is :) And I believe that most of the time at a programming contest is spent in thinking (including the thinking you do _while_ writing code), not in writing code, so the length of the program (or the typing speed, for that matter) is irrelevant.

And I believe the availability of various libraries is also not that important. So if I were to choose between C++ and Pascal, I'd choose Pascal because of the same argument (much more strict checking of everything).

Я не перевел мнение Петра, потому что оно намного лучше звучит на английском.

 

C# (поддерживает много парадигм(multi-paradigm) : объектно-ориентированное, обобщённое, процедурное программирование)

За: Быстрее чем Java. Стандартные библиотеки C#: в последней версии .NET присутствуют, как и в Java, классы для работы с длинной арифметикой, но теперь вы можете использовать их как переменные базовых типов: c=a+b, и т.п.

Против: Последняя версия .NET все еще не доступна на большинстве соревнований по программированию.

 

VB (процедурный, объектно-ориентированный, компонентно-ориентированный, событийно-ориентированный)

Отличие от C#: Язык программирования – Visual Basic, а не C#.

Мнение alliumnsk: VB.NET это всего лишь C# с синтаксисом Visual Basic, который был сделан, чтобы облегчить перенос программ, написанных на VB. Т.е. нет никаких причин думать о VB.NET.

 

Python (объектно-ориентированный, императивный, функциональный, аспектно-ориентированный)

Мнение _ph_:

За: Python - язык широкого назначения, на нем пишут практически любые типы программ, за исключением программ реального времени. Не случайно, питон - это официальный язык #3 в Google.

Python отлично подходит для решения не очень сложных задач благодаря краткости записи и наличию встроенных средств:

·         встроенная длинная арифметика (как целочисленная, так и дробная)

·         встроенные list (aka vector<>), set, dict, tuple (aka struct)

·         библиотека для работы с регулярными выражениями re

·         функция sorted() для любых последовательностей

·         удобные строковые операции

·         удобные конструкторы списков

·         функции sum(), max(), min(), способные обрабатывать списки и т.д.

Против: К недостаткам Python с точки зрения олимпиадного программирования относятся:

·         низкая скорость исполнения программ (в среднем проигрыш в 6 раз по сравнению с С++) и особенно медленный ввод-вывод (так что без специальных ухищрений 10^6 чисел даже прочитать за 1 сек. не успеешь)

·         мало удобных IDE (единственная нормальная, что я знаю, PyDev для Eclipse)

 

PHP и другие языки программирования.

Пока я не вижу никаких причин использовать их на соревнованиях. Если у вас есть возражения - пишите.

 

Заключение:

Лучше всего знать и практиковать как можно больше языков, учиться, знать все нюансы, но это не так просто и не всегда возможно. Мы – люди, и мы не можем изменить своей природы, но мы можем постараться стать лучше. Каждый язык программирования имеет свои преимущества и недостатки, и вы всегда можете выбрать один из них для более эффективного решения определенных разных задач.

Вы должны решить для себя, чего вы хотите: гибкости и свободы языка или простоты написания, чтения, отладки и сопровождения программ; нужна ли вам высокая скорость, или ей можно пренебречь.

Надеюсь, что эта статья помогла вам понять отличия разных языков программирования, самые основные их преимущества и недостатки.

 

Дополнительная и использованная информация:

Ссылки:

Lisp as an Alternative to Java: http://norvig.com/java-lisp.html

Выбор оружия - обсуждение: http://codeforces.ru/blog/entry/254

Выбор оружия 2 – обсуждение: http://mirror.codeforces.com/blog/entry/316

C#. Почему не моно? : http://codeforces.ru/blog/entry/229

Немного о C# и Linq: http://codeforces.ru/blog/entry/245

Тесты и сравнение производительности Java, C#, C++:

·         Умножаем матрицы (не читайте, если вы любитель Java)

Определения:

Pascal: http://en.wikipedia.org/wiki/Pascal_(programming_language)

C++: http://en.wikipedia.org/wiki/C%2B%2B

Java: http://en.wikipedia.org/wiki/Java_(programming_language)

C#: http://en.wikipedia.org/wiki/C_Sharp_(programming_language)

Visual Basic: http://en.wikipedia.org/wiki/Visual_Basic

Python: http://en.wikipedia.org/wiki/Python_(programming_language)

 

Ярлыки: java, c++, vb, c#, pascal, python, лучший язык, языки программирования.

 

Благодарности: MikeMirzayanov, Petr, alliumnsk, OSt, dAFTc0d3r, _ph_, Peteris, ktuan, SkidanovAlex, Nerevar, dev_il, valergrad и всем, кто принимал участие в обсуждении данной темы.

  • Проголосовать: нравится
  • +1
  • Проголосовать: не нравится

15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
"Basic is the default language."

What does it mean?
15 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится
я немножко попридираюсь :)

С++ не функциональный язык программирования. Haskell или Lisp - да, а С++ - нет.

возможно, Вы подразумевали под словом "функциональный" немного другое - а именно слово "процедурный"?
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Насколько я понимаю, С++ является multi-paradigm programming language, в том числе он (по большей части в c++0x) поддерживает некоторым образом и функциональную парадигму. 
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Ух ты, ниже-то целая дискуссия на эту тему :) Почитал...
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        та дискуссия, походу, загнулась уже...

        я не спорю, что С++ поддерживает функциональную парадигму "некоторым образом". таким, о которым сами создатели С++ (наверно) и не подозревали. но, чтобы хоть как нибудь по-нормальному использовать данную парадигму, нужно еще написать кучу вспомогательного кода. спасибо, я лучше на хаскелле пофункциональничаю...

        таким образом, я лично считаю, что теоретическая поддержка функциональной парадигмы не делает язык функциональным.
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Немного идет подмена понятий
Linq - это работа с данными, то есть все, что крутится вокруг интерфейся IEnumerable<>
В 90% это все, что выглядит так:
(from v in bla where bla let bla orderby bla select bla)
Хотя это не более чем украшение (очень удобное) над методами IEnumerable.

BigInteger в C# - это просто тип данных, он не имеет отношения к Linq
15 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
Питон незаслуженно оскорбили. Очевидно, вы на нем никогда не писали. Могу сказать, что функциональные языки ( в частности питон ) позволяют значительно более короткие и ясные программы, чем С.
На питоне ты не заморачиваешься со всякими низкоуровневыми операциями с данными, ты сразу пишешь алгоритм. В олимпиадном программировании имхо питон часто дает участнику громадное преимущество в скорости.
Минусы
- доступен не везде
- если важна скорость исполнения тривиальных операций ( типа считать большой объем данных, пробежаться по массиву и т.д. )
текущие версии питона показывают себя очень медленным языком.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    "функциональные языки ( в частности питон )" - м... С каких пор питон стал таковым? Он в лучшем случае мульти-парадигменный, действительно функциональная парадигма используется в Haskell, ML, O'camel и APL.
15 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
Функциональный язык - это Haskell или F# :о)
Я не спорю с тем, что питон в том числе и функциональный, но это не первичная его парадигма. Я думаю в первую очередь он ОО язык.
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Поправьте меня, если я ошибаюсь, но мне кажется, Пётр говорил о скорости C# vs. Java в контексте MS.NET vs. Sun JVM, что на Топкодере так и есть, а на других олимпиадах обычно используется Mono C#, который существенно медленее Sun JVM (см. shootout)
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Федор, такое впечатление, что ты не прочитал всего о чем писали на Codeforces. Код на Java хоть и длинный, но значительная его часть делается автозаполнением, так что в контексте олимпиад правильно было бы сказать "на Java неудобно писать без IDE". И еще, сборщик мусора в олимпиадах не имеет значения никакого.
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Еще про первый пост
А с каких пор С++ стал функциональным? Что именно в нем от функционального языка программирования?
  • 15 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    Я может буду грубоватым, но мне вообще непонятно, зачем писать "статьи" по теме, о которой имеешь очень смутное представление.
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Вообще, с++ конечно в доску императивный, но если рассмотреть отдельно "язык шаблонов", и как он используется для метапрограмирования (хоть и ущербного, но работающего), то вот его можно рассматривать как функциональный язык.
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    expression templates,

    boost::lambda

    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      ну уж если на то пошло, то на паскале и на жаве тоже можно написать либы, эмулирующие функциональный язык программирования. значит паскаль и жава - функциональные, что ли? оО

      стандартно функциональная парадигма то не поддерживается, однако всегда можно извратиться и переделать язык под другую парадигму. даже тоже хаскелль можно заставить быть императивным :D
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Покажите аналог expression templates в Java
        • 15 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          заметьте, я не говорил, что существует аналог. я говорил можно написать.

          в Java я почти 0, поэтому ничего не могу сказать по поводу существования. но, думаю, аналог expression templates соорудить там можно. возможно, и не в виде шаблоном вообще, а как нибудь извратно и не так изящно, как на С++, но можно.
          • 15 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            В любом языке можно соорудить интерпретатор другого языка. Только сам язык от этого не изменится. Тогда как тут речь идет о том, что компилируется.
            • 15 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              шаблоны не делают язык функциональным. это просто очень удачный инструмент для эмуляции в виде приема под названием "expression templates". Вы просто на основе шаблонов создаете объекты, эмулирующие поведение функционального языка. только для этого вам эти шаблоны нужно написать. разве это не написание интерпретатора?))
              • 15 лет назад, # ^ |
                  Проголосовать: нравится -6 Проголосовать: не нравится
                Нет. Я не буду дальше продолжать разговор с человеком, который не понимает разницы между интерпретатором и компилятором.
                • 15 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится

                  Unable to parse markup [type=CF_HTML]

                • 15 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится
                  блин... надо осторожнее быть в долларами :D

                  прошу прощения, возможно вы меня не так поняли:) но все же я хочу донести свою мысль до Вас так, чтобы стало понятно.

                  еще раз. вы пишете интерпретатор с какого-то условного языка C@ на язык C++, используя прием "expression templates". чтобы Вы опять не назвали меня дураком из-за неточного применения термина, назовем это лучше не интерпретатором, а ПРОМТ-переводчиком из C@ в C++.

                  тут что происходит... вы пишете на C@, ПРОМТ-переводчик переводит это все в С++, а потом (как вы и сказали) оно компилируется в машинный код. но ведь у вас же нет изначально ПРОМТ-переводчика!
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        >даже тоже хаскелль можно заставить быть императивным

        А без этого никуда. Если в языке ничего императивного нет, то даже вывести результат работы программы некуда :))

15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Сборщик мусора в Java — это на олимпиадах бывает не достоинство, а то, из-за чего бывает “в 3-4 раза медленнее, чем C++”.

В обычной олимпиадной программе нет замедления в 3-4 раза только из-за того, что она переписана с C++ на Java.

Решения простых задач на Питоне, хотя и медленно работают, быстро и понятно пишутся. Встроенная длинная арифметика в Питоне тоже есть, причём не в виде BigInteger.add (a, BigInteger.valueOf (3)), а в виде a += 3. Также на Питоне влёт пишутся простые генераторы тестов.
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    >Сборщик мусора в Java — это на олимпиадах бывает не достоинство

    А он вообще успевает запуститься за две-три секунды на тест? Хотя сборщик мусора замедляет работу, даже если и не запускается: из-за него компилятор не может класть значения куда угодно, а обязательно так, чтобы их потом GC мог найти.

    >“в 3-4 раза медленнее, чем C++”.

    А я вот только что проверил умножение матриц на 3 языках несколькими способами, и *самый быстрый* способ на Java оказался в ПОЛТОРА раза медленнее, чем *самый медленный* на Си++, и в ПЯТЬ раз медленее *самого быстрого* на Си++. *Самый простой* способ на Java -- и он же самый медленный в СЕМЬ с половиной раз медленее простейшего варианта на Си.

    >Встроенная длинная арифметика в Питоне тоже есть, причём не в виде BigInteger.add 

    Да перегрузка операторов есть почти во всех языках высокого уровня. Даже варианты паскаля можно найти с перегрузкой операторов. Это только Java так отличилась отсутствием.

    • 15 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится
      Перегрузка операторов тут непричем. В питоне длинная арифметика встроенная - тип long он как раз и соответствует "длинным" числам.
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      А какие способы умножения матриц тестировались? Никак, Штрассен тоже?
      Можно исходники глянуть?
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Зачем так волноваться из-за 2-3-4-кратного замедления работы программ на Java/C#?
      В 98% случаев (на нормальных олимпиадах) нет абсолютно никакой разницы и решения с одинаковой асимптотикой получают одинаковые вердикты.
      На NEERC, например, практически все авторские решения пишутся на Java и ни у кого это почему-то вопросов не вызывает
      • 15 лет назад, # ^ |
          Проголосовать: нравится +3 Проголосовать: не нравится
        Не вызывает, потому что Java самый медленный язык из используемых на NEERC. Если авторские решения пишутся на С++, то у участников пишущих Java вопросы возникают.
        • 15 лет назад, # ^ |
            Проголосовать: нравится +3 Проголосовать: не нравится
          На NEERC к подготовке задач относятся очень ответственно. И хотя бы одно авторское решение на Java для любой задачи всегда есть. Скачайте архив любого NEERC - там по несколько решений на Java для любой задачи.
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Для всех языков я подразумеваю использование их "родных" версий, т.е. идеальный случай.
Для C++ - GNU C++, для C# - MS.NET, для Java - Sun Java (JDK/JRE).
Нет, напротив, я все прочитал, может, не все дискуссии, но про автодополнение все и так понятно. Набирание кода программы и ее длина все-таки разные вещи, даже если набирать ее быстро.
Да, к сожалению, "потискать" C# я еще не успел(, поэтому о нем мог допустить ошибки в определениях, но суть та, что есть хорошие библиотеки и удобные "фичи".
Потом я еще подкорректирую и дополню текст.
Я сравнивал работу sort в C++ и, по-моему, Arrays.sort в java, а еще один из способов ввода информации, пока точно не могу его описать словами), с cin/cout в C++.
тот тест лежит здесь.
Программа явы отработала за 0.58 secs (49 total ticks), но, если я правильно понял, то ввод работал 93.9% от этого времени, на sort остается
А C++ (оптимизация -O2):
1) ср время ввода(ticks/1000): 150
ср время сортировки(ticks/1000): 42
2) с ios_base::sync_with_stdio(0);
ср время ввода(ticks/1000): 135
ср время сортировки(ticks/1000): 43
Этот тест я сделал навскидку, нормальный еще не перепровел, потому что хотел протестить еще и C#, но тогда сидел под линуксом - не было нормального C#, а сейчас на это времени пока нет + в яве очень много библиотек ввода-вывода, поэтому я не могу сказать, что то, что я написал вообще можно тестить или как-то воспринимать.
Про сборщик мусора: если он есть, то о мусоре уже можно не думать, хотя намного меньше контроля за оперативной памятью.
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Подсказка: на олимпиадах сортировать большие массивы не приходится никогда. А там где есть челлендж - особенно. Иначе кто-нибудь сунет median-of-3 killer, и 95% решений на Java упали.
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Если имеется в виду TopCoder, то там вообще большой массив - редкость:)) А на соревнованиях ACM ICPC достаточно часто возникает потребность отсортировать большой массив. Уж по крайней мере заявление, что этого не приходится делать никогда - неправда. Или уточните свое понимание "большого массива":))
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Вот там http://lurkmore.ru/Java раньше был код, где тестировалась сортировка массивов в 50*1024*1024 интов. Вот это я называю большими массивами.
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    1. В олимпиадных задачах о сборке мусора можно не думать вообще - утечки памяти нам простят.

    2. Программы на Си++ мусора не производят: я уже не помню, когда я в последний раз в олимпиадном коде на Си++ использовал ключевое слово new.

  • 15 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится

    1. В олимпиадных задачах о сборке мусора можно не думать вообще - утечки памяти нам простят.

    2. Программы на Си++ мусора не производят: я уже не помню, когда я в последний раз в олимпиадном коде на Си++ использовал ключевое слово new.

  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Непонятно, почему родной и идеальный случай, особенно под окошки — это GCC, а не Visual Studio.

    По поводу сравнения скорости кода, скомпилированного GCC и Visual Studio под виндой, могу сказать следующее. На олимпиадах и сборах обычно ставится Time Limit как двухкратное время работы самого быстрого из решений жюри (отдельно для Java, если это оправдано). На прошлых летних сборах в Петрозаводске у нас было аж три компилятора C++: MinGW g++ 3.4.2, экспериментальный MinGW g++ 4.4.0 и Visual C++, кажется, 2005. Ну и решения жюри на C++, по которым важно было поставить Time Limit, проверялись на всех трёх компиляторах. Так вот, быстрее с отрывом в несколько процентов бывали все три. Ну и случалась пару раз фигня, когда какой-то из компиляторов проигрывал раза в полтора. Почему — было сложно понять, это случалось на решениях жюри по 7-10 килобайт.
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Не ввод через iostream тому причиной?
      • 15 лет назад, # ^ |
          Проголосовать: нравится +3 Проголосовать: не нравится
        Сейчас сложно проверить, но не думаю. Если бы узким местом был ввод, а не решение, то переписывание ввода/вывода через cstdio ускорило программу под любым компилятором и позволило понизить TL. Вряд ли авторы решений этого не понимали.
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
а почему бы просто не тестить главный код в программе, т.е. не включать время ввода\вывода!?
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Это было бы просто шикарно. На топ кодере это очень классная идея(объектный подход и передача аргументов в функцию).
    • 15 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится
      И как результат - сложность поддержки широкого спектра языков. Дурное кодирование данных - например, двумерного массива в одномерный. Невозможность в программе использовать стека меньше, чем размер входных данных (это для С++, но на других памяти O(1) на больших данных уже не получится). Увеличенный порог вхождения - школьникам младших классов понятней как считать с консоли 2 числа, а не как написать класс Summator с методом add(int firstOperand, int secondOperand). Я уже не говорю, что мой мозг иногда содрогается от названий классов/методов/параметров.
      • 15 лет назад, # ^ |
          Проголосовать: нравится +3 Проголосовать: не нравится
        а зачем им писать класс ? .. у них будет шаблончик и им будет сказано вот в этом методе и пишете своё решение. Параметры методы - входные данные задачи. Думаю вполне устроило бы всех =)
15 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
Про Python (и другие скриптовые языки)
Никак не могу согласиться с такой категоричной фразой: "они узкоспециализированные. Нет никакого смысла использовать их на соревнованиях."

Во-первых, Python - самый что ни на есть язык широкого назначения, на нем пишут практически любые типы программ за исключением real-time. Не случайно, питон - это официальный язык #3 в Google.

Во-вторых, Python отлично подходит для решения не очень сложных задач благодаря краткости записи и наличию встроенных средств:
- встроенная длинная арифметика (как целочисленная, так и дробная)
- встроенные list (aka vector<>), set, dict, tuple (aka struct)
- библиотека для работы с регулярными выражениями re
- функция sorted() для любых последовательностей
- удобные строковые операции
- удобные конструкторы списков
- функции sum(), max(), min(), способные обрабатывать списки
и т.д.

К недостаткам Python с точки зрения олимпиадного программирования относятся: - низкая скорость исполнения программ (в среднем проигрыш в 6 раз по сравнению с С++) и особенно медленный ввод-вывод (так что без специальных ухищрений 10^6 чисел даже прочитать за 1 сек. не успеешь)
- мало удобных IDE (единственная нормальная, что я знаю, PyDev foк Eclipse)



  • 15 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    Спасибо, про питон исправлю. Больше нет никаких замечаний о нём?
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Не мог бы ты еще про Ruby написать в кратце? :о)
    • 15 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится
      А что там писать? Всё, что написано про Python, подходит, с несколькими поправками:

      -- Ruby, в отличие от питона, можно назвать красивым. Хотя бы назвать.
      -- Ruby несравненно тормознее. На Codeforces он успевает делать около 200к простых операций в секунду (слабо решить CBR4-D за квадрат на руби?).
      Питон, за исключением ввода-вывода, невероятно быстр для скриптового языка. Невероятно.

      Я ещё не пришёл к определённому мнению, но на контестах на Ruby, похоже, можно решать халяву, и, если наловчиться, даже быстрее, чем на других языках.

      Из больших плюсов -- отличные регэкспы (см. мои сабмиты CBR5-A, если отсортировать по размеру, их видно)
      Из больших минусов -- сложно дебажить


      Вообще, рекомендую ознакомиться с Ruby всем тем, кто ещё не знаком.
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А к чему такой срач? Разрешенные языки на ACM - C, C++, Java. Собственно выбор языка не является критичным для победы в финале. Вроде бы представители всех языков побеждали. В любых других случаях у всех инструментов есть свои плюсы и минусы и выбор осуществляется с учётом особенностей той или иной задачи.... Товарищи, о чём Вы тут спорите? :)
  • 15 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    Тут идут религиозные войны. Иначе это никак не объяснить.
15 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится
About other languages, "I don’t see any sense to use them at competitions" - this sounds almost like flame bait. You said pretty much the same thing about Python in your earlier post, but in this one you have radically revised your assessment. is it not possible that there are languages out there, which have useful features for contests that you are not aware of?

Other languages include languages like Ruby and Perl, which have pretty much a similar set of advantages/disadvantages as Python, and dismissing them all as "no sense to use them in contests" sounds rather harsh and uninformed. Perhaps revising that line to something a little less dismissive, or omitting it altogether might be a good idea?

Apart from that, this is really a great article. +1 for the effort.