Язык программирования D: различия между версиями
Содержимое удалено Содержимое добавлено
Gribozavr (обсуждение | вклад) много мелких улучшений |
|||
Строка 1:
{{wikipedia|D (язык программирования)}}
'''D''' — язык программирования общего назначения, предназначенный для прикладного и системного программирования. Он является языком более высокого уровня, нежели [[w:C++|C++]], но сохраняет возможность писать высокопроизводительный код и напрямую взаимодействовать с программным интерфейсом операционной системы и с оборудованием. D пригоден для написания
D не является ни языком скриптования, ни интерпретируемым языком. Он не требует наличия виртуальной машины, не навязывает новой философии программирования. D позиционируется
В D собран опыт разработки десятков компиляторов для самых разнообразных языков программирования, а также попыток создания крупных проектов на этих языках. Язык D вобрал в себя лучшее из тех языков (больше всего из C++) и практично применил эти возможности.
Строка 10:
И действительно, почему? Кому нужен другой язык программирования?
Индустрия программного обеспечения прошла долгий путь с тех пор
Программисты на C++, по сути, используют различные подмножества языка, то есть в основном используют одни возможности языка и, в то же время, избегают других его возможностей. Помимо сложности портирования кода между компиляторами, существует также сложность портирования кода между программистами. Мощь языка C++ заключается в том, что он поддерживает радикально различные стили программирования, но в большинстве случаев противоречивые стили программирования являются помехой.
Строка 20:
* Облегчает написание кода, который без особых усилий может быть перенесен от компилятора к компилятору, от компьютера к компьютеру, от одной операционной системы к другой;
* Поддержка нескольких подходов к программированию: структурный и объектно-ориентированный, как минимум;
*
* Обеспечение прямого низкоуровневого доступа к оборудованию;
* Наличие контекстно-независимой грамматики;
Строка 28:
=== Возможности, унаследованные от C/C++ ===
Общий синтаксис языка D схож с синтаксисом C и C++. Это делает
Для того чтобы использовать язык D, программисту не обязательно ограничивать себя специализированной виртуальной машиной (VM), как это сделано с Java и Smalltalk. Для D не существует виртуальной машины. Программы, написанные на D, компилируются в
* Сохранены синтаксис и семантика языков C и C++. D использует те же формы выражений и общий план программ
* Программы на D могут быть написаны с использованием функционального и объектно-ориентированного подходов, а также с использованием шаблонов (template metaprogramming) или любой комбинации этих трех подходов
* Поддерживается модель разработки по этапам компиляция/линкование/отладка (compile/link/debug), но ничто не мешает откомпилировать код D в байт-код и интерпретировать его
* Обработка исключений (exception handling). Опыт использования обработки исключений показывает, что существует более совершенный стиль обработки ошибок, чем традиционное для языка C использование кодов ошибок и переменной <code>errno
* Приведение типов в реальном времени. Отчасти это было реализовано и в C++. Способ приведения типов в языке D позволяет улучшить процесс сбора мусора и облегчить процесс отладки
* D поддерживает совместимость с соглашением о вызове функций в языке C, что делает возможным прямой доступ из кода на языке D напрямую к программному интерфейсу операционной системы. В работе с API в D могут быть использованы уже имеющиеся знания и опыт
* Перегрузка операторов. В языке D можно перегружать операторы с целью расширения списка операций над пользовательскими данными
* Использование шаблонов. Шаблоны дают возможность создавать
=== Чего нет в языке D ===
* Совместимость с исходным кодом
* Препроцессор. Для расширения языка удобно использовать макросы.
* Множественное наследование. Это запутанная возможность сомнительной полезности. Множественное наследование может быть заменено обычным наследованием с использованием интерфейсов и агрегированием
* Пространства
*
* Не
* Битовые поля (bit fields) произвольного размера. Битовые поля сложны, неэффективны и достаточно редко используются
* Поддержка 16-битных компьютеров. В языке D нет никаких решений для
* Взаимная зависимость проходов компилирования (compiler passes). В языке C++
* Различие между операторами точка (<code>.</code>) и стрелка (<code>-></code>). В их различии нет необходимости, поскольку оператор точка (<code>.</code>) в языке D служит также для разыменования указателей.
=== Для кого и чего предназначен язык D ===
Строка 58:
* Для программистов, регулярно пользующихся анализаторами кода для выявления ошибок еще до компиляции;
* Для людей, которые компилируют код с максимальным количеством включенных уровней предупреждений (warning levels), что означает интерпретацию предупреждений как ошибок;
* Для тех, кто решил, что обещание
* Для программистов, которых впечатляет мощь языка C++, но разочаровывает необходимость ручного управления памятью и ловля багов, связанных с указателями;
* Для проектов, нуждающихся во встроенных средствах тестирования и верификации;
Строка 67:
=== Для кого и чего D не предназначен ===
* Вообще-то никто не собирается
* Для очень маленьких программ, для которых больше подойдут языки скриптования или интерпретируемые языки, например Python или Perl
* В качестве первого языка программирования. Basic и Java больше подойдут для начинающих программистов, а язык D предназначен для тех, кто уже имеет опыт программирования и для профессиональных программистов
* Для борцов за чистоту языка. D является практичным языком и каждая его особенность реализуется таким образом, чтобы сохранить эту практичность. Например, в языке D нет необходимости использовать указатели в
== Особенности языка D ==
Строка 78:
==== Классы ====
Объектно-ориентированная природа языка D происходит от классов. Модель наследования не поддерживает наследования от нескольких классов, зато расширяется за счет использования интерфейсов. На вершине иерархии наследования находится класс <code>Object</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; } тоже описаны внутри класса, но более сложные должны быть описаны отдельно. Вдобавок, если нужны опережающие ссылки (ссылки на класс или функцию, которые объявлены, но
<source lang=d>
Строка 150:
==== Ассоциативные массивы ====
Ассоциативные массивы — это массивы, в качестве индекса в которых можно использовать любой тип данных, а не только целые числа. По существу, ассоциативные массивы являются
====
В языках C и C++ оператор typedef на самом деле просто создает синоним типа данных и никакого нового типа данных не объявляется. В языке D оператор typedef объявляет новый тип данных. Таким образом, код
Строка 180:
Для генерации документации в языке C++ существуют инструментальные средства, разработанные третьими лицами. Использование этих инструментальных средств имеет ряд недостатков:
* Очень сложно обработать C++ код на 100
* Разные компиляторы поддерживают разные версии языка C++ и разные расширения языка. Очень трудно соответствовать всем этим вариациям поддержки языка C++
* Инструменты для
Будучи встроенным в компилятор,
=== Функции ===
Строка 249:
==== Явное управление памятью ====
Несмотря на то, что язык D поддерживает автоматический сбор мусора, операторы <code>new</code> и <code>delete</code> могут быть перегружены для определенных классов.
==== RAII ====
Строка 265:
Драйвера устройств, высокопроизводительные системные приложения, а также встраиваемые системы (embedded systems) требуют углубления до уровня команд ассемблера. Программирование на языке D не требует использования ассемблера, но он реализован и является частью языка.
===
Современный язык программирования должен сделать все, чтобы помочь программисту отловить ошибки в коде. Эта помощь может проявляться по-разному: от обеспечения
==== Отладочный код ====
Строка 279:
==== Синхронизация ====
Многопоточное программирование становится
<source lang=d>
Строка 322:
==== Поддержка всех типов данных языка C ====
Это делает возможным взаимодействие с API языка C или с кодом существующей библиотекой языка C. Эта поддержка включает структуры, объединения, перечисления, указатели и все типы данных,
==== Обработка исключений операционной системы ====
Строка 336:
==== Контроль версий ====
В языке D реализована встроенная поддержка
==== Устаревание ====
|