Язык системного программирования

редактировать
Эта статья посвящена языку программирования HP, а не концепции SPL в целом.
Язык системного программирования
Парадигмы процедурный, императивный, структурированный
Семья АЛГОЛ
Впервые появился 1972 ; 49 лет назад  ( 1972 )
Под влиянием
АЛГОЛ 60, ESPOL
Под влиянием
ZSPL, Micro-SPL, Action!

Язык системного программирования, часто сокращаемый до SPL, но иногда известный как SPL / 3000, был процедурно-ориентированным языком программирования, написанным Hewlett-Packard для линейки миникомпьютеров HP 3000 и впервые представленным в 1972 году. SPL использовался для написания основных операционных систем HP 3000. система, Multi-программирование Executive (ПДВ). Подобные языки на других платформах обычно назывались языками системного программирования, что сбивало с толку.

Первоначально известный как язык программирования Alpha Systems, названный в честь проекта разработки, который произвел серию 3000, SPL был разработан, чтобы воспользоваться преимуществами архитектуры процессора Alpha на основе стека. Он основан на ESPOL, аналогичном языке, производном от Алгола, который использовался системами мэйнфреймов Burroughs B5000, которые также повлияли на ряд языков 1960-х годов, таких как PL360 и JOVIAL.

В середине 1970-х годов успех систем HP привел к появлению ряда ответвлений SPL. Примеры включают ZSPL для процессора Zilog Z80 и Micro-SPL для Xerox Alto. Позднее вдохновленный Action! для 8-битного семейства Atari, который оказался довольно успешным. Последний более точно следует синтаксису Паскаля, теряя некоторые особенности SPL.

SPL широко использовался во время существования исходных версий платформы HP 3000 на базе интегральных схем. В 1980 годе HP 3000 и П были переписаны в эмуляторе работающего на PA-RISC HP 9000 платформ. HP продвигала Паскаль как предпочтительный системный язык на PA-RISC и не предоставляла компилятор SPL. Это вызвало проблемы с обслуживанием кода, и для удовлетворения этой потребности были введены сторонние компиляторы SPL.

СОДЕРЖАНИЕ
  • 1 История
  • 2 Язык
    • 2.1 Базовый синтаксис
    • 2.2 Типы данных
    • 2.3 Сегментация памяти
    • 2.4 Другие особенности
  • 3 Пример
  • 4 ссылки
    • 4.1 Цитаты
    • 4.2 Библиография
История

Hewlett-Packard представила свои первые миникомпьютеры серии HP 2100 в 1967 году. Изначально машины были разработаны внешней командой, работающей на Union Carbide, и предназначались в основном для промышленного использования встраиваемых систем управления, а не для более широкого рынка обработки данных. HP посчитала, что это естественное соответствие их существующему бизнесу по производству приборов, и изначально предложила это этим пользователям. Несмотря на это, HP обнаружила, что соотношение цены и качества машины делает ее все более успешной на рынке бизнеса.

В течение этого периода концепция разделения времени становилась популярной, особенно когда снизилась стоимость основной памяти и системы стали поставляться с большим объемом памяти. В 1968 году HP представила объединенную систему, в которой использовались две машины серии 2100, на которых был запущен HP Time-Shared BASIC, который обеспечивал полную операционную систему, а также язык программирования BASIC. Эти двухмашинные системы, известные под общим названием HP 2000s, сразу же имели успех. HP BASIC был очень влиятельным в течение многих лет, и его синтаксис можно увидеть в ряде BASIC микрокомпьютеров, включая Palo Alto TinyBASIC, Integer BASIC, North Star BASIC, Atari BASIC и другие.

Дизайнеры HP начали задаваться вопросом: «Если мы сможем создать такую ​​хорошую систему с разделением времени, используя такой старомодный компьютер, как 2116, подумайте, чего бы мы могли добиться, если бы разработали наш собственный компьютер». С этой целью в 1968 году компания начала собирать большую команду для разработки новой архитектуры среднего размера. В новую группу вошли те, кто работал над системами мэйнфреймов Burroughs и IBM, и полученные концепции сильно напоминали очень успешную систему Burroughs B5000. В B5000 использовался процессор стековой машины, который упростил реализацию мультипрограммирования, и эта же архитектура была выбрана для новой концепции HP.

