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

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

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

Первоначально известный как Язык программирования Alpha SystemsSPL, названный в честь проекта разработки, позволившего создать серию 3000, был разработан с учетом преимуществ Alpha стековый процессор дизайн. Это по образцу ESPOL, похожий АЛГОЛ - производный язык, используемый Берроуз B5000 мэйнфрейм системы, которые также повлияли на ряд языков 1960-х годов, таких как PL360 и Веселый.

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

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

История

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

В этот период концепция совместное времяпровождение становился популярным, особенно когда основная память стоимость упала, и системы стали поставляться с большим объемом памяти. В 1968 году HP представила объединенную систему, в которой использовались две машины серии 2100. БАЗОВЫЙ HP с разделением времени, который предоставил полный Операционная система так же хорошо как BASIC язык программирования. Эти двухмашинные системы, известные под общим названием HP 2000s, сразу же имели успех.[3] HP BASIC пользовался большим влиянием на протяжении многих лет, и его синтаксис можно увидеть в ряде микрокомпьютер BASIC, включая Пало-Альто TinyBASIC, Целое число BASIC, ОСНОВНАЯ ИНФОРМАЦИЯ, Atari BASIC, и другие.

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

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

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

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

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

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

Язык

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

SPL обычно следует синтаксическим соглашениям ALGOL 60 и будет знаком любому, кто имеет опыт работы с ALGOL или его потомками, например Паскаль и Модула-2. Как и в этих языках, операторы программы могут занимать несколько физических строк и заканчиваться точкой с запятой. Комментарии обозначены КОММЕНТАРИЙ ключевое слово или заключив текст комментария в << и >>.[9]

Операторы сгруппированы в блоки с использованием BEGIN и END, хотя, как и в Паскале, за концом программы должна стоять точка. Программа в целом окружена символами BEGIN и END., Как и в Паскале, но без ключевого слова PROGRAM или аналогичного оператора вверху.[10] Причина этого в том, что SPL позволяет использовать любой блок кода как программу сам по себе или скомпилировать в другую программу, чтобы действовать как библиотека. Создание кода в виде программы или подпрограммы не было частью самого языка, вместо этого выполнялось размещение ПОДПРОГРАММА КОНТРОЛЯ $ директива компилятора вверху файла.[11]

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

В отличие от Паскаля, где ПРОЦЕДУРА и НАЗНАЧЕНИЕ были отдельными концепциями, SPL использует более C-подобный подход, где любой ПРОЦЕДУРА может иметь префикс типа, чтобы превратить его в функцию. В соответствии с синтаксисом других АЛГОЛ-подобных языков типы параметров указывались после имени, а не его части. Например:[13]

ИНТЕГРИРОВАННАЯ ПРОЦЕДУРА (N); ЗНАЧЕНИЕ N; INTEGER N;

Объявляет функцию FACT, которая принимает целое число N. В ЦЕНИТЬ указывает, что эта переменная также является возвращаемым значением для процедуры.[13]

Хотя это и не одобрялось, Алгол и Паскаль позволяли маркировать код, используя начальное имя, заканчивающееся двоеточием, которое затем можно было использовать для целей циклов и ИДТИ К заявления. Одно небольшое отличие состоит в том, что SPL требовал, чтобы имена меток были объявлены в разделе переменных с использованием МЕТКА ключевое слово.[14]

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

Типы данных

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

В ЦЕЛОЕ type - это 16-битный знаковый тип с 15 битами значения и младший бит как знак. ДВОЙНОЙ 32-битное целое число, нет тип с плавающей точкой. НАСТОЯЩИЙ представляет собой 32-битное значение с плавающей запятой с 22 битами для мантиссы и 9 для экспоненты, а ДЛИННЫЙ представляет собой 64-битное значение с плавающей запятой с 54 битами мантиссы и 9-битной экспонентой.[16]

БАЙТ используется для обработки символов, состоящих из 16-битного машинного слова, содержащего два 8-битных символа. ЛОГИЧЕСКИЙ это логический тип, который хранит один бит в старший бит. Нет эквивалента УПАКОВАННЫЙ модификатор, как в Паскале, поэтому ЛОГИЧЕСКИЙ несколько расточает память.[17]

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

ЦЕЛОЕ A, B, КЛОГИЧЕСКОЕ D = A + 2

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

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

Указатели были объявлены добавлением УКАЗАТЕЛЬ модификатор для любого объявления переменной, а также место в памяти переменной, разыменованной с помощью @. Таким образом ЦЕЛОЙ УКАЗАТЕЛЬ P: = @ A объявляет указатель, значение которого содержит адрес переменной A, а не значение A.[19] @ можно использовать с любой стороны задания; @P: = A помещает значение A в P, что, вероятно, приводит к висячий указатель, @P: = @ A указывает P на A, а P: = A помещает значение A в то место, на которое указывает P.[20]

