Блог пользователя 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://codeforces.me/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
  • Проголосовать: не нравится

Автор fedor.birjukov, 15 лет назад, По-русски
Неплохо было бы обобщить все дискуссии по поводу языков программирования и их использования на олимпиадах.

Я писал на многих языках программирования и в разных средах, на каких-то больше, на каких-то меньше, примерно в таком порядке:
QBasic, VBasic, VFoxPro, Pascal, среда Delphi, AS(скриптовой язык в Flash), (читал про C++ и яву) PHP+JS+css+xml+html+MySQL, C++, капельку на Java, курсовые на C#, немного на python, немного C++ с QT.

Pascal - очень простой язык для алгоритмизации и олимпиад. Для школьных олимпиад вполне подходит, потому что на них нужна производительность и скорость написания, а не наоборот.
C++ - после паскаля я советую использовать его на олимпиадах. Я люблю C++ больше всего за его "свободу", так сказать. Правда, из-за нее же и возникают всякие дискуссии о возможных ошибках, которые не отлавливаются компилятором и т.п. На нем можно написать одни и те же вещи по-разному. Это замечание годится почти к любому _си_-подобному языку. А почти все перечисленные языки _си_-подобные. Его или, хотя бы, о нем знают почти все. В стл есть много достаточно неплохих библиотек, но никто не запрещает написать все самому, как в паскале, например. Скорость программирования растет на C++, потому что многое можно записать намного короче, это, конечно, зависит от выбранного стиля, но такая возможность лежит прямо на поверхности.
Java - прочитав дискуссии о яве, которые уже есть на CodeForces, мне даже и не хочется писать на ней на соревнованиях, что бы там ни произошло, какая бы задача ни попалась. Пролистав пару книг по яве в свое время, я для себя понял, что ява классный язык, но он пригодится только для разработки и сопровождения больших проектов. Могу привести пару цитат о яве, они не противоречат моему мнению.
“Fine, Java MIGHT be a good example of what a programming language should be like.  But Java applications are good examples of what applications SHOULDN’T be like.”
(pixadel)

“Java is, in many ways, C++–.”
(Michael Feldman)
Больше цитат можно найти здесь: 101 Great Computer Programming Quotes.
C# - на нем я писал только курсовые и практические для студентов, рекомендовать для олимпиад не буду.
VB - на нем я писал очень давно и продолжать не горю желанием, потому что не помню синтаксис и не вижу преимуществ.
Python, PHP, ... - куча скриптовых и других языков с си-подобным синтаксисом. Не вижу смысла применять их на олимпиаде. Все они полезны/созданы для использования в разных ситуациях, т.е. более применимы в разных частях проектов для решения тех или иных задач.

Полный текст и комментарии »

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

Автор fedor.birjukov, 15 лет назад, перевод, По-русски
LAST UPD:
Календарь, сделанный мной, удален, потому что я нашел более удобное решение.
Darnley написал скрипт, который парсит расписание топ кодера и переводит в формат Google calendar. Пока скрипт работает корректно, будем надеяться, что это не изменится :)
Спасибо, Darnley.

Полный текст и комментарии »

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

Автор fedor.birjukov, 15 лет назад, По-русски
Пока что я почти не участвовал в соревнованиях на Top Coder. И сейчас исправляю ситуацию)
Когда я тренировался, то почему-то не участвовал в TC, потому что мне хватало других контестов, более похожих по стилю на школьную олимпиаду, да и времени на тренировки почти не было, потому что я учился в школе на отлично, а это тоже время...
У меня есть некоторое число вопросов по поводу TC) А еще пара общих вопросов к топовым участникам.
1) Как лучше писать в топкодере? Использовать плагины с этой страницы: http://www.topcoder.com/wiki/display/tc/How+to+install+The+Arena+plug-ins?showComments=true#comments  ? Или писать сразу в окне соревнования?
Мне интересно, пишите ли вы полную программу, в ней библиотеку, потом тесты к программе и тестите?
Или быстро набираете в стандартном редакторе библиотеку и там же тестируете?
2) Используете ли вы какие-либо заготовки?
Этот вопрос у меня не только про топ кодера, но и про другие соревнования, где люди сдают задачи с интервалом 3-5 минут? Разве возможно за 3 минуты прочитать и вникнуть в условие, придумать решение(даже если оно очень простое и видно сразу), закодить и отправить за 3 минуты с нуля?
3) Следовательно, вопрос об организации времени и своей работы. Не лучше ли начинать с задач, за которые дают больше баллов, а потом переходить к более простым?
4) Может быть у вас есть какие-то правила, рекомендации? Может общие советы для соревнований. И, в частности, отличия TC от других соревнований.
Вот такие вопросы.

UPD: Да, как лично вы подходите к различным соревнованиям и готовитесь к ним?

Полный текст и комментарии »

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

