Вышла версия 2.066 кроссплатформенного компилятора языка программирования D: Digital Mars D (DMD). Язык D использует статическую типизацию, обладает синтаксисом, схожим с C/C++, и обеспечивает производительность компилируемых языков, при этом заимствуя некоторые полезные возможности динамических языков в области эффективности разработки и обеспечения безопасности. Например, предоставляется поддержка ассоциативных массивов, косвенное определение типов, автоматическое управление памятью, средства параллельного программирования и т.п.

Краткий список изменений:

  • Изменения в компиляторе DMD и языке:
    • Опция "-w" теперь выводит предупреждение про неиспользованное значение, возвращаемое pure-функцией. Так как pure-функции не могут иметь побочных эффектов, то подобный код, скорее всего, возник из-за невнимательности.
    • Опция "-noboundscheck" объявлена устаревшей и заменена на опцию "-boundscheck={on|safeonly|off}". Это позволяет гибко управлять проверками на выход из диапазона массивов в режиме -release (раньше включить проверку на выход из диапазона для relese-режима было невозможно).
    • Добавлена опция "-vgc", которая выводит места, где программа неявно выделяет память (это могут быть изменения размеров динамических массивов, объединения строк и т.п.). Опция использует новый атрибут "@nogc" для анализа.
    • Добавлена опция "-vcolumns", которая в диагностических сообщениях включает вывод не только номера строки, но и позиции в строке.
    • Добавлена опция "-color", которая расцвечивает диагностические сообщения об ошибках и предупреждения.
    • Добавлена языковая конструкция extern (C++, namespace), позволяющая использовать прямые вызовы функций C++ из пространств имён.
    • Добавлена возможность перегружать оператор многомерного слайсинга (multi-dimensional slicing).
    • Добавлен новый трэйт: __traits(getFunctionAttributes). Он позволяет получить атрибуты функции, такие, как "pure", "nothrow", "@safe" и пр.
    • Улучшен механизм автоматического определения типов в шаблонах. Шаблон вида "void foo(T)(T[] arr, T elem)" теперь может быть вызван как "foo(a, 1)", если a определено как "short[] a". Раньше было необходимо явно приводить 1 к типу short.
    • Операции Read-Modify-Write на разделяемых (shared) переменных объявлены устаревшими. Вместо "foo += 2" теперь следует использовать "atomicOp!"+="(foo, 2)".
    • Добавлена поддержка конструкторов для встроенных типов: "auto foo = long(1)".
  • Изменения в стандартной библиотеке
    • В модуле core,time операция Duration.get объявлена устаревшей и заменена на универсальный шаблон Duration.split, позволяющий более гибко управлять получением нужных частей временного промежутка. Duration.get всегда вычисляла все части (недели, дни, часы, минуты, секунды и т.д.), но возвращала только запрошенные; Duration.split вычисляет только то, что запросил пользователь. Вдобавок Duration.split может возвращать значения как в out-переменных, так и структуру с запрошенными полями.
    • Некоторые свойства встроенных типов заменены на библиотечные функции. Благодаря универсальному синтаксису вызова функций программисту не надо исправлять код. Такая замена позволяет более гибко управлять деталями реализации встроенных типов - динамических массивов и ассоциативных массивов.
    • Типы-ключи ассоциативных массивов теперь нуждаются в операции opEqu (сравнение на идентичность), а не в операции opCmp (сравнение "больше-меньше-равно").


    Источник: http://www.opennet.ru/opennews/art.shtml?num=40406