Один из самых популярных языков программирования, С, появился еще в 70-х годах, и с тех пор он неоднократно эволюционировал. По большому счету синтаксис C++, Java, C# базируется на С, привнося некоторые изменения в его структуру. В принципе, при этом мы получаем совершенно отдельные языки программирования со своими наборами возможностей, но, тем не менее, их базовый функционал исходит от C. Возможно, это несколько субъективное мнение, тем не менее, именно этими соображениями руководствовался Уолтер Брайт при разработке нового
языка D.

Дело в том, что все вышеперечисленные языки (речь идет именно о языках, а не средах разработки) дают разработчику довольно много полезных и удобных возможностей, без которых порой трудно обойтись. С другой стороны, в каждом из этих языков недостает некоторых возможностей. D представляет собою совокупность всех наиболее полезных возможностей «Си-образных» языков программирования. 

Как выразился Уолтер Брайт, D это попытка вернуться назад, осмыслить все этапы развития языков высокого уровня и прийти к обобщению их функциональности напрямую, минуя все промежуточные и тупиковые варианты.

Что бы понять, о чем идет речь достаточно взглянуть на таблицу, приведенную ниже.

Сравнительная таблица возможностей языка D

Feature D C C++ C# Java
Garbage Collection Yes No No Yes Yes
Functions
Function delegates Yes No No Yes No
Function overloading Yes No Yes Yes Yes
Out function parameters Yes Yes Yes Yes No
Nested functions Yes No No No No
Function literals Yes No No No No
Dynamic closures Yes No No No No
Typesafe variadic arguments Yes No No Yes Yes
Arrays
Lightweight arrays Yes Yes Yes No No
Resizeable arrays Yes No No No No
Built-in strings Yes No No Yes Yes
Array slicing Yes No No No No
Array bounds checking Yes No No Yes Yes
Associative arrays Yes No No No No
Strong typedefs Yes No No No No
String switches Yes No No Yes No
Aliases Yes Yes Yes No No
OOP
Object Oriented Yes No Yes Yes Yes
Multiple Inheritance No No Yes No No
Interfaces Yes No Yes Yes Yes
Operator overloading Yes No Yes Yes No
Modules Yes No Yes Yes Yes
Dynamic class loading No No No Yes Yes
Nested classes Yes Yes Yes Yes Yes
Inner (adaptor) classes Yes No No No Yes
Covariant return types Yes No Yes No Yes
Properties Yes No No Yes No
Performance
Inline assembler Yes Yes Yes No No
Direct access to hardware Yes Yes Yes No No
Lightweight objects Yes Yes Yes Yes No
Explicit memory allocation control Yes Yes Yes No No
Independent of VM Yes Yes Yes No No
Direct native code gen Yes Yes Yes No No
Generic Programming
Class Templates Yes No Yes Yes Yes
Function Templates Yes No Yes No Yes
Implicit Function Template Instantiation Yes No Yes No No
Partial and Explicit Specialization Yes No Yes No No
Value Template Parameters Yes No Yes No No
Template Template Parameters Yes No Yes No No
Mixins Yes No No No No
static if Yes No No No No
is expressions Yes No No No No
typeof Yes No No Yes No
foreach Yes No No Yes Yes
Implicit Type Inference Yes No No No No
Reliability
Contract Programming Yes No No No No
Unit testing Yes No No No No
Static construction order Yes No No Yes Yes
Guaranteed initialization Yes No No Yes Yes
RAII (automatic destructors) Yes No Yes Yes No
Exception handling Yes No Yes Yes Yes
Scope
guards
Yes No No No No
try-catch-finally blocks Yes No No Yes Yes
Thread synchronization primitives Yes No No Yes Yes
Compatibility
C-style syntax Yes Yes Yes Yes Yes
Enumerated types Yes Yes Yes Yes Yes
Support all C types Yes Yes No No No
80 bit floating point Yes Yes Yes No No
Complex and Imaginary Yes Yes No No No
Direct access to C Yes Yes Yes No No
Use existing debuggers Yes Yes Yes No No
Struct member alignment
control
Yes No No No No
Generates standard object files Yes Yes Yes No No
Macro text preprocessor No Yes Yes No No
Other
Conditional compilation Yes Yes Yes Yes No
Unicode source text Yes Yes Yes Yes Yes
Documentation comments Yes No No Yes Yes

 Как вы видите в этой таблице приведено сравнение возможностей
языков D, C, C++, C# и Java. Даже если не вчитываться в детали, поражает уже сам объем этой таблицы. Я не стал переводить таблицу, потому как считаю, что человеку, непосредственно связанному с программированием так будет понятнее, а для остальных это будет стимулом выучить хотя бы основные понятия, а заодно и пополнить свой словарный запас. (Шучу, на самом деле я использую данные термины “as is as” и мне попросту трудно их адекватно перевести
:)).

Я не буду подробно останавливаться на перечислении всех преимуществ данного языка, в принципе, все наглядно видно из таблицы. Большинство терминов, используемых в таблице, наверняка, понятно для ООП программистов, но среди перечисленных возможностей нового языка есть такие, которые присущи только ему. На самом деле, в реализациях других языков эти возможности, в большинстве случаев, имелись. Проблема в том, что их не имелось в стандарте языка. Прекрасная
статья Криса Касперски на эту тему была в апрельском СПЕЦе, посвященном программированию. Она называлась «Нестандартный С++».

