Про язык программирования D

Захотелось мне как-то попробовать какую-нибудь экзотику, а тут как раз под руку попалась книга про язык программирования D, да еще и написанная самим Александреску, которого вы можете знать по книге Modern C++ Design (Современное проектирование на С++).

lang_d

В свое время мне очень нравился язык C#, когда он еще был для .NET 2.0, но потом .NET Framework начал пухнуть, как на дрожжах, и уже стало неприлично заставлять пользователя качать библиотеку размером в 250 МБ для запуска программы размером в мегабайт. Да и по поводу кроссплатформенности к C# есть вопросы (точнее, не к самому языку, а к платформе .NET). Со временем я от C# перешел на Python, и, что бы ни говорили, скриптовый язык по сравнению с компилируемым — это потенциальные тормоза.

Хотелось бы иметь язык, который был бы чем-то вроде очеловеченного C++, чтобы, с одной стороны, он был компилируемым, а с другой, по возможности уменьшал вероятность появления ошибок, которые трудно отлавливаются, в основном это касается багов с указателями и утечками памяти.

Язык D как раз и задумывался как такой язык. Правда, этот язык решил усидеть на двух стульях — он предоставляет сборщик мусора, автоматическое управление памятью и некоторые другие защиты программиста от самого себя или от коллег, но в то же время позволяет обойти некоторые свои ограничения, если программист об этом попросит, и там тоже при желании можно устроить утечки памяти и неправильные указатели, чтобы чувствовать себя как в C++.

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

Для прикладных программистов язык D предоставляет, как я уже говорил, сборщик мусора, работу с памятью так, как это происходит в C# — классы создаются в куче, и доступ к ним осуществляется по указателю, а структуры — в стеке и доступ к ним осуществляется по значению. Кроме того, язык предоставляет гору синтаксического сахара для различных типичных задач, новые по сравнению с C++ операторы, ограничивающие полет фантазии программистов (некоторые такие конструкции есть и в Java).

Поскольку в этой небольшой блогозаписи нет смысла пересказывать всю книгу и писать подробное описание языка, то упомяну лишь небольшую часть конструкций, которые мне показались интересными, и которые не требуют написания большого количества кода.

Во-первых, в D сделан по-человечески импорт классов и функций из модулей. Нет этих проклятых #include, так «любимых» C-шниками за русскую рулетку в стиле «подключим эту библиотеку и посмотрим, не перестанет ли компилиться весь проект». Импорт функций рекомендуется использовать как

import std.algorithm

а по сути это работает как импорт всех функций в Python (from math import *), но только если в Python такая запись не рекомендуется из-за опасности перезаписи имеющейся функции, то здесь такую ситуацию отслеживает компилятор, и если появляется неоднозначность, то он не даст вызвать импортированную функцию без явного указания модуля для уточнения. Работа с модулями и пакетами вообще напоминает Python — здесь тоже папка с файлами-модулями образует пакет.

Отдельной большой статьи (и не одной) заслуживает описания работы массивов. Тут есть массивы с фиксированным количеством элементов, и с переменным размером. Массивы знают свою длину, и проверяют выход за границы, но при желании это можно отключить и обойти. Выделение памяти для элементов массива работает довольно хитро, гарантируется, что все элементы расположены в памяти последовательно, а массив только знает, где у них начало и конец. Из массива можно получать его участок (срез), причем гарантируется, что срез указывает на ту же область памяти, что входит в исходный массив. Но исходный массив при некоторых обстоятельствах (при увеличении своего размера) может скопировать свои элементы в другую область памяти. При этом может возникнуть ситуация, когда массив и срез хранят указатели на одну область памяти, а потом внезапно массив может начать указывать на другую область памяти. Данные при этом не будут испорчены благодаря подсчету ссылок, но момент в языке спорный.

Как в C# или Java, в D есть интерфейсы, так и в тех языках запрещено множественное наследование классов (хотя через некоторые извороты в D можно сделать что-то очень напоминающее такое наследование), но разрешено множественное наследование интерфейсов.

Есть поддержка вложенных классов, анонимных функций и замыканий.

Интересной особенностью языка, которая мне не попадалась до этого, являются «ленивые» параметры функции. По умолчанию параметры работают как и в других языках, перед вызовом функции

void f (int x) {

}

