TypeScript 5.7 улучшает отчет об ошибках
Сильно типизированный JavaScript от Microsoft сейчас находится на стадии релиз-кандидата, в котором появится отчет об ошибках, связанных с переменными, которые никогда не были инициализированы.

После выхода Java Development Kit (JDK) 23, который появился 17 сентября, работа теперь сосредоточена на планируемом последующем выпуске, JDK 24, который разросся до 21 предлагаемой функции. Два последних дополнения призваны повысить устойчивость Java к атакам квантовых вычислений, предоставив Java-реализации алгоритма цифровой подписи на основе квантовых модулей и механизма инкапсуляции ключей на основе квантовых модулей.
Ранее предложенные возможности включают удаление 32-битного порта x86; синхронизацию виртуальных потоков без пиннинга; простые исходные файлы и методы instance main; постоянное отключение менеджера безопасности; объявления импорта модулей; экспериментальную версию компактных заголовков; примитивные типы в patterns, instanceof и switch; связывание образов времени выполнения без JMOD; поколенческий сборщик мусора Shenandoah; скопированные значения; API функции деривации ключей; устранение негенеративного режима в сборщике мусора Z; сборщики потоков; API векторов; API файлов классов; предупреждения для подготовки разработчиков к будущим ограничениям на использование JNI (Java Native Interface); и расширение позднего барьера для сборщика мусора G1.
JDK 24 будет выпущен 18 марта 2025 года и получил статус релиза без долгосрочной поддержки (LTS). Как и JDK 23, JDK 24 получит от Oracle только шесть месяцев поддержки на высшем уровне. Сборки раннего доступа к JDK 24 можно найти на сайте jdk.java.net.
Для повышения безопасности Java за счет квантовой устойчивости предлагаются две функции: квантовоустойчивый механизм инкапсуляции ключей на основе модульной решетки (ML-KEM) и квантовоустойчивый алгоритм цифровой подписи на основе модульной решетки (ML-DSA). ML-DSA защитит от будущих атак квантовых вычислений, используя цифровые подписи для обнаружения несанкционированных модификаций данных и удостоверения личности подписавших их лиц. Механизмы инкапсуляции ключей (KEM) используются для защиты симметричных ключей по незащищенным каналам связи с помощью криптографии с открытым ключом. Обе функции предназначены для защиты от будущих атак квантовых вычислений.
Гибкие тела конструкторов представлены в третьей предварительной версии после появления в JDK 22 и JDK 23, хотя и под другим названием в JDK 22, когда функция называлась statements before super(...). Функция призвана переосмыслить роль конструкторов в процессе инициализации объектов, позволяя разработчикам более естественно размещать логику, которую они в настоящее время вынуждены учитывать во вспомогательных статических методах, вспомогательных промежуточных конструкторах или аргументах конструктора.
Опережающая загрузка и связывание классов направлена на улучшение времени запуска за счет того, что классы приложения будут мгновенно доступны в загруженном и связанном состоянии при запуске виртуальной машины HotSpot Java. Это достигается путем мониторинга приложения во время одного запуска и сохранения загруженных и связанных форм всех классов в кэше для использования в последующих запусках.
Порт для Windows 32-bit x86 был отменен для удаления в JDK 21 с намерением удалить его в будущем выпуске. Планируется удалить исходный код и поддержку сборки для порта Windows 32-bit x86. Цели включают удаление всех путей кода, применимых только к Windows 32-bit x86, прекращение всех усилий по тестированию и разработке, направленных на платформу Windows 32-bit x86, и упрощение инфраструктуры сборки и тестирования JDK. В предложении говорится, что срок службы Windows 10, последней операционной системы Windows, поддерживающей 32-битную операционную систему, истечет в октябре 2025 года.
Синхронизация виртуальных потоков без пиннинга предполагает улучшение масштабируемости Java-кода, использующего синхронизированные методы и операторы, за счет того, что виртуальные потоки, которые блокируются в таких конструкциях, освобождают свою базовую платформу для использования другими потоками. Это позволит устранить почти все случаи привязки виртуальных потоков к потокам платформы, что сильно ограничивает количество виртуальных потоков, доступных для обработки рабочей нагрузки приложения.
Четвертый предварительный просмотр простых исходных файлов и основных методов экземпляра позволит усовершенствовать язык Java, чтобы новички могли писать свои первые программы без необходимости разбираться в особенностях языка, предназначенных для больших программ. Ранее эта возможность была представлена в JDK 21, JDK 22 и JDK 23. Цель состоит в том, чтобы позволить начинающим Java-программистам писать упрощенные декларации для одноклассовых программ и затем плавно расширять свои программы, используя более продвинутые функции по мере роста их навыков.
Постоянное отключение менеджера безопасности предполагает пересмотр спецификации платформы Java, чтобы разработчики не могли включить менеджер безопасности, а другие классы платформы не ссылались на него. Менеджер безопасности не был основным средством защиты клиентского Java-кода в течение многих лет, редко использовался для защиты кода на стороне сервера и был дорогостоящим в обслуживании, говорится в предложении. В Java 17 менеджер безопасности был выведен из употребления.
Декларации импорта модулей, ранее представленные в JDK 23, расширяют возможности языка программирования Java, позволяя в сжатой форме импортировать все пакеты, экспортируемые модулем. Это упрощает повторное использование модульных библиотек, но не требует, чтобы импортируемый код сам был модулем.
Компактные заголовки объектов позволят уменьшить размер заголовков объектов в HotSpot VM с 96-128 бит до 64 бит на 64-битных архитектурах. Цель предлагаемой функции - уменьшить размер кучи, повысить плотность развертывания и увеличить локальность данных.
Второй предварительный просмотр примитивных типов в шаблонах, instanceof и switchв JDK 24 улучшит сопоставление шаблонов, позволив использовать примитивные типы во всех шаблонах и контекстах. Функция также расширит функции instanceof и switch для работы со всеми примитивными типами. Цели функции - обеспечить единообразное исследование данных, разрешив шаблоны типов для всех типов, будь то примитивные или ссылочные; выровнять типы с instanceof и выровнять instanceof с безопасным приведением; и позволить сопоставлению шаблонов использовать примитивные типы в контекстах вложенных шаблонов и шаблонов верхнего уровня. Ранее эта возможность была представлена в JDK 23.
Среди других целей - предоставление простых в использовании конструкций, устраняющих риск потери информации из-за небезопасных приведений, следование усовершенствованиям switch в Java 5 и Java 7, а также возможность switch обрабатывать значения любого примитивного типа.
Что касается связывания образов времени выполнения без JMOD, то планируется уменьшить размер JDK примерно на 25 %, предоставив инструменту jlink возможность создавать пользовательские образы времени выполнения без файлов JDK JMOD. Эта функция должна быть включена по умолчанию, и некоторые поставщики JDK могут не включать ее. Цель - позволить пользователям компоновать образ времени выполнения из модулей, независимо от того, являются ли эти модули отдельными JMOD-файлами, модульными JAR-файлами или частью образа времени выполнения, связанного ранее. Мотивация этого предложения заключается в том, что размер установленного JDK в файловой системе важен в облачных средах, где образы контейнеров, включающие установленный JDK, автоматически и часто копируются по сети из реестров контейнеров. Уменьшение размера JDK повысит эффективность этих операций.
Generational Shenandoah усовершенствует сборщик мусора экспериментальными возможностями сбора поколений, чтобы улучшить устойчивую пропускную способность, устойчивость к скачкам нагрузки и использование памяти. Основная цель - обеспечить экспериментальный режим генерации, не нарушая при этом работу негенеративного Shenandoah. Предполагается, что режим поколений станет режимом по умолчанию в одном из будущих выпусков.
Скопированные значения позволяют методу делиться неизменяемыми данными как со своими вызовами внутри потока, так и с дочерними потоками. О скопированных значениях проще рассуждать, чем о локально-потоковых переменных. Кроме того, они занимают меньше места и времени, особенно если используются вместе с виртуальными потоками и структурированным параллелизмом. API для скопированных значений был предложен для инкубации в JDK 20, предложен для предварительного просмотра в JDK 21, а также улучшен и доработан в JDK 22 и JDK 23. Предварительный просмотр скопированных значений состоится в JDK 24.
API Key derivation function (KDF)- это API для функций деривации ключей, которые представляют собой криптографические алгоритмы для получения дополнительных ключей из секретного ключа и других данных. Целью данного предложения является предоставление поставщикам безопасности возможности реализовать алгоритмы KDF как в коде Java, так и в нативном коде. Другая цель - дать приложениям возможность использовать такие алгоритмы KDF, как основанная на HMAC (код аутентификации хэш-сообщений) функция извлечения и расширения ключа (RFC 5869) и Argon2 (RFC 9106).
Удаление негенеративного режима сборщика мусора Z (ZGC) - это предложение, направленное на снижение затрат на поддержку двух различных режимов. Поддержание негенеративного ZGC замедляет разработку новых функций, а генеративный ZGC должен быть лучшим решением для большинства случаев использования, чем негенеративный ZGC, говорится в предложении. В конечном итоге последняя должна быть заменена на первую, чтобы снизить долгосрочные затраты на обслуживание. План предусматривает удаление негенеративного режима путем устаревания опции ZGenerational и удаления кода негенеративного ZGC и его тестов. Срок действия негенеративного режима истечет в одном из будущих выпусков, и тогда он не будет распознаваться HotSpot JVM, которая откажется запускаться.
Сборщики потоков расширяют API потоков для поддержки пользовательских промежуточных операций. Сборщики потоков позволят потоковым конвейерам преобразовывать данные таким образом, который невозможно реализовать с помощью существующих встроенных промежуточных операций. Эта функция была предложена в качестве предварительной версии в JDK 22 и JDK 23. API будет окончательно доработан в JDK 24. Среди целей - сделать конвейеры потоков более гибкими и выразительными и позволить пользовательским промежуточным операциям манипулировать потоками бесконечного размера.
Векторный API предназначен для выражения векторных связей, которые надежно компилируются во время выполнения в оптимальные векторные инструкции на поддерживаемых архитектурах CPU, что позволяет достичь производительности, превосходящей эквивалентные скалярные вычисления. Векторный API ранее использовался в JDK 16 и JDK 23. В JDK 24 он будет повторно инкубирован без изменений в API и без существенных реализаций по сравнению с JDK 23. Цели предложения включают ясное и краткое выражение широкого спектра векторных вычислений в API, который не зависит от платформы, обеспечивает надежную компиляцию и производительность во время выполнения на архитектурах x64 и AArch54, изящно деградирует и продолжает работать, когда векторные вычисления не могут быть выражены во время выполнения, и соответствует проекту Valhalla, используя усовершенствования объектной модели Java.
API для работы с файлами классов, ранее представленный в JDK 22 и JDK 23, будет завершен в JDK 24 с небольшими изменениями. Этот API предоставляет стандартный API для разбора, генерации и преобразования файлов классов Java. Его цель - предоставить API для обработки файлов классов, который отслеживает формат файлов классов, определенный спецификацией Java Virtual Machine. Вторая цель - дать возможность компонентам JDK перейти на стандартный API и в конечном итоге удалить внутреннюю копию сторонней библиотеки ASM в JDK. Изменения со времени второго предварительного просмотра включают переименование значений перечислений, удаление некоторых полей, добавление методов и перегрузок методов, переименование методов, а также удаление интерфейсов и методов, которые считаются ненужными.
Позднее расширение барьеров для сборщика мусора G1 призвано упростить реализацию барьеров G1. Барьеры сборщика мусора G1 записывают информацию о доступе приложений к памяти, перенося их расширение с ранних этапов конвейера компиляции C2 на более поздние. Среди целей - сократить время выполнения компиляции C2 при использовании сборщика G1, сделать барьеры G1 понятными для разработчиков HotSpot, не имеющих глубокого понимания C2, и гарантировать, что C2 сохраняет инварианты относительного упорядочивания обращений к памяти, точек безопасности и барьеров. Четвертая особенность - сохранение качества генерируемого C2 JIT (just-in-time)-компилируемого кода с точки зрения скорости и размера.
Первая функция JDK 24, официально названная «Подготовка к ограничению использования JNI», предусматривает выдачу предупреждений об использовании JNI и настройку API Foreign Function and Memory (FFM), представленного в JDK 22, для последовательной выдачи предупреждений. Эти предупреждения призваны подготовить будущий релиз, обеспечивающий целостность по умолчанию за счет единообразного ограничения JNI и FFM API. Цели плана - сохранить JNI как стандартный способ взаимодействия с родным кодом, подготовить экосистему Java к будущим релизам, которые по умолчанию запретят взаимодействие с родным кодом, и согласовать использование JNI и FFM API, чтобы сопровождающие библиотек могли переходить с одного на другой, не требуя от разработчиков изменения параметров командной строки.
Дополнительные возможности JDK 24 будут определены в течение следующих нескольких недель. Среди других потенциальных возможностей Java 24 - структурированный параллелизм, упрощающий одновременное программирование, и шаблоны строк- функция, представленная в JDK 21 и JDK 22, но исключенная из JDK 23.
Последний LTS-выпуск, JDK 21, появился в сентябре 2023 года и должен получить от Oracle как минимум пять лет премьер-поддержки. Следующая версия LTS, JDK 25, должна выйти в сентябре 2025 года. Релизы LTS доминируют в принятии Java, что означает, что принятие JDK 23 и JDK 24 может быть на низком уровне, поскольку пользователи ожидают JDK 25.
Сильно типизированный JavaScript от Microsoft сейчас находится на стадии релиз-кандидата, в котором появится отчет об ошибках, связанных с переменными, которые никогда не были инициализированы.
Разработанный Google язык Go занял седьмое место в индексе популярности языков программирования Tiobe.
Похоже, что крик о необходимости безопасных языков программирования становится все более настойчивым и официальным. Мы уже давно знаем, что C и C++ - опасные языки, так почему же сейчас это стало такой проблемой и актуально ли это вообще?