Tuesday, October 26, 2010

I'll be back...

...to C++. Как только его стандартная библиотека станет более самодостаточной.

C# меня ужасает своей негибкостью.

Во-первых, нет никакого аналога привычному scanf (или cin - кому как), и массивы приходится считывать какими-то извращенскими методами (разбивание строки методом Split и последующее конвертирование элементов массива строк в массив того_что_мне_нужно. То есть - лишняя память и угрызения совести, потому что можно же сделать лучше, чёрт возьми...)

Но это ещё цветочки.

Во-вторых, какая-то нахальная политика в плане перегрузки операторов. А именно: я не могу перегрузить operator+=, operator-= и всё в таком духе. Видите ли, компилятор позаботится, применив перегруженный operator+/operator-. Нет, ну нихера себе забота! operator+ создаёт новый объект, который никому нафиг не сдался: если операцию можно проводить in-place, то это нехилая потеря производительности. И это не пустая болтология, человек вот по этой ссылке утверждает, что падение в скорости работы доходило до 50 раз!!! Дикость. И самая жесть в том, что никто это менять не собирается, судя по ответу Microsoft в том треде. А дело было ещё в 2005 году.

Sunday, October 24, 2010

Выбор между Java и C#

Как ни странно, С++ мне уже не хватает. Казалось бы, нет более гибкого языка. Но...

Для решения всяких мелких (а порой и не очень) прикладных задач я обычно использую Python/Ruby. Однако после поступления в универ понадобилось нечто среднее между ними и С++, ибо:
1) в компьютерных классах попросту нет этих самых Python/Ruby;
2) всё-таки нужна производительность. Увы, скриптовые языки в этом плане от С++ отстают на порядок. Основной помехой в этом, наверное, является. концепция "всё что угодно есть объект". Теоретически — это изумительно: ах, вы только поглядите, у числа "2" вон сколько методов! А в Ruby on Rails и вовсе чёрт-те что можно творить, скажем, 2.hours вернёт 7200, а 7200.from_now вернёт время, которое будет через два часа. Так что вообще можно писать 2.hours.from_now. Изящно? А то! Но когда эти числа-объекты используются при перемножении матриц, весь их объектный характер нахрен никому не сдался, а лишние память и время жрутся.

А отчего же не продолжать использовать С++? Дело в том, что:
1) его стандартная библиотека содержит мало что. После использования Python кажется, что там вообще почти ничего нету. Java в этом плане великолепна.
2) непонятно, когда наконец выйдет новый стандарт, содержащий в себе кучу вкусностей — C++0x. А я тащусь от лямбда-функций, замыканий и всего такого. Кроме того, в стандарте С++ нет такой стандартнейшей (сорри за каламбур) вещи, как Dictionary (хэш-таблица). И меня убивает, когда только из-за этого к алгоритму добавляется логарифмический множитель.

Возможные варианты перехода — С#, Java, Delphi. Последний отпадает моментально, потому что... Да хотя бы потому, что мне лень эти проклятые begin-end-ы писать. Так что остаются первые два.

Так вот, результаты сравнения Java и C# (большое спасибо английской Википедии):
Java привлекает своей офигенной по размеру стандартной библиотекой. Прям как Python, идущий "с батарейками". Также здорово, что имена методов пишутся с маленькой буквы (я ж лентяй, шифт нажимать влом). Т.е. System.out.println мне нравится куда больше, чем System.Console.WriteLine.
Однако C# содержит вещи, без которых кодинг — тоска зелёная. Как можно жить без operator overloading, вы мне скажите, а?! Среди приятных вещей (в отличие от Java) также есть properties (ням-ням-ням!), лямбда-функции и замыкания, а также комплексные числа (начиная с .NET 4.0).

Так что, несмотря на всю свою нелюбовь к Microsoft и .NET, я пришёл к выводу, что пришла пора учить C#. Вот так вот.