сначала вычисляется значение x, но можно сказать, чтобы параметр x вычислялся только тогда, когда (если) он действительно понадобится, для этого к параметру нужно добавить ключевое слово lazy:

void f (lazy int x) {

}

В D мне понравилась идея к квалификатором immutable, который напоминает const в других языках, но является еще более ограничивающим, он гарантирует, что не только указатель на объект останется неизменным, но и все содержимое объекта тоже останется без изменений. Приятно, что язык поддерживает ключевое слово nothrow для функций, гарантирующих, что они никогда в жизни не бросят исключения, и не вызовут функции, которые могут бросить исключения.

Язык D поддерживает методику контрактного программирования (предусловия и постусловия для функций), в язык встроены операторы unittest и assert, позволяющие писать тесты непосредственно в модулях к основным кодом (честно говоря, мне кажется что смешивать код и тесты не очень правильно), а потом их запускать с помощью специального ключа компилятора.

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

Что касается инструментов для работы с D, то в качестве компилятора можно выбрать или эталонный компилятор dmd от компании Digital Mars (язык изначально должен был называться Mars), или компилятор D из набора GCC.

Поскольку я люблю оффлайновое программирование, то для языков меня обычно интересуют библиотеки для построения интерфейсов, на первый взляд тут пока не все ясно. Такие библиотеки есть. Вроде есть порт моей любимой в последнее вермя библиотеки wxWidgets — wxD, но эта библиотека пока считается альфа-версией, и последняя сборка датируется 2011 годом. Я боюсь, что она может даже не скомпилироваться, поскольку язык D очень резво развивается, в нем появляются новые фичи, удаляются устаревшие, хотя в последнее время язык более-менее стабилизировался.

В общем, язык D меня заинтересовал, буду, наверное, с ним играться, может быть еще про него что-нибудь напишу после экспериментов.

Что касается книги, которую я упомянул в начале поста, то она отличная. Александреску умеет плавно переходить от элементарных, но необходимых для описания языка, вещей к сложным темам, при этом поясняет, почему какая-то фича сделана так, а не эдак. При этом стиль написания книги замечателен, примеры и описания разбавлены шутками, причем действительно смешными.

В результате книга охватывает не только элементарные вещи вроде синтаксиса, чуть более сложные темы ООП и шаблонов, но есть и главы по встроенному ассемблеру и многопоточности с описанием различных стилей и инструментов для создания программ для параллельных вычислений. Правда, в книге ничего не написано про работу с указателями кроме того, что это опасно, и что лучше избегать этой возможности.

Отдельно хочется отметить работу научных редакторов, которые не только в сносках дали пояснения, касательно развития языка, но и написали целые разделы, которых не было в оригинале книги. Здорово, что в книге нет примеров программ на десятки страниц, приводится только минимальный код, необходимый для понимания языка.

Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.

Пожалуйста, оцените запись

УжасноПлохоТак себеХорошоОтлично (Количество голосов: 5, средняя оценка: 5,00)
Загрузка...

комментария 2

  1. Дмитрий:

    У инженеров работа в основном на фортране,с, с++ и пакетами проектирования.
    Так как используются несколько сотен стандартных, отлаженных библиотек и никакие новые языки были не нужны.
    Из фортрана можно вызывать программы на с++,c.
    Но появился пакеты Матлаб,Мапл,Маткад,Skulab у которых есть свои упрощенные языки.
    Я изучаю параллельные расчеты на графических картах(Open CL,Интел Phi процессор, фортран для графических карт.У меня нет таланта программировать, а способности проектировать и решать математические задачи.)
    У меня брат изучал с++, как и я.Но зарабатывать на нем в России мы не смогли.Он изучил Сиквел(SQL) и Оракл, сдал на сертификаты и уехал в Астралию.
    В Москве работал в банке,Медицинскои компании, изучал компьютерную графику, но за это не платили.За ту же самую работy получает там в 2 раза больше.
    Сиквел и Оракл интересны тем, что они почти не изменились за 10 лет.Специалистов по ним мало в России.

  2. Тимур:

    Хочу добавить, что существует также компилятор LDC (с LLVM в качестве бэкенда). Несмотря на всплывающие изредка баги, вполне юзабелен. Под Linux — самое то.
    https://github.com/ldc-developers/ldc/releases

Leave a comment

Subscribe without commenting