Трассировка выполнения

Общая модель выполнения и точки наблюдения

При работе с Globalize выполнение кода формируется через цепочку этапов: инициализация данных CLDR, настройка локали, выбор правил форматирования и применение соответствующих трансформаций к числам, датам, валютам и строкам сообщений.

Трассировка в этом контексте рассматривается как последовательное наблюдение за внутренними шагами выполнения: от загрузки данных до получения конечного форматированного результата. Каждый этап связан с определённым набором входных данных и промежуточных структур, которые формируются внутри библиотеки.

Базовая структура потока выполнения выглядит следующим образом:

  • загрузка и валидация CLDR-данных
  • инициализация глобального контекста локалей
  • резолвинг текущей локали
  • выбор соответствующих правил форматирования
  • выполнение форматирующей функции
  • возврат результата в прикладной код

Каждый из этапов может быть рассмотрен как отдельная точка трассировки.


Загрузка CLDR и первичная инициализация

Globalize опирается на данные Unicode CLDR (Common Locale Data Repository), которые содержат языковые и региональные правила форматирования.

На этапе загрузки происходит:

  • подключение JSON-файлов CLDR
  • проверка наличия минимально необходимых пакетов данных
  • регистрация доступных локалей
  • построение внутренних индексов доступа к правилам

Трассировка на этом уровне обычно фиксирует следующие состояния:

  • список загруженных локалей
  • наличие числовых, временных и валютных наборов данных
  • целостность структуры supplemental данных
  • ошибки отсутствующих сегментов

Типичный поток можно представить следующим образом:

  1. загрузка likelySubtags
  2. загрузка numberingSystems
  3. загрузка plurals
  4. загрузка timeZoneNames
  5. загрузка языковых пакетов (например, en, ru, de)

Любое отсутствие одного из критических блоков данных приводит к частичному ограничению функциональности, что фиксируется на этапе трассировки как деградация покрытия локализации.


Инициализация глобального контекста

После загрузки данных формируется глобальный контекст выполнения. Внутри него хранится информация о доступных локалях, правилах выбора и функциях форматирования.

На этом этапе фиксируются следующие внутренние состояния:

  • текущая активная локаль
  • список поддерживаемых локалей
  • таблицы правил pluralization
  • кэш предварительно вычисленных форматтеров

Инициализация часто включает создание фабрик функций:

  • форматтер чисел
  • форматтер валют
  • форматтер дат
  • парсер сообщений

Каждая фабрика представляет собой замыкание над данными CLDR, что влияет на последующую трассировку: повторное использование функций не требует повторной обработки исходных данных.


Разрешение локали и механизм fallback

Одним из ключевых этапов выполнения является определение фактической локали, используемой при форматировании.

Если задана локаль уровня приложения, выполняется проверка:

  • точное совпадение локали
  • наличие регионального варианта
  • переход к базовой языковой локали
  • fallback к дефолтной локали

Пример цепочки разрешения:

  • ru-KZ → доступна ли локаль
  • ru → используется базовая локаль
  • en → используется как резерв

Трассировка на этом уровне фиксирует:

  • исходное значение локали
  • промежуточные попытки сопоставления
  • конечную выбранную локаль
  • причину fallback (если применён)

Механизм fallback напрямую влияет на результат форматирования, особенно в случаях различий в правилах чисел, дат и грамматических форм.


Трассировка форматирования чисел

Форматирование чисел проходит через несколько внутренних стадий:

  1. определение локали
  2. выбор набора символов числовой системы
  3. применение группировки разрядов
  4. округление по правилам локали
  5. вставка разделителей

При трассировке фиксируются следующие параметры:

  • исходное число
  • применённый формат (decimal, percent, currency)
  • используемая числовая система (например, латинская или арабская)
  • правило округления
  • итоговая строка

Внутренний процесс можно представить как цепочку преобразований:

  • вход: 12345.678
  • локаль: ru
  • формат: decimal
  • результат: 12 345,678

Каждый этап может быть логирован отдельно для анализа расхождений между ожидаемым и фактическим результатом.


Трассировка работы с валютами

Форматирование валют включает дополнительный слой правил:

  • символ валюты
  • позиция символа (до или после числа)
  • правила пробелов
  • формат отрицательных значений

