Введение

Язык программирования HP Systems Programming Language, часто сокращенный до SPL, но иногда известный как SPL/3000, был процедурно ориентированным языком программирования, написанным Hewlett Packard для линейки миникомпьютеров HP 3000 и впервые представленным в 1972 году. SPL использовался для написания основной операционной системы HP 3000, Multi Programming Executive (MPE). Подобные языки на других платформах были обозначены как языки системного программирования, что вызывало путаницу. Первоначально известный как Alpha Systems Programming Language, названный в честь проекта разработки, который произвел серию 3000, SPL был разработан для использования преимуществ процессорной конструкции Alpha на основе стека. Он основан на ESPOL, аналогичном языке ALGOL, используемом в центральных системах Burroughs B5000, который также повлиял на ряд языков 1960-х годов, таких как PL360 и JOVIAL. В середине 1970-х годов успех систем HP привел к появлению ряда SPL-отколов. Примерами являются ZSPL для процессора Zilog Z80 и Micro SPL для Xerox Alto. Позже вдохновленный Действие! для семейства Atari 8 бит, который был довольно успешным. Последний более тесно следовал синтаксису Паскаля, теряя некоторые особенности SPL. SPL широко использовался в течение срока службы оригинальной 16-битной версии платформы HP 3000. В 1980-х годах HP 3000 и MPE были повторно реализованы в эмуляторе, работающем на платформах HP 9000 на основе PA RISC. HP продвигала Pascal в качестве предпочтительного системного языка на PA RISC и не предоставляла компилятор SPL. Это вызвало проблемы с обслуживанием кода, и были введены компиляторы SPL третьей стороны, чтобы удовлетворить эту потребность.

История

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. Почти все усилия были направлены на Омегу, но в июне 1970 года Омега была отменена. Это привело к обширной переработке дизайна Alpha, чтобы отличить его от 2100-х годов, и в конечном итоге появились планы на еще более агрессивный дизайн операционной системы. Omega намеревалась работать в режиме серии и использовать меньший компьютер, "предний конец", для обработки взаимодействий с пользователем. Это была та же концепция работы, что и в серии 2000. Однако еще 2000 не было бы достаточно для Alpha, и было принято решение иметь единый операционный для партии, интерактивной и даже операций в реальном времени. Для этого требовалась современная конструкция компьютерной шины с широким доступом к прямой памяти (DMA) и современная операционная система (OS), обеспечивающая быстрый ответ на действия пользователя. B5000 также был уникальным для своего времени, поскольку его операционная система и основные утилиты были все запрограммированы на языке высокого уровня ESPOL. ESPOL был производным языка ALGOL, настроенным для работы на B5000, концепция, которая была очень влиятельной в 1960-х годах и привела к новым языкам, таким как JOVIAL, PL/360 и BCPL. Команда HP решила, что они также будут использовать язык, полученный из ALGOL, для работы с операционными системами. Аналогичный язык HP первоначально был известен как Alpha Systems Programming Language. Разработка 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! для семейства Atari 8 бит в 1983 году. HP вновь внедрила систему HP 3000 на чипсете PA RISC, запуская новую версию операционной системы, известную как MPE/iX. MPE/iX имел два режима, в "нативном режим�...

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

Классический HP 3000 организовал физическую память в 1, 2, 4, 8 или 16 банков 64K (65536) 16 бит слов (128K байтов). Код (общий, не изменяемый) и данные были отделены друг от друга и хранились в сегментах с переменной длиной до 32 000 слов каждый. В процессе адреса данных, такие как указатели, были 16-битовыми смещениями от базового регистратора (известного как DB) или относительными смещениями от регистра указателя (Q или S), которые привели к действительному адресу в области данных процесса (называемой стеком). В то время как в основном 16-битное слово ориентировано, система поддерживала адресацию отдельных байтов в массиве, используя адрес слова, где был хранится байт, смещенный на 1 бит влево, а затем добавляя 0 для доступа к верхнему байту или 1 для нижнего байта. Таким образом, байтовые адреса были отделены и отличались от словесных адресов, а интерпретация адреса была чисто контекстуальной. Это оказалось довольно проблематичным и стало источником многочисленных ошибок как в системе, так и в пользовательском коде. При использовании байтовых адресов в, например, вычислениях длины, необходимо было обращаться с ними как с 16-битовыми неподписанными (то есть типа LOGICAL), поскольку в противном случае байтовый адрес 2^16 или более будет рассматриваться как значение с подписью 2s, что приведет к ошибочному вычислению длин или смещений. У отдельного процесса был доступ к 254 сегментам кода, каждый из которых содержал до 32 000 слов. Кодовые сегменты были разделены на две области: первые 191 были "системными" сегментами, которыми делятся все процессы, а оставшиеся 63 были "пользовательскими" сегментами, которыми делятся все, запускающие одну и ту же программу. Передача управления указала либо номер рутины в текущем сегменте, либо номер внешнего сегмента и номер рутины в нем. В конце сегмента была небольшая таблица с адресом входной точки для процедуры. Код процесса действовал на данные в стеке, один частный сегмент также до 32 000 слов в размере. В отличие от стеков в других архитектурах, стек HP 3000 использовался для глобальных процессов, сохранения состояния, локальных процедур (поддержка вложенных вызовов и повторного входа) и численных вычислений / оценки. Операционная система обеспечивала доступ к дополнительным сегментам данных, основанным на памяти (не стек), но они не были адресованы набором инструкций, и поэтому программа отвечала за перемещение данных из таких "дополнительных сегментов данных" по мере необходимости. SPL включал в себя различные системы поддержки, позволяющие легко сегментировать программы, а затем сделать эту сегментацию относительно невидимой в коде. Основным механизмом было использование директивы компилятора, которая определяла, в какой сегмент должен быть помещен следующий код. По умолчанию это было , но программист мог добавить любое количество дополнительных именных сегментов, чтобы организовать код в блоки.

Другие особенности

SPL включал функцию "битового извлечения", которая позволяла упрощать бит-использование. Любой бит или строка бит в слове может быть доступна с помощью синтаксиса, где x и y были начальными и конечными позициями бит от 0 до 15. (Очевидно, что x и y должны быть известными константами на момент компиляции.) Таким образом, возвращал нижний байт слова, хранящего A. Этот формат может быть использован для разделения и объединения битов по мере необходимости. Кроме того, были предусмотрены дополнительные операции для смен и ротаций, и они могут быть применены к любой переменной с , например .