Один из самых популярных языков программирования, С, появился еще в 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, как впрочем, и любого другого развивающегося языка - дело неблагодарное. Вспомним, хотя бы историю Паскаля или Бейсика.