четверг, 1 октября 2009 г.

[comp.prog.thoughts] Языки для быстрого и медленного программирования

Хочу развить комментарий тов.Skynin к заметке “Споры о языках программирования – не могу смолчать”:

...а я тут недавно сел, понадобилась утилитка работающая под "чистой" виндой, от вынь2к и выше, и что-то Си мне разонравился. Такие были хорошие воспоминания, и оказывается, на нем "крупу перебирать" хорошо, а не написать что-то непритязательное и быстро.
Тогда открыл VC++ - и вообще не понял ничего. Пока вывел строку wchar_t на экран...

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

На вершине холма стоят два быка – старый и молодой. Под холмом пасется стадо коров. Молодой бык говорит старому: “Давай мы быстренько-быстренько спустимся и вы*бем вон ту телочку!” Старый ему: “Нет…” Молодой опять: “Ну давай тогда мы быстренько-быстренько спустимся и вы*бем вон ту телочку!” Старый ему: “Нет…” Молодой снова: “Ну тогда давай мы быстренько…” Старый его прерывает: “Нет, мы сейчас спокойно, не торопять, спустимся, и вы*бем все стадо!”

Все молодые программисты, которых я видел, грешат одним и тем же: бросаются махать шашкой писать код не подумав толком что, как и зачем. Я и сам таким был. Это, наверное, нормальное явление – в молодости сил много, опыта мало, гормоны голос разума заглушают. У многих с возрастом и с проведенными в отладке и переделке ночами набитыми шишками это проходит. И это хорошо. Но сейчас я не об этом.

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

Первая группа не то, чтобы провоцирует быстрое программирование, но очень лояльно к нему относится. Это такие языки, как Pascal, Visual Basic, Java, Ruby, Python, D, Scala (наверное, в эту же категорию попадают и OCaml с F#, но не буду настаивать). Их характерными чертами являются:

  • отсутствие серьезных требований к знаниям языка программирования и его особенностей со стороны разработчика для получения работающего варианта программы;
  • отсутствие серьезных трудностей в поиске причин возникновения ошибок. Т.е., если программа, скажем, обратилась по нулевому указателю или вышла за пределы какого-то массива, то программист сразу об этом узнает – или в виде подробного стек-трейса, или в виде точного адреса, по которому элементарно определяется место возникновения ошибки. Т.е. эти языки бьют по рукам сразу и не больно;
  • многие из них предоставляют программисту возможность писать мало кода за счет различных видов “синтаксического” (и не только) сахара: автоматический вывод типов или динамическая типизация, foreach вместо циклов, лямбда-функции и пр.;
  • практически все они освобождают программиста от целого ряда проблем, как то: ручное управлению памятью, несовместимые компиляторы, разные системные API на разных платформах и т.п.;
  • для ряда из этих языков доступно большое количество уже готовых библиотек хорошего (на первый взгляд) качества на все случаи жизни. Иногда прямо в комплекте стандартной поставки.

Все это ведет к тому, что ужаленный в жопу загоревшийся идеей программист может сходу налабать что-нибудь работающее на Java/Scala/Ruby/Python, потратив 15 минут на изучение синтаксиса языка + 20 минут на чтение краткого описания библиотеки + 30 минут на набор текста и исправление нескольких ошибок (утрирую, но смысл точен). И, что характерно, решение получится действительно работающее. И не суть важно, что работающее медленно, отжирающее всю память, и с кучей постоянно возникающих ошибок. Важно, что результат есть.

Вторая группа языков (C и C++ в первую очередь) не препятствует ковбойскому быстрому программированию, но очень сильно и больно мстит программисту за это. Написали быстро программу с проходом по повисшему указателю или с выходом за пределы массива – получили периодические непредсказуемые падения и недели (в лучшем случае) увлекательной и изматывающей охоты за такими ошибками. Быстренько навставляли в программу классов из STL (стали возвращать std::string/std::vector и Co из функций по значению или передавать в параметрах по значению) – получился тормознутый и прожорливый монстр, много хуже, чем слепленный на Java аналог.

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

Ну и третья группа – это языки, которые не позволяют писать быстро. Они расчитаны на медленное, очень спокойное и вдумчивое программирование. В первую очередь, это язык Eiffel (а так же Ada, но на Ada я не программировал). Удивительно, но на Eiffel не получиться писать быстро (и мало) даже при очень большом желании. Тотальная объектная ориентированность + Design By Contract + принцип разделения command и query + особенности синтаксиса = мы сейчас спокойно, не торопясь, спустимся и…

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

Чтобы проиллюстрировать свою мысль о быстром и медленном программировании, покажу несколько примеров кода для решения одной несложной задачи. Вот ее решение на языке D 1.0 и на языке Nice (симпатичный язык для платформы JVM, по почивший к сожалению). Для людей, знакомых с C-подобными объектно-ориентированными языками в них не будет ничего особо сложного для восприятия. Обычный код. А вот, для сравнения, та же самая задача, но уже решенная на языке Eiffel.

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

Такие вот три группы языков. Наверное, еще нужно сказать, что если язык допускает быстрое программирование, то при работе с ним возникает некий драйв/фан – ты спешишь переложить в код свои сумбурные мысли, код быстро пишется, программа быстро начинает дышать, ты чувствуешь ее пульс, ты видишь, как она отзывается на твои действия, это заводит тебя, ты распаляешься все больше… Ничего подобного нет в медленном программировании – там есть только скучное продумывание разных вариантов, учет всевозможных граничных условий, размеренное и неспешное кодирование с документированием… Рутина! Ну да, заработало с первого раза, ну да, делает то, что задумано, ну да, ошибки находятся раз в полгода… Но кайф-то где? ;)

