Версия компилятора для Windows в основном соответствует версии 1.1 для DOS,
но есть несколько отличий. Некоторые изменения внесены в описание языка,
они достаточно естественны. Разумеется, отсутствие полной совместимости
с предыдущей версией не является достоинством, но в основном изменения
коснулись того, что было сделано не лучшим образом.
Прямой перевод DOS-версии 1.3 (наиболее полная версия Context) в среду
Windows возможен и был частично выполнен, но это такое решение сохраняет все
недостатки DOS-версии и еще больше запутывает текст компилятора. Context 2.0 -
новый компилятор, но в нем использованы некоторые идеи, реализованные а
DOS-версии. Интегрированный синтаксический и семантический анализатор похож
на применявшийся в DOS-версиях 1.0-1.3, но генератор кода полностью отделен от
него. Результат работы анализатора - синтаксические деревья для всех функций
программы. Соответственно, возросли требования к объему оперативной памяти,
но сегодня это несущественно.
Версия компилятора 2.01 работает в среде DOS и может быть использована для
выполнения первой компиляции версий для Windows (2.02-2.12), но реально
использовалась частично переведенная версия 1.3.
Изменения и дополнения в языке
Не допускается использование одного имени для разных объектов,
например, для константы и глобальной переменной. Идентификаторы
не могут совпадать с ключевыми словами языка
Не допускаюся пустые блоки, если пустой блок зачем-либо нужен,
он должен содержать оператор null
Для организации бесконечного цикла вместо неестественного
while TRUE do ... end должна использоваться конструкция do ... end
Краткая оценка условий, например, если при оценке F()=0 | G()=0,
функция F() возвратит ноль, функция G() вызвана не будет
Специальные символы в строках и символьных константах.
Представления специальных символов состоят из тильды (~) и
следующего за ней символа. Настоящая версия распознает
символы:
~t - горизонтальная табуляция
~r - возврат каретки
~n - перевод строки
~0 - ноль
~C - любой иной символ С, например, ~~ - тильда
Явные преобразования типов. Используется функциональная запись
[@]Тип(Выражение). В данной версии реализовано преобразование
символа в байт, слово и целое со знаком
Везде, где используются константы, могут использоваться константные
выражения
Глобальные переменные простых типов могут быть инициализированы
Второй оператор присваивания (:=). Добавлен, поскольку использование
одного символа для присваивания и сравнения не является хорошим решением
Вставка файлов с помощью директивы include "Имя_файла". include
может встречаться только на уровне определений глобальных объектов,
каждый файл вставляется в текст программы лишь один раз. Например,
если файл A включается в файл B, файлы A и B включаются в программу, то
файл A будет включен в программу только один раз. Неиспользуемый код и
данные исключаются из программы компилятором
Учет специфики Windows
Синонимы. Для каждого объекта в программе может быть определено
второе имя, например, synonym DWORD word
Внешние функции. Каждая функция из внешней DLL должна быть
объявлена в программе как external Имя_DLL[.Имя_функции];
Ограничения
Не реализованы типы-функции, ссылка на функцию считается ссылкой на void
Допускается только прямая рекурсия
Отсутствует встроенный ассемблер
Примитивный генератор кода
Перечисленные ограничения сделаны с целью упрощения компилятора (точнее, ничего
не сделано для их устранения). В будущих версиях (если они появятся) ограничения
будут устранены. Также планируются:
Базовый тип real
Типы-перечисления
Типы-функции и ссылки на функции
Типы-классы
Оптимизатор
Для работы необходим ассемблер FASM (www.flatassembler.net).
Компилятор тестировался с FASM 1.49. Ранее использовался ассемблер TASM32 (V5.0) и компоновщик TLINK32
фирмы Boland. Замена ассемблера связана только с тем, что TASM32 не является свободно распространяемым
продуктом.