При выполнении фиксируются:

  • код валюты (например, USD, EUR, KZT)
  • локаль
  • формат отображения
  • итоговая строка
  • применённые правила CLDR

Особое значение имеет ветвление логики:

  • положительные значения
  • отрицательные значения
  • бухгалтерский формат
  • сокращённый формат

Каждое ветвление может приводить к разным шаблонам форматирования, что отражается в трассировке как отдельные пути выполнения.


Трассировка дат и времени

Обработка дат включает многоуровневую систему преобразований:

  • парсинг входного объекта Date
  • выбор календаря
  • применение локального формата
  • вычисление временной зоны
  • формирование строки

Фиксируемые параметры:

  • исходная дата (timestamp)
  • локаль
  • формат (short, medium, long, full)
  • часовой пояс
  • результирующее представление

Дополнительный слой сложности связан с календарными системами. В CLDR могут присутствовать альтернативные календари, что изменяет алгоритм трассировки:

  • григорианский календарь
  • локальные календари (в зависимости от региона)
  • смещения временных зон

Трассировка сообщений и plural rules

Система сообщений в Globalize использует правила множественных форм (plural rules), определяемые CLDR.

Процесс выполнения включает:

  • определение числа
  • выбор категории plural формы
  • выбор строки шаблона
  • интерполяция параметров

Трассировка фиксирует:

  • входное значение числа
  • категорию plural (one, few, many, other)
  • выбранный ключ сообщения
  • итоговую строку

Пример логической цепочки:

  • вход: 3
  • локаль: ru
  • категория: few
  • шаблон: "3 файла"
  • результат: "3 файла"

Ошибки в этом процессе часто связаны с некорректной загрузкой plural rules или отсутствием соответствующих ключей сообщений.


Кэширование и влияние на трассировку

Внутренние механизмы кэширования существенно изменяют структуру выполнения.

После первого вызова форматтера:

  • создаётся специализированная функция
  • сохраняется связка локаль + формат
  • повторные вызовы используют кэш

В трассировке это выражается следующим образом:

  • первый вызов: полный путь вычислений
  • последующие вызовы: сокращённый путь (cache hit)
  • обновление данных: инвалидирует кэш

Фиксируемые события:

  • cache miss
  • cache hit
  • cache invalidation

Инструментирование и отладочная трассировка

При необходимости анализа поведения системы используются уровни инструментирования:

  • логирование загрузки CLDR
  • логирование выбора локали
  • логирование форматирования чисел и дат
  • логирование ошибок отсутствующих данных

Типовая структура отладочного вывода включает:

  • этап выполнения
  • входные параметры
  • промежуточные данные
  • конечный результат
  • время выполнения

Особое значение имеет временная трассировка, позволяющая определить узкие места:

  • стоимость инициализации форматтеров
  • время парсинга сообщений
  • накладные расходы fallback-логики

Поток выполнения при комбинированных операциях

В реальных сценариях операции форматирования комбинируются:

  • дата внутри сообщения
  • число внутри валютного формата
  • plural внутри шаблона сообщения

В таких случаях трассировка формирует вложенные цепочки:

  • сообщение

    • plural правило

      • формат числа

        • применение локали

          • доступ к CLDR

Каждый уровень может быть независимо зафиксирован, что позволяет анализировать сложные цепочки преобразований.


Ошибочные состояния и трассировка сбоев

В процессе выполнения фиксируются типовые классы ошибок:

  • отсутствующие CLDR данные
  • неподдерживаемая локаль
  • некорректный формат сообщения
  • отсутствующий plural key

При возникновении ошибки трассировка включает:

  • точку возникновения
  • стек вызовов
  • состояние локали
  • состояние кэша
  • входные данные

Это позволяет восстановить цепочку вычислений вплоть до первичного источника сбоя.


Производительность и наблюдение за узкими местами

Анализ трассировки выполнения позволяет выделить ключевые зоны нагрузки:

  • первичная инициализация CLDR
  • создание форматтеров
  • разрешение локалей с fallback
  • сложные plural-ветвления

Каждая из этих операций может быть измерена по:

  • времени выполнения
  • количеству аллокаций
  • частоте вызовов
  • использованию кэша

Сравнение этих параметров между различными локалями выявляет различия в сложности правил форматирования, заложенных в CLDR.