Что еще характерно: по мере перехода из стадии “водка, лодка и молодка” в стадию “кино, вино и домино” мои языковые предпочтения серьезно меняются. Если еще лет пять назад я на Eiffel смотрел с ужасом, то сейчас думаю, что лучше было бы спокойно и не торопясь писать на Eiffel-е надежный код, чем пытаться бежать по минному полю делать это же, но на C++…

PS. Я не упоминал в тексте такие языки, как PHP, Perl, C# и Haskell, поскольку никакого опыта работы с ними у меня нет. Подозреваю, что PHP и C# точно попадают в первую группу. Perl, наверное, во вторую. Куда отнести Haskell – я даже не знаю.

20 комментариев:

Skynin комментирует...

Все молодые программисты, которых я видел, грешат одним и тем же: бросаются махать шашкой писать код не подумав толком что, как и зачем.
Об этом высказался недавно тут:
Самые большие проблемы программирования
Оттуда: Мы с детства умеем говорить. В школе нас доучивают грамматике.
Но много ли способны написать интересное эссэ? Или небольшой но хороший стих?
Так вот чтобы "написать мысль", она должна вначале появится в голове.
А у большинства программистов — ее там нет. И нет желания ее туда поместить.

потому продолжу список "прегрешений", относящийся впрямую к теме:
грешат гонкой за быстродействием и экономией памяти, хотя в профессиональном программировании эти требования к ПО часто не входят в 5ку, а то и в 10ку обобщенных требований к программному продукту.

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

Уже лет 20 минимум 70%, а то и 90% программистов мира зарабатывают сопровождением и написанием программ на конечного заказчика. Индивидуальным пошивом и ремонтом так сказать. И другой пример что привожу молодым (и не очень ;) ) программистам: представь что ты нашел заказчика, который готов заплатить "тыщу" за твою программу и ждать от месяца до 5ти лет. Как ты будешь рассуждать - за 5 лет на ассемблере я напишу ему программу нужной функциональности которая будет крохотная и быстрая, или за месяц - толстую и медленную? Напомню - "тыща" в итоге. Полученная за месяц работы или за 5 лет ;)

Можно возразить, что это первые 5 лет, а потом я буду писать такие программы, на таком инструменте если не за месяц, то за 2. Только в профессиональном программировании почему-то не срабатывает. Как тратил ты время на поиск выхода за пределы памяти по указателю - так и будешь тратить. На борьбу с утечками памяти как тратил, так и будешь. Как тратил ты время на долботню с низкоорувневым API для "скорости" (вместо обертки в удобный интерфейс = утолщающий программу) - так и будешь тратить. И десятки библиотек тебе в этом почему-то не помогают.
То есть берем опытнейшего С++ника, со любыми существующими библиотеками универсального характера, и такого себе обычного 1Сника, просим написать складскую программу, за "тыщу", и считаем, сколько в день кто из них заработал ;)

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

Skynin комментирует...

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

В среде 1Сников нередок подход - оттестирует пользователь. Сурово, и некрасиво, но пользователь или его представитель не хочет платить за тестирование, за - надежность. (Мало того, это у Кента Бека и иже с ним в книжках заказчика можно привлечь к этапу разработки. В жизни - шиш с маслом.)

То есть даже надежность, безошибочность программы - такое же требование как и остальные, и предыдущие - скорость выполнения, затраты памяти. Не априорное, само собой разумеющееся, а стоящее - денег (= времени программиста).
(У Спольски есть статья, как они робота делали, чтобы сам, 100 километров проезжал и потерпели фиаско. А потом узнали что тот же заказчик был удовлетворен работой другой команды, сделавшей робота с проводом от розетки и с пультом ДУ)

