У любого вменяемого программиста который сталкивается с языком программирования С++ должно рано или поздно возникать чувство отвращения и полной богозабытости. И если в случае с Java кто-то еще может поспорить что “светлое будущее впереди” (фиаско с Java 7 как бы намекает), то с С++ мне кажется определились все: и те кто недавно перешли или решили просто попробовать, и те кто с ним работают десятилетиями.
С++ устарел. Программы на С++, как бы красиво они не выглядели, не соответствуют современным реалиям. Попытки пропатчить C++ под 0x/2011 выглядят трезвыми только на фоне того, что в “плюсах” появились лямбда-выражения, а в Java 7 у Oracle нехватило силенок их сделать.
Вообще, мне по большому счету все равно. Все равно насчет Java-стека т.к. на Java я не пишу, на Scala меня не тянет (синтаксис F# на порядок лучше, имхо). С другой стороны, у меня есть небольшие “вкрапления” С++ в проекты, поэтому о них наверное стоит рассказать.
Зачем нужен С++?
Конкретно мне С++ нужен для параллелизации. Нет, поймите меня правильно, я ни в коей случае не против TPL и всяких прелестей вроде Parallel.For
или AsParallel()
. Более того, все что я сейчас делаю с коллекциями обычно содержит использование TPL т.к. это достаточно безопасный способ ускорить программу.
Но есть ряд областей где .Net-а мало. Возьмем например обработку изображений – даже если вы напишете обработку Bitmap’а в unsafe
режиме на C#, это все равно будет существенно медленнее чем использование C++. Особенно если учесть, что в плюсах есть доступ к SSE (__mm_mul_ps
и все такое). И самое главное, что манипуляций-то никаких особо не нужно, т.к. класс System.Drawing.Bitmap
может выдать указатель на фиксированный блок памяти, который в последствии можно через P/Invoke передать в тело метода на C++. А дальше можно использовать все прелести OpenMP, Threading Building Blocks, а также мощный инструментарий.
Кстати о… думаю стоит пояснить, что я религиозно использую стек Intel, т.е. Intel Parallel Studio со всеми прелестями. Это важно потому что инструментарий этот достаточно хороший и много чего умеет, компилятор С++ от Microsoft в былые годы (до Intel) был ооочень слабоват – в те времена, чтобы заработали примеры из Generative Programming, нужно было использовать KAI C++, Metrowerks или еще какой-то сторонний компилятор. Мне правда повезло – на шаблонное метапрограммирование я так и не подсел, хотя идея конечно заманчива.
Итак, если прорезюмировать то, зачем мне С++ нужен, должен сказать, что нужен он для производительности в параллелизуемых алгоритмах. Для нативных библиотек С++ не критичен, т.к. всегда можно написать P/Invoke обертку или скачать уже готовую, а вот для новых, свежих алгоритмов – при условии что они не требуют качественного библиотечного окружения – С++ очень даже подходит.
А причем тут D?
Я уже давно хотел попробовать D, но все нехаватало времени. Теперь же у меня получилось истратить день на изучение особенностей языка и выборочное читание частей The D Programming Language Александреску. Книга, кстати, классная – объем информации большой, написано с долей весьма своеобразного юмора.
Собственно использование D под Windows требует от вас две вещи.
Во-первых, нужно скачать компилятор. Инсталлятор (MSI) все делает сам, напрягаться толком не нужно.
Во-вторых, хоть это и опционально, можно скачать IDE или пакет поддержки уже существующей IDE. Я конечно же скачал Visual D – пакет для Visual Studio. Особенности пакета:
-
Позволяет создавать проекты на языке D и конфигурировать их
-
Весьма слабо поддерживает IntelliSense – можно сказать что поддержки практически нет
-
Есть отладка (YMMV, конечно же)
-
Все это, увы, 32-bit
Одна из фееричных особенностей использования D – это то, что компиляция практически моментальна. Всем кто привык работать со студией это должно выносить мозг. Вы нажали F6, и программа скомпилировалась – вот так, просто.
D vs. C++
В чем же приемущества D? Попробую перечислить то, что бросилось в глаза:
-
Нет этого бреда с заголовочными файлами,
#pragma once
и т.п. Порядок файлов в проекте тоже не важен (F#, я смотрю на тебя). Пишешьmodule foo
в одном файле иimport foo
в другом. -
Строки… строки вменяемы, почти как в C#. Почти потому что остались извраты с UTF-16 и UTF-32 для тех кто знает в этом толк. Да, естественно что до .Net в плане глобализации не дотянуть – но цель не в этом.
-
Сборка мусора. При этом можно выделять память собственноручно если вдруг у вас приступ мазахизма.
-
Свойства! Java и С++ могут убить себя об стену,
__declspec(property)
идет лесом. Свойства, имхо, должны быть в любом современном языке программирования. И тут они есть, и ими приятно пользоваться. -
Piece de resistance: ключевое слово
mixin
. Самый вменяемый подход к метапрограммированию, который просто ставит в угол Boo, Nemerle и иже с ними.
Язык D отличается очень продуманным, вменяемым дизайном и при этом не несет с собой кучу устаревшей/спорной идеологии на тему того что, например, публичные поля это плохо, надо делать свойства.
Mixin
Как работает метапрограммирование в языках вроде Boo? Там с помощью цитирования создается объектная модель кода – например [| x + y |]
превращается в BinaryExpression
. Вставки из реального мира делаются с помощью splice-оператора $
. Тем самым, чтобы хоть что-то сгенерировать, нужно уметь создавать объектную модель нужного кода.
В большинстве случаев это вообще не нужно. Гораздо проще взять и сгенерировать строку (на подобии T4), которая создает текстовое представление и добавляет его в исходный код на этапе компиляции. Это в 100 раз проще чем мучаться с объектной моделью компилятора.
В языке D, инструкция mixin
просто принимает строку. Напишите mixin("string Name;")
и вы добавили в класс поле Name
. Тривиально. Естественно что строки можно не только передавать напрямую, но и создавать отдельные функции, которые исполняются на этапе компиляции. Это решает проблему метапрограммирования в большинстве случаев.
Недостатки
Куда же без них. Вот то, что я успел заметить:
-
Дебаггер порой идет совсем не туда куда нужно. Вложенные функции и делегаты дебажатся “с грехом пополам”.
-
Конкретно под Windows, D компилируется только в 32-bit.
-
Стандартные библиотеки конечно не дотягивают до какой-нть STL но они намного более вменяемы. Так что это палка о двух концах.
-
Стандартных библиотек на самом деле две – Phobos и Tango. Какую использовать – непонятно. В Phobos я уже столкнулся с недопиленностью – например
std.xml
сейчас переписывается. -
Никто пока не воспринимает D серьезно. Даже у F# больше exposure чем у D, что собственно понятно – ведь F# продвигает Microsoft и этот язык активно используется в quant finance.
-
IntelliSense не работает в Visual D. Надо будет еще глянуть на D-IDE которая, кстати, написана под .Net 4 :)
Впечатления
Мне D очень понравился. Это язык с максимальным уровнем вменяемости и достаточно низким уровнем шума. Если вам не нужно завязок на 100 библиотек, D позволит вам быстро разрабатывать и компилировать ваш код. При этом вы не теряете в выразительности – тут и делегаты, и события, и вложенные функции, функциональные литералы (= лямбда-выражения), не говоря уже о совсем продвинутых вещах вроде вариадичных шаблонов.
Резюмируя, должен сказать что D меня очаровал, и в ближайшее время я планирую его использовать к некритичных, non-production проектах дабы прочувствовать все его возможности. А они, судя по первичным наблюдениям, весьма обширны.
Leave a reply to kotev1000 Cancel reply