Компилятор также будет поддерживать существующие диалекты Object Pascal — Delphi и Free Pascal.
Диалекты Delphi и Free Pascal
Переключение унаследованных диалектов, вероятно, будет делаться ключом командной строки или определяться по расширениям файлов проектов:- Проекты
.dpr
и.dpk
, исходные тексты.pas
в режиме Delphi. - Проекты
.lpr
, исходные тексты.pp
и.pas
в режиме Free Pascal.
{$MODE}
и {$MODESWITCH}
будут косвенно учитываться или игнорироваться, в соответствии с принципом платформы Кантора, исходящим из первичности БД кода, а не исходных текстов.Диалект Халва-Паскаля
Исходные тексты могут иметь любое расширение, распространяемое на все анализируемые или загружаемые модули, как принято на платформе Кантора.Принадлежность исходного текста диалекту Халва-Паскаля определяется синтаксически:
- Программы и библиотеки начинаются с ключевого слова implementation или initialization.
- Модули начинаются с ключевого слова interface.
Программа считается частным случаем библиотеки, экспортирующей лишь одну анонимную функцию — точку входа, прототип которой задается исполняющей средой ОС и не требует явного объявления в коде.
Модуль
В самом распространенном случае исходный текст поступает в компилятор из файла — имя модуля берется из имени файла, как принято на платформе Кантора:interface // файл HelloUnit.pas procedure Hello; implementation procedure Hello; stdcall; begin WriteLn('Привет всем!'); end; end.Если же модуль дается компилятору из некого безымянного скрипта, либо по каким-то другим причинам требуется задать имя явно, допустима такая конструкция:
interface HelloUnit; ... end.Указание имени после ключевого слова interface исключает синтаксический «зазор» между unit и interface в объявлении модуля, присутствующий в традиционных диалектах Паскаля.
Программа
С импортом из модулей:implementation uses HelloUnit; initialization // или begin Hello; end.Без использования модулей:
initialization WriteLn('Привет всем!'); end.Есть гипотеза, что безмодульная программа описывает какой-то вырожденный или особый случай — скрипт немедленного выполнения или некую команду конечной точки, смысл которой уточнится в процессе реализации.
Библиотека
implementation uses HelloUnit; exports Hello; end.Данный синтаксис является вспомогательным, поскольку в Канторе любой модуль считается библиотекой и может быть указан в качестве цели сборки. Если экспортируемые функции не заданы явно, будут экспортированы все функции из раздела interface.
Синтаксические отличия
- Использование мнемоник символов наравне с кодами.
- Экранирование идентификаторов кавычками (как принято в SQL и Канторе).
- Инициализатор даты-времени для типа
TDateTime
. - Инициализатор строк фиксированной длины с определением длины по фактическим данным.
- Константность параметров функций и процедур по умолчанию, запрет на ключевое слово const при объявлении параметров.
- Перегрузка функций и процедур всегда доступна, ключевое слово overload запрещено.
- Частичное применение, объявляемое ключевым словом absolute.
interface const Fmt = 'File name: '#tab'%s'; // "File name: \t%s" в Си-подобных языках Hello = 'Привет!'#CR#LF'Как дела?'; TheStrait = #Oslash'resund'; // Øresund Volcano = 'Eyjafjallaj'#ouml'kull'; // Eyjafjallajökull "procedure" = 'A'; MyTime = TDateTime(['2018-03-22 20:27']); Cantor: string[] = 'Georg Ferdinand Ludwig Philipp'; // string[30] procedure Point(X, Y: Integer); procedure PointAt20(X: Integer) absolute Point(X, 20); end.
Фиксированные строки и национальные символы
Объявление фиксированных строк, содержащих национальные символы, может быть ошибочно в предлагаемом ниже режиме интернационализации, если длина будет задана жестко:var CityA: string[6] = 'Münich'; // ошибка: 'Münich' в UTF-8 имеет длину 7 байт CityB: string[] = 'Münich'; // длина 6 или 7 байт в зависимости от кодировкиВполне возможно, что для выполнения требований по интернационализации объявление в стиле халвы будет единственно допустимым.
Множественное наследование
Предполагается, что может поддерживаться множественное наследование в том виде, в каком оно реализовано платформой Кантора, — от нескольких взаимно-абстрактных классов.Программирование на национальных языках
Поскольку Халва-Паскаль разрабатывается в окружении Кантора, нельзя обойти тему программирования на национальных языках, тем более что русскоязычный синтаксис условно есть в плане реализации (1-й этап, дополнительно). Если серьезно нацеливаться на поиск взвешенного решения в этом непростом вопросе, начинать экспериментировать нужно как можно раньше. Будучи промежуточным языком, Халва-Паскаль отлично подходит для экспериментов.Поддержка нелатинских идентификаторов появилась еще в Delphi 2005, нам самим придумывать уже ничего не придется. За прошедшее время видно, что нововведение на привычки разработчиков не повлияло и осталось по сути невостребованным. Причины могут быть разные. Вполне возможно, что одна из них — невозможность проконтролировать, в каких модулях уже используются национальные идентификаторы, а в каких нет. Можно предположить, что если бы такой контроль был, экспериментировать с русскоязычным программированием было бы проще.
Именно это и предполагается сделать в Халва-Паскале — добавить в компилятор возможность контроля локализации и глобализации, распространяющуюся не только на строки в интерфейсе пользователя, но и на идентификаторы в исходном коде. Имеется достаточно опыта наблюдения за международными проектами русскоязычных разработчиков, чтобы рассуждать на эту тему предметно.
Программный контроль локализации и глобализации
В Халва-Паскале предполагается, что изначально разработчик ничем не ограничен и может писать код, как удобно ему или заказчику. Для проверки готовности проекта к международному сотрудничеству реализуется ключ компиляции-i18n
, включающий анализатор идентификаторов и комментариев в коде, локализуемость текстовых строк и зависимость процесса сборки от настроек локали:
halva Project.pas -unsafe -i18n ... Warning: source file “Project.pas” depends on locale character set Warning: identifier “класс_окна” is not understandable for international community Line 211 Warning: comment “потом исправлю :)” is not understandable for international community Line 388 Warning: string “Завершить работу?” is not localizable Line 1512Если не задать ключ
-unsafe
, по умолчанию действует режим полного неприятия ошибок, что приведет к завершению компиляции на первом же найденном нарушении. Этот режим удобно использовать для соблюдения правил перед складыванием кода в хранилище:
halva Project.pas -i18n ... Error: source file “Project.pas” depends on locale character setПредполагается, что при помощи этого нехитрого механизма технически удастся развести сторонников и противников национально-ориентированного программирования: каждый будет использовать то, что подходит ему, а в случае необходимости сможет хотя бы оценить объем работ по (де)локализации, просто запустив компилятор.
Особенности реализации
Планируется, что Халва-Паскаль будет поддерживать большинство возможностей входного языка Delphi 2007, за исключением тех, которые явно противоречат концепциям Кантора. Некоторые возможности будут реализованы не сразу или не будут реализованы по причине нехватки ресурсов у команды разработчиков, формально оставаясь реализуемыми технически.Поскольку Халва-Паскаль не планируется как эталонная реализация Object Pascal, некоторые значимые вещи будут реализованы в нем нетрадиционным способом и могут оказаться не вполне совместимы с существующим кодом на Delphi и Free Pascal. Это не прихоть разработчиков, а следствие трансляции в объектный код Кантора, для которого входной язык Object Pascal является чужим и может быть лишь адаптирован, с большей или меньшей совместимостью.
Отличия от Delphi 2007
- Встроенный тип
Extended
— синоним типаDouble
, имеет размер 64 бита. - Длинные строки реализуются как AnsiString с кодовой страницей и
UnicodeString
, аналогично Delphi 2009. Строки будут реализованы классами CoreLite, а другой реализации там попросту нет. UnicodeString
может существовать одновременно сChar = AnsiChar
для лучшей совместимости с существующим кодом.- Встроенный тип
WideString
объявлен как синонимUnicodeString
и не является COM-совместимым (не является реализацией BSTR). - Возможность компиляции под 64-битную платформу, даже если компилятор выдает себя за ранние версии Delphi.
- Встроенные процедуры
Write/WriteLn
иRead/ReadLn
реализуются как вызовы методов класса консоли, по одному вызову на каждый аргумент (в Delphi реализация аналогична, но не видна программисту). - Возможность компиляции и работоспособность программ VCL не гарантируется до тех пор, пока механизмы VCL не будут реализованы через частичные вычисления.
- Объявления из раздела published не имеют каких-либо отличий от public.
Что будет реализовано в будущих версиях (не в альфе)
- Эмулируемый программно тип
Real48
(может быть реализован, если найдется его открытая реализация). - Встроенный тип
Extended
длиной 80 бит. - Процедуры
ReadLn
, читающие введенные пользователем значения. На данный момент в CoreLite есть только одна процедураReadLn
— без параметров, ожидающая ввода Enter. - Поддержка интерфейсов COM, automation и всего остального, связанного с COM (в том числе
WideString
как BSTR). - RTTI и режим компиляции
{$M+}
. - Хранилище данных форм (VCL, CLX, FMX) как потоков
RCDATA
. - Объявления resourcestring не будут помещаться в раздел ресурсов.
- Cборка под *nix-системы в режиме эмуляции Kylix.
- Обобщения, анонимные функции, вспомогательные классы и прочие нововведения Delphi 2009 и более поздних.
Что не может быть реализовано из-за противоречия платформе Кантора
- Встроенный ассемблер BASM (уже недоступен в самом Delphi в режимах компиляции под 64 бита).
- Директивы
{$EXTERNALSYM}
и{$HPPEMIT}
будут игнорироваться в режиме совместимости с Delphi, запрещены в режиме халвы. - Сборка пакетов, объявляемых ключевым словом package, как пакетов, совместимых с Delphi. Объявления package будут поддерживаться лишь ограниченно, как проекты особого вида, в соответствии с понятием проекта в Канторе.
- Модель ООП точно в том виде, как в современных версиях Delphi, с отличием между private, strict private и пр. ООП Халва-Паскаля всегда будет соответствовать модели Кантора.
Комментариев нет :
Отправить комментарий
Выбрав в выпадающем списке пункт «Имя/URL», можно оставить комментарий от своего имени без предварительной регистрации.
Примечание. Отправлять комментарии могут только участники этого блога.