Автор fedor.birjukov, 15 лет назад, По-русски
В наши дни существует необычайной количество прекрасных книг о программировании, которые стали классикой, традиционными учебниками для программистов. Так что же все-таки стоит прочитать и в какой последовательности?
Сейчас я сам столкнулся с тем, что не знаю за что взяться, потому что количество книг, которые я хочу прочитать плавно перевалило за 20...
Вот, что рекомендует Санкт-Петербургский тренировочный центр:
  • Кормен, Т., Лейзерсон, Ч., Ривест Р., Штайн К. «Алгоритмы: построение и анализ».
  • Кнут Д. «Искусство программирования».
  • Шень А. А. «Программирование. Теоремы и задачи».
  • Керниган Б., Пайк Р. «Практика программирования».
  • Романовский И. В. «Дискретный анализ».
  • Уоррен Г. «Алгоритмические трюки для программистов».
  • Грехем Р., Кнут Д., Паташник О. «Конкретная математика».
  • Скиена С. С., Ревилла М. А. «Олимпиадные задачи по программированию. Руководство по подготовке к соревнованиям».
  • Меньшиков Ф. В. «Олимпиадные задачи по программированию».
  • Асанов М. О., Баранский В. А., Расин В. В. «Дискретная математика: графы, матроиды, алгоритмы».
  • Гасфилд. Д. «Строки, деревья и последовательности в алгоритмах».
  • Вирт. Н. «Алгоритмы и структуры данных».
Но есть еще много интересных книг, которые стоило бы почитать:
  • Роберт Седжвик «Фундаментальные алгоритмы на C++».
  • Steven Skiena "The algorithm design manual". Если честно, то именно эта книга и ввела меня в задумчивость. Потому что, немного просмотрев ее, я увидел какое-то сходство с творением Кормена (CLRS, «Алгоритмы: построение и анализ»).
  • И великое множество книг по математике. Ведь математика тоже очень полезна. Этот пункт тоже ввел меня в задумчивость. Литература по линейной алгебре и по аналитической геометрии. По высшей математике.
Чем больше список, тем больше он дезориентирует.
Поэтому я рекомендую всем остановиться для начала на списке тренировочного центра. Можно, конечно, добавить к нему Седжвика и еще одну книгу Стивена Скиены, только она полностью на английском.
Если смотреть только на первый список, то я могу определиться, что читать следующим. Но если добавить еще пару книг, то я в замешательстве.
Сложно добавить еще что-то к этому звездному составу. Книги по языкам программирования не в счет. Мне больше интересно, может ли кто-нибудь высказаться по поводу моих добавлений к списку. Потому что они сбивают меня с толку и я не могу взять наконец книгу и читать ее.
Если кто-то хочет, может высказаться о книгах и сказать, в каком порядке он советовал бы их читать.
Думаю, тем, кто собрался здесь, все эти книги знакомы. Но всегда есть люди, которые только начинают свое знакомство с программированием. В итоге, может получиться неплохое руководство.
Я, в свою очередь, рекомендую прочитать Кормена, "Конкретную математику" и Стивена Скиену. Ну и все остальное) Потому что все книги очень интересные. Правда, одни сложнее, а другие проще.

Полный текст и комментарии »

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

Автор fedor.birjukov, 15 лет назад, По-русски
Если честно, то это может сделать каждый иностранец на свой страх и риск: использовать Google Translate. Но он будет заранее знать, что в переводе могут быть и более простым и удобным решением для него будет не читать этот сайт вообще. На самом деле перевод в направлении русский английский и обратно у google довольно неплох. Перевод, например, с нидерландского на английский еще лучше.
В частности перевод можно улучшить грамотной расстановкой слов в исходном тексте, написанием более простых предложений или использованием таких фраз, которые хорошо и адекватно переводятся Google Translate автоматически. Меня, в частности, такой перевод очень устраивает. Он довольно неплох и очень быстр. Т.е. я предлагаю использовать Google Translate хотя бы для чернового перевода текста, сделать его работу неявной для глаз пользователей. Пользователь, который не будет переводить все самостоятельно будет с большим (б`ольшим) доверием, интересом смотреть на любые материалы сайта, комментарии, ему будет более комфортно. Да, просто скрывать иноязычные комментарии - тоже выход. Но, как я понял, современное общество идет к полному стиранию граней и барьеров, даже языковых. Свидетельство этому и это сообщество.
В качестве примера такого перевода можете зайти в мой блог и сравнить русскую и английскую версии или просто перевести любую страницу следующим образом:
1) Добавить в закладки эту ссылку English. Либо для перевода на русский с любого другого языка Russian.
2) Открыть какую-либо страницу и нажать на эту ссылку.
Но это не отменяет необходимости перевода полностью...
Просто со временем можно будет контроллировать его все больше, сохраняя перевод определенных фраз. Т.е., фактически, это более строгий контроль к тому, что и как ты пишешь. Игра по правилам русского языка, которая понятна и доступна переводчику.
И параллельно задаю вопрос:
Каждый, кто оставляет комментарий может перевести его на английский, если у него есть немного времени и комментарий не очень велик. Но как это сделать? Комментарий можно оставить на одном из двух языков, но не на обоих сразу. +Было бы неплохо ввести круг активных пользователей и дать им право писать предварительные переводы.
Хотя, на самом деле, то, что уже сделано, сделано очень качественно.

Полный текст и комментарии »

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