Вторая конференция "Свободное програмное обеспечение в высшей школе" (27-28 января 2007)

Рефал-юникод

Исламов Марат Шамилевич

Удмуртский государственный университет, Ижевск

Введение

В настоящее время открытое программное обеспечение играет огромную роль в высшей школе. Особенно активно используется свободный софт в обучении программированию. Существует множество открытых и бесплатных систем разработки программ, таких как GNU C/C++, free-pascal, common-lisp, Refal...

В данной статье (?) описывается одна из таких систем.

Что такое Refal-юникод?

Рефал-юникод это реализация расширения популярного нетрадиционного языка программирования Рефал-5, которая позволяет легко работать с текстовыми данными, представленными символами различных кодировок (включая unicode), использовать в одной программе сразу несколько кодировок, работать с юникод-файлами, а так же запускать программы, написанные в юникоде.

Распространенная реализация языка Рефал-5, созданная профессором Турчиным и доработанная разработчиками Москвы и Переяславля-Зарецкого предоставляет эффективный и удобный инструмент обработки текстовой информации, позволяет решать сложные арифметические и логические задачи, а так же задачи метапрограммирования. Однако в исходном коде присутствует ошибка, которая не позволяет работать с файлами, содержащими нулевые байты, что препятствует работе с юникод-текстом.

Система Рефал-юникод является результатом исправления этой ошибки, добавления некоторых встроенных функций для работы с кодировками текстов, и написания нескольких утилит.

Как это использовать?

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

_xxxx ,
где хххх его шестнадцатеричный код. Например, слово Refal будет представлено выражением _052 _0x65 _66 _61 _6с .

Задавать юникод-символы явно необходимо только тогда, когда Ваша программа написана в простом текстовом файле. Если же программа сохранена в юникод-файле, то для ее выполнения необходимо воспользоваться утилитой uni2ref.rsl, которая вместе с исходным кодом входит в состав дистрибутива. Эта утилита преобразует юникод-программу в простой текстовый файл, заменяя все явно указанные в ней символы на их юникод-представление это значит, что все символы этих программ воспринимаются как юникод-символы.

Команда запуска:

Refgo uni2ref utf16-файл-программа.ref преобразованная-программа.ref.

Далее необходимо компилировать уже файл 'преобразованная-программа.ref'. (!) Внимание! Полученная программа может оказаться неудобной для чтения и редактирования ошибок. (!)

Функция <Type> для юникод-символа возвращает выражение l_.

Для обработки юникод-файлов необходимо указывать в функции <Open> режим открытия вместе с символом 'u', например:

<Open 'ru' 1 'utf16_file_to_read.txt'>

Функция Get будет считывать из простых файлов простые символы, из юникод-файлов (utf-16) юникод-символы. Функции Put и Putout будут преобразовывать символы к нужному виду автоматически - в соответствии с типом файла и загруженной таблицей перекодировки(см. ниже). Функции Print и Prout так же будут конвертировать все юникод-символы в однобайтные. Функция Card, как и в стандартном Рефале, считывает только однобайтные символы.

Еще одним нововведением стала таблица перекодировки. Таблица представляет собой глобальный массив из 128 ячеек, которые являются образами простых символов с кодами от 128 до 255 (расширение ASCII).

Чтобы загрузить таблицу перекодировки для работы с юникодом, нужно воспользоваться функцией <LoadTable e.e>, где e.e 128 юникод-символов.

Поскольку для работы с юникодом программист обычно использует небольшой набор кодировок (как правило для своего языка), разумно описать функцию, загружающую нужное расширение ASCII по названию кодировки. Для этого была написана Рефал-библиотека unitable.ref, содержащая функцию <Setlocale e.e>. Изначально она хранит две таблицы для русского языка: e.e может быть одним из следующих выражений:

koi8r - для работы с кодировкой KOI8 русского языка (Linux) cp866 - для DOS и Windows

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

Обратите внимание на то, что таблицы перекодировки загружается в программу динамически, что позволяет использовать сразу несколько кодировок в одной программе. Для явного конвертирования (согласно таблице, загруженной функцией <Setlocale>) в этой реализации Рефала-5 были описаны две новые build-in функции: <ToUnicode e.e> и <ToAscii e.e>. Первая конвертирует все простые символы выражения e.e в юникод, вторая - наоборот.

Зачем это нужно?

Как было указано ранее, область применения Рефала-5 очень велика. Поддержка юникода делает Рефал более мощным инструментом обработки текстовых файлов. Интернациональная кодировка (UTF-16) сегодня используется повсеместно: текстовые документы (*.doc), базы данных, коды программ современных языков (Java), тексты сайтов и т.д., - поэтому для Рефала открывается новый мир серьезных и актуальных задач, в котором он может занять почетное место одного из мощнейших инструментальных средств.

Предложение

В качестве учебной задачи предлагается описать еще две функции (пользовательские или build-in): <UTF8to16 e.utf8line> и <UTF16to8 e.utf16line> для поддержки кодировки utf-8. Теперь, когда возможна нормальная обработка Рефалом 0-байтов, описать эти функции на языке Рефал не представляет особого труда.

Данная система была создана в рамках курсовой работы студентом Удмуртского Государственного Университета, Математического факультета, кафедры Математического Обеспечения ЭВМ - Исламовым Маратом (e-mail: slam@idz.ru) под научным руководством доктора физико-математических наук, профессора факультета ФиТИВТ УдГУ - Непейводы Николая Николаевича (сайт: http://ulm.uni.udm.ru/~nnn).

Программа конференции