Поэтому: При этом программист находится в твердой уверенности, что в его программе очень мало ошибок. Но кода будет написано на Eiffel-е, как минимум, в два раза больше, чем на C++.
В топку эту уверенность. Если, конечно, это не автопилот поезда метро, полносью заменяющего машиниста.
Объем кода на Eiffel, как минимум, в два раза больше объема кода на других языках.
В топку Eiffel, если заказчик не готов "в два раза" увеличить оплату или сроки.

то сейчас думаю, что лучше было бы спокойно и не торопясь писать на Eiffel-е надежный код, чем пытаться бежать по минному полю делать это же, но на C++…
Лучше - кому? Тыща - та же. ;)

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

Для того чтобы "спокойно и не торопясь писать" - нужно найти заказчика желающего именно вечную иглу для примуса.
Потому что заказчики уже стали понимать что еще быстрее чем они помрут, они откажутся от самого примуса в пользу микроволновки.
Говорят, DEC потому и умер, что давал - вечную гарантию на свое железо. А IBM - на 15 лет.

P.S.
От D отказался, перепробовав почти все средства разработки на нем. Это вообще эпопея :)
Остановлюсь наверное на Open Watcom. (wedit для lcc-win32 виснет на смешном моменте - при наборе точки или ->. Видать интелисенс пытается выдать поля структуры, и... неподъемный это труд. А если не использовать улучшения Си у lcc-win32, то зачем тогда он нужен?).

Кстати, вот и ответ в другую тему, нетбуки посбособствуют возврату нативных языков в программрование:
Нет, пока кроме С/С++ нет других языков. Компилятор и библиотека - это только фундамент, без IDE с интегрированным пошаговым отладчиком - ЯП уже массовым не станет. То есть им не будут всерьез пользоваться те самые 70-90% программистов.

А то что версии средств для разработки на D датированы серединой 2008го, наводит на мысль, что даже энтузиастам "не под силу". В этом у него проблема, а не в возможности написания кошмарического винигрета в виде выделения памяти в ручном режиме и управляемом сборщиком мусора. Кошмары пишут и на джаве, в виде программ из 10 "классов" с десятками статик методов и сотнями строк в каждом методе.

Skynin комментирует...

P.P.S. "в топку" конечно была шутка. Качаю EiffelStudio. Посмотреть надо на остальные возможности среды в целом.

Евгений Охотников комментирует...

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

А по поводу Eiffel -- с наскоку его не освоить, сразу предупреждаю. Тем более, что в Eiffel 6.4 появилась очень важная новая фича: void safety, о чем я хочу написать отдельно (но это требует времени).

Rubanets Myroslav комментирует...

2eao197
:) спасибо за подробное объяснение почему eiffel можно закопать :) Я то понимаю - сам к подобному пришел когда нужно было "0 ошибок", но ... это никому не нужно.
2Skynin
контсруктивнее надо писать.

Skynin комментирует...

2Rubanets Myroslav
Надо - кому?
И для поднятых вопросов что - "Eiffel за 24 часа" или "Факты и заблуждения профессионального программирования"?

Евгений Охотников комментирует...

2Rubanets Myroslav: аргумент "но это никому не нужно" хорошо бы использовать против апологетов хардкорной функциональщины. Которые ратуют за переход к Haskell-ям и Agda2 ради "correctness by construction" ;)

Skynin комментирует...

...не сложилось с Eiffel, смешное, что-то выдало, при предкомпиляции среды Type error: redeclaration has non-conforming signature. и т.д.
Сама среда тоже, "молодец", в "Мои документы" хочет сохранять проекты, а вот показать по русски, а не по "арабски" - не может. Проблемы с Unicode видать. 21ый век...

Но как понял, для создания неумираемых и безошибочных программ Eiffel Studio самое то, типа системы управления адронным коллайдером. Хотя 2 гига на диске заняла.

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

Мне же понадобилась консольная утилитка, с тремя командами и пятью опциями, которая понимала бы Unicode в именах файлов, не нуждалась бы ни в чем кроме Win NT API и вызывала некоторые его функции, законно отсутствующие в стандартной библиотеке.

Потратил вобщем-то несколько дней, на ознакомление, а что же появилось за последние 10 лет, вслед за С/С++. И... а ничего и не вызрело.
Осталось только GCJ попробовать, хотя последняя новость March 30, 2007
Ну и Дельфи конечно можно, эмберкадеровский поставить...

