Вышло у меня с FallenGameR интересное обсуждение. Спором это назвать сложно, потому что в главном мы все же сходимся, но определенные разногласия имели место (в том числе и в комментариях к моему посту). Поэтому я решил, что нужно высказать свою точку зрения более развернуто, чем это обычно делается в комментариях.
Итак, язык программирования — это инструмент, с помощью которого создаются программы (да, я сегодня за К.О.). Как и всякий инструмент, он характерен тем, что:
- предназначен для решения определенного круга задач;
- имеет некое соотношение «удобство — сложность освоения — производительность труда — качество продукта».
Круг задач, решаемых с помощью инструмента, не является четко очерченным. Штыковая лопата замечательно подходит для изготовления небольших ям. Еще ей можно недурственно раскроить чей-то череп. Можно косить ею траву. Саперную лопатку можно метать на небольшие расстояния. При достаточном желании можно даже лопатой играть в большой теннис. Но все же первичная область использования, в которой лопата раскрывает свои лучшие качества, — копание ям.
Не кажется ли вам, что все религиозные войны вокруг современных языков программирования напоминают спор о том, чем лучше подметать плац — лопатой или метлой? Иной солдатик с помощью лопаты так лихо это делает, что никакой дворник с метлой не угонится. Значит ли это, что нужно всем переходить на лопаты?
Ладно, хватит аналогий.
Возьмем множество сферических программистов в вакууме. Для каждого языка программирования тогда будут более-менее соблюдаться следующие утверждения:
- время на изучение языка до определенного уровня = константа 0;
- удобство использования = (константа 1 для данного класса задач и языка)*sqrt(уровень владения);
- производительность труда = (константа 2 для данного класса задач и языка)*sqrt(уровень владения);
- качество результата = (константа 3 для данного класса задач и языка)*sqrt(уровень владения);
- прочие параметры по аналогии.
Полагаю, что достаточно здравого смысла, чтобы осознать справедливость этих утверждений. Например, повышение уровня владения языком позволяет повысить производительность труда. Но чем выше уровень владения, тем меньший эффект оказывает его повышение. Поэтому чтобы радикально повысить производительность для определенного класса задач, нужно просто выбрать другой язык, у которого «константа для данного класса задач и языка» будет выше.
Тем не менее, языки программирования развиваются, стремясь тем самым увеличить свои константы и стать универсальными. Да, было бы очень удобно изучить один язык, и решать любые возможные задачи только на нем. Но в действительности все не так гладко, как хотелось бы. Сейчас распределение примерно такое (классы задач могут пересекаться):
- системное программирование: ассемблеры, C, C++;
- высокопроизводительные вычисления: ассемблеры, C, C++;
- параллельные вычисления: C, C++, Erlang, C#, …;
- веб-приложения: PHP, Perl, Python, Java, Ruby, JavaScript;
- корпоративные приложения: C#, Java;
- массовые настольные приложения: C++, C#, Delphi;
- игры: С, С++, ActionScript, …;
- вспомогательные и встраиваемые сценарии: bash, Perl, Python, TCL, Lua, …
Этот список я брал более-менее из головы, но, думаю, недалеко ушел от истины.
Выучить такую прорву языков непросто, да и ненужно. Современный программист, если не привязан к конкретному классу задач, обычно выбирает два языка: один низкоуровневый, другой высокоуровневый, да такие, чтоб могли между собой взаимодействовать, чтоб были кроссплатформенные, и чтобы имели по возможности низкий порог вхождения и высокое все остальное. Возможно, есть смысл взять еще третий язык, скриптовый.
Хорошим примером такой связки может быть Python+C. Они оба в плане синтаксиса несложные, но при этом первый имеет мощную библиотечную поддержку, но нетороплив, а второй позволяет выжать из компьютера все соки, но писать на нем большие программы — та еще радость (хотя опенсорсники придерживаются иного мнения). На таком тандеме можно написать почти все что угодно. На Python — GUI и основную логику, на C — низкоуровневую реализацию. Бхай-бхай.
Другой вариант — путь обобщения. Будут развиваться универсальные языки, которые обеспечит разумный компромисс между упомянутыми выше константами. Это может быть C++0x, ускоренный Python, упрощенный Perl или даже потихоньку всплывающий из пучин и обещающий всех порвать Haskell. C# — сомневаюсь. LINQ и вообще стремление к декларативщине — хорошее направление, но будет непросто преодолеть стереотип C# → Microsoft → отсутствие кроссплатформенности.
Этот вариант плох тем, что, как ни крути, специализированный язык в своей области эффективнее универсального.
Какой путь выбрать? А хрен его знает. Решайте сами.




(Еще не оценили)
Loading ...