Язык программирования D
Язык программирования C никому лишний раз представлять не нужно. Если вы им не пользовались, то хотя бы слышали. Но далеко не все программисты, читая учебники по одному из самых популярных языков программирования, читают предисловие, в котором, как правило, авторы не забывают упомянуть о родословной этого языка. Произошёл он, как известно, от другого языка программирования, который назывался B. Вполне логично, что дальнейшее развитие языка C - язык программирования... нет, не C++, а D. Да, C++ гораздо более известный в широких кругах, но D от этого не становится хуже. Поэтому я и хочу сейчас о нём рассказать.
"Кулибинщина... Такие
штуковины обречены жить на
задворках прогресса" (© форум GameDev.ru) |
Любые новации программисты, дети научно-технического прогресса, воспринимают неохотно. Их понять можно: очень уж лень переходить с одной, обкатанной технологии, на что-то новое, пусть, в конце концов, и более удобное. Поэтому из новых технологий выживают лишь те, которые создатели пропихивают в массы стальной рукой. Ну, или такие, которые в одночасье позволяют облениться ещё больше. Язык D, к сожалению, к таким технологиям не относится... Хотя, наверное, разработай его корпорация Microsoft, его ждало бы большое будущее.
D - классический компилируемый язык, имеющий синтаксис, схожий с синтаксисом C/C++. Как говорит автор языка, Уолтер Брайт, "это практичный язык для практичных программистов, которым нужно, чтобы работа была сделана быстро, надёжно, а её результатом был лёгкий для понимания и последующей поддержки кода". Но при этом имеется гигантское отличие от C++ - отличие, я бы сказал, даже идеологическое. Оно состоит в том, что D не имеет обратной совместимости с C. По словам автора, это потому, что поддержка обратной совместимости с C не позволила бы ввести в состав языка некоторые очень полезные вещи.
Однако во многом D похож на C++. Например, тем, что имеется поддержка объектно-ориентированного программирования, а также шаблонов. Поддерживается перегрузка операторов, обработка исключений также происходит в стиле С++.
Чего вы в D не найдёте? Тоже многого, но вряд ли об этом стоит жалеть. Множественное наследование? Не думаю, что это так уж удобно. Множество объектно-ориентированных языков живут и процветают и с одиночным наследованием классов, в то время как множественное наследование реализуется с помощью специализированных интерфейсных типов. Классический пример такого подхода - Object Pascal/Delphi. Мощнейшая библиотека VCL написана безо всякого множественного наследования, так что, как мне кажется, можно только поприветствовать устранение из языка этого источника путаницы. Нет в языке и знакомых по C "#include" и пространств имён. Вместо этого авторы решили использовать более мощную и гибкую модульную структуру, которая гораздо лучше справляется с проблемой уникальности имён типов, переменных, классов и т.п. Все функции внутри классов (сиречь методы) автоматически объявляются виртуальными, и таким образом решается проблема возможности переопределения функций в дочерних классах. Любую функцию можно переопределить. Нет в D битовых полей, которые авторы посчитали сложными и редко используемыми; ну и, наконец, оператор "->" в D упразднён - указатели "научился" разыменовывать и оператор ".".
Как видите, авторы языка D действительно постарались сделать всё, чтобы новый язык действительно вобрал в себя только лучшее, и устранил многие из проблем, которыми грешат C/C++.
"Язык D хорош тем, что уже
позволяет (с точки зрения
синтаксиса) больше, чем Java и C#,
оставаясь компилируемым" (© форум Balancer.ru) |
Модель классов в D очень похожа на родной и знакомый ещё со школы Object Pascal/Delphi. На вершине иерархии наследования находится класс Object, от которого все классы наследуют базовый набор функциональности. Экземпляры классов работают по ссылке, поэтому после обработки исключений не требуется писать сложный код для очистки памяти. О Pascal'е же напоминают и модули, о которых я уже кратко вспоминал выше. Файлы исходного кода взаимно однозначно соответствуют модулям. Вместо включения (#include) файлов исходного кода достаточно импортировать модуль. В этом случае нет необходимости беспокоиться о том, что один и тот же модуль будет импортирован несколько раз, а, значит, и нет необходимости обрамлять код в заголовочных файлах с использованием макросов препроцессора #ifndef/#endif или #pragma once. Правда, D избавлен от болезни Object Pascal/Delphi, свойственной и C++: двойному объявлению классов и типов.
Что есть в D очень полезное - это встроенная прямо в язык поддержка ассоциативных массивов, являющихся, по большому счёту, хэш-таблицами. Ещё одна интересная вещь - тип данных bit. Можно создавать массивы битов и работать с ними как с обычными массивами, без дополнительных ухищрений. В D реализована возможность ведения документации прямо в комментариях в исходном тексте программы - в общем-то, совсем как в .NET. За счёт того, что такое документирование поддерживается прямо на уровне компилятора, нет необходимости адаптировать тексты разных разработчиков, пользующихся разными системами документирования кода, в случае перехода от одной такой системы к другой.
От Pascal'а D взял ещё одну хорошую вещь. Это спецификаторы доступа к параметрам функций: in, out и inout. По словам разработчиков языка, данные спецификаторы не только делают объявления функций говорящими сами за себя, но и открывают возможности компилятору для помощи в нахождении ошибок. Все эти возможности D позволяют использовать больше различных программных интерфейсов, а также избавляют от необходимости использовать различные искусственные приемы, как, например IDL (Interface Definition Languages). Ещё один плюс (и даже не плюс, а плюсплюс) - встроенная прямо в язык возможность работы со строками. Выделение памяти в языке D полностью контролируется методикой сбора мусора. Но, несмотря на то, что язык D поддерживает автоматический сбор мусора, операторы new и delete могут быть перегружены для определенных классов. Для тех, кому нужна очень высокая производительность, есть встроенный ассемблер.
Отладка в D может показаться странной тому, кто привык к тому стилю отладки программ, который требовал от программиста язык C++, но неудобным его назвать сложно. Отладочный код может быть включен или отключен перед компилированием, при этом не требуется использовать макросы или команды препроцессора. Такой вариант использования отладки, по мнению авторов D, делает код непротиворечивым, переносимым и обеспечивает понимание того, что один и тот же код используется для компиляции и отладочных версий программы и релизов.
Думаю, никто не будет возражать против того, что многопоточное программирование становится все более распространенным. Поэтому авторы языка снова позаботились о программистах - в D реализованы базовые возможности для создания многопоточных приложений. Синхронизация может быть применена ко всему объекту или к отдельным его методам. Синхронизированные функции разрешают в один момент времени исполнять код функции только одному потоку.
"Должен же быть некий
элемента хаоса, а то нельзя же
только про язык D рассуждать,
безо всяких лирических
отступлений" (© форум Jewniverse.ru) |
Любая идея так и останется красивым идеалом, если её не принизить до материального (или электронного) воплощения. Язык D, в отличие от множества "идеальных" языков, которые существуют лишь в виде описания, имеет и реализацию. То есть, компилятор.
Я расскажу вам о компиляторе, но сначала ещё немного, так сказать, рекламы, с вашего позволения. Поскольку в языке D, в отличие от C и C++, напрочь отсутствует препроцессор, это даёт несколько дополнительных преимуществ. Например, самое простое - уменьшается время на анализ исходного кода программы, что, несомненно, очень хорошо при компиляции больших проектов. Я помню, как однажды набрёл в Интернете на рекомендацию использовать Visual Basic вместо Visual C++ для сколь-нибудь масштабных проектов не столько из-за того, что эта среда, в отличие от MSVC, позволяла осуществлять быструю разработку приложений, а именно из-за скорости компиляции. Правда, в этом совете ничего не говорилось о стабильности приложений на Visual Basic'е со всеми их ActiveX'ами, но в случае с D такой проблемы нет. Во-первых, компилируемый в натуральный машинный код с мощным механизмом обработки исключений позволяет достичь необходимой стабильности, а, во-вторых, компилятор D сделан солидной фирмой - Digital Mars Software. Ещё одна вещь, которую даёт отсутствие препроцессора - возможность применять разные инструменты анализа на этапе написания кода, то есть ещё до компиляции.
По заверениям авторов языка, он создавался специально под проекты, исходные тексты которых содержат миллионы строк кода. Специально для этого устранены такие недочёты C++, как необходимость ручной работы с памятью. Для тех, кто работает с математическими расчётами, приятной новостью будет тот факт, что язык имеет встроенные средства для работы с комплексными числами и с числом "бесконечность" (хотя математики называют бесконечность числом довольно редко).
Разработчики языка не рекомендуют, тем временем, переводить уже написанные на C/C++ проекты на D, обоснованно называя это занятие трудоёмким. Авторы также отмечают нецелесообразность использования D для обучения программированию, рекомендуя для этих целей Pascal и Basic. Не слишком удобно, по их мнению, использовать D и для создания небольших приложений, для чего гораздо лучше подходят более простые языки, для самых простых приложений даже скриптовые. В общем-то, глядя на это описание, становится понятно, что работа с объектно-ориентированным языком может быть весьма комфортной, если соблюдён разумный баланс между высокоуровневыми и низкоуровневыми элементами, что в D налицо.
"Сам по себе язык
достаточно интересный, но ...
нет поддержки со стороны
сильных мира сего и, как
следствие, полная
бесперспективность" (© форум Gnu.kz) |
На сегодняшний момент, насколько мне удалось выяснить, самый лучший компилятор D - Digital Mars D. Найти его в Интернете можно по адресу www.digitalmars.com/d/dcompiler.html. Есть версии для Windows и Linux, а поскольку открыт и исходный текст компилятора (на языке C), то его, в принципе, можно перенести и под другие операционные системы. Есть ещё и GNU'шная реализация D, которую можно найти в составе GNU Compilers Collection.
Те, кто пользовался компилятором от Digital Mars, отмечает довольно плохую оптимизацию выходного объектного кода, но это, в общем-то, в наши дни не слишком серьёзный минус. Сам компилятор работает стабильно.
На сайте www.dsource.org можно найти сообщество программистов, разрабатывающих open-source проекты на D. Думаю, взглянуть на список представленных на сайте разработок тем, кто заинтересовался языком программирования D, будет весьма и весьма интересно.
К сожалению, за D не стоит громких имён - ни IBM, ни Sun Microsystems, ни, конечно же, Microsoft не заинтересованы в продвижении этого языка в массы. Первые две компании активно продвигают Java, а "мелкомягкие" стараются не отстать от них со своим .NET'ом. Поэтому, в общем-то, очень перспективная и интересная разработка и завязла в своём развитии и распространении. Правда, многие разработчики смотрят на перспективы D радужно именно в связи с open source проектами. Но, думаю, в этом отношении какие-то предсказания делать рано. Язык развивается и обрастает новыми адептами и ненавистниками, и лично мне будет интересно увидеть в один прекрасный день Microsoft Visual D. А чем, в самом деле, чёрт не шутит? Не одним же интерпретируемым языкам развиваться.
Вадим СТАНКЕВИЧ
Горячие темы