Лично мне из всей таблицы были наиболее интересны ООП возможности языка. По большому счету ситуация, когда вместо десяти строчек кода мне придется написать целых тринадцать
:), меня не слишком смущает. А вот организация объектов внутри программы действительно может стать весьма актуальной. Здесь я обратил внимание, прежде всего, на отсутствие множественного наследования. Все же, очевидно разработчики языка считают, что множественное наследование не вписывается в концепцию «чистого ООП». Однако, это компенсируется поддержкой интерфейсов. Перегружаемые операторы и вложенные классы… меня бы скорее удивило, если бы они не поддерживались. Очень полезно на практике. Мое мнение, что по части ООП D действительно собрал все лучшее и отбросил лишнее. Тем не менее, последний тезис может показаться спорным адептам C++. Но на самом деле,
D – действительно объектно-ориентированный язык. Конечно не в такой степени как Smalltalk или C#, где практически все построено на объектах, но именно в разумной мере.

Еще обращает на себя внимание раздел Reliability (надежность). И здесь мы видим, что ведется работа в сторону встроенной поддержки некоторых прогрессивных методик программирования. К примеру, интересный ход – декларирование совместной разработки на уровне языкового стандарта. Я всегда считал, что это – классический пример ALM и хотел бы увидеть пример реализации на уровне языка. К сожалению, как гласит комментарий, сегодня эта возможность еще полностью не реализована.

Но все же, что именно может сделать язык D привлекательным для разработчиков программного обеспечения. И будет ли он конкурентно способным? Вот как ответил на этот вопрос создатель языка в одном из своих интервью.
«D привлекателен для программистов, заинтересованных в написании высокопроизводительного кода, желающих писать в стиле С++, но нуждающихся в языке, который значительно проще в плане реализации современных технических приемов, таких как автоматическое управление памятью, модули, UTF и т.д. Для D программ не будет странным, если объем исходного кода уменьшится на 30% по сравнению с аналогичным С++ кодом, при этом исполняться он будет той же скоростью или даже быстрее. Попросту на D быстрее разрабатывать код, кроме того, быстрее его и отлаживать».

Теперь, когда мы разобрались с предпосылками создания нового языка и некоторыми его возможностями, давайте его немного пощупаем. На сайте
http://www.digitalmars.com помимо многочисленных обзоров и документации, выложены компиляторы и линковщики D для Win32 и Linux. Забираем и устанавливаем. Для работы я использовал D для Win32. Собственно, установка очень напомнила установку Eclipse J. Ничего не надо делать, просто распаковать архив и при желании прописать пути в системе (это если вам будет лень вводить их руками). Примерно так и описывался инсталляционный процесс в документации к скачанным продуктам. На практике же с путями пришлось повозиться. 

Я не искал легких решений, и поэтому не прописывал системные переменные. Почему? Потому, что это мне позволило понять, что и в какой последовательности нужно запускать для того, что бы из исходных кодов собрать исполняемый файл. Если интересно, найдите каталог Samples и запустите файл run.bat. Последний предназначен для того, что бы отлинковать и скомпилировать сразу все примеры. Пройдясь фактически по всем подкаталогам и подправив пути в файлах конфигурации, мне удалось все нормально собрать.

Для тех, кто не сталкивался ранее с разработкой в консольном режиме, возможно, будет трудно сразу разобраться с процедурой отладки программ на D. Но, на сегодняшний день IDE отсутствует, однако первоисточники говорят, что работа над ним уже ведется. А пока нам остается довольствоваться тем, что есть. И именно некоторые особенности самого языка позволят сделать хороший и удобный продукт. А до тех пор, пока среда разработки не будет создана, мы можем просто изучать
синтаксис D.

В заключение я хочу еще раз коснуться вопроса перспектив нового языка. Мне кажется (это только мое мнение), что его успех, как, впрочем, и успех любого другого языка, будет зависеть от нескольких факторов. Во-первых, от того, насколько удобна будет IDE. Во-вторых, насколько глубоко он будет поддерживать современные методики и технологии программирования. И, наконец, от того, как будет поставлена маркетинговая политика. Нет, конечно, сам синтаксис и обилие возможностей также играют значительную роль, но, на мой взгляд, эта роль не определяющая. Здесь можно вспомнить, что многие Delphi программисты перешли на C# из-за того, что синтаксис – прозрачен, но были добавлены новые интересные возможности. Тем не менее, не стоит забывать, что «дельфинисты» серьезно заинтересовались С# только после того как Borland внедрил поддержку этого языка в BDS. Тем не менее, уже сейчас в многочисленных исследованиях популярности и востребованности языков, D выходит за рамки статистики и им пользуется по разным данным до 3% разработчиков. Но как мне кажется, популярным этот язык станет только тогда, когда войдет в состав Visual Studio, BDS или какой-либо другой мощной среды разработки. 

Конечно, прогнозировать будущее языка D, как впрочем, и любого другого развивающегося языка — дело неблагодарное. Вспомним, хотя бы историю Паскаля или Бейсика.

Оставить мнение

Check Also

Скрытая сила пробела. Эксплуатируем критическую уязвимость в Apache Tomcat

В этой статье мы поговорим о баге в Apache Tomcat, популярнейшем веб-сервере для сайтов на…