Kiesel на Rust: универсальная реализация Temporal API
-
Долго ли Java переживала те же проблемы с датами, что и JavaScript? Ровно до 1997 года, когда они отказались от своего Date. А JavaScript всё это время тащит на себе этот груз - мутирующий объект Date, который создаёт кучу ошибок в боевом коде. Но вот наконец-то появился Temporal API, и это действительно революция в обработке дат и времени.
Temporary уже в два браузера - Firefox 139 и Chrome 144. Safari работает над поддержкой. Главное чудо в том, что за этой реализацией стоит temporal_rs - общая Rust-библиотека, которая используется сразу в Boa, Kiesel и V8. Это значит, что вместо того чтобы каждый движок писал свою реализацию, они договорились и создали единый стандарт.
Почему Temporal был так нужен
Дате в JavaScript - практически ровесник самому языку. За три десятилетия разработчики научились с ним работать, но эти знания добываются кровью. Основная проблема в том, что Date объект - это мутирующий объект, которым жонглируют все операции. Когда ты прибавляешь день или изменяешь время, старый объект меняется, а не создаётся новый. Это приводит к ошибкам, особенно когда код становится сложнее.
Temporary решает это принципиально по-другому. Вместо одного универсального объекта, который пытается быть всем сразу, здесь есть специализированные типы для разных задач. Нужна только дата без времени? Возьми PlainDate. Нужна дата с временем в конкретном часовом поясе? ZonedDateTime ждёт тебя. Требуется работать с моментом в UTC? Instant - твой выбор. Каждый тип заточен под свой сценарий и не пытается быть чем-то большим.
Все операции возвращают новые значения вместо того чтобы менять старые. Это кажется мелочью, но на практике это превращает работу с датами из минного поля в спокойный расчёт. Код становится понятнее, ошибок меньше, и логика проще отследить.
Вот что предоставляет Temporal для работы:
- PlainDate - работа с датами без учёта времени и часовых поясов
- PlainTime - время суток без привязки к конкретной дате
- PlainDateTime - дата и время, но без часового пояса
- ZonedDateTime - полная информация с часовым поясом
- Instant - момент времени в UTC, универсальный стандарт
- Duration - промежуток времени между событиями
- Month - информация о месяце года
- YearMonth - год и месяц без конкретного дня
Как temporal_rs объединил все движки
Когда несколько движков начинают поддерживать один стандарт, обычно случается хаос. Каждый пишет своё, результаты отличаются, начинаются споры. Но на этот раз разработчики поступили умнее. Вместо того чтобы каждому движку писать собственную реализацию на своём языке, они создали temporal_rs - библиотеку на Rust, которая содержит всю основную логику.
Это очень смелый шаг, потому что V8 (основа Chrome) написан на C++, а некоторые другие движки вообще на совсем других языках. Но Rust позволил решить эту проблему через FFI (Foreign Function Interface) - технологию, которая позволяет коду на одном языке вызывать код на другом. Так V8 может использовать Rust-библиотеку, не переписывая её на C++. Это гениально просто.
Прямо сейчас temporal_rs используют:
- Boa - JavaScript движок на Rust, где всё разговаривает на одном языке
- Kiesel - ещё один двигатель, где Rust становится стандартом
- V8 - монстр, который работает в Chrome и Node.js
- Yavashark - движок, который тоже подключился к этой системе
Это означает, что когда тебе нужно написать код для работы с датами, ты можешь быть почти уверен, что он будет вести себя одинаково во всех браузерах. Больше не нужно ловить подвохи с разными интерпретациями стандарта.
Практика: как это работает в коде
Давайте посмотрим, как реально использовать Temporal. Если ты работаешь с Rust и хочешь использовать temporal_rs напрямую, то сначала добавляешь зависимость:
cargo add temporal_rsИли добавляешь в Cargo.toml:
temporal_rs = "0.1.0"А потом пишешь какой-нибудь практический код:
use std::convert::TryFrom; use temporal_rs::{Calendar, Temporal, options::DifferenceSettings, partial::PartialDuration}; // Получаем сегодняшнюю дату let today = Temporal::now().plain_date_iso(None).unwrap(); // Добавляем один день через Duration let partial = PartialDuration::empty().with_days(1); let tomorrow = today.add(&partial.try_into().unwrap(), None).unwrap(); // Считаем разницу между датами let diff = today.since(&tomorrow, DifferenceSettings::default()).unwrap();Это выглядит просто, но за этой простотой стоит вся мощь Temporal. Обрати внимание на несколько ключевых моментов:
- Новые объекты, а не мутация: когда ты вызываешь add(), ты получаешь новую дату, а старая остаётся неизменной
- Явная работа с часовыми поясами: функции, которые могут быть чувствительны к часовому поясу, требуют его указать явно
- Типизация: Rust проверит ошибки уже на этапе компиляции, а не во время выполнения
- Методы для вычислений: есть встроенные методы для сложения, вычитания, округления и сравнения
В JavaScript это выглядит чуть проще (когда Temporal станет стандартной частью языка):
// Получаем текущую дату const today = Temporal.Now.plainDateISO(); // Прибавляем день const tomorrow = today.add({ days: 1 }); // Проверяем разницу const diff = today.until(tomorrow);Статус и дальнейшая дорога
Темпоральный API пока находится на Stage 3 процесса TC39 - это значит, что он уже готов для реальной реализации в браузерах, но всё ещё может получить правки и улучшения на основе обратной связи. Следующий этап - это Stage 4, который добавит Temporal в официальный стандарт ECMAScript как полноценную часть языка.
Планы TC39 амбициозны: на мартовском плнарном заседании (которое проходит в New York в Google) разработчики собираются предложить повышение Temporal на Stage 4. Если это произойдёт, то мы официально получим новый стандарт для работы с датами. Но даже если на этот раз не получится, Temporal уже работает в боевых браузерах, и разработчики могут начинать интегрировать его в свои проекты.
Полифилл всё ещё может пригодиться для старых браузеров, но с Firefox и Chrome уже поддерживающими Temporal, покрытие браузерами становится солидным. Safari тоже работает над поддержкой - ранние версии уже видны в Safari Technical Preview.
Вот что стоит учитывать при планировании использования:
- Chrome 144+ поддерживает Temporal из коробки
- Firefox 139+ также имеет встроенную поддержку
- Safari поддержка находится в разработке, но уже близко
- Для старых браузеров нужен полифилл (доступен на npm)
- Node.js будет поддерживать Temporal через обновления V8
Общая реализация через temporal_rs означает, что поведение будет предсказуемо везде. Нет больше странных различий между браузерами в вычислении дат.
Технические детали сотрудничества движков
Что делает сотрудничество V8, Boa и Kiesel особенно интересным - это факт, что каждый из них написан на разных языках. V8 использует C++, Boa родился на Rust, Kiesel создан на Zig. Но всё это не помешало им договориться и использовать одну общую библиотеку.
Это возможно благодаря FFI - инструменту, который позволяет интеграции между языками. temporal_rs экспортирует своё API таким образом, чтобы его мог использовать код на других языках. Когда V8 выполняет операцию с датой, он вызывает функции из temporal_rs, получает результат и возвращает его обратно в JavaScript код.
Такой подход имеет огромные преимущества:
- Единая реализация логики - баги ловятся один раз, а не несколько
- Меньше дублирования - каждый движок не пишет свою версию wheel
- Быстрая итерация - улучшения в temporal_rs автоматически попадают везде
- Проще тестирование - стандартный набор тестов работает для всех
- Экономия времени - разработчики могут сосредоточиться на оптимизации, а не переписывании
Это показывает новый тренд в разработке JavaScript - движки начинают сотрудничать вместо соперничества. То, что раньше казалось невозможным (общая реализация на Rust для C++ и других языков), теперь стало нормой.
Что дальше для разработчиков
Темпоральный API - это не просто улучшение существующей функциональности, это переосмысление того, как мы работаем с датами. Разработчикам больше не нужно помнить про подводные камни Date, про то, что месяцы считаются с нуля, про часовые пояса как врага. Всё стало явным и безопасным.
Общая реализация через temporal_rs означает, что разработчики могут верить коду, который они написали один раз. Нет больше ситуаций, когда дата считается по-разному в Chrome и Firefox. Это создаёт условия для более надежной и предсказуемой работы с датами во всей экосистеме JavaScript.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.