Были рассмотрены две реализации: 32-разрядная машина масштаба мэйнфрейма, известная как Omega, и 16-разрядная конструкция, известная как Alpha. Почти все усилия были сделаны на Omega, но в июне 1970 года Omega была отменена. Это привело к обширной переработке Alpha, чтобы отличить ее от 2100-х, и в конечном итоге возникли планы по еще более агрессивному дизайну операционной системы. Omega намеревалась работать в пакетном режиме и использовать меньший компьютер, «интерфейс», для обработки взаимодействия с пользователем. Это была та же концепция управления, что и в серии 2000 года. Однако для Alpha было недостаточно еще одной-2000, и было принято решение иметь одну операцию для пакетной, интерактивной и даже работы в реальном времени.

Чтобы это работало, требовалась усовершенствованная конструкция компьютерной шины с расширенным прямым доступом к памяти (DMA) и требовалась усовершенствованная операционная система (ОС), обеспечивающая быструю реакцию на действия пользователя. B5000 был также уникален, для своего времени, в том, что операционная система и основные утилиты были запрограммированы на языке высокого уровня, ESPOL. ESPOL был производным от языка ALGOL, настроенного для работы с B5000, концепция, которая имела большое влияние в 1960-х годах и привела к появлению новых языков, таких как JOVIAL, PL / 360 и BCPL. Команда HP решила, что они также будут использовать язык, производный от АЛГОЛА, для работы своих операционных систем. Подобный язык HP изначально был известен как язык программирования Alpha Systems.

На разработку Alpha потребовалось несколько лет, прежде чем она появилась в 1972 году как HP 3000. Машина была на рынке всего несколько месяцев, прежде чем стало ясно, что она просто не работает должным образом, и HP была вынуждена отозвать все уже проданные 3000. Он был повторно введен в действие в конце 1973 года, и большинство его проблем было исправлено. Значительное обновление всей системы, машины CX и MPE-C для работы на ней изменило ее имидж, и 3000 стал еще одним крупным успехом во второй половине 1970-х годов.

Этот успех сделал SPL почти таким же широко распространенным, как BASIC серии 2000 года, и, как и этот язык, SPL привел к появлению ряда версий для других платформ. Среди них особо выделялся Micro-SPL, версия, написанная для рабочей станции Xerox Alto. Первоначально эта машина использовала BCPL в качестве основного языка, но неудовлетворенность его производительностью побудила Генри Бейкера разработать нерекурсивный язык, который он реализовал с Клинтоном Паркером в 1979 году. Затем Клинтон дополнительно модифицировал Micro-SPL для создания Action! для семейства 8-битных Atari в 1983 году.

HP повторно реализовала систему HP 3000 на наборе микросхем PA-RISC, запустив новую версию операционной системы, известную как MPE / iX. MPE / iX имел два режима: в «собственном режиме» он запускал приложения, которые были перекомпилированы для PA-RISC с использованием более новых компиляторов Pascal, а в «совместимом режиме» он мог запускать все существующее программное обеспечение посредством эмуляции. HP не поставляла компилятор в собственном режиме для MPE / iX, поэтому перенести существующее программное обеспечение на новую платформу было непросто. Чтобы удовлетворить эту потребность, консультанты Allegro написали SPL-совместимый язык под названием «SPLash!». который мог скомпилироваться в исходный код HP 3000 для работы в эмуляторе или в основном режиме. Это открыло путь к переносу существующего программного обеспечения SPL.

Язык

Базовый синтаксис

SPL обычно следует синтаксическим соглашениям ALGOL 60 и будет знаком любому, кто имеет опыт работы с ALGOL или его потомками, такими как Pascal и Modula-2. Как и в этих языках, операторы программы могут занимать несколько физических строк и заканчиваться точкой с запятой. Комментарии обозначаются COMMENT ключевым словом или заключением текста комментария в lt;lt; и gt;gt;.

Операторы группируются в блоки с использованием BEGIN и END, хотя, как и в Паскале, за концом программы должна стоять точка. Программа в целом окружена символами BEGIN и END., Как и в Паскале, но без ключевого слова PROGRAM или аналогичного оператора вверху. Причина этого в том, что SPL позволяет использовать любой блок кода как программу сам по себе или скомпилировать в другую программу, чтобы действовать как библиотека. Создание кода в виде программы или подпрограммы не было частью самого языка, вместо этого выполнялось размещение $CONTROL SUBPROGRAM директивы компилятора в верхней части файла.

