Компания Qt Company опубликовала релиз фреймворка Qt 6.10, в котором продолжена работа по стабилизации и наращиванию функциональности ветки Qt 6. В Qt 6.10 предоставлена поддержка платформ Windows 10+, macOS 13+, Linux (Ubuntu 22.04/24.04, openSUSE 15.6, SUSE 15 SP6, RHEL 8.10/9.4, Debian 11.6), iOS 16+, Android 9+(API 23+), webOS, WebAssembly, INTEGRITY, VxWorks, FreeRTOS и QNX. Исходные тексты компонентов Qt поставляются под лицензиями LGPLv3 и GPLv2. Qt 6.10 получил статус промежуточного выпуска, общедоступная поддержка которого будет осуществляться 6 месяцев (+ ещё 6 месяцев для коммерческих пользователей).
Добавлен QML-тип FlexboxLayout для адаптивной раскладки элементов интерфейса в соответствии с концепцией Flexbox, применяемой в CSS для упрощения вертикального выравнивания элементов. Реализация поддерживает концепции, уже используемые в Qt Quick, такие как прикрепление свойств для настройки поведения отдельных элементов в макете.
В модулях Qt Quick Scene Graph и Qt Quick Shapes реализованы возможности для работы с анимированной векторной графикой, формируемой из изображений в форматах SVG и Lottie. В модуле Qt Lottie расширена поддержка файлов в формате Lottie. Добавлена возможность использования формата Lottie в типе VectorImage для отображения файлов Lottie с масштабированием и аппаратным ускорением.
В набор Qt Quick Control включён новый элемент SearchField с реализацией специализированного поля ввода для использования с функциональностью поиска, позволяющего отображать релевантные данные во всплывающем окне, отфильтровываемые в зависимости от уже введённого в поле текста.
Элемент поддерживает различные встроенные стили Qt и позволяет добиться оформления, родного для всех основных платформ.
Добавлены классы для упрощения интеграции моделей данных C++ с QML и Qt Quick:
QRangeModel - обвязка над QAbstractItemModel для прямого использования в элементах интерфейса на базе QML и Qt Quick любых перечисляемых типов из C++, включая std::vector, std::tuples и std::array.
std::vector<int> values = {1, 2, 3, 4, 5};
auto model = new QRangeModel(values);
QListView *listView = new QListView;
listView->setModel(model);
В QML-тип DelegateModel добавлено свойство delegateModelAccess, которое может принимать значение DelegateModel.ReadWrite для разрешения записи в модель через свойства контекста, объект модели или обязательные свойства.
Добавлен QML-тип Synchronizer, решающий задачу синхронизации состояния элемента управления со значением из модели. Synchronizer гарантирует, что несколько свойств содержат одинаковое значение - изменение одного из синхронизированных свойств автоматически приводит к изменению всех остальных.
Добавлен QML-тип TreeModel, позволяющий размещать древовидные структуры C++ непосредственно в QML-документе, используя пары ключ-значение и синтаксис словарей и массивов, напоминающий JSON.
Добавлен QML-тип SortFilterProxyModel, позволяет сортировать и фильтровать данные непосредственно из QML, без использования кода на C++.
В Qt Quick 3D расширены возможность для создания карт освещения при рендеринге в высоком качестве и добавлена поддержка реверсивного применения эффектов с частицами для создания эффекта столкновения дождя или снега с моделью.
В Qt Graphs добавлен тип поверхности с заполнением и реализована возможность преобразования среза трехмерных графиков в 2D-изображение для вывода на печать.
В Qt Widgets упрощена реализация пользовательских delegate-объектов, улучшено управление операциями drag&drop и добавлена возможность индивидуальной настройки размера макетов.
В Qt Core улучшена работа с локалями, XML-документами и последовательностями асинхронных операций (continuation chain).
Расширены средства для людей с ограниченными возможностями. Встроенные стили контрастного представления информации адаптированы для использования системных настроек контраста, чтобы Qt-приложения визуально соответствовали общему стилю. Элементы управления и виджеты Qt усовершенствованы для использования с экранными ридерами.
Добавлена поддержка мобильных платформ Android 15 и 16, включая возможность работы на устройствах, на которых используются страницы памяти размером 16 КБ.
Представлен инструментарий Qt Jenny 1.0, упрощающий интеграцию Qt-приложений с Android Java API и поддерживающий автоматическую генерацию C++ API из аннотированных Java-классов, позволяющих напрямую обращаться из Qt-кода к таким Android-сервисам, как BatteryManager, PowerManager и AudioManager.
Добавлены
возможности для корректного вывода заставки на платформе Android.
Обеспечена полна поддержка платформ macOS 26 и iOS 26, в которых задействован визуальный язык Liquid Glass и изменена архитектура отрисовки.
В модуль Qt WebView на платформе Windows добавлена возможность встраивания в Qt-приложения web-контента с использованием движка WebView2 на базе Microsoft Edge вместо движка WebEngine на базе Chromium.
В модуль Qt Multimedia добавлен бэкенд для использования мультимедийного сервера PipeWire на платформе Linux.
Обновлён стек Boot2Qt, который может использоваться для создания загружаемых мобильных систем с окружением на базе Qt и QML. Системное окружение в Boot2Qt обновлено до платформы Yocto 5.2.
Добавлена поддержка плат Ezurio Nitrogen.
По данным сервиса, осуществляющего мониторинг международных каналов связи, пропускная способность глобальной сети в 2025 году выросла на 25% и достигла 1835 Тбит/с, что более чем в два раза больше, чем было в 2021 году. Наибольший рост пропускной способности международных каналов связи за последние четыре года наблюдается в Африке (38%) и Ближнем Востоке (27%).
Росту интернет-трафика последние годы способствовали такие факторы, как распространение потребительских устройств с доступом в интернет, проникновение широкополосного доступа в развивающихся странах и рост приложений, требовательных к полосе пропускания.
Из факторов, которые могут повлиять на международный интернет-трафик в будущем, отмечены: облачные сервисы для AI и доступа к мощностям GPU; внедрение частных магистральных сетей, не использующих общедоступные каналы связи, в инфраструктуре компаний, развивающих сети доставки контента, датацентры и облачные сервисы; развитие сервисов, зависимых от прямых подключений к поставщикам контента; использование систем кэширования трафика; региональная локализация контента; снижение стоимости на транзитный трафик после введения новых международных сетей.
Компания Mozilla начала тестирование Firefox VPN, встроенного в Firefox бесплатного VPN-сервиса, позволяющего обращаться к сайтам не напрямую, а через промежуточные серверы в разных странах, скрывающие IP-адрес пользователя. VPN станет первым сервисом, реализованным в рамках инициативы по интеграции в Firefox дополнительных инструментов для защиты конфиденциальности и усиления безопасности. Сервис находится на ранней стадии внедрения и в ближайшие несколько месяцев в качестве эксперимента станет предлагаться для включения небольшому проценту случайно выбранных пользователей.
Отмечается, что Firefox VPN не связан с платным сервисом Mozilla VPN, который является полноценным VPN для всей системы, в то время как Firefox VPN бесплатен и ограничен только одним браузером. В текущем виде Firefox VPN включается и выключается для всего браузера кнопкой в панели с адресной строкой, но разработчики обещают добавить возможность выборочной активации VPN для отдельных вкладок или включения в привязке к сайтам.
Кэрол Хербст (Karol Herbst) из компании Red Hat, принимающий участие в разработке Mesa, драйвера Nouveau и открытого стека OpenCL, предложил для включения в состав Mesa драйвер cluda, реализующий API Gallium поверх API CUDA, предоставляемого проприетарным драйвером NVIDIA. Gallium используется в Mesa для абстрагирования разработки драйверов и реализует типовые для драйверов программные интерфейсы, не специфичные для отдельных аппаратных устройств. В контексте cluda реализованы интерфейсы, связанные с вычислениями, которых достаточно для воплощения спецификации OpenCL поверх CUDA.
Предполагается, что cluda поможет решить проблемы с использованием OpenCL поверх проприетарного драйвера NVIDIA. Использование дополнительной обвязки даёт возможность реализовать недостающие расширения OpenCL, отсутствующие в стеке NVIDIA на базе проприетарного драйвера. В cluda используются только возможности библиотеки libcuda.so, входящей в состав GPU-драйверов NVIDIA и не привязанной к CUDA runtime. В текущем виде реализация OpenCL на базе cluda поддерживает операции с памятью и позволяет запускать вычислительные ядра.
Реализация OpenCL на базе cluda и rusticl поддерживает следующие расширения OpenCL, которые отсутствуют в реализации NVIDIA:
cl_khr_extended_bit_ops
cl_khr_integer_dot_product
cl_khr_fp16
cl_khr_suggested_local_work_size
cl_khr_subgroup_extended_types
cl_khr_subgroup_ballot
cl_khr_subgroup_clustered_reduce
cl_khr_subgroup_non_uniform_arithmetic
cl_khr_subgroup_non_uniform_vote
cl_khr_subgroup_rotate
cl_khr_subgroup_shuffle
cl_khr_subgroup_shuffle_relative
cl_khr_il_program (Yes, that means SPIR-V support)
cl_khr_spirv_linkonce_odr
cl_khr_spirv_no_integer_wrap_decoration
cl_khr_spirv_queries
cl_khr_expect_assume
cl_ext_immutable_memory_objects
При измерении производительности в тестовом наборе LuxMark 3.1 реализация OpenCL на базе Mesa, cluda и rusticl показала 57702 баллов, а реализация на базе стека NVIDIA - 64009 баллов. Падение производительности объясняется накладными расходами на преобразование промежуточного представления Mesa NIR в CUDA PTX (Parallel Thread Execution). Из возможных оптимизаций, которые могли бы уменьшить отставание в производительности, отмечается более активное использование векторизации и задействование JIT-компиляции.
Представлен выпуск мобильной платформы LineageOS 23, основанный на кодовой базе Android 16. Отмечается, что ветка LineageOS 23 достигла паритета по функциональности и стабильности c веткой 22, и признана готовой для формирования первого релиза. Сборки подготовлены для 104 моделей устройств (на 28 устройств меньше, чем в LineageOS 22). LineageOS также можно запустить в эмуляторе Android Emulator, в QEMU и в среде Android Studio. Дополнительно, предоставлена возможность сборки в режиме Android TV и Android Automotive.
Помимо публикации LineageOS 23 опубликовано обновление ветки LineageOS 22.2, для которой сформированы дополнительные сборки для 39 устройств. Также обновлена ветка LineageOS 20, в которую перенесены исправления, связанные с устранением уязвимостей. При установке для всех поддерживаемых устройств по умолчанию предлагается собственный Lineage Recovery, не требующий выделения отдельного recovery-раздела.
Выпуск Android 16 поддерживает работу с ядрами Linux, начиная с ветки 5.4, но необходимые изменения были портированы разработчиками LineageOS для ядер вплоть до версии 4.14. В ядра 4.4 и 4.9 необходимые компоненты пока не портированы, что привело к потере совместимости с устройствами на базе SoC Qualcomm MSM8998/MSM8996, Qualcomm MSM8953 и Qualcomm SDM845. Тем не менее, потенциально портирование возможно и зависит от наличия энтузиастов, готовых выполнить данную работу. Для обладателей устройств, для которых доступны только старые ядра Linux, рекомендовано использовать обновление LineageOS 22.2, для которого доступны ядра 4.4 и 4.9.
По сравнению с LineageOS 22, кроме улучшений, специфичных для Android 16, предложены следующие изменения:
Расширены возможности по использованию ванильных ядер Linux (мainline), а не только изменённых вариантов ядра, поставляемых платформой Android. Обеспечена совместимость с устройствами, которые поддерживаются в основном ядре Linux и могут быть загружены с использованием немодифицированных ядер.
Применены исправления уязвимостей, опубликованные с сентября 2024 по август 2025 года. Google перешёл с ежемесячного на ежеквартальное размещение исправлений ошибок и уязвимостей в репозитории AOSP (Android Open Source Project), поэтому специфичные для Android исправления в LineageOS теперь будут запаздывать. Кроме того, выпуск LineageOS 23 пока базируется на исходном обновлении Android 16 QPR0, а не уже доступном QPR1, так как связанный с QPR1 исходный код ещё не опубликован.
Полностью переписано приложение для работы с камерой - Aperture (Camera), что позволило расширить его функциональность и упростить сопровождение кода. Добавлена поддержка захвата изображений в форматах JPEG Ultra HDR, RAW и одновременно в RAW и JPEG. Улучшено отображений уведомлений. Добавлены новые индикаторы HDR, RAW, заряда аккумулятора и ограничения ресурсов для предотвращения перегрева.
Расширена функциональность музыкального проигрывателя Twelve (Music Player): Добавлена кнопка для воспроизведения случайной композиции. Добавлена статистика на страницу с информацией о проигрываемой композиции. Реализована возможность повторного сканирования музыки в локальном хранилище для отображения добавленных вручную музыкальных файлов без перезапуска. Расширена интеграция с сервисом Jellyfin (добавлена поддержка рекомендаций и избранных композиций, улучшена работа с миниатюрами). Добавлена поддержка воспроизведения MIDI.
В состав включён пакет Catapult с реализацией интерфейса работы с контентом на Android TV, оформленного в стиле LineageOS, легко кастомизируемого и сфокусированного на приложениях и контенте. В отличие от оригинального интерфейса Android TV и Google TV, предложенный интерфейс избавлен от бесконтрольного показа рекламы и навязывания рекомендаций.
Улучшена поддержка установки LineageOS в виртуальных окружениях с VirtIO, создаваемых на базе QEMU, crosvm, UTM и libvirt. Упрощён запуск LineageOS в виртуальных машинах на базе QEMU. Добавлена возможность запуска LineageOS в виртуальной машине UTM на Mac-компьютерах с процессорами Apple Silicon. Добавлена поддержка запуска с использованием открытого виртуального устройства Cuttlefish, предоставляющего эмуляцию дополнительных периферийных устройств и позволяющего работать с виртуальным устройством как с реальным.
Сборочная система почти избавлена от привязки к файлам Android.mk в связи с переводом Android с утилиты make на инструментарий soong и сборочные файлы Android.bp.
Расширена функциональность компонентов для управления обычной и быстрой зарядкой.
Из KDE Plasma Mobile перенесены новые рингтоны и звуки предупреждений.
Браузерный компонент WebView обновлён до состояния движка Chromium 140.
Обновлены до актуальных выпусков приложение для резервного копирования SeedVault и календарь-планировщик Etar.
Проект GrapheneOS, разрабатывающий альтернативную свободную прошивку Android, нацеленную на усиление безопасности и обеспечение конфиденциальности, сообщил о внесении компанией Google изменений в политику публикации исправлений уязвимостей для платформы Android и раскрытия информации об уязвимостях. Октябрьский отчёт об уязвимостях в Android опубликован пустым (в сентябрьском отчёте была информация о 114 уязвимостях).
Отныне Google изначально предоставляет исправления безопасности для Android исключительно OEM-производителям по закрытым каналам с соглашением о неразглашении, обязующем их не раскрывать исходный код с применением предоставленных патчей на срок 3 месяца с момента получения. В течение этого времени возможно распространение исключительно бинарных сборок с включением исправления.
Сам код продолжает быть под открытой лицензией Apache, но на право распространения накладывается временное ограничение через соглашение о неразглашении. Мотивом данного изменения в политике компании является "стремление к повышенной безопасности", отмечаемое как попытка реализации принципа "Безопасность через неясность".
Несмотря на создаваемые этим сложности для открытых сторонних прошивок, проект GrapheneOS нашёл выход из ситуации, найдя партнёра среди OEM-поставщиков, который предоставляет для проекта закрытые эмбарго патчи до их официального разглашения.
Отмечается, что отныне GrapheneOS будет предоставлять два разных канала с релизами - с полностью воспроизводимыми сборками на момент публикаций на основе AOSP, но без закрытых исправлений безопасности, и со сборками с включёнными патчами, воспроизводимый исходный код которых будет опубликован лишь после истечения эмбарго.
На конференции QoMEX (Quality of Multimedia Experience) в одном из докладов представлены результаты тестирования формата кодирования видео AV2, развиваемого альянсом Open Media (AOMedia) и идущего на смену формату AV1. При использовании метрик оценки качества VMAF (Video Multi-Method Assessment Fusion), разработанных компанией Netflix, использование кодека AV2 позволило добиться снижения битрейта на 32.59% по сравнению с кодеком AV1 при аналогичном уровне качества. При использовании метрик PSRN-YUV (Peak-Signal-to-Noise Ratio 14:1:1) битрейт удалось снизить на 28.63%. При тестировании задействован выпуск AVM 11.0 с эталонной реализацией AV2.
Формат кодирования видео AV2 не требует лицензионных отчислений и позволяет безвозмездно использовать связанные с ним технологии, патенты и интеллектуальную собственность. Особенности AV2: оптимизация для применения в потоковом вещании; значительное улучшение по сравнению с AV1 производительности операций сжатия; расширенная поддержка возможностей для виртуальной и дополненной реальности; поддержка более широкого диапазона визуального качества; возможность одновременной доставки нескольких видео в рамках одного видеопотока с поддержкой их раздельного отображения на экране.
AV2 продолжает использовать гибридную блочно-ориентированную структуру, но в отличие от AV1 поддерживает более крупные суперблоки 256×256, полностью рекурсивное секционирование (partitioning) и более эффективное разделение параметров яркости и цветности. В AV2 задействован унифицированный экспоненциальный квантизатор, охватывающий более широкий диапазон яркости и обеспечивающий большую точность квантования для 8-, 10- и 12-битного видео, а также лучше управляющий низкими битрейтами.
Расширены возможности предсказания межкадровых изменений, которые лучше моделируют изменение яркости и цветности, учитывают при построении модели до 7 предыдущих кадров, поддерживают временну́ю (temporal) интерполяцию и лучше обрабатывают движение в видео с высоким разрешением или быстро меняющимся содержимым. Добавлены дополнительные фильтры для подавления шумов, уменьшения артефактов от сжатия и сохранения детализации. Отмечается, что работа над кодеком AV2 и его эталонной реализацией уже завершена, но остаётся отточить спецификацию, финальный вариант которой планируют опубликовать в конце года.
Опубликован выпуск проекта MicroPythonOS 0.0.11, разрабатывающего операционную систему для микроконтроллеров, таких как ESP32, написанную с использованием инструментария MicroPython. Операционная система оснащена графическим интерфейсом, развиваемым с оглядкой на Android и iOS, и поддерживающим управления через сенсорные экраны. Из областей применения MicroPythonOS упоминаются устройства интернета вещей (IoT), системы управления домашней автоматизацией, интерактивные панели, роботы и умные носимые устройства с управлением экранными жестами. Проект также может применяться для быстрой разработки прототипов новых устройств. Код написан на языках Си и Python и распространяется под лицензий MIT.
Архитектура MicroPythonOS основана на использовании минимальной базовой системы, отвечающей за инициализацию и взаимодействие с аппаратным обеспечением, монтирование накопителей, многозадачность и интерфейс пользователя. Вся остальная функциональность, такая как настройка Wi-Fi и установка обновлений, вынесена в приложения. Для приложений предлагается использовать язык MicroPython и подмножество библиотек Python.
Ключевые особенности MicroPythonOS:
Возможность быстрого написания приложений и драйверов с использованием инструментария MicroPython (редакция Python 3 для микроконтроллеров, поставляемая c урезанным набором библиотек).
Поддержка запуска как на платах с микроконтроллерами ESP32, так и на обычных ПК или платах с Linux, таких как Raspberry Pi c Raspbian.
Графический интерфейс с управлением экранными жестами.
Набор встроенных приложений (меню приложений, конфигуратор, виджет для настройки Wi-Fi, программа установки и обновления приложений).
Поддержка установки внешних приложений, распространяемых через централизованный каталог App Store (например, просмотрщик изображений и программа для работы с камерой).
Установка и доставка обновлений по сети в режиме OTA (over-the-air).
Поддержка Wi-Fi, Blutooth, датчиков IMU (Inertial Measurement Unit) и камер.
Оптимизация системы для выполнения на устройствах с ограниченными ресурсами. Очень быстрая загрузка.
Проект WSL-For-FreeBSD развивает редакцию инструментария WSL2 (Windows Subsystem for Linux), позволяющую вместо Linux запустить FreeBSD в Windows с минимальными изменениями в базовом окружении FreeBSD. По возможности вносимые изменения планируют передавать в основной состав открытой кодовой базы WSL2. Проект позиционируется как персональный и экспериментальный.
На текущем этапе FreeBSD уже можно загрузить в WSL2 в консольном режиме. Основные компоненты FreeBSD успешно запускаются. В настоящее время работа сосредоточена на добавление поддержки сети, оптимизации ввода/вывода и управления процессами. Из планов на будущее упоминается интеграция утилит FreeBSD c окружением Windows и подготовка документации.
Развиваемый компанией Micrоsoft проект WSL2 предоставляет виртуальную машину с полноценным ядром Linux, в которой могут запускаться дистрибутивы Linux. Ядро включает специфичные для WSL изменения, такие как оптимизации для сокращения времени запуска и уменьшения потребления памяти, возможность возвращения Windows освобождённой Linux-процессами памяти и настройки для исключения лишних драйверов и подсистем. Система устанавливается в отдельный дисковый образ (VHD) c файловой системой ext4 и виртуальным сетевым адаптером.
Опубликован релиз языка программирования OCaml 5.4.0, промышленного функционального языка программирования с акцентом на выразительность и безопасность разрабатываемого программного обеспечения. В OCaml сочетается функциональное ядро, императивные возможности, объектная система и модульная система.
Код инструментария для языка OCaml распространяется под лицензией LGPL.
Среди других языков программирования OCaml выделяется своей универсальностью и практичностью, делая тем самым его хорошим выбором для разработки сложных систем. Основные особенности OCaml включают автоматическое управление памятью, функции первого класса, статическую типизацию, полиморфизм, поддержку неизменяемых структур данных, автоматический вывод типов и алгебраические типы данных с сопоставлением шаблонов.
Именованные кортежи (Labelled tuples), позволяющие давать имена членам кортежа и затем использовать эти имена для обращения к ним.
let point = ~x:1, ~y:2
(* val point : x:int * y:int = (~x:1, ~y:2) *)
let ( * ) (x,~dx) (y, ~dx:dy) =
x*.y, ~dx:(x *. dy +. y *. dx )
(* val ( * ) : float * dx:float -> float * dx:float -> float * dx:float *)
let mult_dx x y =
let ~dx, .. = x * y in
dx
Неизменяемые массивы и единый синтаксис для "_ array", "_ iarray" и "floatarray".
Встроенный атрибут "atomic" для полей записей, требующий использования атомарных операций для работы над ними.
type 'a mpsc_list = { mutable head:'a list; mutable tail: 'a list [@atomic] }
let rec push t x =
let before = Atomic.Loc.get [%atomic.loc t.tail] in
let after = x :: before in
if not (Atomic.Loc.compare_and_set [%atomic.loc t.tail] before after) then
push t x
...
Новые модули в стандартной библиотеке: Pair, Pqueue, Repr, Iarray.
module Int_pqueue = Pqueue.MakeMin(Int)
let q = Int_pqueue.of_list [4;0;5;7]
let some_zero = Int_pqueue.pop_min q
Модуль Repr содержит функции физического и структурного сравнения;
let f = Repr.phys_equal (ref 0) (ref 0)
Модуль Iarray для работы с неизменяемыми массивами;
let a = Iarray.init 10 Fun.id
let b = Iarray.map succ a
Восстановлен режим “очистки памяти при выходе”. Этот режим позволяет многократно запускать среду выполнения OCaml в программах на языке C, которые используют библиотеки OCaml. Он также полезен для уменьшения шума при отслеживании утечек памяти в коде C, выполняемого в среде OCaml. Чтобы избежать проблем с "cancellation", все домены объединяются перед выходом из среды выполнения OCaml.
Новый раздел в документации по профилированию OCaml-программ в среде Linux и MacOS.
Множественные улучшению среды выполнения, кодогенерации, около тридцати новых функций в стандартной библиотеке, почти дюжина улучшенных сообщений об ошибках, более пятидесяти исправлений ошибок.
Опубликован релиз языка программирования Julia 1.12, сочетающего такие качества как высокая производительность, поддержка динамической типизации и встроенные средства для параллельного программирования. Синтаксис Julia близок к MATLAB с заимствованием некоторых элементов из Ruby и Lisp. Метод манипуляции строками напоминает Perl. Код проекта распространяется под лицензией MIT.
Ключевые особенности языка:
Высокая производительность: одной из ключевых целей проекта является достижение производительности близкой к программам на языке Си. Компилятор Julia основан на наработках проекта LLVM и генерирует эффективный нативный машинный код для многих целевых платформ;
Поддержка различных парадигм программирования, включая элементы объектно-ориентированного и функционального программирования. Стандартная библиотека предоставляет в том числе функции для асинхронного ввода/вывода, управления процессами, ведения логов, профилирования и управления пакетами;
Динамическая типизация: язык не требует явного определения типов для переменных по аналогии со скриптовыми языками программирования. Поддерживается интерактивный режим работы;
Опциональная возможность явного указания типов;
Синтаксис, превосходно подходящий для численных вычислений, научных расчётов, систем машинного обучения и визуализации данных. Поддержка многих числовых типов данных и средств для распараллеливания вычислений.
Возможность прямого вызова функций из библиотек на языке Си без дополнительных прослоек.
Экспериментальный параметр "--trim", позволяющий создавать более компактные бинарные файлы за счёт удаления кода, который не достижим из указанных точек входа. Точки входа можно помечать с помощью "Base.Experimental.entrypoint". С этой опцией может работать не весь код.
Переопределение констант теперь чётко определено и следует семантике "world age". Допустимы дополнительные переопределения (например, типов).
В функцию "names" добавлен новый параметр "usings::Bool", заставляющий функцию вернуть все имена, видимые через "using".
Семейство макросов "@atomic" теперь поддерживает синтаксис присваивания ссылок, например: "@atomic :monotonic v[3] += 4", который атомарно изменяет "v[3]" с семантикой монотонного упорядочения. Поддерживаемый синтаксис включает:
Новый параметр "--task-metrics=yes", включающий сбор информации о времени выполнения каждой задачи, который можно включать/выключать и во время работы через "Base.Experimental.task_metrics(::Bool)". Доступные метрики:
фактическое время выполнения задачи, включая компиляцию и сбор мусора ("Base.Experimental.task_running_time_ns"),
время от момента, когда задача начала выполняться до завершения("Base.Experimental.task_wall_time_ns").
Поддержка Unicode 16.
"Threads.@spawn" теперь принимает аргумент ":samepool" для указания того же пула потоков, что и вызывающий код. "Threads.@spawn :samepool foo()" — сокращение для "Threads.@spawn Threads.threadpool() foo()".
Макрос "@ccall" теперь может принимать аргумент "gc_safe". Если он равен true, то во время вызова "ccall" рантайм может осуществлять сборку мусора параллельно.
Изменения языка
При замене метода эквивалентным по сигнатуре, существующий метод не удаляется. Вместо этого новый метод становится приоритетным. Если новый метод будет удалён, старый метод снова начнёт работать. Это полезно, например, в фреймворках тестирования с подменой (SparseArrays, Pluto, Mocking и др.), так как не нужно явно восстанавливать старый метод. В настоящее время для этой ситуации требуется повторная компиляция, но возможно в будущем удастся переиспользовать старые результаты.
Развертывание макросов больше не будет сразу рекурсивно входить в выражения "Expr(:toplevel)" из макросов. Вместо этого развёртывание ":toplevel" будет отложено до времени выполнения. Это позволяет более поздним выражениям в том же ":toplevel" использовать макросы, определённые ранее.
Тривиальные бесконечные циклы (такие как "while true; end") больше не считаются неопределённым поведением. Бесконечные циклы, в которых что-то происходит (например, с побочными эффектами или sleep), никогда не были и не являются неопределённым поведением.
Одновременная пометка идентификатора как "public" и "export" теперь является ошибкой.
Ошибки во время выполнения "getfield" теперь порождают новый тип исключений "FieldError" вместо общего "ErrorException".
Макросы в позиции объявления функций теперь не требуют круглых скобок. Например, допустимо "function @main(args) ... end", тогда как ранее требовалось "function (@main)(args) ... end".
Вызов "using" по имени пакета внутри самого пакета (особенно актуально для вложенных модулей) теперь явно использует этот пакет без просмотра Manifest и окружения, так же, как "..Name". Это лучше соответствует ожидаемому поведению.
Улучшения компилятора/рантайма
Сгенерированный LLVM промежуточный код (IR) теперь использует типы указателей вместо передачи указателей в форме целых чисел. Это касается "llvmcall": встроенный LLVM IR следует обновить, заменив "i32"/"i64" на "i8*" или "ptr" и убрав ненужные конверсии "ptrtoint"/"inttoptr". Для совместимости IR с целочисленными указателями всё ещё поддерживается, но выдаёт предупреждение.
Изменения параметров командной строки
Флаг "-m/--module" можно передать для запуска функции "main" внутри пакета с набором аргументов. Эта функция должна быть объявлена через "@main", указывая, что это точка входа.
Включение/отключение цветового вывода в Julia теперь можно контролировать с помощью переменных окружения "NO_COLOR" и "FORCE_COLOR". Эти переменные также учитываются системой сборки Julia.
"--project=@temp" запускает Julia с временным окружением.
Новый параметр "--trace-compile-timing" выводит время компиляции каждого метода, который выводится "--trace-compile", в миллисекундах.
"--trace-compile" теперь выводит перекомпилированные методы жёлтым цветом или добавляет комментарий, если цвет недоступен.
Новый параметр "--trace-dispatch" выводит методы, которые динамически распределяются.
Изменения многопоточности
Julia теперь по умолчанию использует 1 «интерактивный» поток, в дополнение к 1 основному «рабочему» потоку, т.е. "-t1,1". Это означает, что основная задача и REPL (в интерактивном режиме), которые оба работают в потоке 1, теперь выполняются в интерактивном пуле. Цикл ввода-вывода libuv тоже работает в потоке 1, что обеспечивает эффективное использование рабочего пула, используемого "Threads.@spawn". Запрос ровно 1 потока ("-t1"/"JULIA_NUM_THREADS=1") или 0 интерактивных потоков отключает интерактивный поток: "-t1,0", "JULIA_NUM_THREADS=1,0" или "-tauto,0". Запрос более 1 потока включает интерактивный поток; например, "-t2" эквивалентно "-t2,1". Напоминаем: буферы не следует привязывать к "threadid()".
Определены новые типы для шаблона кода, который должен выполняться один раз на процесс — тип "OncePerProcess{T}" позволяет определить функцию, которая выполнится ровно один раз, когда её впервые вызовут, а затем будет всегда возвращать одно и то же значение типа "T" при последующих вызовах. Также существуют типы "OncePerThread{T}" и "OncePerTask{T}" для аналогичного использования с потоками или задачами.
Изменения системы сборки
Добавлены новые файлы Makefile для сборки Julia и LLVM с использованием BOLT (Binary Optimization and Layout Tool). См.
"contrib/bolt" и "contrib/pgo-lto-bolt".
Новые библиотечные функции
"logrange(start, stop; length)" создаёт диапазон с постоянным коэффициентом (ratio), а не постоянным шагом.
Новая функция "isfull(c::Channel)" проверяет, будет ли блокироваться "put!(c, some_value)".
"waitany(tasks; throw=false)" и "waitall(tasks; failfast=false, throw=false)" ждёт завершения нескольких задач одновременно.
"uuid7()" создаёт UUID версии 7, соответствующий RFC 9562.
Новый тип "Fix" обобщает "Fix1/Fix2" для фиксации одного аргумента.
"Sys.detectwsl()" проверяет, выполняется ли Julia внутри WSL в runtime.
Новые возможности библиотек
"escape_string" принимает дополнительные параметры "ascii=true" (для экранирования всех не-ASCII символов) и "fullhex=true" (для использования полного 4/8-значного hex-формата в u/U-экранировке, например для совместимости с C).
"tempname" теперь может принимать строку суффикса, чтобы имя файла включало этот суффикс и он учитывался при уникальности.
Объекты "RegexMatch" теперь можно использовать для создания "NamedTuple" и "Dict".
"Lockable" теперь экспортируется.
"Base.require_one_based_indexing" и "Base.has_offset_axes" теперь публичные.
Добавлены новые функции "ltruncate", "rtruncate" и "ctruncate" для усечения строк до ширины текста, учитывая ширину символов.
Функция "isless" (а значит, и "cmp", сортировка и т.д.) теперь поддерживается для нулемерных "AbstractArray".
"invoke" теперь позволяет передавать "Method" вместо сигнатуры типа.
"invoke" теперь принимает "CodeInstance" вместо типа, что может ускорить некоторые рабочие процессы плагинов компилятора.
"Timer(f, ...)" теперь наследует "липкость" (stickiness) родительской задачи при создании задач таймера, что можно переопределить новым аргументом "spawn". Это решает проблему, когда липкие порождённые задачи ("@async") делали родителя липким.
"Timer" теперь имеет читаемые свойства "timeout" и "interval", а также более описательный метод "show".
"sort" теперь поддерживает кортежи "NTuple".
"map!(f, A)" теперь сохраняет результаты в "A", как "map!(f, A, A)" или "A .= f.(A)".
"setprecision" с аргументом-функцией (обычно через блок "do") теперь потокобезопасен. Другие формы следует избегать, и типы должны перейти к реализации, использующей "ScopedValue".
Изменения стандартной библиотеки
"gcdx(0, 0)" теперь возвращает "(0, 0, 0)" вместо "(0, 1, 0)".
"fd" возвращает "RawFD" вместо "Int".
Пакет JuliaSyntaxHighlighting
Новый стандартный пакет для применения подсветки синтаксиса к коду Julia, использующий "JuliaSyntax" и "StyledStrings" для реализации функции "highlight", которая создаёт "AnnotatedString" с применённой подсветкой.
"rank" теперь может принимать матрицу "QRPivoted" для оценки ранга через QR-факторизацию.
Добавлен ключевой параметр "alg" для "eigen", "eigen!", "eigvals" и "eigvals!" для типов самосопряжённых матриц (типовое объединение "RealHermSymComplexHerm"), позволяющий переключаться между различными алгоритмами извлечения собственных значений.
Добавлена общая версия неблокированного разложения Холецкого с выборкой поворотов (вызывается через "cholesky[!](A, RowMaximum())").
Количество потоков BLAS по умолчанию теперь учитывает привязку процессов (process affinity), а не просто количество логических потоков системы.
Добавлена функция "zeroslike", которая возвращает нулевые элементы для матриц с ленточным хранением. Пользовательские типы массивов могут специализировать эту функцию для правильного результата.
Перемножение матриц "A * B" теперь вызывает "matprod_dest(A, B, T::Type)" для генерации приемника. Эта функция теперь публичная.
Функция "haszero(T::Type)" используется для проверки, имеет ли тип "T" уникальный нулевой элемент, определённый как "zero(T)". Теперь она публичная.
Добавлена функция "diagview", возвращающая представление (view) на конкретную диагональ матрицы "AbstractMatrix".
Пакет Profile
"Profile.take_heap_snapshot" теперь принимает новый параметр "redact_data::Bool", по умолчанию "true". Если разрешено, то содержимое объектов Julia (например, строк) не включается в снимок памяти.
"Profile.print()" теперь окрашивает модули Base/Core/Package так же, как это делается в трассировках стека, а также пути (даже обрезанные) теперь кликабельны в терминалах, которые поддерживают ссылки URI и позволяют открыть указанный файл и строку в редакторе, заданном "JULIA_EDITOR".
REPL
Используя новую возможность "usings=true" в функции "names()", автодополнение в REPL может дополнять имена, видимые через "using".
Автодополнение REPL теперь может завершать строки вида "[import|using] Mod: xxx|", например, завершать "using Base.Experimental: @op" до "using Base.Experimental: @opaque".
REPL теперь выдаёт предупреждение, если имя обращается через модуль, который его не определяет (и не имеет подмодуля, который его определяет), и имя не является публичным в этом модуле. Например, "map" определён в Base, и выполнение "LinearAlgebra.map" в REPL теперь выдаст предупреждение при первом таком обращении.
При выводе результата ввода в REPL вывод теперь обрезается до 20 KiB. Это не влияет на ручные вызовы "show", "print" и т.д.
Автодополнение по символу "\" теперь выводит соответствующий символ или эмоджи рядом с каждым соответствующим кодовым словом.
Пакет Test
Если набор тестов "DefaultTestSet" завершается с ошибкой, на экран выводится генератор случайных чисел (RNG) этого набора, чтобы помочь воспроизвести стохастическую ошибку, зависящую только от состояния RNG. Также можно задать RNG для набора тестов, передав параметр "rng" в макрос "@testset":
julia
using Test, Random
@testset rng=Xoshiro(0x2e026445595ed28e, 0x07bb81ac4c54926d, 0x83d7d70843e8bad6, 0xdbef927d150af80b, 0xdbf91ddf2534f850) begin
@test rand() == 0.559472630416976
end
Пакет InteractiveUtils
Новые макросы "@trace_compile" и "@trace_dispatch" для выполнения выражений с параметрами "--trace-compile=stderr --trace-compile-timing" и "--trace-dispatch=stderr" соответственно.
Внешние зависимости
База данных terminal info ("terminfo") теперь входит в поставку Julia по умолчанию, что улучшает работу REPL, когда "terminfo" недоступен в системе. Julia можно собрать без встраивания базы, используя параметр Makefile "WITH_TERMINFO=0".
Улучшения инструментов
Доступен профилировщик "wall-time" для пользователей, которым нужен профилировщик с выборкой, захватывающий задачи независимо от их состояния (запланированы/выполняются). Такой профилировщик позволяет профилировать задачи с интенсивным вводом-выводом и помогает обнаружить области сильной конкуренции в системе.
После двух месяцев разработки опубликован релиз Luanti 5.14.0, свободного кроссплатформенного игрового движка в жанре песочницы, позволяющего создавать игры по аналогу Roblox, но с воксельной механикой, используя различные блоки для совместного формирования игроками различных структур и построек, образующих подобие виртуального мира. Некоторые игры на движке стремятся клонировать Minecraft. Предоставляемый движком геймплей полностью зависит от набора модов, создаваемых на языке Lua. Движок написан на языке С++ c использованием 3D-библиотеки IrrlichtMt (форк Irrlicht). Код Luanti распространяется под лицензией LGPL, а игровые ресурсы под лицензией CC BY-SA 3.0. Готовые сборки формируются для различных дистрибутивов Linux, Android, FreeBSD, Windows и macOS.
Основные изменения:
Частицы, появляющиеся при копании, теперь видны всем игрокам.
Улучшен пользовательский интерфейс. В главном меню связанные с игровым миром параметры теперь скрываются, если мир не выбран. Добавлена поддержка выделения слов целиком при помощи комбинаций клавиш "Ctrl+Shift + ←/→".
Обеспечена возможность масштабирования имён (nametag) в зависимости от расстояния.
Обновлена документация.
Решены проблемы с интерполяцией звеньев (bone) при анимации.
Повышена эффективность хранения и стабильность генерации блоков карт (mapblock).
Загрузка текстур ускорена за счёт кэширования путей.
Спустя четыре дня после релиза OpenSSH 10.1 опубликован корректирующий выпуск OpenSSH 10.2, открытой реализации клиента и сервера для работы по протоколам SSH 2.0 и SFTP. В новой версии отмечены только исправления ошибок:
В утилите ssh решена проблема с обработкой параметров терминала, приводившая к невозможности использования SSH-сеанса при активной настройке ControlPersist.
В утилите ssh-keygen устранена проблема с загрузкой ключей из токенов PKCS#11.
В ssh-keygen решена проблема с операциями формирования цифровых подписей при хранении ключа удостоверяющего центра в ssh-agent.
Добавлена поддержка платформ без mmap, таких как WASM.
Решены проблемы со сборкой во FreeBSD и MacOS <10.12.
Прекращено использование PAM_RHOST если внешних хост помечен как "UNKNOWN" (выставляется для соединений не через IPv4 и IPv6), что потенциально могло приводить к зависанию при использовании некоторых PAM-модулей.
Исследователи из компании Legit Security разработали технику атаки на GitHub Copilot, позволяющую извлечь содержимое из приватных репозиториев при использовании чатбота для анализа присылаемых pull-запросов. В качестве примера продемонстрирована возможность определения хранимых в приватном репозитории ключей для доступа к облачному окружению AWS.
Атака основывается на способности GitHub Copilot загружать внешние изображения в зависимости от обрабатываемого содержимого и возможности подставлять в pull-запросы скрытые комментарии, которые невидны в интерфейсе GitHub, но учитываются при анализе чатботом. Для организации утечки атакующий на своём сервере создаёт набор однопиксельных прозрачных изображений, каждое из которых соответствуют спецсимволу, цифре или букве алфавита. Далее жертве отправляется pull-запрос, в котором помимо предлагаемого изменения указывается скрытый комментарий с инструкцией для чатбота, оформленный в блоке "<!-- комментарий -->", не показываемом при выводе текста в формате Markdown.
В комментарии боту предлагается найти во всех репозиториях пользователя, включая приватные, строки с кодом,
содержащим значение "AWS_KEY". Найденные строки предписывается вывести не обычным текстом, а используя визуализацию на основе изображений - каждый символ из текста следует отобразить в виде картинки. Таблица для сопоставления символов и картинок дополнительно приводится в комментарии. В примечании указано, что при выполнении задания не нужно показывать рассуждения и информацию кроме картинок.
При использовании мэйнтейнером GitHub Copilot для разбора предложенного pull-запроса, чатбот выполнит скрытое задание и покажет результат в форме картинок. Так как картинки прозрачные мэйнтейнер не заметит аномалий, а атакующий сможет воссоздать содержимое найденных строк с ключами AWS путём анализа последовательности загрузки картинок в логе web-сервера.
Для обхода защиты CSP (Content Security Policy), допускающей загрузку в GitHub Copilot картинок только с серверов GitHub, в качестве прокси задействован сервис GitHub Camo. Данный прокси используется в GitHub как промежуточное звено для загрузки внешних изображений, например, встраиваемых на страницу README. Для задействования Camo в таблице сопоставления символов указываются не прямые ссылки, а ссылки на сам прокси, оформленные как "https://camo.githubusercontent.com/хэш_картинки". До этого через
GitHub REST API в Camo добавляются и заверяются необходимые пути для перенаправления загрузки изображений. Компания GitHub уже блокировала описанный метод атаки через запрет отрисовки изображений в чате с Copilot.
Мигель Гринбе (Miguel Grinberg), автор нескольких книг по Python-фреймворкам SQLAlchemy и Flask, опубликовал результаты тестирования производительности веток CPython с 3.9 по 3.14. Дополнительно аналогичные тесты проведены для Pypy 3.11 (реализация Python с JIT-компилятором), Node.js 24 и Rust 1.90. Для выпусков CPython 3.13 и 3.14 дополнительно измерена производительность при включении JIT-компилятора и режима сборки Free-threading без глобальной блокировки.
Для изменения производительности использовались скрипты для вычисления чисел Фибоначчи (глубокая рекурсия) и пузырьковой сортировки случайно генерируемых чисел, запускаемые в однопоточном режиме и с разделением на 4 потока. Тесты запускались в Ubuntu 24.04 на ноутбуке с CPU Intel Core i5 и macOS Sequoia на ноутбуке с SoC Apple M2.
В большинстве тестов CPython 3.14 оказался быстрее ветки 3.13 примерно на 20%, при том, что в некоторых тестах ветки 3.11 и 3.12 оказались быстрее 3.13. Отрыв 3.14 от веток 3.9 и 3.10 составил примерно два раза. Pypy, Node.js и Rust обогнали CPython 3.14 в первом тесте в 4.93, 4.88 и 69.82 раз, а во втором тесте в 18.14, 6.64 и 36.15 раз, соответственно (сравнивались только однопоточные режимы).
Режим без глобальной блокировки в CPython 3.14 позволил в два раза ускорить многопоточное выполнение. Включение режима с JIT в CPython не привело к существенному росту производительности, а в тесте ветки 3.14 в macOS даже замедлило выполнение.
В однопоточных тестах режим без глобальной блокировки заметно замедлил выполнение задач, а режим с JIT почти не повлиял на производительность.