ИП Паскаль
![]() | В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
IP Pascal — это реализация языка программирования Pascal с использованием платформы переносимости IP, многомашинной, операционной системы и системы реализации языка. Он реализует язык «Pascaline» (названный в честь калькулятора Блеза Паскаля) и прошел проверку Pascal Validation Suite.
Обзор
[ редактировать ]IP Pascal реализует язык «Pascaline» (названный в честь калькулятора Блеза Паскаля ), который представляет собой расширенную версию ISO 7185 Pascal. Он добавляет модульность с контролем пространства имен параллельных задач , включая концепцию монитора , динамические массивы , перегрузки и переопределения, объекты и множество других незначительных расширений языка. IP реализует платформу портирования, включающую набор инструментов для виджетов , TCP/IP библиотеку , библиотеку MIDI и звуков, а также другие функции, что позволяет как программам, написанным под IP Pascal, так и самому IP Pascal, перемещаться на несколько операционных систем и машин.
IP Pascal — одна из немногих существующих реализаций Pascal, которая прошла Pascal Validation Suite — большой набор тестов, созданный для проверки соответствия стандарту ISO 7185 Pascal.
Хотя Паскалин расширяет ISO 7185 Паскаль, он не снижает типобезопасность Паскаля (как это происходит во многих других диалектах Паскаля, включая так называемые «экранирование типов»). Функциональность языка аналогична функциональности C# (который реализует язык, подобный C++, но с удаленной небезопасностью типов), и Pascaline можно использовать везде, где можно использовать управляемые программы (даже несмотря на то, что он основан на языке на 30 лет старше). чем С#).
Открытый или закрытый статус
[ редактировать ]Автор языка Паскалин заявил, что не желает, чтобы он оставался собственным языком. IP Pascal продается как реализация Pascaline, но сам язык может и должен быть открытым и иметь качественные реализации.
С этой целью полная спецификация Pascaline будет опубликована в Интернете, а долгосрочное намерение состоит в том, чтобы создать версию компилятора-интерпретатора Pascal-P5 с открытым исходным кодом (версия компилятора-интерпретатора Pascal-P4 компании Wirth в соответствии с ISO 7185), которая обеспечивает соответствие Паскалину. Он будет известен как компилятор Pascal-P6, и он также будет открыто публиковаться и распространяться.
Ценность IP Pascal как коммерческого продукта будет зависеть от ресурсов IDE и компилятора-кодировщика этой системы.
Эта статья посвящена довольно старой версии Паскалина. Более новая версия Pascaline существует как Pascal-P6, часть серии Pascal-P. См. ссылки ниже.
Язык
[ редактировать ]IP Pascal начинается с ISO 7185 Pascal (который стандартизировал исходный язык Никлауса Вирта ) и добавляет:
Модули, включая конструкции параллельных задач, обрабатывают, контролируют и делятся
[ редактировать ]module mymod(input, output);
uses extlib; const one = 1;
type string = packed array of char;
procedure wrtstr(view s: string);
private
var s: string;
procedure wrtstr(view s: string);
var i: integer;
begin
for i := 1 to max(s) do write(s[i])
end;
begin { initialize monitor }
end;
begin { shutdown monitor }
end.
Модули имеют секции входа и выхода. Объявления в модулях формируют собственные спецификации интерфейса, и не обязательно иметь разделы интерфейса и реализации одновременно. Если необходим отдельный файл объявления интерфейса, он создается путем удаления кода из модуля и создания «скелета» модуля. Обычно это делается только в том случае, если объект модуля должен быть отправлен без источника.
Модули должны занимать один файл, а модули ссылаются на другие модули через оператор uses или joins . Для этого модуль должен иметь то же имя, что и имя его файла. Оператор Uses указывает, что глобальные объявления модуля, на который ссылаются, будут объединены с ссылочным модулем, и любые конфликты имен, возникающие в результате этого, приведут к ошибке. Оператор joins сделает модуль, на который ссылается, доступным через ссылающийся модуль, но не объединяет пространства имен двух модулей. Вместо этого ссылающийся модуль должен использовать так называемый «полный идентификатор»:
module.identifier
Программа . из ISO 7185 Pascal является прямым аналогом модуля и фактически представляет собой модуль без секции выхода Поскольку все модули в системе «последовательно соединены», так что каждый из них выполняется по порядку, программа принимает на себя «команду» программы просто потому, что она не выходит из инициализации до тех пор, пока ее полная функция не будет завершена, в отличие от модуля, который это делает. Фактически, можно иметь несколько разделов программы, которые будут выполняться последовательно.
Модуль процесса , как и программный модуль, имеет только раздел инициализации и выполняет свой запуск, полную функцию и завершение в этом разделе. Однако он получает для выполнения собственный поток, отличный от основного потока, который запускает программные модули. Таким образом, он может вызывать только модули мониторинга и совместного использования .
Монитор — это модуль , который включает блокировку задач при каждом вызове доступной извне процедуры или функции и реализует связь между задачами с помощью семафоров.
Общий . модуль, поскольку он вообще не имеет глобальных данных, может использоваться любым другим модулем в системе и используется для размещения библиотечного кода
Поскольку модульная система напрямую реализует многозадачность/многопоточность с использованием концепции Monitor , она решает большинство проблем многопоточного доступа. Данные модуля привязываются к коду с помощью мьютексов или взаимоисключающих секций . Подзадачи/подпотоки запускаются прозрачно с помощью модуля процесса. Несколько подзадач/подпотоков могут получать доступ к мониторам или совместно использовать модули. Общий модуль — это модуль без данных, для которого не требуются механизмы блокировки монитора.
Динамические массивы
[ редактировать ]В IP Pascal динамика рассматривается как «контейнер» для статических массивов. В результате IP Pascal, пожалуй, единственный язык Pascal, в котором динамические массивы полностью совместимы со статическими массивами ISO 7185 исходного языка. Статический массив можно передать в параметр динамического массива процедуры или функции или создать с помощью new.
program test(output);
type string = packed array of char;
var s: string;
procedure wrtstr(view s: string);
var i: integer;
begin
for i := 1 to max(s) do write(s[i])
end;
begin
new(s, 12); s := 'Hello, world'; wrtstr(s^); wrtstr('That's all folks')
end.
Такие массивы-«контейнеры» могут иметь любое количество измерений.
Постоянные выражения
[ редактировать ]Объявление константы может содержать выражения других констант.
const b = a+10;
Система счисления для чисел
[ редактировать ]$ff, &76, %011000
Буквенно-цифровые метки перехода
[ редактировать ]label exit; goto exit;
подчеркивание во всех метках
[ редактировать ]var my_number: integer;
подчеркивание цифрами
[ редактировать ]a := 1234_5678;
Символ «_» (разрыв) может быть включен в любое место числа, кроме первой цифры. Он игнорируется и служит только для разделения цифр в номере.
Последовательности специальных символов, которые можно встраивать в константные строки.
[ редактировать ]const str = 'the rain in Spain\cr\lf';
Использование стандартной ISO 8859-1 мнемоники .
Дублирование пересылаемых заголовков
[ редактировать ]procedure x(i: integer); forward;
...
procedure x(i: integer);
begin
...
end;
Это упрощает объявление пересылки путем вырезания и вставки и сохраняет параметры процедуры или функции в фактическом заголовке, где их можно увидеть.
неубедительная процедура
[ редактировать ]procedure error(view s: string);
begin
writeln('*** Error: ', s:0); halt { terminate program }
end;
Специальные предопределенные файлы заголовков
[ редактировать ]program myprog(input, output, list);
begin
writeln(list, 'Start of listing:'); ...
program echo(output, command);
var c: char;
begin
while not eoln(command) do begin
read(command, c); write(c)
end; writeln
end.
program newprog(input, output, error);
begin
... writeln(error, 'Bad parameter'); halt ...
«команда» — это файл, который подключается к командной строке, чтобы его можно было прочитать с помощью обычных операций чтения файлов.
Автоматическое связывание заголовочных файлов программы с именами командной строки
[ редактировать ]program copy(source, destination);
var source, destination: text; c: char;
begin
reset(source); rewrite(destination); while not eof(source) do begin
while not eoln(source) do begin
read(source, c); write(destination, c)
end; readln(source); writeln(destination)
end
end.
Файлы «исходник» и «назначение» автоматически подключаются к параметрам командной строки программы.
Операции по именованию и обработке файлов
[ редактировать ] program extfile(output);
var f: file of integer;
begin
assign(f, 'myfile'); { set name of external file }
update(f); { keep existing file, and set to write mode }
position(f, length(f)); { position to end of file to append to it }
writeln('The end of the file is: ', location(f)); { tell user location of new element }
write(f, 54321); { write new last element }
close(f) { close the file }
end.
фиксированные объявления, которые объявляют типы структурированных констант
[ редактировать ]fixed table: array [1..5] of record a: integer; packed array [1..10] of char end = array
record 1, 'data1 ' end, record 2, 'data2 ' end, record 3, 'data3 ' end, record 4, 'data4 ' end, record 5, 'data5 ' end
end;
Булевы битовые операторы
[ редактировать ]program test; var a, b: integer; begin a := a and b; b := b or $a5; a := not b; b := a xor b end.
Переменные расширенного диапазона
[ редактировать ]program test; var a: linteger; b: cardinal; c: lcardinal; d: 1..maxint*2; ...
Спецификации расширенного диапазона дают правила для скаляров, находящихся за пределами диапазона -maxint..maxint. Насколько большое число возможно, зависит от реализации, но Паскалин определяет ряд стандартных типов, которые используют расширенные диапазоны, включая linteger для целых чисел двойного диапазона, кардинальный для целых чисел без знака и lcardinal для целых чисел двойного диапазона без знака. Паскалин также определяет новые ограничения для этих типов: maxlint, maxcrd и maxlcrd.
Семафоры
[ редактировать ]monitor test;
var notempty, notfull: semaphore; procedure enterqueue; begin while nodata do wait(notempty); ... signalone(notfull) end; ... begin end.
Семафоры реализуют очередь событий задач непосредственно в языке, используя классические методы, изложенные Пером Бринчом Хансеном .
Переопределения
[ редактировать ]module test1; virtual procedure x; begin ... end;
program test; joins test1; override procedure x; begin inherited x end; begin end.
Переопределение процедуры или функции в другом модуле эффективно «перехватывает» эту подпрограмму, заменяя определение для всех ее вызывающих сторон, но делает исходное определение доступным для перехватывающего модуля. Это позволяет переопределяющему модулю добавлять новые функциональные возможности к старой процедуре или функции. Это можно реализовать на любой глубине.
Перегрузки
[ редактировать ]procedure x; begin end; overload procedure x(i: integer); begin end; overload function x: integer; begin xx:= 1 end;
«Группы» перегрузки позволяют размещать ряд процедур и/или функций под одним и тем же именем и получать доступ к ним по формальному параметру или «подписи» использования. В отличие от других языков, реализующих эту концепцию, Паскалин не будет воспринимать перегрузки как принадлежащие к одной и той же группе, если они не являются двусмысленными друг с другом. Это означает, что не существует «приоритета» перегрузок и нет вопроса о том, какая подпрограмма группы перегрузок будет выполняться для конкретной фактической ссылки.
Объекты
[ редактировать ]program test; uses baseclass; class alpha; extends beta; type alpha_ref = reference to alpha; var a, b: integer; next: alpha_ref; virtual procedure x(d: integer); begin aa:= d; selfl:= next end; private var q: integer; begin end. var r: alpha_ref; begin new(r); ... if r is alpha then r.a := 1; r.x(5); ... end.
В Паскалине классы — это динамический экземпляр модуля (а модули — статический экземпляр класса). Классы — это конструкция кода (а не тип), которая существует между модулями, процедурами и функциями. Поскольку класс является модулем, он может определять любую конструкцию кода, такую как константы, типы, переменные, фиксированные значения, процедуры и функции (которые становятся «методами»), и делать их общедоступными для клиентов класса или скрывать их с помощью ключевое слово «частное». Поскольку класс является модулем, доступ к нему можно получить через квалифицированный идентификатор.
Классы как модули имеют автоматический доступ к своему пространству имен, как в C# и C++, и не требуют какой-либо квалификации. Вне класса ко всем членам класса можно получить доступ либо по квалифицированному идентификатору, либо по ссылке. Ссылка — это указатель на объект, созданный согласно классу. Любое количество экземпляров класса, называемых «объектами», может быть создано с помощью оператора new() и удалено с помощью оператора Dispose(). Доступ к членам класса, с которыми связаны данные экземпляра, такие как переменные (или поля) и методы, должен осуществляться через ссылку. Ссылка является типом и напоминает указатель, включая возможность иметь значение nil и проверку на равенство с другими ссылочными типами. Не требуется уточнять доступ к указателю с помощью "^".
В Паскалине реализована концепция «изящества ссылок», позволяющая ссылке получить доступ к любой части объекта независимо от того, является ли она экземпляром или нет. Эта характеристика позволяет «продвигать» члены класса, то есть перемещать их из констант в переменные, а затем в «свойства» (которые представляют собой поля класса, доступ к чтению и записи которых обеспечивается методами «get» и «set»).
Для методов объекта предусмотрены как перегрузки, так и переопределения. Метод, который будет переопределен, должен быть указан как виртуальный.
Методы объекта могут изменять ссылку, используемую для доступа к ним, с помощью self
ключевое слово.
Реализовано только одиночное наследование.
Структурированная обработка исключений
[ редактировать ]try ... except ... else ...; throw
Оператор «try» может защищать ряд операторов, и любые исключения, помеченные в коде, запрограммированы для оператора, следующего за «исключением». В операторе try также имеется предложение else, которое позволяет выполнить оператор при обычном завершении блока try.
Исключения вызываются в коде с помощью процедуры throw(). Операторы Try позволяют программе выйти из любого вложенного блока и служат лучшей заменой внутрипроцедурных переходов (которые все еще поддерживаются в Pascaline). Поскольку необработанные исключения по умолчанию генерируют ошибки, процедура throw() может служить системой маркировки ошибок общего назначения.
Утверждения
[ редактировать ]assert(expression);
Системная процедура 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 использует уникальную концепцию стекирования модулей. Каждый модуль располагается в памяти один поверх другого и выполняется внизу. Нижний модуль вызывает следующий модуль, а этот модуль вызывает следующий модуль и так далее.
wrapper serlib program cap
Модуль cap (иногда называемый «ячейкой» в терминологии IP Pascal, в честь концепции проектирования интегральных схем ) завершает стек и начинает процесс возврата, который возвращается обратно до тех пор, пока программа не завершится. У каждого модуля есть секция запуска или входа, выполняемая на пути вверх по стеку, и секция завершения или выхода, выполняемая на обратном пути вниз.
Это соответствует естественным зависимостям в программе. Самые примитивные модули, такие как базовая поддержка ввода-вывода в «serlib», сначала выполняют свою инициализацию, а финализацию — в последнюю очередь, до и после модулей более высокого уровня в стеке.
Портирование платформы
[ редактировать ]IP Pascal имеет ряд модулей (или «библиотек»), которые образуют «платформу портирования», называемую Petit-Ami (по-французски «маленький друг»). Эти библиотеки представляют идеализированный API для каждой применимой функции, например, файлов и расширенных функций операционной системы, графики, MIDI, звука и т. д. Вся коллекция формирует основу для реализации в каждой операционной системе и машине, на которой появляется IP Pascal.
Два важных различия между IP Pascal и многими другими языками, которые просто были объединены с переносимыми графическими библиотеками, заключаются в следующем:
- IP Pascal использует собственную платформу портирования для собственного низкоуровневого кода, так что, как только платформа будет создана для конкретной операционной системы и машины, на ней смогут работать как система IP, так и программы, которые она компилирует. Это похоже на то, как работают системы Java и UCSD Pascal , но с действительно высокооптимизированным скомпилированным кодом, а не интерпретируемым кодом или скомпилированным кодом «точно в срок».
- Поскольку модули могут переопределять функции более низкого уровня, такие как оператор «записи» Паскаля, обычные, немодифицированные программы Pascal ISO 7185 также могут использовать расширенные аспекты платформы портирования. Это отличается от многих или большинства портативных графических библиотек, которые заставляют пользователя использовать совершенно другую методологию ввода-вывода для доступа к оконной графической системе, например C, другие Pascals и Visual Basic .
Также можно создавать IP-модули, независимые от системы и зависящие только от модулей платформы переноса. В результате IP Pascal очень легко переносим.
Пример: стандартная программа «Привет, мир» связана с выводом в
графическое окно.
program HelloWorld(output); begin writeln('Hello, World!') end.
Пример: «Привет, мир» с добавленными графическими командами. Обратите внимание, что стандартный Паскаль
выходные операторы все еще используются.
program hello(input, output);
uses gralib;
var er: evtrec;
begin
bcolor(output, green);
curvis(output, false);
auto(output, false);
page(output);
fcolor(output, red);
frect(output, 50, 50, maxxg(output)-50, maxyg(output)-50);
fcolorg(output, maxint, maxint-(maxint div 3), maxint-maxint div 3);
frect(output, 50, 50, 53, maxyg(output)-50);
frect(output, 50, 50, maxxg(output)-50, 53);
fcolorg(output, maxint div 2, 0, 0);
frect(output, 52, maxyg(output)-53, maxxg(output)-50, maxyg(output)-50);
frect(output, maxxg(output)-53, 52, maxxg(output)-50, maxyg(output)-50);
font(output, font_sign);
fontsiz(output, 100);
binvis(output);
fcolor(output, cyan);
cursorg(output, maxxg(output) div 2-strsiz(output, 'hello, world') div 2+3,
maxyg(output) div 2-100 div 2+3);
writeln('hello, world');
fcolor(output, blue);
cursorg(output, maxxg(output) div 2-strsiz(output, 'hello, world') div 2,
maxyg(output) div 2-100 div 2);
writeln('hello, world');
repeat event(input, er) until er.etype = etterm
end.


Поскольку модули IP Pascal могут «переопределять» друг друга, модуль графического расширения (или модуль любого другого типа) может переопределять стандартные вызовы ввода-вывода, реализованные в модуле ниже него. Таким образом, paslib реализует стандартные операторы Pascal, такие как чтение, запись и другие службы поддержки. gralib переопределяет эти службы и перенаправляет весь стандартный ввод-вывод Pascal в графические окна.
Разница между этой и подобными библиотеками в других реализациях заключается в том, что вам обычно приходится отказаться от использования стандартных операторов ввода-вывода и переключиться на совершенно другой набор вызовов и парадигм. Это означает, что вы не можете «перенести» программы, реализованные с использованием парадигмы последовательного ввода-вывода, в графические системы.
Еще одно важное отличие IP Pascal заключается в том, что он использует методы процедурного языка для доступа к оконной графической библиотеке. Большинство наборов графических инструментов требуют использования методов объектно-ориентированного программирования . Одна из причин этого заключается в том, что объектная ориентация хорошо подходит для графики, но это также происходит потому, что обычные системы, такие как Windows, вынуждают прикладную программу выглядеть как служебная программа для операционной системы, представляя собой набор функций, вызываемых операционной системой. системе вместо того, чтобы программа сама управляла своим выполнением и вызывала операционную систему. Это широко известно как дизайн обратного вызова . Объектно-ориентированный код часто лучше работает с обратными вызовами, поскольку он позволяет вызывать методы объекта как обратные вызовы, вместо того, чтобы программисту приходилось регистрировать несколько указателей на функции в коде обработки событий, каждый из которых был бы отдельным обратным вызовом.
Объектно-ориентированное программирование — хороший метод программирования, но IP Pascal делает его необязательным, а не обязательным методом написания программ. Способность IP Pascal использовать процедурные методы для доступа ко всем графическим функциям означает отсутствие « эффекта обрыва » для старых программ. Их не нужно переписывать только для того, чтобы воспользоваться преимуществами современных сред программирования.
Еще одна интересная особенность платформы IP-портирования заключается в том, что она поддерживает символьный режим даже в графических средах, предоставляя «сетку символов», которая накладывается на пиксельную сетку, и программы, которые используют только вызовы символьного режима (которые будут работать на любом терминале или telnet-соединение) автоматически работают в графическом окружении.
История
[ редактировать ]Реализация Z80
[ редактировать ]Компилятор начал свою работу в 1980 году для Micropolis дисковой операционной системы , но был быстро перенесен на CP/M, работающий на Z80. Исходная система была закодирована на языке ассемблера Z80 и выводила прямой машинный код для Z80 . Это был однопроходный компилятор без компоновщика, он включал в себя свою библиотеку поддержки системы, перемещал и выводил ее в сгенерированный код в исполняемый файл на диске.
После того, как компилятор был запущен в эксплуатацию, почти ровно в новом 1980 году, был написан сопутствующий ассемблер для компилятора на языке Паскаль, а затем компоновщик на языке ассемблера Z80. Эта странная комбинация возникла из-за расчета, который показал, что таблицы компоновщика будут проблемой в Z80 с ограниченным размером 64 КБ, поэтому компоновщик должен был быть как можно меньшим. Затем это было использовано для перемещения исходного кода компилятора и компоновщика Z80 из ассемблера Micropolis (который представлял собой ассемблер без компоновщика, создававший один выходной двоичный файл) в новую систему компоновщика ассемблера.
После этого компилятор был переоборудован для вывода в формат компоновщика, а вспомогательная библиотека была перенесена в отдельный файл и связана с ним.
В 1981 году компилятор был значительно переделан, чтобы добавить такие оптимизации, как распределение регистров, логические значения для перехода, мертвый код, свертывание констант и другие оптимизации. В результате была создана реализация Pascal, которая показала лучшие результаты, чем любые существующие компиляторы Z80, а также большинство компиляторов 8086. К сожалению, при размере 46 КБ его также было сложно использовать, поскольку можно было скомпилировать лишь несколько страниц исходного кода перед переполнением его таблиц (это была общая проблема большинства реализаций Паскаля на процессорах с небольшой адресацией). Систему можно было использовать в первую очередь благодаря решению создать компактный компоновщик, позволяющий создавать большие системы из этих небольших объектных файлов.
Несмотря на это, первоначальная реализация IP Pascal работала до 1987 года как компилятор общего назначения. На этом этапе IP Pascal был похож на C по своей модульной структуре. Каждый исходный файл представлял собой единицу и состоял из некоторой комбинации «программного» модуля, типов, констант, переменных, процедур или функций. Они были в «свободном формате». Процедуры, функции, типы, константы и переменные могут находиться вне любого блока и в любом порядке. На процедуры, функции и переменные в других файлах ссылались «внешние» объявления, а процедуры, функции и переменные в текущем файле были объявлены «глобальными». Каждый файл компилировался в объектный файл, а затем компоновался вместе. В объектных файлах не проводилась проверка типов.
В составе исходного компилятора был создан независимый от устройства модуль терминала ввода-вывода, позволяющий использовать любой последовательный терминал (аналогично Turbo Pascal ЭЛТ-модулю ), который существует и по сей день.
В 1985 году была предпринята попытка переписать компилятор на языке Паскаль. Новый компилятор будет двухпроходным с промежуточным кодом, который был разработан для решения проблем с памятью, связанных с первым компилятором. Интерфейсная часть компилятора была создана и протестирована без возможности генерации промежуточного кода (только синтаксический анализ).
в 1987 году система Z80, использовавшаяся для IP, была заменена на IBM-PC 80386, и работы над ней прекратились. С того времени использовалось несколько других компиляторов стандарта ISO 7185, заканчивая компилятором SVS Pascal, 32-битной реализацией на основе расширителя DPMI .
Реализация 80386
[ редактировать ]К 1993 году компиляторы, совместимые с ISO 7185, которые обеспечивали высококачественный 32-битный код, прекратили свое существование. На этом этапе выбор заключался в том, чтобы прекратить использование Паскаля или возродить прежний проект IP Pascal и модернизировать его как компилятор 80386. На тот момент синтаксический анализатор и ассемблер Pascal (для 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. Система загрузилась сама, а оставшийся код Pascal был перенесен из SVS Pascal в IP Pascal для завершения начальной загрузки. Этому процессу значительно способствовала способность SVS Pascal на базе DPMI работать под Windows 95, что означало, что необходимость загрузки между DOS и Windows 95 была устранена.
Реализация Linux
[ редактировать ]В 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 году был добавлен набор виджетов и управления Windows.
Паскалин
[ редактировать ]Примерно в 2015 году была собрана и расширена спецификация языка IP Pascal. Результатом стал язык под названием «Паскалин». Большая часть спецификации Pascaline была реализована в IP Pascal. Однако было принято решение сначала включить большую часть языка в кодовую базу компилятора Pascal-P6. Серия Pascal-P представляет собой оригинальный компилятор, разработанный студентами Вирта в ETH Zurich, и существует сегодня как Pascal-P4 (название, выбранное Никлаусом Виртом). Он был преобразован в ISO 7185 Pascal в Pascal-P5 и обновляется до языка Pascaline в Pascal-P6. В то же время Pascal-P6 превращается в полноценный компилятор, начиная с генерации кода для модели процессора AMD64, с целью распространить его на другие процессоры, такие как ARM и RISC-V. Цель состоит в том, чтобы достичь версии Pascal-P6 1.0, когда спецификация Pascaline будет полностью реализована.
Парень
[ редактировать ]Примерно в 2019 году библиотека поддержки IP Pascal была переписана на C. Идея была двоякой: во-первых, сделать библиотеку полезной для всех языков, а не только для Pascal, и, во-вторых, сделать кодирование и отладку на новых платформах более простыми и удобными. Быстрее. Petit-Ami теперь доступен для Windows, Linux и частично реализован в Mac OS и BSD Unix.
Уроки
[ редактировать ]![]() | Возможно, этот раздел содержит оригинальные исследования . ( февраль 2017 г. ) |
Оглядываясь назад, можно сказать, что самой большой ошибкой версии Z80 была ее однопроходная структура. Для этого не было никакой реальной причины; предыдущий (Basic) компилятор автора был многопроходным с промежуточным хранилищем. Единственным аргументом в пользу этого было то, что однопроходная компиляция должна была быть быстрее. Однако однопроходная компиляция плохо подходит для небольших машин и вряд ли поможет расширенным оптимизациям, обычным для больших машин.
Кроме того, однопроходный аспект замедлял или препятствовал загрузке компилятора с ассемблера Z80 на сам Паскаль. Поскольку компилятор был монолитным, преобразование в Паскаль не могло выполняться по одному разделу за раз, а должно было происходить как полная замена. Когда началась замена, проект просуществовал дольше, чем машина. Самая большая помощь, которую двухпроходная компиляция оказала реализации I80386, заключалась в поддержке стандартного сборника промежуточных инструкций, которые обменивались данными между передней и задней частями компилятора. Этот хорошо понятный «этап» компиляции снизил общую сложность. Интуитивно понятно, что когда две программы одинакового размера тесно связаны, сложность не аддитивна, а мультипликативна, поскольку связи между половинами программы выходят из-под контроля.
Еще один урок времен Z80, который был исправлен в компиляторе 80386, заключался в том, чтобы писать как можно больше кода в самом Паскале, даже во вспомогательной библиотеке. Наличие кода поддержки 80386, полностью написанного на Паскале, сделало его настолько модульным и переносимым, что большая его часть была перенесена из области, специфичной для операционной системы, в раздел библиотеки «общий код», раздел, зарезервированный для кода, который никогда не меняется для каждой машины. и операционная система. Даже код, «специфичный для системы», требует лишь незначительной модификации от реализации к реализации. В результате при портировании системы экономится большой объем работы по реализации.
Наконец, было ошибкой начинать второй этап оптимизации перед начальной загрузкой компилятора. Хотя улучшение выходного кода было значительным, последующее увеличение сложности компилятора вызвало проблемы с ограниченным адресным пространством. В то время считалось, что более оптимизированный код позволяет загрузить код на Паскале. Оглядываясь назад, можно сказать, что оставшиеся написанные разделы сборки БЫЛИ проблемой, и их нужно было устранить, и чем скорее, тем лучше. Другими словами, проблемы с пространством могут быть временными, но наличие значительных разделов программы, написанных на ассемблере, является серьезной и долгосрочной проблемой.
Дальнейшее чтение
[ редактировать ]- Кэтлин Янсен и Никлаус Вирт : PASCAL – Руководство пользователя и отчет . Шпрингер-Верлаг, 1974, 1985, 1991, ISBN 0-387-97649-3 , ISBN 0-387-90144-2 и ISBN 3-540-90144-2 [1]
- Никлаус Вирт: «Язык программирования Паскаль». Acta Informatica , 1, (июнь 1971 г.) 35–63.
- ISO/IEC 7185: Языки программирования — PASCAL . [2]
Ссылки
[ редактировать ]- ^ Супчик, Жак (5 декабря 1997 г.). «ПАСКАЛЬ — Руководство пользователя и отчет» . ETH Zürich: Департамент компьютерных наук. Архивировано из оригинала 14 марта 2005 года . Проверено 23 июня 2005 г.
- ^ Мур, Скотт А. «АНСИИЗО ПАСКАЛЬ» . Moorecad.com . Проверено 21 февраля 2017 г.