Среда времени выполнения (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.
Читайте также:
- Релиз Go 1.15, порты, инструменты
- Релиз Go 1.14: изменения в языке и его портах
- Релиз Go 1.14: инструменты, команда go
Комментариев нет:
Отправить комментарий