Знал бы шеф чем эти дни занимался, прибил бы :D

Евгений Охотников комментирует...

2Skynin: я EiffelStudio не запускал уже 2 года. Тогда это была версия 6.1 и работала нормально. Новых я уже не видел. Версия же 6.4 явно промежуточная, возможно очень сырая.

В том-то и беда, что если нужен быстрый, компилируемый, кроссплатформенный, промышленный язык, то список очень короткий получается: С/C++, Java, C#, Eiffel, Ada. И этот список уже лет десять не меняется (если не считать появления в нем C#). Есть еще маргинальные OCaml, Haskell, Scala и какие-то диалекты Lisp-а. Но это уже для определенных условий.

Евгений Охотников комментирует...

2Skynin: собрался таки с мыслями, чтобы ответить вам по существу. Хочется сказать три вещи.

1. На мой взгляд, вся эта неправильная система ценностей у начинающих (и не только) программистов от той же самой проблемы -- "давайте быстренько, быстренько спустимся и..." Отсюда и нежелание подумать о том, что же на самом деле является главным в конкретной задаче.

2. Расслоение и специализация у программистов становится все сильнее и сильнее. Если 1С-ники и PHP-ники могут себе позволить тестироваться на пользователях, то очень многие программисты не могут. Таких не мало: разработчики встраиваемого софта, разработчики платежных систем, телекоммуникационных систем, систем АСУТП и пр. Софт для ядерных реакторов -- это, конечно, утрирование, но есть очень немало софта, где качество и надежность отнюдь не пустой звук. А сроки реализации и стоимость заказов там неизменно снижаются. Поэтому, имхо, не очень правильно говорить о программистах и о подходах к разработке "вообще".

3. О разработке спокойно и неспеша. Это образное выражение. В любой области (будь то Web, 1C или телеком) разработку можно вести либо впопыхах, под лозунгом "быстрей, быстрей", либо спокойно и размеренно. При использовании, разумеется, соответствующих инструментов. Нет смысла лезть в нишу RubyOnRails с C++, или в нишу бухгалтерского софта с Eiffel. Но, если у нас есть система 24x7, которая требовательна к ресурсам и быстродействию, то ситуация между C++, Java и Eiffel не так очевидна. Как и затраты на разработку на том или ином языке. Не буду флеймить по поводу C++ vs Java. Но вот в борьбе C++ vs Eiffel ситуация не очевидна. Пусть Eiffel требует написать в два раза больше кода, зато этот код будет проще. А значит, в нем будет меньше ошибок. А значит он будет обходиться дешевле. В идеале, конечно. На практике все не так однозначно.

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

Skynin комментирует...

На мой взгляд, вся эта неправильная система ценностей
Я ни слова не говорил о моральной стороне. Программирование также подчиняется обычным законам производства и отношений - производитель-покупатель. Человечество сколько тысяч лет пользуется посудой из глины. И только немногие могли себе позволить заказать "вазы эпохи Мин". Не в горшечниках дело.

2. Дело не в расслоении. А все в том же спросе. И программисты на java - также поступают как 1Сники и phpисты. Аргументы базируются на рассуждениях в первом комментарии.

Софт для ядерных реакторов -- это, конечно, утрирование, но есть очень немало софта
Как раз - мало :) И мизерно количество пользователей такого рода софта. Основным заказчиком ПО является бизнес. И только когда бизнесу стало по карману - тогда программирование вышло из научных центров в промышленность. Самих же научных центров больше не стало. Кому пишут софт индийцы?

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

А значит, в нем будет меньше ошибок. А значит он будет обходиться дешевле.
Если будет, то бизнес оценит. Получить за те же деньги более надежный и быстрее продукт - любому приятно. С 70ых, когда программирование стало обслуживать бизнес за надежность пока платить не хочет. Как и обычные пользователи с - 80ых. Может быть сейчас, во времена финансового кризиса и затяжной рецессии(а то и началу прекращения гонки "роста") бизнес и пользователи обрадуются удорожанию разработки?

вот в борьбе C++ vs Eiffel ситуация не очевидна
Не скажу, не знаю. Точно могу утверждать для большинства программистов результаты этой борьбы не интересны. Ну примерно как OCaml vs Haskell.

не очень правильно говорить о программистах и о подходах к разработке "вообще".
Я и не говорил "вообще". А о минимум 70%, а то и 90% программистов мира. В первом комментарии.

есть и их не так мало
Это сколько, в процентах?

Но есть и совсем другие ситуации.
Есть и люди, научившиеся писать и рисовать ногами, потому что рук нет.

