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

© OpenNet