Вышла версия 2.066 компилятора языка D

Вышла версия 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 (сравнение «больше-меньше-равно»).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.