IP Pascal

редактировать

IP Pascal - это реализация языка программирования Pascal, использующая платформу IP-переносимости, несколько машина, операционная система и система языковой реализации.

Содержание
  • 1 Обзор
  • 2 Открытое или закрытое состояние
  • 3 Модули языка
    • 3.1, включая конструкции параллельных задач, обрабатывают, отслеживают и совместно используют
    • 3.2 Динамические массивы
    • 3.3 Постоянные выражения
    • 3,4 Основание для чисел
    • 3,5 Буквенно-цифровые метки перехода
    • 3,6 подчеркивание во всех метках
    • 3,7 подчеркивание в числах
    • 3.8 Последовательности специальных символов, которые могут быть встроены в постоянные строки
    • 3.9 Дублирование пересылаемых заголовков
    • 3.10 процедура остановки
    • 3.11 Специальные предопределенные файлы заголовков
    • 3.12 Автоматическое соединение файлов заголовков программы с именами командной строки
    • 3.13 Операции именования и обработки файлов
    • 3.14 фиксированные объявления, которые объявляют структурированные типы констант
    • 3.15 Логические битовые операторы
    • 3.16 Переменные с расширенным диапазоном
    • 3.17 Семафоры
    • 3.18 Переопределения
    • 3.19 Перегрузки
    • 3.20 Объекты
    • 3.21 Обработка структурированных исключений
    • 3.22 Утверждения
    • 3.23 Unicode
    • 3,24 Константа для верхнего предела символов
  • 4 Модульная структура
  • 5 Платформа переноса rm
  • 6 История
    • 6.1 Реализация Z80
    • 6.2 Реализация 80386
    • 6.3 Реализация Linux
    • 6.4 Шаги, чтобы «написать один раз, запустить где угодно»
    • 6.5 Уроки
  • 7 Далее чтение
  • 8 Ссылки
  • 9 Внешние ссылки
Обзор

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 (который стандартизировал исходный язык Никлауса Вирта ) и добавляет:

модули, в том числе параллельные задачи, конструкции process, monitor и share

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.

Overrides

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 вызывает завершение программы, если проверяемое значение ложно. Обычно он связан с дампом времени выполнения или диагностикой и может быть удален опцией компилятора.

Unicode

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 и другими языками, которые были просто объединены с портативными графическими библиотеками, заключаются в следующем:

  1. IP Pascal использует собственную платформу переноса для своего собственного низкоуровневого кода, так что однажды Платформа создается для операционной системы и машины, которые работают как система IP, так и программы, она компилирует. Это похоже на то, как работают системы Java и UCSD Pascal, но с действительно скомпилированным кодом с высокой степенью оптимизации, а не с интерпретируемым кодом или с кодом, скомпилированным «точно в срок».
  2. модули могут быть переопределять функции нижнего уровня, такие как оператор «write» Паскаля, обычные немоданные программы ISO 7185 Pascal также могут использовать расширенные аспекты платформы переноса. Другие методы ввода-вывода для доступа к оконной графической системе, например, C, Pascals и IP-модули Visual Basic.

могут быть созданы, которые не зависят от модулей платформы переноса. В результате 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-соединении) автоматически работать в графической среде.

История

Реализация Z80

Компилятор стартовал в 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.

Реализация 80386

К 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 была устранена.

Реализация 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 году был добавлен комплект управления окнами и виджетов.

Уроки

Оглядываясь назад, можно сказать, что самой большой ошибкой в ​​версии Z80 была ее однопроходная структура. Для этого не было реальной причины; предыдущий (Базовый) компилятор автора был многопроходным с промежуточным хранилищем. Единственным аргументом в пользу этого было то, что однопроходная компиляция должна была быть быстрее. Однако однопроходная компиляция не подходит для небольших машин и вряд ли поможет продвинутым оптимизациям, обычным для больших машин.

Кроме того, однопроходный аспект замедлил или предотвратил загрузку компилятора с языка ассемблера Z80 на сам Паскаль. Поскольку компилятор был монолитным, преобразование в Паскаль не могло выполняться по частям, а должно было выполняться как полная замена. Когда началась замена, проект длился дольше, чем машина. Самая большая помощь, которую двухпроходная компиляция дала реализации I80386, заключалась в поддержании стандартной книги промежуточных инструкций, которые обменивались данными между внешней и задней частями компилятора. Этот хорошо понятный «этап» компиляции снизил общую сложность. Интуитивно понятно, что когда две программы равного размера тесно связаны, сложность не аддитивная, а мультипликативная, потому что связи между половинами программы бесконтрольно умножаются.

Еще один урок из дней Z80, который был исправлен на компиляторе 80386, заключался в том, чтобы писать как можно больше кода в сам Паскаль, даже в библиотеку поддержки. Наличие кода поддержки 80386, написанного на Паскале, сделало его настолько модульным и переносимым, что большая часть его была перемещена из области, специфичной для операционной системы, в раздел библиотеки «общего кода», раздел, зарезервированный для кода, который никогда не изменяется для каждой машины. и операционная система. Даже «системный» код требует незначительных изменений от реализации к реализации. В результате при переносе системы экономится большой объем работы по внедрению.

Наконец, произошла ошибка при входе во второй раунд оптимизации перед загрузкой компилятора. Хотя улучшение выходного кода было значительным, возникшее в результате увеличение сложности компилятора вызвало проблемы с ограниченным адресным пространством. В то время считалось, что лучше оптимизированный код дает возможность начальной загрузки кода на Паскале. Оглядываясь назад, можно сказать, что оставшиеся разделы, написанные на ассемблере, БЫЛИ проблемой, и их нужно было устранить, чем раньше, тем лучше. Другой способ сказать, что проблемы с пространством могут быть временными, но наличие значительных программных разделов, написанных на ассемблере, является серьезной и длительной проблемой.

Дополнительная литература
  • Кэтлин Янсен и Никлаус Вирт : PASCAL - Руководство пользователя и отчет. Springer-Verlag, 1974, 1985, 1991, ISBN 0-387-97649-3, ISBN 0-387-90144-2 и ISBN 3-540-90144-2
  • Никлаус Вирт: «Язык программирования Паскаль». Acta Informatica, 1, (июнь 1971 г.) 35–63
  • ISO / IEC 7185: Языки программирования - PASCAL.
Ссылки
  1. ^Supcik, Jacques (5 декабря 1997 г.). «PASCAL - Руководство пользователя и отчет». ETH Zürich: Департамент компьютерных наук. Архивировано из оригинала 14 марта 2005 г. Получено 23 июня 2005 г.
  2. ^Мур, Скотт А. «ANSIISO PASCAL». Moorecad.com. Проверено 21 февраля 2017 г.
Внешние ссылки
Последняя правка сделана 2021-05-23 07:39:06
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте