IP Pascal - это реализация языка программирования Pascal, использующая платформу IP-переносимости, несколько машина, операционная система и система языковой реализации.
IP Pascal реализует язык "Pascaline" (названный в честь калькулятора Blaise Pascal ), который расширенный надмножество ISO 7185 Pascal. Он добавляет модульность с элементом управления пространством имен, включая концепцию monitor, динамические массивы, перегрузки и объекты и множество других второстепенных расширений языка. IP реализует платформу портирования, включая набор инструментов виджетов , TCP / IP библиотеку, MIDI и звуковую библиотеку, а также другие функции, что позволяет обеим программам, написанным на IP Pascal, и сам IP Pascal, чтобы перейти на несколько операционных систем и машин.
IP Pascal - одна из немногих реализаций Pascal, которые все еще существуют, которые прошли Pascal Validation Suite, большой набор тестов, созданных для проверки соответствия ISO 7185 Pascal.
Хотя Паскалин расширяет ISO 7185 Паскаль, он не снижает безопасность типов Паскаля (как многие другие диалекты Паскаля, включая так называемые «escape-последовательности»). Функциональные возможности языка аналогичны функциям C # (который реализует язык, подобный C ++, но с удаленными типами незащищенности), а Pascaline можно использовать везде, где можно использовать управляемые программы (даже если он основан на на языке на 30 лет старше C #).
Автор языка Pascaline заявил, что не хочет, чтобы он оставался частным языком. IP Pascal продается как реализация Pascaline, но сам язык может и должен быть открытым и должен иметь качественные реализации.
С этой целью полная спецификация для Pascaline будет опубликована в Интернете, и в долгосрочной перспективе планируется создать версию компилятора-интерпретатора P5 с открытым исходным кодом (версия ISO 7185 компилятора-интерпретатора Wirth.), который реализует соответствие Pascaline. Он будет известен как компилятор P6, и он также будет открыто публиковаться и распространяться.
Ценность IP Pascal как коммерческого продукта будет основываться на ресурсах IDE и компилятора-кодировщика этой системы.
Эта статья следует за довольно старой версией Паскалина. Более новая версия Pascaline существует как Pascal-P6, часть серии Pascal-P. См. Ссылки ниже.
IP Pascal начинается с ISO 7185 Pascal (который стандартизировал исходный язык Никлауса Вирта ) и добавляет:
module mymod (input, output);. использует extlib; const one = 1;. тип string = packedarrayofchar;. процедура wrtstr (view s: string);. private . var s: string;. procedure wrtstr (view s: string);. var i: integer;. begin . for i: = 1 до max (s) do write (s [i]). end ;. begin {инициализировать монитор}. end ;. begin {shutdown monitor}. end .
Модули имеют секции входа и выхода. Объявления в модулях формируют свои собственные спецификации интерфейса, и необязательно иметь разделы интерфейса и реализации. Если требуется отдельный файл объявления интерфейса, он создается путем выделения кода из модуля и создания «скелета» модуля. Обычно это делается только в том случае, если объект для модуля должен быть отправлен без источника.
Модули должны занимать один файл, а модули ссылаются на другие модули с помощью оператора uses или joins . Для этого модуль должен иметь то же имя, что и его файл. Оператор использует указывает, что глобальные объявления указанного модуля будут объединены со ссылочным модулем, и любые возникающие конфликты имен вызовут ошибку. Оператор joins приведет к тому, что указанный модуль будет доступен через ссылающийся модуль, но не объединит пространства имен двух модулей. Вместо этого ссылочный модуль должен использовать так называемый «квалифицированный идентификатор»:
module.identifier
A program из ISO 7185 Pascal является прямым аналогом модуля и фактически является модулем без выход из раздела. Поскольку все модули в системе "гирляндно связаны", так что каждый из них выполняется по порядку, программа принимает "команду" программы просто потому, что она не завершает свою инициализацию, пока ее полная функция не будет завершена, в отличие от модуля, который это делает. Фактически, возможно иметь несколько разделов программы, которые будут выполняться последовательно. Модуль
A process, как и модуль program, имеет только секцию инициализации и выполняет в ней свои начало, полную функцию и завершение. Однако он получает свой собственный поток для выполнения помимо основного потока, который запускает модули программы . Таким образом, он может вызывать только модули monitor и share .
A monitor - это модуль, который включает блокировку задачи при каждом вызове внешней процедуры или функции и реализует связь между задачами с помощью семафоров.
A share модуль, поскольку он вообще не имеет глобальных данных, может использоваться любым другим модулем в системе и используется для размещения кода библиотеки.
Поскольку модульная система напрямую реализует многозадачность / многопоточность с использованием концепции Monitor решает большинство проблем многопоточного доступа. Данные для модуля привязаны к коду с помощью мьютексов или взаимоисключающих секций. Подзадачи / подпотоки запускаются прозрачно с помощью модуля процесса. Несколько подзадач / подпотоков могут иметь доступ к мониторам или совместно использовать модули. Общий модуль - это модуль без данных, которому не нужны механизмы блокировки монитора.
В IP Pascal динамические массивы считаются «контейнерами» для статических массивов. В результате IP Pascal, возможно, единственный Pascal, где динамические массивы полностью совместимы со статическими массивами ISO 7185 из исходного языка. Статический массив может быть передан в параметр динамического массива в процедуру или функцию или создан с помощью новой программы
programtest(output);. type string = Packages array ofchar;. var s: string;. procedure wrtstr (view s: string);. var i: integer;. begin . for i: = 1 до max (s) do write (s [i]). конец ;. начало . новый (s, 12); s: = 'Привет, мир'; wrtstr (s ^); wrtstr ('Вот и все'). end .
Такие "контейнерные" массивы могут иметь любое количество измерений.
Объявление константы может содержать выражения других констант
const b = a + 10;
$ ff, 76,% 011000
метка exit; перейти выйти;
var my_number: integer;
a: = 1234_5678;
Символ «_» (разрыв) может быть включен в любое число, кроме первой цифры. Он игнорируется и служит только для разделения цифр в номере.
const str = 'дождь в Испании \ cr \ lf';
Использование мнемоники стандарта ISO 8859-1.
процедура x (i: целое число); вперед;..... процедура x (i: целое число);. начало ..... end ;
Это упрощает объявление форварда путем вырезания и вставки и сохраняет параметры процедуры или функции в фактическом заголовке, где их можно увидеть.
процедура ошибка (просмотр s: строка);. begin . Writeln ('*** Ошибка: ', s: 0); halt {завершить программу}. end ;
программа myprog (ввод, вывод, список);. begin . Writeln ( list, 'Начало листинга:');...
программа echo (вывод, команда);. var c: char;. begin . while not eoln (команда) dobegin. read (команда, c); напишите (c). end ; Writeln. конец .
программа newprog (ввод, вывод, ошибка);. begin ....writeln (error, 'Bad parameter'); halt...
«команда» - это файл, который подключается к командной строке, чтобы его можно было прочитать с помощью обычных операций чтения файла.
программа копия (источник, назначение);. var источник, назначение: текст; c: char;. begin . reset (источник); переписать (место назначения); покане eof (источник) dobegin. покаnot eoln (источник) dobegin. читать (источник, c); запись (назначение, c). конец ; readln (источник); Writeln (назначение). end . end .
"исходный" и "целевой" файлы автоматически подключаются к параметрам в командной строке программы.
программный extfile (вывод); var f: файл целого числа; начать присваивать (f, 'myfile'); {установить имя внешнего файла} update (f); {сохранить существующий файл и установить режим записи} position (f, length (f)); {позиция до конца файла для добавления к нему} Writeln ('Конец файла:', местоположение (f)); {сообщаем пользователю местоположение нового элемента} write (f, 54321); {напишите новый последний элемент} close (f) {закройте файл} end.
фиксированная таблица: массив [1..5] ofзапись a: целое число; packedмассив [1..10] из char end = array . record 1, ' data1 'end, record 2,' data2 'end, record 3,' data3 'end, запись 4, 'data4' end, record 5, 'data5' end . end ;
программа тест; var a, b: целое число; begin a: = a и b; b: = b или $ a5; a: = не b; b: = a xor b end .
программа тест; var a: linteger; б: кардинал; c: кардинальный; d: 1..maxint * 2;...
Спецификации расширенного диапазона содержат правила для скаляров, лежащих вне диапазона -maxint..maxint. Это зависит от реализации относительно того, насколько возможно большое число, но Паскалин определяет серию стандартных типов, которые используют расширенные диапазоны, включая linteger для целых чисел с двойным диапазоном, cardinal для целых чисел без знака и lcardinal для целых чисел с двойным диапазоном без знака. Паскалин также определяет новые ограничения для этих типов, такие как maxlint, maxcrd и maxlcrd.
monitortest;. var notempty, notfull: semaphore; процедура enterqueue; begin, а nodata do wait (notempty);... signalone (notfull) end ;... beginend .
Семафоры реализуют организацию очереди событий задач непосредственно на языке, используя классические методы, описанные в Per Brinch Hansen.
module test1; виртуальнаяпроцедура x; начало ... конец ;
программа проверка; присоединяется к test1; переопределитьпроцедуру x; beginунаследовано x end ; beginend .
Переопределение процедуры или функции в другом модуле эффективно «перехватывает» эту подпрограмму, заменяя определение для всех ее вызывающих, но делает исходное определение доступным для модуля перехвата. Это позволяет модулю переопределения добавлять новые функции к старой процедуре или функции. Это может быть реализовано на любой глубине.
процедура x; начатьконец ; перегрузкапроцедура x (i: целое число); начатьконец ; перегрузкафункция x: целое число; begin x: = 1 end ;
«Группы» перегрузки позволяют помещать серию процедур и / или функций под одним и тем же именем и получать к ним доступ по их формальному параметру или «сигнатуре» использования. В отличие от других языков, реализующих эту концепцию, Pascaline не будет принимать перегрузки как принадлежащие к одной группе, если они не противоречат друг другу. Это означает, что не существует «приоритета» перегрузок и вопросов относительно того, какая процедура из группы перегрузки будет выполняться для любой данной фактической ссылки.
программа тест; использует базовый класс; класс альфа; расширяет бета; тип alpha_ref = ссылка toalpha; var a, b: целое число; следующий: alpha_ref; виртуальная процедура x (d: целое число); начало a: = d; self: = следующий конец ; privatevar q: целое число; начатьконец . var r: alpha_ref; начало новый (г);... ifr isальфа, затем r.a: = 1; r.x (5);... end .
В Паскалине классы являются динамическим экземпляром модуля (а модули - статическим экземпляром класса). Классы - это конструкция кода (а не тип), которая существует между модулями, процедурами и функциями. Поскольку класс является модулем, он может определять любую конструкцию кода, такую как константы, типы, переменные, фиксированные, процедуры и функции (которые становятся «методами»), и делать их общедоступными для клиентов класса или скрывать их с помощью "частное" ключевое слово. Поскольку класс является модулем, к нему можно получить доступ через квалифицированный идентификатор.
Классы как модули имеют автоматический доступ к своему пространству имен, как в C # и C ++, поскольку они не требуют какой-либо квалификации. Вне класса ко всем членам класса можно получить доступ либо по квалифицированному идентификатору, либо по ссылке. Ссылка - это указатель на объект, созданный в соответствии с классом. Любое количество экземпляров класса, известного как «объекты», может быть создано с помощью оператора new () и удалено с помощью оператора dispose (). Члены класса, с которыми связаны данные экземпляра, такие как переменные (или поля) и методы, должны быть доступны через ссылку. Ссылка - это тип, напоминающий указатель, включая возможность иметь значение nil и проверку на равенство с другими ссылочными типами. Не требуется указывать доступ к указателю с помощью «^».
Паскалин реализует концепцию «изящества ссылок», чтобы позволить ссылке обращаться к любой части объекта, независимо от того, является ли она для каждого экземпляра. Эта характеристика позволяет «продвигать» членов класса, то есть перемещать их из констант в переменные, а затем в «свойства» (которые являются полями класса, доступ для чтения и записи которых обеспечивается методами «get» и «set»).
Предусмотрены как перегрузки, так и переопределения для методов объекта. Метод, который будет переопределен, должен быть указан как виртуальный.
Методы объекта могут изменять ссылку, используемую для доступа к ним, с помощью ключевого слова self
.
Реализовано только одиночное наследование.
попробуйте ... кроме ... else ...; throw
Оператор «try» может защищать серию операторов, и любые исключения, отмеченные в коде, перенаправляются в оператор после «except». Оператор try также имеет предложение else, которое позволяет оператору выполняться при нормальном завершении блока try.
Исключения возникают в коде с помощью процедуры throw (). Операторы try позволяют программе выйти из любого вложенного блока и служат лучшей заменой внутрипроцедурных gotos (которые все еще поддерживаются в Pascaline). Поскольку по умолчанию необработанные исключения генерируют ошибки, процедура throw () может служить универсальной системой пометки ошибок.
assert (выражение);
Системная процедура assert вызывает завершение программы, если проверяемое значение ложно. Обычно он связан с дампом времени выполнения или диагностикой и может быть удален опцией компилятора.
IP Pascal может генерировать программы в режиме ISO 8859-1 (8-битные символы) или программы в режиме Unicode простым переключением во время компиляции (в отличие от многих других языков, между программами Unicode и программами, отличными от Unicode, нет исходной разницы). В текстовых файлах используется ASCII-совместимый формат UTF-8, и эти файлы считываются в 8- или 16-битные символы, внутренние по отношению к программе, и из них (верхние 128 символов ISO 8859-1 преобразуются в формат UTF-8 и из него в текстовых файлах даже в программе с 8-битной кодировкой символов).
Подобно maxint, Pascaline имеет maxchr, который является максимальным символом, который существует в наборе символов (и на самом деле может не иметь графического представления). Тогда диапазон типа char определяется как 0..maxchr. Это важное дополнение для работы с такими типами, как «набор символов», и помогает при работе с различными параметрами набора символов (такими как ISO 8859-1 или Unicode).
IP Pascal использует уникальную концепцию стекирования модулей. Каждый модуль размещается в памяти один над другим и выполняется внизу. Нижний модуль вызывает следующий модуль вверх, этот модуль вызывает следующий модуль и так далее.
программа-оболочка serlib cap
Модуль cap (иногда называемый «ячейкой» в терминологии IP Pascal, после концепции в конструкции интегральной схемы ) завершает стек, и начинает процесс возврата, который возвращается в исходное положение, пока программа не завершится. Укаждого модуля есть свой раздел запуска или входа, выполняемый на пути вверх по стеку, и его раздел завершения или выхода, выполняемый на обратном пути.
Это соответствует естественным зависимостям в программе. Самые примитивные модули, такие как базовая поддержка ввода-вывода в "serlib", сначала свою инициализацию, а - завершение, до и после модулей более высокого уровня в стеке.
IP Pascal имеет ряд модулей (или «библиотек»), которые образуют «платформу переноса». Эти библиотеки представляют собой идеализированный API для каждой применяемой функции, например файлов и расширенных функций операционной системы, графики, midi и звука и т. Д. Вся коллекция формирует основу для реализации в каждой системе и на каждой машине. этот IP появляется Паскаль.
Два важных различия между IP Pascal и другими языками, которые были просто объединены с портативными графическими библиотеками, заключаются в следующем:
могут быть созданы, которые не зависят от модулей платформы переноса. В результате IP Pascal очень портативен.
. Пример: стандартная программа "hello world" с выводом в графическое окно.
программа HelloWorld (вывод); begin Writeln ('Hello, World!') end .
. Пример: "hello world" с добавленными графическими командами. Обратите внимание, что стандартные операторы вывода Паскаля все еще используются.
программа привет (ввод, вывод); использует гралиб; var er: evtrec; begin bcolor (выход, зеленый); curvis (вывод, ложь); авто (вывод, ложь); страница (вывод); fcolor (вывод, красный); frect (вывод, 50, 50, maxxg (вывод) -50, maxyg (вывод) -50); fcolorg (вывод, maxint, maxint- (maxint div 3), maxint-maxint div 3); frect (вывод, 50, 50, 53, maxyg (вывод) -50); frect (вывод, 50, 50, maxxg (вывод) -50, 53); fcolorg (вывод, maxint div 2, 0, 0); frect (вывод, 52, maxyg (вывод) -53, maxxg (вывод) -50, maxyg (вывод) -50); frect (вывод, maxxg (вывод) -53, 52, maxxg (вывод) -50, maxyg (вывод) -50); шрифт (вывод, font_sign); шрифциз (вывод, 100); binvis (вывод); fcolor (вывод, голубой); cursorg (вывод, maxxg (вывод) div 2-strsiz (вывод, 'привет, мир') div 2 + 3, maxyg (вывод) div 2-100 div 2 + 3); Writeln ('привет, мир'); fcolor (вывод, синий); cursorg (вывод, maxxg (вывод) div 2-strsiz (вывод, 'привет, мир') div 2, maxyg (вывод) div 2-100 div 2); Writeln ('привет, мир'); повторить событие (input, er) до тех пор, пока er.etype = etterm end.Пример: игра Breakout. Пример: графические часы в большом окне.
стандартные модули IP Pascal могут "перекрывать" друг друга, графический модуль модуля расширения (любой другой тип модуля) может отменять Вызовы ввода-вывода реализованы в модуле под ним. Таким образом, paslib реализует стандартные операторы Паскаля, такие как чтение, запись и другие службы поддержки. gralib переопределяет эти службы и перенаправляет весь стандартный ввод-вывод Паскаля в графические окна.
Разница между этой и такими библиотеками в других реализациях заключается в том, что вам обычно приходится использовать использование стандартных операторов ввода-вывода и переключаться на совершенно другой набор стандартных и парадигм. Это означает, что вы не можете «перенести» программы, реализованные с использованием парадигмы последовательного ввода-вывода, в графические системы.
Еще одно важное отличие IP Pascal использует методы процедурного языка для доступа к библиотеке оконной графики. Большинство инструментов заставляет использовать в инструментарии методы объектно-ориентированного программирования. Одна из причин этого заключается в том, что Ориентация объекта хорошо подходит для графики, но это также происходит из-за того, что обычные системы, такие как Windows, заставляют прикладную программу как служебную программу для операционной системы, Используемая программа выполняет как функцию вызываемой операционной системы. Это широко известно как дизайн обратного вызова. Объектно-ориентированный код лучше работает с обратными вызовами, потому что он позволяет вызывать методы объекта как обратные вызовы, чтобы программисту приходилось регистрировать несколько указателей на функции в коде обработки событий, каждый из которых был бы вызывать обратным вызовом.
Объектная ориентация - хороший метод программирования, но IP Pascal делает его необязательной, а не обязательной методологией для написания программ. Способность IP Pascal использовать процедурные методы для доступа ко всем графическим функциям означает, что в старых программах нет «эффект обрыва ». Их не нужно переписывать только для того, чтобы воспользоваться преимуществами современных сред программирования.
Еще одна интересная особенность платформы IP-портирование заключается в том, что она поддерживает символьный режим даже в графической среде, предоставляя «символьную сетку», которая накладывается на пиксельную сетку, и программы, которые используют только вызовы символьного режима ( что будет работать на любом терминале или telnet-соединении) автоматически работать в графической среде.
Компилятор стартовал в 1980 году в Micropolis Disk Operating System, но быстро был перемещен в CP / M работает на Z80. Исходная система была написана на языке ассемблера Z80 и выводила прямой машинный код для Z80. Это был однопроходный компилятор без компоновщика, он включил свою системную библиотеку поддержки компилятора, перемещал ее и выводил в сгенерированный код в исполняемый файл на диске.
После того, как компилятор заработал, почти ровно в новом 1980 году, был написан ассемблер-компаньон для компилятора на языке Паскаль, а затем компоновщик на языке ассемблера Z80. Эта странная комбинация возникла из-за расчета, показанная, что таблица компоновщика будет проблемой в Z80 с ограничением в 64 КБ, поэтому компоновщик должен быть как можно меньше. Затем это было использовано для перемещения исходного кода компилятора и компоновщика Z80 с ассемблера Micropolis (который создавал единственный выходной двоичный файл) в новую систему компоновщика ассемблера.
После этого компилятор был переоборудован для вывода в формате компоновщика, а библиотека поддержки перемещена в отдельный файл и связ с ним.
В 1981 году компилятор был тщательно переделан, чтобы добавить оптимизацию, например, распределение регистров, логическое значение для перехода, мертвый код, сворачивание констант и другие оптимизации. К сожалению, при 46 КБ его также было сложно использовать, поскольку можно было скомпилировать только несколько страниц кода до переполнения его таблиц, чем любые другие компиляторы кода Pascal, чем любые другие компиляторы Pascal. проблема с большинством реализаций Pascal на процессорах с малыми адресами). Удалось использовать в первую очередь из-за решения о создании компактного компоновщика, позволяющего создать большие системы из этих небольших объектных файлов.
Несмотря на это, исходная реализация IP Pascal работала до 1987 года как компилятор общего назначения. На этом этапе IP Pascal был похож на C в своей модульной структуре. Каждый исходный файл представляет собой единицу и последовательность из некоторых комбинаций «модуля», констант, последовательности, процедур или функций. Они были в «свободном формате». Процедуры, функции, типы, константы и переменные могут находиться вне любого блока и в любом порядке. На процедуры, функции и переменные в других файлах были объявлены «внешние» объявления, а процедуры, функции и переменные в текущем файле были объявлены «глобальными». Каждый файл был скомпилирован в объектный файл, а затем связан вместе. Проверка типов в объектных файлах не проводилась.
Создан независимый модуль ввода-вывода, позволяющий использовать любой последовательный терминал (аналогично модулю CRT Turbo Pascal ), остается этот день.
В 1985 году была начата попытка переписать компилятор на Паскале. Новый компилятор будет двухпроходным промежуточным, разработан для решения проблем с памятью, связанным с первым компилятором. Внешний интерфейс компилятора был создан и протестирован без возможности генерации промежуточного кода (только синтаксический анализ).
в 1987 году система Z80, используемая для IP, была заменена на 80386 IBM-PC, и работа над ним прекратилась. С того времени использовалось несколько других компиляторов стандарта ISO 7185, включая компилятор SVS Pascal, 32-битную работу на основе расширителя DPMI.
К 1993 году совместимые с ISO 7185 компиляторы, доставляющие высококачественный 32-битный код, умирали. На этом этапе выбор заключался в том, чтобы прекратить использование Pascal или возродить прежний проект IP Pascal и модернизировать его до компилятора 80386. Этот моменту синтаксический анализатор Паскаля иемблер (для Z80) были всем, что можно было использовать на IBM-PC. С 1993 по 1994 год ассемблер был составлен модульным для работы с процессорами, включая 80386, был создан компоновщик для замены компоновщика языка ассемблера Z80, внешний интерфейс компилятора Pascal был завершен для вывода в промежуточный код. Наконец, на Паскале был поставлен промежуточный симулятор кода для проверки работоспособности системы.
В 1994 году симулятор использовался для расширения «основного» языка ISO 7185 IP Pascal, чтобы включить такие функции, как динамические массивы.
В 1995 году был создан «проверочный кодировщик» для целевого машинного кода 80386, созданная для получения выходных файловых файлов и создания «переносимого исполняемого файла» для Windows. Библиотека поддержки системы была создана для IP Pascal, сама на IP Pascal. Это был необычный шаг, предпринятый для предотвращения необходимости перекодировать библиотеку из другого Паскаля в IP Pascal, но с проблемой, возникающей в том, что и генератор кода 80386, и библиотеку пришлось бы отлаживать вместе.
В начале 1996 года начальная цель Windows NT была переключена на Windows 95, и IP Pascal стал полностью работоспособным как компилятор 80386 под Windows. Система загрузилась сама, оставшийся код Паскаля был перенесен с SVS Pascal на IP Pascal для завершения начальной загрузки. Таким образом была улучшена способность SVS Pascal на основе DPMI работать под Windows 95, что означало, что установка в загрузке между DOS и Windows 95 была устранена.
В 2000 году версия Linux (Red Hat) была создана только для текстового режима. Эта реализация использует систему таким вызовом и избегает использования glibc и, таким образом, создает поддержку тонких двоичных файлов, чем если бы использовалась полная система, необходимая для C, за счет двоичной переносимости.
Планируется создать версию текстовой библиотеки, использующую termcap и графическую библиотеку под X11.
В 1997 году версия терминальной библиотеки из исходного IP Pascal 1980 года была перенесена на Windows, и окончательный кодировщик был запущен для 80386. Основная причина потребности в улучшенном кодировщике - скорость выполнения в основной степени стала неактуальной из-за увеличения скорости процессора в IBM-PC. В результате новый кодировщик не был закончен до 2003 года.
В 2001 году была создана программа, сопутствующая IP Pascal, для преобразования файлов заголовков C в файлы заголовков Pascal. Это нужно было заменить ручной метод создания интерфейса системы для IP Pascal.
В 2003 году для IP Pascal был создан полностью графический, независимый от операционной системы модуль.
В 2005 году был добавлен комплект управления окнами и виджетов.
Оглядываясь назад, можно сказать, что самой большой ошибкой в версии Z80 была ее однопроходная структура. Для этого не было реальной причины; предыдущий (Базовый) компилятор автора был многопроходным с промежуточным хранилищем. Единственным аргументом в пользу этого было то, что однопроходная компиляция должна была быть быстрее. Однако однопроходная компиляция не подходит для небольших машин и вряд ли поможет продвинутым оптимизациям, обычным для больших машин.
Кроме того, однопроходный аспект замедлил или предотвратил загрузку компилятора с языка ассемблера Z80 на сам Паскаль. Поскольку компилятор был монолитным, преобразование в Паскаль не могло выполняться по частям, а должно было выполняться как полная замена. Когда началась замена, проект длился дольше, чем машина. Самая большая помощь, которую двухпроходная компиляция дала реализации I80386, заключалась в поддержании стандартной книги промежуточных инструкций, которые обменивались данными между внешней и задней частями компилятора. Этот хорошо понятный «этап» компиляции снизил общую сложность. Интуитивно понятно, что когда две программы равного размера тесно связаны, сложность не аддитивная, а мультипликативная, потому что связи между половинами программы бесконтрольно умножаются.
Еще один урок из дней Z80, который был исправлен на компиляторе 80386, заключался в том, чтобы писать как можно больше кода в сам Паскаль, даже в библиотеку поддержки. Наличие кода поддержки 80386, написанного на Паскале, сделало его настолько модульным и переносимым, что большая часть его была перемещена из области, специфичной для операционной системы, в раздел библиотеки «общего кода», раздел, зарезервированный для кода, который никогда не изменяется для каждой машины. и операционная система. Даже «системный» код требует незначительных изменений от реализации к реализации. В результате при переносе системы экономится большой объем работы по внедрению.
Наконец, произошла ошибка при входе во второй раунд оптимизации перед загрузкой компилятора. Хотя улучшение выходного кода было значительным, возникшее в результате увеличение сложности компилятора вызвало проблемы с ограниченным адресным пространством. В то время считалось, что лучше оптимизированный код дает возможность начальной загрузки кода на Паскале. Оглядываясь назад, можно сказать, что оставшиеся разделы, написанные на ассемблере, БЫЛИ проблемой, и их нужно было устранить, чем раньше, тем лучше. Другой способ сказать, что проблемы с пространством могут быть временными, но наличие значительных программных разделов, написанных на ассемблере, является серьезной и длительной проблемой.