Скатываться на частности можно долго.

Кстати, по поводу анекдота. Телочки достаются молодым и шустрым. Но смысл там есть, и он в том, что старому быку все равно, трахнет он кого-то или нет. Он уже выше этих забот. Ему и так хорошо, и эдак.golypn

Евгений Охотников комментирует...

2Skynin:
>>На мой взгляд, вся эта неправильная система ценностей
>Я ни слова не говорил о моральной стороне. Программирование также подчиняется обычным законам производства и отношений - производитель-покупатель.

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

>>Софт для ядерных реакторов -- это, конечно, утрирование, но есть очень немало софта
>Как раз - мало :) И мизерно количество пользователей такого рода софта. Основным заказчиком ПО является бизнес.

Пользователей такого софта, как раз очень много. Подсчитайте количество людей, пользующихся телефонами, пластиковыми картами, покупающих ж/д и авиа билеты, пользующихся DVD-проигрывателями и т.д. Заказчиков такого софта мало, это да.

>>Но, если у нас есть система 24x7, которая требовательна к ресурсам и быстродействию,
>Такими системы занято крохотное число программистов. Я же говорил о том чем занято большинство программистов.
>>есть и их не так мало
>Это сколько, в процентах?

Наверное, проценты или даже доли процентов от общего числа. Но в количественном отношении это сотни тысяч разработчиков.

Сведение разговора к количеству процентов мне не нравится. Если 95% занимаются написанием кода с другими требованиями к качеству, нежели я, то мне как-то пофигу что и как они делают. Я на своей колокольне, я вижу, что происходит вокруг, в моем болоте. О том и пою.

Skynin комментирует...

Если 95% занимаются написанием кода с другими требованиями к качеству, нежели я, то мне как-то пофигу что и как они делают.
Знал бы что такой - и не писал бы ничего.

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

Евгений Охотников комментирует...

Слухи о том, как у других доходят даже до моей каморки :) Иногда это хорошие слухи, иногда не очень.

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

Rustam комментирует...

Все-таки очень корявая квалификация :)

Например OCaml формально да можно вроде легко сделать что-то "работающее" с нулевыми знаниями, но при этом получишь "программу на фортране" с синтаксисом окамла :)

А чтобы писать хорошо нужно преодолеть немаленький все-таки входной барьер.
И потом есть выбор писать быстро коряво и с большим объемом кода или медленно красиво и очень кратко.

Евгений Охотников комментирует...

2Rustam:
Все-таки очень корявая квалификация :)

Корявая квалификация или классификация? ;)

Rustam комментирует...

Надо в опере отключить проверялку синтаксиса :)
Корявая конечно классификация :)

Евгений Охотников комментирует...

Корявая конечно классификация :)

А мне нравится :)
Собственно, не суть важно, позволяет ли язык писать медленно, мало и красиво вообще. Поскольку очень многие языки (включая OCaml) позволяют это. Важнее то, можно ли безопасно написать быстро и коряво.

Вот в Java и Ruby -- можно. А в C++ -- нельзя. Коряво будет, а безопасно -- нет.

Rubanets Myroslav комментирует...

2Евгений Охотников
"да ну вы шо". Безопасно == придерживаясь "параноидального :)" code-style. Это зависит только от людей. Могу повторить :). Иногда при наличии жесткого фреймворка люди могут "сделать по образцу не задумываясь" но то что они делают не является новым. Они просто чуть расширяют уже протоптанные тропы.
Язык увы не помошник (пока). Я пробовал поковырять хаскель тк thesz очень его пиарит как "язык-помошник" и пока думаю что там тоже нужно много чего "не делать" чтобы оно работало.

Евгений Охотников комментирует...

2Rubanets Myroslav: в общем вы, конечно, правы. Но вот если брать совсем простые примеры, то станет понятно о чем я говорю, когда упоминаю "безопасность".

Вот, скажем, написал кто-то код на C++:

std::vector < MyType> v = ...;
size_t i = 0;
do {
...
if( ... )
v[ i ] = ...;
if( i == v.size() ) break;
else ++i;
...
} while( ... );

Или в стартовой функции какого-то потока:

void thread_func(...) {
try {
...
}
catch( const std::runtime_error & x ) {
...
}
}

Будут ли выявлены подобные ошибки при поверхностном тестировании -- вряд ли. Приведут ли они к понятным и предсказуемым сбоям во время работы -- вряд ли. Могут ли они привести к какой-нибудь порче данных -- запросто.

Тогда как в той же Java/Ruby ошибка будет обнаружене в runtime, программисту будет указано конкретное место ее возникновения и ничего запорчено не будет.