The most important thing in the programming language is the name. A language will not succeed without a good name. I have recently invented a very good name and now I am looking for a suitable language.
Donald Knuth
Выбор – всегда непростая штука. Если у нас нет альтернатив, мы чувствуем себя обреченными. Если приходится выбирать между двумя вариантами, мы боимся прогадать. А если мы интеллектуально развиты, способны видеть и даже создавать новые возможности? Тогда после мозгового штурма у нас разбегаются глаза от избытка альтернатив. Взвесить каждую, обмусолить, сократить-расширить список. Чем более важным представляется решение, тем сложнее его принять. На что опираться при выборе языка программирования?
Существует немало формальных методов сравнения. Языки программирования можно разбить по категориям и областям применения, проанализировать по составу базовых типов и функций, по парадигмам и замерам производительности (здесь и здесь), конструкциям языка и даже способам реализации программы Hello, world. Это проторенные дороги, которые, безусловно, способны обеспечить разумный выбор. Но сегодня хочется немного отойти в сторону от формальных методик и подойти к выбору языка с неформальной стороны.
Прежде всего, как рождается язык программирования? На каком-то этапе талантливый программист начинает понимать, что имеющиеся средства разработки его не устраивают. Он видит N новых задач и хочет решить их быстрее и эффективнее. Какой солдат не носит в рюкзаке маршальский жезл? Чем глубже знания разработчика и чем больше его амбиции, тем больше шансов на создание нового языка, способного изменить мир. В большинстве случаев, у будущего языка есть motto (девиз), олицетворяющий его предназначение. Вот несколько примеров:
Its design goals were for it to be compiled using a relatively straightforward compiler, provide low-level access to memory, provide language constructs that map efficiently to machine instructions, and require minimal run-time support.
There is more than one way to do it (TIMTOWTDI, usually pronounced “Tim Toady”) is a Perl motto. The language was designed with this idea in mind, so that it “doesn’t try to tell the programmer how to program”. This makes it easy to write extremely messy programs, but, as proponents of this motto argue, it also makes it easy to write beautiful and concise ones.
Python (интересно сравнить с Perl):
The Zen of Python has a principle which is the exact opposite of TIMTOWTDI: “There should be one—and preferably only one—obvious way to do it.”
“Write once, run anywhere”
Matsumoto has said his primary design goal was to make a language which he himself enjoyed using, by minimizing programmer work and possible confusion.
Особняком стоят функциональные языки программирования. На первый взгляд их “базовые ценности” выглядят порадоксальными, но только на первый взгляд:
The nearest thing Common Lisp has to a motto is the koan-like description, “the programmable programming language.” While cryptic, that description gets at the root of the biggest advantage Common Lisp still has over other languages. More than any other language, Common Lisp follows the philosophy that what’s good for the language’s designer is good for the language’s users. Thus, when you’re programming in Common Lisp, you almost never find yourself wishing the language supported some feature that would make your pogram easier to write, because, as you’ll see throughout this book, you can just add the feature yourself.
The FailFast philosophy is central to the Erlang Language - the Erlang motto is “just fail” and “let some other process do the error recovery” - this has been used in very reliable production systems with millions of lines of code.
There’s good reason that Haskell’s motto has long been “Avoid success at all costs.”
Безусловно, каждый язык программирования, который получил признание, со временем эволюционирует. В него добавляются новые возможности, новая функциональность. Один виток, другой – и незаметно текущее состояние языка начинает противоречить базовым предпосылкам его создания. Java: Write once, debug everywhere? Шутка. Тем не менее, девиз языка программирования помогает понять его дух, его предназначение. Дело в том, что разработчик – не робот, а human being. Он спотыкался, сталкивался с трудностями, совершал ошибки и… больше не хотел их совершать. Созданный им язык программирования – это квинтэссенция его опыта. Можно ожидать, что при выборе данного языка мы будем избавлены от трудностей и ошибок, которые разработчик не хотел допустить. По крайней мере, их должно быть меньше, чем в тех языках, где о подобных материях не задумывались :)
Что еще принять во внимание?
1. Опыт команды, кривая обучения новому языку, временные ограничения и бюджет проекта.
2. Среда разработки, наличие полезных библиотек, встроенные средства тестирования кода.
3. Конкурентные преимущества, которые может дать выбранный язык. Вот хороший пример: Paul Graham рассказывает о своих успехах, достигнутых благодаря языку Lisp.
4. Перспективы языка: насколько реалистично его дальнейшее развитие? Порой замечательный язык оказывается в тупике (пример с TCL/TK).
5. Функциональные особенности приложения. Будет ли оно взаимодействовать с другими приложениями? Каким образом? Через какие интерфейсы? На каких платформах?
6. Перспективы проекта: как он будет развиваться, какие задачи встанут в будущем.
Фу, заумные материи? Тогда можно поставить вопрос так: какой язык программирования поможет разработчику наилучшим образом проявить свои достоинства? Larry Wall, Randal Schwartz и Tom Christiansen выделяют три добродетели программиста: лень, нетерпение и высокомерие. Какие языки помогут команде реализовать ее лучшие качества? :)
Выбор сократился до двух вариантов? У каждого из них есть плюсы и минусы? Самое время бросить монетку. Орел или решка? С языком программирования никогда нельзя все просчитать заранее. Хороший пример: Derek Sivers, cоздатель СDBaby, предпринял попытку перейти с PHP на Ruby on Rails, проникся мощью нового языка и… вернулся обратно к PHP, обогащенный новыми идеями и подходами.
P.S. Rozetta Code – хрестоматия программирования. Есть задача или синтаксическая конструкция или алгоритм. Как их реализовать в том или ином языке? Отличный ресурс.
Хорошего выбора! Оставайтесь с нами.
P.P.S. Возможно, кому-нибудь пригодится: полезная идея для освоения иностранных языков.
Что такое качество программного обеспечения и как его улучшить: теория и практика, задачи и решения, подводные камни и обходные пути.