пятница, 14 августа 2020 г.

Релиз Go 1.15, runtime, компилятор, компоновщик

Среда времени выполнения (Runtime)

Если паника вызывается со значением, тип которого является производным от любого из: bool, complex64, complex128, float32, float64, int, int8, int16, int32, int64, string, uint, uint8, uint16, uint32, uint64, uintptr, тогда будет напечатано значение, а не только его адрес. Раньше это было верно только для значений именно этих типов.

В системе Unix, если команда kill или системный вызов kill используется для отправки сигнала SIGSEGV, SIGBUS или SIGFPE программе Go, и если сигнал не обрабатывается через os/signal.Notify, программа Go теперь будет надежно вылетать с трассировкой стека. В более ранних выпусках поведение было непредсказуемым.

Распределение небольших объектов теперь работает намного лучше при большом количестве ядер и имеет меньшую задержку в худшем случае.

Преобразование небольшого целочисленного значения в значение интерфейса больше не вызывает выделения.

Неблокирующие приемы по закрытым каналам теперь работают так же, как неблокирующие приемы по открытым каналам.

Компилятор

Правила безопасности package unsafe позволяют конвертировать unsafe.Pointer в uintptr при вызове определенных функций. Ранее в некоторых случаях компилятор допускал несколько связанных преобразований (например, syscall.Syscall(…, uintptr(uintptr(ptr)), …)). Теперь компилятору требуется ровно одно преобразование. Код, в котором использовалось несколько преобразований, следует обновить, чтобы он соответствовал правилам безопасности.

Go 1.15 уменьшает типичный двоичный размер примерно на 5% по сравнению с Go 1.14 за счет исключения определенных типов метаданных GC и более активного удаления метаданных неиспользуемых типов.

Цепочка инструментов теперь смягчает ошибку CPU Intel SKX102 на GOARCH=amd64, выравнивая функции по 32-байтовым границам и заполняя инструкции перехода. Хотя это заполнение увеличивает двоичный размер, это более чем компенсируется упомянутыми выше улучшениями двоичного размера.

Go 1.15 добавляет флаг -spectre как к компилятору, так и к ассемблеру, чтобы разрешить включение защиты от Spectre. В них почти никогда не должно быть необходимости, и они предоставляются в основном как механизм "глубокой защиты".

Теперь компилятор отклоняет компиляторные директивы //go: , которые не имеют значения для объявления, к которому они применяются, с ошибкой "неправильно размещенная директива компилятора". Такие неправильно примененные директивы ранее нарушались, но компилятор молча игнорировал их.

Ведение журнала оптимизации компилятора -json теперь сообщает о больших (>= 128 байт) копиях и включает объяснения решений анализа выхода.

Компновщик (Linker)

Этот выпуск включает в себя существенные улучшения компоновщика Go, которые сокращают использование ресурсов компоновщика (как время, так и память) и улучшают надежность кода/ремонтопригодность.

Для репрезентативного набора больших программ Go компоновка выполняется на 20% быстрее и требует в среднем на 30% меньше памяти для ОС на основе ELF (Linux, FreeBSD, NetBSD, OpenBSD, Dragonfly и Solaris), работающих на архитектурах amd64, с более скромными параметрами улучшения для других комбинаций архитектуры/ОС.

Ключевыми факторами повышения производительности компоновщика являются недавно переработанный формат объектного файла и переработка внутренних фаз для увеличения конкурентности (например, параллельное применение перемещений к символам). Объектные файлы в Go 1.15 немного больше, чем их эквиваленты в 1.14.

Эти изменения являются частью проекта с несколькими выпусками по модернизации компоновщика Go, а это означает, что в будущих выпусках ожидаются дополнительные улучшения компоновщика.

Компоновщик теперь по умолчанию использует режим внутренней компоновки для -buildmode=pie в linux/amd64 и linux/arm64, поэтому эти конфигурации больше не требуют компоновщика C.

Objdump

Инструмент objdump теперь поддерживает дизассемблирование в синтаксисе ассемблера GNU с флагом -gnu.


Читайте также:


Комментариев нет:

Отправить комментарий