Skip to content

Latest commit

 

History

History
115 lines (86 loc) · 7.07 KB

File metadata and controls

115 lines (86 loc) · 7.07 KB

Refal-05-Unicode

Форк Refal-05 с поддержкой Unicode, добавляющий полную поддержку Unicode с использованием ICU (International Components for Unicode).

Обзор

Этот форк расширяет оригинальный компилятор Refal-05 полной поддержкой Unicode, позволяя программам обрабатывать текст на любом языке и письменности. Реализация использует UTF-32 внутри для эффективной обработки символов и UTF-8 для ввода/вывода.

Ключевые возможности

Поддержка Unicode

  • Полный набор символов Unicode: Поддержка всех символов Unicode, включая эмодзи
  • UTF-8 ввод/вывод: Весь ввод и вывод использует кодировку UTF-8
  • Внутреннее представление UTF-32: Кодировка фиксированной ширины для эффективного сопоставления с образцом
  • Оптимизация ASCII: Символы < 128 используют устаревшие узлы CHAR для производительности

Операции с символами

  • Свойства символов: Функция Type расширена для определения категорий Unicode
  • Преобразование регистра: Функции Upper и Lower работают со всеми письменностями Unicode
  • Сопоставление с образцом с учётом Unicode: Правильная обработка многобайтовых символов
  • Шестнадцатеричная поддержка: ChrHex и OrdHex для шестнадцатеричной записи (например, 0x4E2D)
  • Шестнадцатеричные литералы: Прямая шестнадцатеричная запись в исходном коде (0xFF, 0x1F389)

Интеграция с ICU

  • Классификация символов: определение буквенных, цифровых, пробельных, печатаемых символов
  • Преобразование регистра: преобразование верхнего/нижнего/заглавного регистра с учётом локали
  • Нормализация: формы NFC, NFD, NFKC, NFKD
  • Определение письменности: идентификация системы письма символов
  • Графемные кластеры: правильная обработка комбинирующих символов

Детали реализации

Архитектурные изменения

  1. Расширенная структура узлов (refal05rts.h):

    • Добавлен R05_DATATAG_UNICODE для символов UTF-32
    • Добавлено поле unicode_ в объединение узла
    • Сохранена обратная совместимость с ASCII
  2. Библиотека Unicode (r05-unicode.h/c):

    • Функции преобразования UTF-8 ↔ UTF-32
    • Запросы свойств символов через ICU
    • API нормализации и определения письменности
  3. Обновления среды выполнения:

    • Функции выделения памяти с учётом Unicode
    • Разбор строк UTF-8 с быстрым путём для ASCII
    • Сравнение символов Unicode при сопоставлении с образцом
    • Преобразование вывода в UTF-8
  4. Встроенные функции:

    • Chr/Ord: Расширены для кодовых точек Unicode (0-0x10FFFF)
    • ChrHex/OrdHex: Шестнадцатеричные операции Unicode
    • Type: Определение категории Unicode
    • Upper/Lower: Полное преобразование регистра Unicode
    • Prout/Print: Поддержка вывода UTF-8
  5. Улучшения парсера:

    • Поддержка шестнадцатеричных литералов: префикс 0x для чисел (например, 0x4E2D = 20013)
    • Кодировка исходных файлов UTF-8
    • Строки Unicode в исходном коде

Система сборки

Система сборки автоматически определяет ICU и включает поддержку Unicode:

./makeself.sh lambda  # Собирает с Unicode, если ICU доступен

Необходимые зависимости:

  • Библиотеки разработки ICU (icu4c)
  • Компилятор C с поддержкой C99

Соображения производительности

  • Символы ASCII (< 128) используют оригинальный тип узла CHAR для эффективности
  • Декодирование UTF-8 включает быстрый путь для ASCII
  • Сопоставление с образцом оптимизировано для распространённых случаев только с ASCII
  • Свойства Unicode кэшируются ICU для производительности

Тестирование

Тестовые программы демонстрируют функциональность Unicode:

  • test-unicode-hello.ref: "Hello World" на разных языках
  • test-simple-unicode.ref: Операции с символами и преобразование регистра
  • test-unicode-comprehensive.ref: Сопоставление с образцом и граничные случаи
  • test-unicode-advanced.ref: Типы символов и смешанные строки
  • test-hex-literals.ref: Разбор шестнадцатеричных литералов
  • test-hex-functions.ref: Функциональность ChrHex/OrdHex

Пример вывода:

Hello, World!
Привет, мир!
你好,世界!
こんにちは、世界!
🌍🌎🌏 Unicode Test 🎉

Совместимость

  • Сохраняет полную обратную совместимость с существующими программами Refal-05
  • Программы только с ASCII работают без потери производительности
  • Исходные файлы могут использовать кодировку UTF-8 для строковых литералов
  • Двоичная совместимость сохранена для сборок без Unicode

Лицензия

Та же, что и у оригинального Refal-05 (см. файл LICENSE)

Авторы

Реализация Unicode: Данслав Славенской.

Refal-05: Александр Коновалов.