Язык программирования D: различия между версиями

Содержимое удалено Содержимое добавлено
много мелких улучшений
Строка 1:
{{wikipedia|D (язык программирования)}}
'''D''' — язык программирования общего назначения, предназначенный для прикладного и системного программирования. Он является языком более высокого уровня, нежели [[w:C++|C++]], но сохраняет возможность писать высокопроизводительный код и напрямую взаимодействовать с программным интерфейсом операционной системы и с оборудованием. D пригоден для написания откак средних, так дои крупных систем с миллионами строк исходного кода, а также хорошо подходит для ведения командной разработки. Язык D легоклёгок в изучении, поддерживает многие возможности в помощь программисту, а также пригоденпредоставляет компилятору большое поле действий для проведения агрессивной оптимизации кода компилятором.
 
D не является ни языком скриптования, ни интерпретируемым языком. Он не требует наличия виртуальной машины, не навязывает новой философии программирования. D позиционируется, как практичный язык для практичных программистов, которым важно сделать работу быстро, надежно, сохранив гибкость и понятность кода.
 
В D собран опыт разработки десятков компиляторов для самых разнообразных языков программирования, а также попыток создания крупных проектов на этих языках. Язык D вобрал в себя лучшее из тех языков (больше всего из C++) и практично применил эти возможности.
Строка 10:
И действительно, почему? Кому нужен другой язык программирования?
 
Индустрия программного обеспечения прошла долгий путь с тех пор, как изобрели язык C. Много новых концепций было реализовано в языке C++, но его обратная совместимость со своим предком заставила унаследовать не только достоинства, но и недостатки языка C. Тем временем, и в C и в C++ реализуются новые возможности, которые опять же были внедрены в существующую структуру языков таким образом, чтобы не было необходимости переписывать старый код. Результат получился довольно неоднозначный и запутанный — стандарт C насчитывает 500 страниц, а стандарт C++ — около 750 страниц! C++ является сложным и слишком разнообразным для его полной реализации, в результате чего существует множество несовместимых его реализаций, что лишает возможности легко писать переносимый код.
 
Программисты на C++, по сути, используют различные подмножества языка, то есть в основном используют одни возможности языка и, в то же время, избегают других его возможностей. Помимо сложности портирования кода между компиляторами, существует также сложность портирования кода между программистами. Мощь языка C++ заключается в том, что он поддерживает радикально различные стили программирования, но в большинстве случаев противоречивые стили программирования являются помехой.
Строка 20:
* Облегчает написание кода, который без особых усилий может быть перенесен от компилятора к компилятору, от компьютера к компьютеру, от одной операционной системы к другой;
* Поддержка нескольких подходов к программированию: структурный и объектно-ориентированный, как минимум;
* ЛегкостьЛёгкость изучения языка для тех, кто имел дело с языками C и C++;
* Обеспечение прямого низкоуровневого доступа к оборудованию;
* Наличие контекстно-независимой грамматики;
Строка 28:
=== Возможности, унаследованные от C/C++ ===
 
Общий синтаксис языка D схож с синтаксисом C и C++. Это делает легкимлёгким его изучение и портирование кода. Переход от C/C++ к D должен проходить без проблем. Программисту не придется привыкать к другому подходу написания кода.
 
Для того чтобы использовать язык D, программисту не обязательно ограничивать себя специализированной виртуальной машиной (VM), как это сделано с Java и Smalltalk. Для D не существует виртуальной машины. Программы, написанные на D, компилируются в файлыобъектные объектовфайлы, которые затем могут быть объединены линкеромлинковщиком в исполняемый файл. D взаимодействует с операционной системой так, как это делает C. Знакомые инструменты, например make, подойдут и для разработки на языке D.
 
* Сохранены синтаксис и семантика языков C и C++. D использует те же формы выражений и общий план программ;.
* Программы на D могут быть написаны с использованием функционального и объектно-ориентированного подходов, а также с использованием шаблонов (template metaprogramming) или любой комбинации этих трех подходов;.
* Поддерживается модель разработки по этапам компиляция/линкование/отладка (compile/link/debug), но ничто не мешает откомпилировать код D в байт-код и интерпретировать его;.
* Обработка исключений (exception handling). Опыт использования обработки исключений показывает, что существует более совершенный стиль обработки ошибок, чем традиционное для языка C использование кодов ошибок и переменной <code>errno;</code>.
* Приведение типов в реальном времени. Отчасти это было реализовано и в C++. Способ приведения типов в языке D позволяет улучшить процесс сбора мусора и облегчить процесс отладки;.
* D поддерживает совместимость с соглашением о вызове функций в языке C, что делает возможным прямой доступ из кода на языке D напрямую к программному интерфейсу операционной системы. В работе с API в D могут быть использованы уже имеющиеся знания и опыт;.
* Перегрузка операторов. В языке D можно перегружать операторы с целью расширения списка операций над пользовательскими данными;.
* Использование шаблонов. Шаблоны дают возможность создавать обобщенныеобобщённые функции, оперирующие независящими от типа данных переменными. В языке D шаблоны лишены недостатков шаблонов из языка C++.
 