В языке используется ключевое слово INTRINSIC, позволяющее напрямую вызывать внешний код, давая ему локальное имя. Например, библиотека машинного языка, открывающая функцию для запуска консольного звонка, может быть импортирована в программу SPL, а INTRINSIC BELL затем звонком можно управлять с помощью ключевого слова, BELL как если бы это была собственная команда.

В отличие от Паскаля, где PROCEDURE и FUNCTION были отдельными концепциями, SPL использует подход, более похожий на C, где любой PROCEDURE может быть снабжен префиксом типа, чтобы превратить его в функцию. В соответствии с синтаксисом других АЛГОЛ-подобных языков типы параметров указывались после имени, а не его части. Например:

INTEGER PROCEDURE FACT(N); VALUE N; INTEGER N;

Объявляет функцию FACT, которая принимает целое число N. Значок VALUE указывает, что эта переменная также является возвращаемым значением для процедуры.

Хотя это и не одобрялось, ALGOL и Pascal позволяли маркировать код, используя начальное имя, заканчивающееся двоеточием, которое затем можно было использовать для целей циклов и GO TO операторов. Одно небольшое отличие состоит в том, что SPL требовал, чтобы имена меток были объявлены в разделе переменных с использованием LABEL ключевого слова.

SPL был добавлен к этой концепции с помощью ENTRY оператора, который позволял определять эти метки как «точки входа», к которым можно было получить доступ из командной строки. Метки, указанные в операторе (ах) ввода, были доступны операционной системе и могли быть вызваны из команды RUN. Например, можно написать программу, содержащую строковые функции для преобразования в верхний или нижний регистр, а затем предоставить для этих двух точек ВХОДА. Это может быть вызвано из командной строки как RUN $STRINGS,TOUPPER.

Типы данных

В чем SPL наиболее заметно отличается от ALGOL, так это то, что его типы данных сильно зависят от машины и основаны на 16-битном формате big endian в 3000.

INTEGER Тип представляет собой 16-разрядный целый тип, с 15 битами значения и наималейшим значащим битом в качестве знака. DOUBLE является 32-битным целым числом, а не типом с плавающей запятой. REAL представляет собой 32-битное значение с плавающей запятой с 22 битами для мантиссы и 9 для экспоненты, а LONG представляет собой 64-битное значение с плавающей запятой с 54 битами мантиссы и 9-битной экспонентой.

BYTE используется для обработки символов, состоящих из 16-битного машинного слова, содержащего два 8-битных символа. LOGICAL это логический тип, который хранит один бит в наиболее значащий бит. В PACKED Паскале нет эквивалента модификатора, поэтому LOGICAL он несколько расточает память.

Как и в C, данные слабо типизированы, ячейки памяти и хранилища переменных - это смешанные концепции, и можно получить доступ к значениям непосредственно через их местоположения. Например, код:

INTEGER A,B,C LOGICAL D=A+2

определяет три 16-битные целочисленные переменные, A, B и C, а затем LOGICAL, также 16-битное значение. Как = и Паскаль, означает «эквивалентно», а не «получает значение», которое используется := в алголо-подобных языках. Таким образом, во второй строке указано «объявить переменную D, которая находится в той же ячейке памяти, что и A + 2», которая в этом случае также является местоположением переменной C. Это позволяет считывать то же значение как целое число через C или логический через Д.

Этот синтаксис может показаться странным современным читателям, где память, как правило, представляет собой черный ящик, но он имеет ряд важных применений в системном программировании, где определенные ячейки памяти содержат значения от базового оборудования. В частности, он позволяет определить переменную, которая указывает на начало таблицы значений, а затем объявить дополнительные переменные, которые указывают на отдельные значения в таблице. Если расположение таблицы изменится, только одно значение должно измениться, начальный адрес и все отдельные переменные будут автоматически следовать в своих соответствующих относительных смещениях.

