Logo

Халва-Паскаль

Кодовое имя Halva Pascal будет использоваться для названия диалекта и соответствующего ему режима работы компилятора. Диалект Халва-Паскаля в компиляторе — более полно отражающий возможности платформы Кантора. Название взято по одноименной метафоре, обозначающей характерную особенность кода.

Компилятор также будет поддерживать существующие диалекты Object Pascal — Delphi и Free Pascal.

Диалекты Delphi и Free Pascal

Переключение унаследованных диалектов, вероятно, будет делаться ключом командной строки или определяться по расширениям файлов проектов:
  • Проекты .dpr и .dpk, исходные тексты .pas в режиме Delphi.
  • Проекты .lpr, исходные тексты .pp и .pas в режиме Free Pascal.
Существующие директивы переключения режимов 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», можно оставить комментарий от своего имени без предварительной регистрации.