=== Чего нет в языке D ===
 
* Совместимость с исходным кодом языкана языке C. Уже существуют языки программирования, совместимые с исходным кодом, написанным на языке C (C++ и ObjectiveC). Дальнейшая работа в этом направлении препятствует реализации существенных возможностей;.
* Препроцессор. Для расширения языка удобно использовать макросы. КомпиляцияУсловная с условиямикомпиляция (<code>#if</code>, <code>#elif</code>, <code>#ifdef</code>), включениявключение файлов кода (<code>#include</code>), макросы (<code>#define</code>), конкатенация строк, по существу формируют дополнительный язык, не связанный синтаксисом с основным языком программирования. Препроцессор в C/C++ является довольно примитивным макроязыком. Самое время сделать шаг назад и посмотреть, для чего используется препроцессор, а затем внедрить поддержку этих возможностей в собственно язык программирования;.
* Множественное наследование. Это запутанная возможность сомнительной полезности. Множественное наследование может быть заменено обычным наследованием с использованием интерфейсов и агрегированием;.
* Пространства именимён (namespacenamespaces). Пространства именимён были попыткой решить проблему, возникающую при объединении разработанных независимо друг от друга кусков кода, когда пересекаются имена переменных, типов данных и так далее. Модульный подход выглядит проще и удобнее для использования;.
* ФайлыВключаемые включения кодафайлы (include files). Главной причиной медленной работы компиляторов является то, что в каждом модуле исходного кода необходимо обработать огромное количество заголовочных файлов. Включение исходного кода целесообразнее реализовать в виде импортирования таблицы символов;.
* Не -виртуальные функции-члены классов. В языке C++ разработчик класса должен напереднаперёд решить, виртуальной будет функция-член или нет. Достаточно трудно отловить появившиеся ошибки, когда разработчик забывает объявить в базовом классе виртуальной функцию-член, которая переопределяется в производном классе. Более гибким решением является автоматическое объявление всех функций-членов классов виртуальными, а компилятор уже сам будет конвертировать функцию в не виртуальную, если она не переопределяется в производных классах;.
* Битовые поля (bit fields) произвольного размера. Битовые поля сложны, неэффективны и достаточно редко используются;.
* Поддержка 16-битных компьютеров. В языке D нет никаких решений для генерациигенерирования качественного 16-битного кода, зато возможен плавный переход с использования 32-битного плоского пространства памяти на 64-битную архитектуру;.
* Взаимная зависимость проходов компилирования (compiler passes). В языке C++, успешная обработка исходного кода основывается на таблице символов (symbol table) и различных командах препроцессора. Это делает невозможным предварительную обработку кода и значительно усложняет работу анализаторов кода;.
* Различие между операторами точка (<code>.</code>) и стрелка (<code>-></code>). В их различии нет необходимости, поскольку оператор точка (<code>.</code>) в языке D служит также для разыменования указателей.
 
=== Для кого и чего предназначен язык D ===
Строка 58:
* Для программистов, регулярно пользующихся анализаторами кода для выявления ошибок еще до компиляции;
* Для людей, которые компилируют код с максимальным количеством включенных уровней предупреждений (warning levels), что означает интерпретацию предупреждений как ошибок;
* Для тех, кто решил, что обещание легкоголёгкого объектно-ориентированного подхода к программированию в языке C++ не выполняется из-за его сложности и запутанности;
* Для программистов, которых впечатляет мощь языка C++, но разочаровывает необходимость ручного управления памятью и ловля багов, связанных с указателями;
* Для проектов, нуждающихся во встроенных средствах тестирования и верификации;
Строка 67:
=== Для кого и чего D не предназначен ===
 
* Вообще-то никто не собирается конвертироватьпереписывать миллионы строк исходного кода на C/C++ вна код языкаязык D. А поскольку компилятор D не будет работать с не модифицированным исходным кодом C/C++, язык D не предназначен для уже существующих программ (однако, D поддерживает существующие API для языка C);.
* Для очень маленьких программ, для которых больше подойдут языки скриптования или интерпретируемые языки, например Python или Perl;.
* В качестве первого языка программирования. Basic и Java больше подойдут для начинающих программистов, а язык D предназначен для тех, кто уже имеет опыт программирования и для профессиональных программистов;.
* Для борцов за чистоту языка. D является практичным языком и каждая его особенность реализуется таким образом, чтобы сохранить эту практичность. Например, в языке D нет необходимости использовать указатели в ординарныхстандартных ситуациях, но работа с указателями поддерживается.
 
== Особенности языка D ==
Строка 78:
==== Классы ====
 
Объектно-ориентированная природа языка D происходит от классов. Модель наследования не поддерживает наследования от нескольких классов, зато расширяется за счет использования интерфейсов. На вершине иерархии наследования находится класс <code>Object</code>, от которого все классы наследуют базовый набор функциональности. Экземпляры классов работают по ссылке, поэтому после обработки исключений не требуется писать сложный код для очистки памяти.
 
==== Перегрузка операторов ====
 
Классы могут быть приспособлены для работы с уже существующими операторами. Благодаря перегрузке операторов можно создавать новые типы данных. Например, можно создать тип данных для работы с большими числами, создав класс и перегрузив, операторы <code>+</code>, <code>-</code>, <code>*</code> и <code>/</code>, чтобы использовать алгебраические операции с этими числами.
 
=== Эффективность ===
Строка 88:
==== Модули ====
 
Файлы исходного кода взаимно однозначно соответствуют модулям. Вместо включения (<code>#include</code>) файлов исходного кода достаточно импортировать модуль. В этом случае нет необходимости беспокоиться о том, что один и тот же модуль будет импортирован несколько раз, а, значит, и нет необходимости обрамлять код в заголовочных файлах с использованием макросов препроцессора <code>#ifndef</code>/<code>#endif</code> или <code>#pragma once</code>.
 
==== Объявление против описания ====
Строка 103:
</source>
 
И более нет необходимости отдельного описания функций-членов, атрибутов и спецификаций внешних объявлений (<code>extern</code>), как в языке C++:
 
<source lang=d>
Строка 113:
</source>
 
Заметка: Конечно же, в C++ тривиальные функции вроде { return 7; } тоже описаны внутри класса, но более сложные должны быть описаны отдельно. Вдобавок, если нужны опережающие ссылки (ссылки на класс или функцию, которые объявлены, но ещеещё не определены), то для этих объектов нужны прототипы (prototype). Следующий код не будет работать в C++:
 
<source lang=d>
Строка 150:
==== Ассоциативные массивы ====
 
Ассоциативные массивы — это массивы, в качестве индекса в которых можно использовать любой тип данных, а не только целые числа. По существу, ассоциативные массивы являются хэшхеш-таблицами, которые облегчают создание быстрых, эффективных и устойчивых к ошибкам таблиц символов.
 
==== РеальныйНастоящий typedef ====
 
В языках C и C++ оператор typedef на самом деле просто создает синоним типа данных и никакого нового типа данных не объявляется. В языке D оператор typedef объявляет новый тип данных. Таким образом, код
Строка 180:
 
Для генерации документации в языке C++ существуют инструментальные средства, разработанные третьими лицами. Использование этих инструментальных средств имеет ряд недостатков:
* Очень сложно обработать C++ код на 100 % правильно, для этого на самом деле потребуется компилятор. Инструменты от третьих лиц (third party tools) корректно работают только с подмножеством языка C++;.
* Разные компиляторы поддерживают разные версии языка C++ и разные расширения языка. Очень трудно соответствовать всем этим вариациям поддержки языка C++;.
* Инструменты для генерациигенерирования документации из C++ могут не быть реализованы для некоторых платформ или могут не соответствовать последней версии компилятора;.
 
Будучи встроенным в компилятор, генерациягенерирование документации является единой для всех реализаций языка D.
 
=== Функции ===
Строка 249:
==== Явное управление памятью ====
 
Несмотря на то, что язык D поддерживает автоматический сбор мусора, операторы <code>new</code> и <code>delete</code> могут быть перегружены для определенных классов.
 
==== RAII ====
Строка 265:
Драйвера устройств, высокопроизводительные системные приложения, а также встраиваемые системы (embedded systems) требуют углубления до уровня команд ассемблера. Программирование на языке D не требует использования ассемблера, но он реализован и является частью языка.
 
=== НадежностьНадёжность ===
 
Современный язык программирования должен сделать все, чтобы помочь программисту отловить ошибки в коде. Эта помощь может проявляться по-разному: от обеспечения легкостилёгкости использования устойчивых методик до эвристического поиска компилятором явно некорректного кода и проверок во время выполнения программы.
 
==== Отладочный код ====
Строка 279:
==== Синхронизация ====
 
Многопоточное программирование становится всевсё более распространенным, поэтому в языке D реализованы базовые возможности для создания многопоточных приложений. Синхронизация может быть применена ко всему объекту или к отдельным его методам.
 
<source lang=d>
Строка 322:
==== Поддержка всех типов данных языка C ====
 
Это делает возможным взаимодействие с API языка C или с кодом существующей библиотекой языка C. Эта поддержка включает структуры, объединения, перечисления, указатели и все типы данных, введенныевведённые в стандарте C99.
 
==== Обработка исключений операционной системы ====
Строка 336:
==== Контроль версий ====
 
В языке D реализована встроенная поддержка генерациигенерирования нескольких версий программ из одного исходного кода. Это заменяет использование команд препроцессора <code>#if</code> и <code>#endif</code>.
 
==== Устаревание ====