eao197 on the Web
Сайт Евгения Охотникова
[ Главная | Проекты | Описания | Об авторе ]

В поисках лучшего языка / Что хочется найти?

В поисках лучшего языка
Почему я ищу новый язык?
Что не так с C++?
Что хочется найти?
Прощай C++?
Связано ли это с SObjectizer?
Языки
Тестовые программы

Здесь я попытаюсь тезисно определить, что именно хочется иметь в языке, который будет заменой C++. Практически все критерии являются субъективными и обязательными. Но перечислены вовсе не в порядке приоритетов (поскольку приоритеты имеют свойство меняться с течением времени :) ).

Безопасный

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

С поддержкой исключений

Удобство и важность исключений для написания надежных и отказоустойчивых программ сложно переоценить. Не знаю, появляются ли сейчас языки без поддержки исключений, но раньше такое бывало. Тот же C++ -- я получил возможность использовать в нем исключения только где-то в 1995-96 годах. Причем под старыми Linux-ами были старые версии GCC, в которых были проблемы с перехватом исключений при использовании наследования.

Неотъемлемой частью поддержки исключений в языке должно быть наличие stack trace. Опять же, нет смысла менять C++, если в новом языке при возникновении исключения остается разводить руками при попытке отследить путь к месту его генерации. Тем не менее, даже в новом языке D, нет поддержки stack trace "из коробки".

Императивный

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

Во-первых, это связано с моими собственными умственными способностями. Несмотря на учебу на математическом факультете у меня большие проблемы с манипулированием математическими абстракциями. Это начало проявляться еще в школе -- я перестал понимать математику когда начались пределы и производные, поскольку не мог представить себе смысла этих сущностей. Что-то подобное происходит со мной при попытке освоить функциональные языки.

Во-вторых, не верится, что в обычных условиях программирование без побочных эффектов может быть эффективным. Например, в разработанном мной SMS-шлюзе используются списки транзакций. При возникновении каких-то событий эти списки или элементы этих списков модифицируются. Программирование без побочных эффектов подразумевает, что при каждой модификации нужно получать новую копию списка. Но как это может быть эффективно для списков, содержащих тысячи, а то и десятки тысяч элементов, и обновляются они сотни раз в секунду?

Отдельно стоят гибридные языки, сочетающие в себе императивный и функциональный подходы. Например, OCaml, Scala и Nemerle. Кто-то думает, что за ними будущее. Может быть. Пока, на мой взгляд, OCaml -- это функциональный язык с элементами императивности, а Scala и Nemerle еще слишком молоды и нестабильны.

Статически типизированный

Это требование возникло по двум основным причинам.

Во-первых, статически типизированные языки генерируют гораздо более быстрый код. Разница составляет порядки. А быстрый код мне необходим вследствии специфики работы.

Во-вторых, по моему мнению, статическая типизация выигрывает у динамической типизации при командной и длительной разработке. Поскольку, с одной стороны, описания типов в коде является дополнительным источником информации и таким образом облегчает обмен знаниями между членами команды. А с другой стороны -- компилятор берет на себя работу по проверке соответсвия типов.

Объектно-ориентированный

Я стал фанатом объектно-ориентированного подхода уже очень давно, может быть где-то в 1994. За это время я настолько привык смотреть на мир через призму ООП, что менять ООП на что-нибудь иное даже и не хочется. Тем более, что пока достойных и зарекомендовавших себя временем и проектами альтернатив не видно.

Хотя кто-нибудь может считать что функциональный подход более "правильный" и перспективный или что ООП смог зарекомендовать себя только в узком классе приложений. Но в своей приверженности ООП я следую старым поговоркам: "Коней на переправе не меняют", "Лучшее -- враг хорошего" и "Используй то, что под рукою, и не ищи себе другое". ;)

Кросс-платформенный

Так уж получилось, что мне пришлось программировать на разных платформах. Причем чем дальше, тем меньше можно было ориентироваться на какую-то одну платформу как на основную. В связи с этим я оценил, насколько выгодно писать кросс-платформенный код. Даже если это связано с несколько большими затратами, это оправдывается собственной свободой и мобильностью собственных программ.

Хочется, чтобы язык обеспечивал кросс-платформенность хотя бы на уровне C++. Вовсе не обязательно, чтобы кросс-платфоменным был результат компиляции (как в случае байт-кода JVM), достаточно кросс-платформенности на уровне исходного кода.

Переносимость языка связана как с наличием компиляторов на разных платформах, так и с наличием переносимых базовых библиотек. Хочется, чтобы не было зоопарка разных компиляторов, с разной степенью соответствия спецификации языка. А так же хочется, чтобы язык имел большую стандартную библиотеку, доступную на всех платформах. Гораздо побольше стандартной библиотеки C++, хотя и необязательно столь монстрообразное, как JDK или .NET Framework. Что-нибудь вроде Tango для языка D.

Быстрый

Чем быстрее и ближе по производительности к C++, тем лучше. А если быстрее C++ -- так вообще здорово.

В конце-концов, там, где скорость не важна, я могу спокойно программировать на Ruby.

Живой

Язык должен быть "живым и здоровым", т.е. его компиляторы и библиотеки должны регулярно обновляться. У языка должно быть нормальное community. Следствием чего долно являться наличие и стабильное пополнение количества доступных учебных материалов, документации, книг и интернет-ресурсов.

Недорогой

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

Но вполне устроит и вариант, когда язык оказывается бесплатным для обучения и использования в OpenSource проектах. Например, если он распространяется по лицензии GPL (как в случае с языком Eiffel).

Не играет роли, доступны ли исходные тексты компилятора и стандартных библиотек, если выполняются остальные требования по кросс-платформенности и жизнеспособности языка.

Несложный

Хочется, чтобы язык был проще, чем C++. В первую очередь интересует сложность в освоении языка и сложность в использовании.

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

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

Он просто должен мне нравиться

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

Хотя практика показывает, что это один из самых сложных критериев, в котором первое впечатление часто оказывается обманчивым. Например, C++, Ruby и Eiffel при первом знакомстве мне казались неудобными, но с течением времени мнение о них изменилось на прямо противоположное. С другой стороны, Scala и D поначалу производят благоприятное впечатление, которое ухудшается по мере их освоения.

Пожалуй, двумя примерами языков, которые мне никогда не нравились, являются Java и Perl :)

Мейнстрим или нет?

Мейнстрим (в лице Java и C#) -- это, конечно, заманчиво. Тот же C++ еще недавно был (а может и сейчас есть) самым настоящим мейнстримом, и это было хорошо.

Мейнстрим автоматически означает наличие инструментов, документации, книг, Internet-ресурсов. Да и просто знакомых с ним специалистов на рынке труда.

С другой стороны, когда все пользуются одними и теми же инструментами, за счет чего получать преимущества?

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

Так что Java и C# -- это скорее "вариант B", "запасной аэродром" на который можно будет в любой момент приземлиться, если не получиться найти чего-нибудь более привлекательного. В то же время хочется найти что-нибудь не очень далекое от мейнстрима, чтобы не иметь проблем с поиском библиотек для очередных новомодных "достижений" (коими стало повсеместное распространение XML и HTTP). Примерами таких не очень далеких от мейнстрима языков могут являться Ada95, Component Pascal, Eiffel, D, E, Nice и Scala (последние три за счет реализаций на основе JVM и интероперабельности с Java).

© 2007-2008 Е.А. Охотников
LastChangedDate: 2008-09-11 11:00:39
e-mail

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

Hosted by uCoz