December 31st, 2007

Священная война

 

Про Haskell мы с товарищами уже несколько раз реально перетёрли. И про удобства, и про сравнение с объектными языками. Сейчас назрела внутренняя необходимость (то бишь, злость взяла) перетереть на баянистую тему: C++ vs Java.

Для справки: на C++ я программировал лет десять. После этого я благополучно децл сменил область деятельности и перешёл на Java. Из этого всем должно быть очевидно, что оба языка я хорошо знаю и понимаю (кому не очевидно, тот сам виноват). Однако же пару дней назад пришлось-таки снова написать всякого на C++. Что вызвало нехилое раздражение.

Я понял, что подход C++ к автомобилестроению примерно такой: человеку дают все инструменты, с помощью которых можно собрать совершенно любой автомобиль. Но ничего кроме простейших инструментов не дают. Типа, если можно собрать, то и собирай что хочешь. Стандартная библиотека C++ хотя и довольно гибка, но неуловимо ущербна. Например, в WinAPI нет функции копирования директории. Нет функции для получения списка файлов, вместо этого есть какой-то недоитератор. Складывается ощущение, что копирование директорий такая редкая операция, что и заморачиваться не стоит: кому надо, сам напишет.

И так во всём. Чуть где нужно что-то очевидно стандартное – его нет. Зато есть что-то очень-очень гибкое, с помощью чего это стандартное следует собирать. Причём, началось это очень давно. В тот самый момент, когда разработчики С решили вдруг, что строки вполне можно встроить в виде char*. Да чего там – в тот момент, когда они поняли, что с помощью массивов вообще всё что угодно можно сгенерить. Они были правы, но их правота вылилась в мега-кучи ошибок с битой памятью. По опыту, половина ошибок при написании чего-то на C проистекает из-за бития памяти с помощью char*.

Collapse )