Указатели объявлялись путем добавления POINTER модификатора к любому объявлению переменной и местоположения в памяти переменной, разыменованной с помощью @. Таким образом, INTEGER POINTER P:=@A объявляется указатель, значение которого содержит адрес переменной A, а не значение A. @ Может использоваться с любой стороны от присваивания; @P:=A помещает значение A в P, что, вероятно, приводит к зависанию указателя, @P:=@A делает P точкой A, а P:=A значение A помещает в то место, на которое указывает P.

Аналогичным образом SPL включает в себя поддержку массивов в стиле C, в которых индексная переменная представляет собой смещение количества слов от ячейки памяти, установленной для начальной переменной. В отличие от C, SPL предоставляет только одномерные массивы и использует круглые скобки, а не скобки. Переменные также могли быть объявлены GLOBAL, и в этом случае для них не выделялась локальная память, и предполагалось, что хранилище было объявлено в другой библиотеке. Это отражает extern ключевое слово в C.

Литералы могут быть указаны с различными суффиксами, а литералы без суффикса считаются таковыми INTEGER. Например, 1234 было бы интерпретировано как INTEGER, а 1234D было DOUBLE. E обозначается а REAL и L а LONG. Строковые константы были разделены двойными кавычками, а двойные кавычки внутри строки были экранированы вторыми двойными кавычками.

В объявлениях переменных можно использовать константы для определения начального значения, как в INTEGER A:=10. Обратите внимание на использование assign-to, а не is-a. Кроме того, в SPL было EQUATE ключевое слово, которое позволяло определить строку текста как переменную, а затем заменять любые экземпляры этой переменной в коде литеральной строкой во время компиляции. Это похоже на const ключевое слово в C.

Сегментация памяти

Как было принято в то время, HP 3000 использовала байтовую сегментированную модель памяти, в которой адрес представлял собой одно 16-битное слово, что позволяло коду обращаться к 65 536 байтам (или, как они называли это, «полусловам»).). Чтобы обеспечить доступ к большему объему памяти, использовалась система виртуальной памяти. При доступе к памяти к 16-битному адресу добавлялось одно из двух 8-битных значений сегмента, одно для программного кода (PB), а другое для переменных данных. В результате получился 24-битный адрес. Таким образом, хотя каждая программа имела доступ к 128 КБ одновременно, она могла поменять местами сегменты, чтобы получить доступ к полному пространству памяти 16 МБ.

SPL включал в себя множество систем поддержки, позволяющих легко сегментировать программы, а затем сделать эту сегментацию относительно незаметной в коде. Основным механизмом было использование $CONTROL SEGMENT=asegmentname директивы компилятора, которая определяла, в какой сегмент должен быть помещен следующий код. По умолчанию было MAINLINESEG, но программист мог добавить любое количество дополнительных именованных сегментов, чтобы организовать код в блоки.

Другие свойства

SPL включал функцию «извлечения битов», которая позволяла упростить использование битов. Доступ к любому биту или строке битов в слове можно было получить с помощью .(x:y) синтаксиса, где x и y были позициями начального и конечного бита от 0 до 15. Таким образом A.(8:15) возвращался младший байт слова, в котором хранится A. Этот формат можно было использовать. для разделения и объединения битов по мере необходимости. Кроме того, дополнительные операции были предоставлены для сдвигов и вращается, и могут быть применены к любому переменному с amp;, например A:=A amp; LSR(3).

Пример

Эта простая программа из справочного руководства 1984 г. показывает большинство возможностей языка SPL.

Программа в целом разделена между символами BEGIN и END.. Он начинается с определения серии глобальных переменных A, B и C, определяет одну процедуру, а затем вызывает ее двадцать раз. Обратите внимание, что процедура не имеет начала и конца своего собственного, потому что он содержит только одну строку фактического кода, X:=X*(Y+Z); на который INTEGER X,Y,Z не считается частью самого кода, это указывает на тип трех параметров, передаваемых в по вышеуказанной линии и считается частью этой линии.

 BEGIN INTEGER A:=0, B, C:=1; PROCEDURE N(X,Y,Z); INTEGER X,Y,Z; X:=X*(Y+Z); FOR B:=1 UNTIL 20 DO N(A,B,C); END.
Рекомендации

Цитаты

Библиография

Последняя правка сделана 2023-03-19 09:08:03
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте