вторник, 14 июня 2011 г.

Покажите язык! (с) ...знакомимся с особенностями Ди

Что для вас является самым главным в языке? Допустим, вы только что узнали, что есть язык Ди, на что вы обратите внимание в первую очередь? Я вот, будучи личностью незаурядной, в первую очередь обратил внимание на... официальный веб-сайт языка. Скромный дизайн, пара цитат от пользователей, общая информация о языке, гора ссылок и пример кода. Очень ненавязчиво. Похоже панель слева содержит всю необходимую информацию для новичков. Время ознакомится с особенностями языка.

Введение раскрывает все карты: язык Ди задумывался как переработанная, доведенная до совершенства, соответствующая новейшим требованиям версия языка С++. Ответ на вопрос, а почему именно так, я нашел в третьем абзаце:
“Язык Ди — это кульминация многолетнего опыта написания компиляторов для различных языков программирования”
Уолтер Брайт, создатель языка

Не знаю, что это за «различные» языки, но на сайте есть упоминание лишь о знаменитом (по мнению википедии) компиляторе — Digital Mars C++, который ранее назывался Zortech C++ и был самым первым коммерческим компилятором для Windows. Ситуацию проясняет биография Уолтера: оказывается, он три года работал в «Боенге», разрабатывая ПО для самолетов; приложил руку к компилятору для среды разработки «Symantec Visual Cafe's Java», который, по его мнению, до сих пор является самым быстрым (правда он не поясняет, что именно понимать под быстротой); написал компилятор для языка Advanced Boolean Expression Language; ну и наконец, создал интерпретатор и компилятор к DMDScript.

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

И вот, вооружившись прошлым опытом, он создает язык, который будет практичным (читай удобным в использовании), мощным (читай широкий спектр возможностей и областей применения языка) и продуктивным (читай продлевающим жизнь). Главными постулатами и ориентирами языка признаются:
  • “Облегчение написания кода, который без особых усилий может быть перенесен от компилятора к компилятору, от компьютера к компьютеру, от одной операционной системы к другой.
  • Поддержка нескольких подходов к программированию: структурный и объектно-ориентированный, как минимум.
  • Легкость изучения языка для тех, кто имел дело с языками C и C++.
  • Обеспечение прямого низкоуровневого доступа к оборудованию
  • Наличие контекстно-независимой грамматики.
  • Легкость создания интернациональных программ.
  • Возможность создания легковесных и самостоятельных программ.”
Осталось понять, как это реализовано на уровне языка. Беру первый попавшийся пример - классический (правда, далеко не в каноническом виде) «hello world» с главной страницы языка:
#!/usr/bin/dmd -run
/* sh style script syntax is supported */

/* Hello World in D
   To compile:
     dmd hello.d
   or to optimize:
     dmd -O -inline -release hello.d
*/

import std.stdio;

void main(string[] args)
{
    writefln("Hello World, Reloaded");

    // auto type inference and built-in foreach
    foreach (argc, argv; args)
    {
        // Object Oriented Programming
        auto cl = new CmdLin(argc, argv);
        // Improved typesafe printf
        writeln(cl.argnum, cl.suffix, " arg: ", cl.argv);
        // Automatic or explicit memory management
        delete cl;
    }

    // Nested structs and classes
    struct specs
    {
        // all members automatically initialized
        int count, allocated;
    }

    // Nested functions can refer to outer
    // variables like args
    specs argspecs()
    {
        specs* s = new specs;
        // no need for '->'
        s.count = args.length;     // get length of array with .length
        s.allocated = typeof(args).sizeof; // built-in native type properties
        foreach (argv; args)
            s.allocated  = argv.length * typeof(argv[0]).sizeof;
        return *s;
    }

    // built-in string and common string operations
    writefln("argc = %d, " ~ "allocated = %d",
 argspecs().count, argspecs().allocated);
}

class CmdLin
{
    private int _argc;
    private string _argv;

public:
    this(int argc, string argv) // constructor
    {
        _argc = argc;
        _argv = argv;
    }

    int argnum()
    {
        return _argc   1;
    }

    string argv()
    {
        return _argv;
    }

    string suffix()
    {
        string suffix = "th";
        switch (_argc)
        {
          case 0:
            suffix = "st";
            break;
          case 1:
            suffix = "nd";
            break;
          case 2:
            suffix = "rd";
            break;
          default:
     break;
        }
        return suffix;
    }
}
Код, пожалуй, даже в объяснении не нуждается. В глаза бросились ключевые моменты:
  1. Модульная философия. Каждый файл выступает как функциональная единица.
  2. Диагноз «ООП головного мозга» отменяется. Заметно по тому, как main лихо расположилась в глобальном контексте.
  3. Вложенные в функцию конструкции. Приятно удивило, хотя, возможно, ведет к созданию плохого кода. Время покажет.
  4. Переменным присваиваются значения по-умолчанию. Ох, как же этого не хватало в С++!
  5. Выведение типов. Компилятор может сообразить в определенных контекстах, какого типа должна быть переменная.
  6. Ручная и автоматизированная работа с памятью.
Самый важный момент здесь, безусловно, что в языке есть сборщик мусора. Осталось разобраться в тонкостях его работы. Радует что можно удалять объекты и вручную.

Помимо всего вышеприведенного, Ди включает в себя:
  • свое видение обобщенного программирования
  • «продвинутые» массивы
  • средства для быстрого создания документации к коду
  • встроенные инструменты unit-тестирования
  • и многое другое

Важно отметить вот еще что: присутствует поддержка совместимости с языком C. Можно напрямую взаимодействовать с уже готовыми библиотеками. Есть только одно но: понятия строк в D и C отличаются. Самое важное, что необходимо запомнить, — в Си все строки заканчиваются двоичным нулем. В Ди же, они представляются как массив символов.

Итак, после подобного инструктажа, я вполне могу перейти к коду. Все-таки проще будет познакомится с языком на конкретных примерах.

6 комментариев:

  1. Спасибо за полезную информацию по D на русском. Я тоже решил изучать этот язык (после C++ и Java). Как вы думаете, какая IDE наиболее развита на данный момент для D ?

    ОтветитьУдалить
  2. Дмитрий, здравствуйте! Прежде всего, хотел бы поблагодарить за комментарий — я уже и не надеялся увидеть в этом блоге посетителей.

    Насчет вашего вопроса. Вы должны понимать, что «язык Ди» — это требующая уточнения фраза. В обществе последователей языка давно существует четкое разделение на два лагеря: приверженцы первой версии и приверженцы второй.

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

    Учитывая ваше Солнечное™ прошлое (привет Sun Microsystems!), можно посоветовать решение на базе некогда родного и уютного Eclipse: плагин Descent (http://www.dsource.org/projects/descent/). Он покрывает абсолютно все фичи языка и делает это на невероятно качественном уровне: продвинутый, гибкий intellisense; всевозможные настройки (в том числе и автоформатирования кода); …хотя, что я вам тут рассказываю?! Можете сами посмотреть, на что способен плагин: http://www.youtube.com/view_play_list?p=1DFFABD495A9072E

    Кстати, возможно даже использовать Ant для построения проекта — http://gim.jogger.pl/2009/01/14/eclipse-3-4-descent-ant-tango-linux/ (хоть речь и о Linux, но принципы настройки Ant одинаковые)

    Должен предостеречь: проект был заброшен и больше не развивается. Хотя, на мой скромный взгляд, плагин полностью жизнеспособен. Если решитесь его использовать, держите при себе список «горячих клавиш» — http://www.dsource.org/projects/descent/wiki/Shortcuts — сильно помогающих во время работы.

    Считаю, что это самое лучшее «IDE» (формально обозвать Descent средой разработки нельзя) для D1.

    ОтветитьУдалить
  3. Хорошо, будем пробывать!) И вам удачи в изучении этого замечательного языка. Кстати был русскоязычный сайт dprogramming.ru , но похоже сейчас он умер (все ссылки идут на главную)

    ОтветитьУдалить
  4. Приветствую храбрых D-программистов :)

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

    Сейчас пытаюсь подобрать среду разработки. Споткнулся на отладчике.

    Вы все еще используете ddbg в связке с Poseidon? На сколько я смог уяснить - это компромисс между отладкой в командой строке и GUI IDE. Т.е. в редакторе модуля точку останова не поставишь. Но заметно, что посейдон подсвечивает какие-то окошки, связанные с отладкой.

    Я попробовал использовать ddgb в режиме эмуляции gdb, в связке с IDE Code::Blocks. Если верить документации ddbg, таким способом можно интегрировать ddbg кодеблоксом. Но не получилось.

    Не анализировали другие варианты отладчика? Или есть смысл напрячься и изучить командный интерфейс ddbg? Прежде чем ввязываться хотелось бы узнать, работает ли оно хотя бы в первом приближении?

    ОтветитьУдалить
  5. Владислав, здравствуйте!

    На самом деле, в Poseidon встроена полноценная поддержка ddbg (советую брать отсюда: http://www.dsource.org/projects/ddbg_continued). Однако, есть одна маленькая (озвученная вами) проблема: не понятно, как ставить «точки останова». Ответ когда-то давно я нашел на форуме программы: «точки останова» нужно устанавливать с зажатой клавишей Control (в простонародье — Ctrl).

    Впрочем, это теперь не единственно возможный способ. Последняя версия Poseidon обзавелась соответствующим пунктом в меню «Debug». Кратенькое введение в мир Посейдоновской отладки читайте здесь: http://dsource.org/projects/poseidon/wiki/debug

    Ну и про вашу историю с Code::Blocks. Вы знаете, вы не одиноки. Я тоже пытался заняться отладкой в кодеблоксе. Ничего не вышло, этот «хак» у меня не срабатывал. Хотя это было давно, может чего и изменилось. Но судя по вашему опыту — вряд ли.

    А вам, Дмитрий, советую особо не расстраиваться по поводу смерти ресурса: все матерые русские специалисты по языку до сих пор сидят на IRC-канале D (сервер: http://irc.freenode.net/ имя канала: #d). Кстати, там частенько можно встретить одного знатного интеллектуала — Андрея Александреску, слыхали о таком?

    Еще раз спасибо вам, дорогие посетители!

    ОтветитьУдалить
  6. Здравствуйте, отличый блог жаль его найти в сети трудно.
    Всем изучающим язык d1 И d2 предлагаю переехать на ресурс ddevel.org (тематика сайта програмирование, и геймдев) Сайт еще в разработке но уже пора его забивать информацией.

    ОтветитьУдалить