Аналогичным образом SPL включает в себя поддержку массивов в стиле C, в которых индексная переменная представляет собой смещение количества слов от ячейки памяти, установленной для начальной переменной. В отличие от C, SPL предоставлял только одномерные массивы и использовал круглые скобки, а не скобки.[21] Переменные также могут быть объявлены ГЛОБАЛЬНЫЙ, и в этом случае для них не выделялась локальная память и предполагалось, что хранилище объявлено в другой библиотеке.[22] Это отражает внешний ключевое слово в C.

Литералы могут быть указаны с различными суффиксами, а литералы без суффикса считаются ЦЕЛОЕ. Например, 1234 будет интерпретироваться как ЦЕЛОЕ, пока 1234D был ДВОЙНОЙ. E обозначается НАСТОЯЩИЙ и L а ДЛИННЫЙ.[23] Строковые константы были разделены двойными кавычками, а двойные кавычки внутри строки были экранированы вторыми двойными кавычками.[24]

В объявлениях переменных можно использовать константы для определения начального значения, как в ЦЕЛОЕ A: = 10. Обратите внимание на использование assign-to, а не is-a. Кроме того, SPL имел РАВНЫЙ ключевое слово, которое позволило определить строку текста как переменную, а затем заменить любые экземпляры этой переменной в коде буквальной строкой во время компиляции.[25] Это похоже на const ключевое слово в C.

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

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

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

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

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

Пример

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

Программа в целом разделена между НАЧИНАТЬ и КОНЕЦ.. Он начинается с определения серии глобальных переменных A, B и C, определяет одну процедуру, а затем вызывает ее двадцать раз. Обратите внимание, что процедура не имеет собственных BEGIN и END, потому что она содержит только одну строку фактического кода, Х: = Х * (Y + Z); то ЦЕЛОЕ X, Y, Z не считается частью самого кода, он указывает тип трех параметров, передаваемых в строке выше, и считается частью этой строки.[11]

 НАЧАТЬ ЦЕЛОЕ A: = 0, B, C: = 1; ПРОЦЕДУРА N (X, Y, Z); ЦЕЛОЕ X, Y, Z; Х: = Х * (Y + Z); ДЛЯ B: = 1 ДО 20 ДО N (A, B, C); КОНЕЦ.

Рекомендации

Цитаты

  1. ^ Лейбсон 2017.
  2. ^ «История цифровой ЭВМ 2116А». HP.
  3. ^ "Hewlett / Packard Computers". 2000A была первой системой HP 2000 с таймшерингом на рынке ок. 1969 г.
  4. ^ Зеленый 2004.
  5. ^ а б c d Эдлер 1995.
  6. ^ Бейкер, Генри; Паркер, Клинтон (сентябрь 1979 г.). «Микро-СПЛ» (PDF).
  7. ^ Паркер, Клинтон (31 декабря 2015 г.). "ANTIC Interview 111, Клинтон Паркер, Action!" (подкаст). Беседовал Рэнди Киндиг.
  8. ^ "SPLash! Компилятор SPL в собственном режиме для MPE / iX". Консультанты Аллегро. 1 января 2004 г.
  9. ^ SPL 1984, стр. 1.2, 1.3.
  10. ^ а б SPL 1984, п. 1.1.
  11. ^ а б c SPL 1984, с. 1.5.
  12. ^ SPL 1984, стр. 1.12.
  13. ^ а б SPL 1984, стр. 1.11.
  14. ^ SPL 1984, стр. 3.15.
  15. ^ SPL 1984, стр. 1.13, 1.14.
  16. ^ SPL 1984, стр. 2.1-2.3.
  17. ^ SPL 1984, стр. 2.4.
  18. ^ а б SPL 1984, стр. 3.2.
  19. ^ SPL 1984, стр. 2.13.
  20. ^ SPL 1984, с. 4.4.
  21. ^ SPL 1984, стр. 2.12.
  22. ^ SPL 1984, стр. 3.6.
  23. ^ SPL 1984, стр. 2.6.
  24. ^ SPL 1984, стр. 2.11.
  25. ^ SPL 1984, стр. 3.18.
  26. ^ SPL 1984, стр. 1.6-1.7.
  27. ^ SPL 1984, стр. 1.8.
  28. ^ SPL 1984, с. 4.6.
  29. ^ SPL 1984, с. 4.9.

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