ПАРУС (язык программирования)
Семья | АЛГОЛ |
---|---|
Разработано | Дэн Свинхарт Роберт Спроулл |
Разработчик | Стэнфордский университет |
Впервые появился | 1969 год |
Платформа | ПДП-10 и другие |
Под влиянием | |
АЛГОЛ-60 | |
Под влиянием | |
грот |
SAIL , Стэнфордский язык искусственного интеллекта , был разработан Дэном Суайнхартом и Бобом Спроуллом из Стэнфордской лаборатории искусственного интеллекта . Первоначально это был большой язык, похожий на ALGOL 60 , для PDP-10 и DECSYSTEM-20 . Язык объединил более ранний языка PDP-6 /-10 компилятор GOGOL , по сути, целочисленную версию ALGOL, с ассоциативным хранилищем из языка LEAP . Первый выпуск состоялся в ноябре 1969 года, и он продолжал развиваться до 1980-х годов, включая коммерческую версию MAINSAIL .
Основная особенность SAIL — это система символических данных, основанная на ассоциативном хранилище на основе LEAP Джерри Фельдмана и Пола Ровнера. Элементы могут храниться как неупорядоченные наборы или как ассоциации (тройки). Другие функции включают процессы, переменные процедур, события и прерывания, контексты, возврат и сборку мусора . Он также имеет макросы с блочной структурой, средства сопрограммирования и некоторые новые типы данных, предназначенные для построения деревьев поиска и списков ассоциаций.
История
[ редактировать ]Компилятор GOGOL изначально был написан Биллом Маккиманом для PDP-1 . По сути, это была целочисленная версия АЛГОЛ-60 с рядом дополнений, обеспечивающих прямой доступ к памяти и другому оборудованию, что позволяло использовать ее в качестве языка системного программирования . Он сократил массивы до одного измерения, удалил любую возможность динамического распределения памяти, но добавил некоторые дополнительные строковые функции. Значительно обновленная версия Джона Саутера, GOGOL II, была написана как часть порта базовой операционной системы с ODIN на THOR. Когда Стэнфордская лаборатория искусственного интеллекта получила PDP-6 , Заутер, Петтит и (в основном) Дэн Свинхарт написали ГОГОЛЬ III для новой машины. [1]
Свинхарт, к которому присоединился Роберт Спрул, объединил синтаксис GOGOL с дополнениями из современных версий языка LEAP , чтобы создать первую версию SAIL в ноябре 1969 года. Главной особенностью LEAP как языка было использование ассоциативной памяти, более известной как сегодня как карта или словарь. В LEAP можно было установить значение поля в типе, используя тройку, где первая запись — это имя переменной, вторая — имя поля, а третья — значение. [2]
Дальнейшие улучшения были внесены Расселом Тейлором, Джимом Лоу и Ханой Самет, которые добавили процессы, переменные процедур, прерывания, контекст, процедуры сопоставления, новую систему макросов и другие функции. Затем разработка перешла к Тейлору, Джону Райзеру и Роберту Смиту, которые добавили отладчик, оператор печати на системном уровне, записи и выполнили преобразование из собственного SUAI компании Standord в TENEX . от DEC Позже он был портирован и на TOPS-10 , тогда как исходная версия TENEX работала без изменений под TOPS-20 . [2]
Описание
[ редактировать ]Основная структура и утверждения
[ редактировать ]Как и во многих системах АЛГОЛ, а также в более позднем Паскале , базовая структура SAIL основана на блоке , который обозначается кодом между ключевыми словами BEGIN
и END
. Внутри блока имеется дополнительная структура с объявлениями локальных переменных вверху, если таковые имеются, а затем код или операторы . В отличие от большинства диалектов, SAIL позволял помещать строку после BEGIN
, нравиться BEGIN "program"
, а затем завершите блок с помощью END "program"
. Компилятор будет использовать их, если они будут введены, для проверки правильности заключения в скобки. [3] SAIL не включал в себя эквивалент PROGRAM
блок, как в Паскале, ни main
как и в C, выполнение начинается с первой строки кода в самом внешнем блоке. [4]
Стандартные заявления включены IF...THEN...ELSE
, [5] FOR...STEP...UNTIL...DO
, [6] WHILE...DO
для самых проверенных петель, WHILE...UNTIL
для нижнего тестирования и GOTO
который использовал метку. [7] CASE
был похож на switch
в C, но обычно используется несколько другой синтаксис, например CASE i OF ("Zero","One","Two");
, который возвращает соответствующую строку на основе значения i. [5] Если кто-то хотел проверить явные значения в CASE, значения должны были быть в квадратных скобках:
CASE I OF
BEGIN
[0] 10;
[4] 25;
[6][7] 50
END;
Этот код будет игнорировать значения от 1 до 3 и возвращать значения только для перечисленных значений. Обратите внимание, что после последнего элемента не может стоять точка с запятой. [8]
DONE
выход из блока, обычно используемый в циклах, и CONTINUE
вернулся в начало блока. Бесконечный цикл обычно реализовывался с помощью WHILE TRUE DO...
. [9]
Объявления процедур
[ редактировать ]Процедуры были реализованы аналогично языку программирования C , с типом возвращаемого значения, если таковой имеется, перед именем, например: STRING PROCEDURE toUpper(STRING originalStr);BEGIN...
. Обратите внимание на редкое использование здесь точки с запятой, тогда как в Паскале сразу за ней следует блок, обычно BEGIN
. [10]
Чтобы улучшить производительность, SAIL добавил два квалификатора процедуры: SIMPLE
и RECURSIVE
. RECURSIVE
сообщил компилятору, что процедура может вызвать саму себя, и поэтому ее локальные переменные , а не только информацию, возвращаемую подпрограммой. в стек необходимо записать SIMPLE
сделал обратное, потребовав, чтобы процедура вообще не имела локальных переменных, не позволяя GOTO
вне функции и не мог ссылаться на включающие переменные процедуры. Эти директивы позволяют избежать необходимости заполнения полной записи активации , тем самым повышая производительность. [11] Это также имело побочный эффект: переменные, объявленные внутри процедуры, которая не была помечена как RECURSIVE, не будут сбрасываться между вызовами. [11] действует аналогично C static
.
SAIL также включал в себя FORWARD
квалификатор, используемый для вставки опережающих объявлений , обычно когда две процедуры вызывают друг друга. [10] RETURN
работало как в C, выходя из процедуры и возвращаясь к вызывающей стороне, а также при необходимости возвращая значение, если процедура его использует. [12] Параметры, передаваемые процедурам, могут быть VALUE
или REFERENCE
, последний позволяет передавать значения обратно. [13]
Основные типы данных и операторы
[ редактировать ]Основными типами переменных в SAIL являются целые числа , вещественные числа (с плавающей запятой), логические значения и строки . [14] Преобразования типов происходили автоматически, поэтому INTEGER i;i←SQRT(5);
преобразует значение 5 в двойное, поскольку это то, что требует SQRT, а затем преобразует результат в целое число. [3] Любой из этих типов можно превратить в массив, добавив ARRAY
квалификатор и поместив границы массива в скобки, например, REAL ARRAY weeks[1:52]);
. SAIL поддерживает одномерные и двумерные массивы. [15]
В языке для присваивания использовалась стрелка влево, ←
или подчеркивание на платформах, не поддерживающих Stanford ASCII . [16] Он включал ряд стандартных функций, таких как квадратный корень , все распространенные математические операторы, и в остальном был похож на большинство производных АЛГОЛА для обычного программирования. [17]
Манипулирование строками осуществлялось с помощью нарезки массива , при этом aStr[i TO j]
возврат подстроки с символами от i до j, или aStr[i FOR j]
который вернул подстроку, начинающуюся с i и содержащую j символов. [18] INF
Ключевое слово (inity) представляло конец строки, поэтому можно было aStr[i TO INF]
чтобы вернуть все, начиная с I. [3] Включены строковые функции и операторы. EQU
для проверки равенства двух строк, [5] амперсанд для конкатенации, LENGTH
, и LOP
который удаляет первый символ из строки. [18] Не было другого способа сравнить строки, кроме EQU
, такие операторы, как <
были определены только для чисел. [4]
Записи и указатели
[ редактировать ]Концепция записей как типа данных была введена совсем недавно, когда писался SAIL. Таким образом, эта функция показывает признаки того, что она «прикручена» к синтаксису языка. Например, структура записи была определена с использованием RECORD!CLASS
заявление: RECORD!CLASS person (STRING name, address; INTEGER accountnum; REAL balance)
. Это утверждение действовало аналогично RECORD
оператор в Паскале, определяющий шаблон записи. Для создания записи использовался метод NEW!RECORD
заявление, которое вернуло RECORD!POINTER
. Указатели были типизированы и могли быть напечатаны для более чем одного типа, например, RECORD POINTER (person,university) rp;
определяет rp, указатель на человека или университетскую запись. [19] Указатели также могут быть объявлены так, чтобы они указывали на ANY!CLASS
. [20] Доступ к данным в записи был столь же своеобразным; например, чтобы напечатать файл имени человека, синтаксис был PRINT(person:name[rp]);
. [20]
Струнный сканер
[ редактировать ]В дополнение к базовым строковым функциям SAIL включил в базовый язык систему сканирования строк. SCAN
работал со строковыми переменными, в то время как в остальном аналогичные INPUT
использовался для сканирования строк, считываемых из файла. Оба использовали систему, известную как «таблица разрывов», которая состояла из набора символов, обозначающих места, где следует прекратить чтение. Примеры включают переводы строк, различные пробелы и знаки препинания. Эти таблицы хранились в специальных структурах, и система допускала только 54 из них — число, не поясняемое в документации. [21]
Чтобы построить новую таблицу, сначала вызывается GETBREAK
который возвращал следующий свободный слот в таблице или «номер стола». За этим последует SETBREAK
, который принимал номер таблицы, строку с символами разрыва, еще одну строку «пропущенных символов», которые просто игнорировались при чтении (как если бы их не было в строке) и, наконец, «режимы», флаги, которые указывали, как работает система. должно работать. После установки программа может неоднократно вызывать SCAN
или INPUT
и возвращать полные строки. [22] Сюда входит ссылочный параметр, обычно brkchar, который содержит символ, вызвавший разрыв, что позволяет проверить, например, наличие символов конца файла. Система концептуально похожа на C. strtok
функциональность, которая является частью stdlib [23] в отличие от того, чтобы быть частью самого языка, как в SAIL.
Ввод/вывод
[ редактировать ] SAIL Система ввода/вывода была основана на идее пронумерованных «каналов», чем-то напоминающих записи сканера. Чтобы открыть файл, сначала нужно вызвать GETCHAN
чтобы вернуть значение свободного канала, а затем OPEN
отредактировал его с различными параметрами для описания файла и режимов работы. RELEASE
было эквивалентно закрытию. После открытия файл можно было прочитать в соответствии с правилами сканирования, указанными выше, вызвав INPUT
и ищем конец файла. Файлы не имели имен в рамках OPEN, вместо этого LOOKUP
может использоваться для указания канала на данный файл, ENTER
создал новый файл, связанный с каналом, и RENAME
разрешено изменение существующего имени файла. [24] Открыть существующий файл для записи можно с помощью GETCHAN... OPEN... LOOKUP... ENTER
. [25]
Во время ввода-вывода использовалось множество специальных обработчиков и переменных. Например, INCHWL
функция была входом, жестко привязанным к пользовательскому терминалу и всегда открытым, и она возвращает символ прерывания в системной переменной. !SKIP!
. [26] PRINT
функция обычно выводится на тот же канал терминала, но также может быть направлена на любой другой открытый канал. [27]
Директивы компилятора
[ редактировать ]Как язык системного программирования, производительность была важна, и чтобы помочь в этом, SAIL включил в себя DEFINE
который использовал замену строк аналогично C #define
макросы. [28] Разница заключалась в том, что необходимо было определить разделители вокруг замены, например REQUIRE "[][]" DELIMITERS;DEFINE maxSize=[100];
. Одним из распространенных вариантов использования этих макросов было определение символьных констант, таких как CRLF
, поскольку они не были частью основного языка. [28] Другой задачей было переопределить COMMENT
заявление для более короткого !
. [29]
Система также включала систему условной компиляции с использованием операторов, в отличие от директив препроцессора, как в C. IFCR
будет скомпилировать блоки между соответствующими THENC
и ELSEC
или ENDC
. Условие в IFCR должно быть известно во время компиляции, поэтому, как и в случае с C, оно обычно является DEFINE
значение д. [30]
данные LEAP
[ редактировать ]Основным отличием SAIL от других языков, производных от ALGOL, было включение ассоциативного хранилища из языка LEAP. Эта система представляла собой систему, которая позволяла помещать данные в структуры, подобные записям, а затем сохранять, извлекать и искать. В этом отношении это было похоже на функции обработки данных в COBOL . Основой хранилища была ассоциация или тройка , которая позволяла связать значение данных с именованным слотом в записи. Например, можно сделать запись типа Family_Member
с Name
«Томь» и установите Father
поле «Гарри». В результате получается тройка формы (Отец, Том, Гарри). Соответствующие библиотеки смогут затем найти все Family_Member
с «Гарри» в качестве Father
, возможно, возвращая «Тома» и «Алису». [31]
Пример
[ редактировать ]Следующий код, найденный в учебнике, преобразует входную строку в верхний регистр. [10]
STRING PROCEDURE upper(STRING rawstring);
BEGIN "upper"
STRING tmp;
INTEGER char;
tmp←NULL;
WHILE LENGTH(rawstring) DO
BEGIN
char←LOP(rawstring); COMMENT LOP returns the first character and moves the pointer past it
tmp←tmp&(IF "a" LEQ char LEQ "z" THEN char-'40 ELSE char);
END;
RETURN(tmp);
END "upper";
Использование
[ редактировать ]На SAIL было написано несколько интересных программных систем, в том числе некоторые ранние версии FTP и TeX , системы форматирования документов под названием PUB. [32] и BRIGHT, проект клинической базы данных, спонсируемый Национальными институтами здравоохранения . [33] [34] [35] [36] [37] [38] [39] [40] [41]
В 1978 году для PDP-10 существовало полдюжины различных операционных систем: ITS (MIT), WAITS (Stanford), TOPS-10 (DEC), CMU TOPS-10 (Carnegie Mellon), TENEX ( BBN ), Tymcom- X (Tymshare) и TOPS-20 (DEC, на базе TENEX).
SAIL был портирован с WAITS на ITS, чтобы исследователи MIT могли использовать программное обеспечение, разработанное в Стэнфордском университете . Каждый порт обычно требовал переписывания кода ввода-вывода в каждом приложении.
Машинно-независимая версия SAIL под названием MAINSAIL была разработана в конце 1970-х годов и использовалась для разработки многих инструментов проектирования eCAD в 1980-х годах. MAINSAIL легко переносился на новые процессоры и операционные системы и по состоянию на 2005 год все еще использовался ограниченно. [update].
См. также
[ редактировать ]- Стэнфордский расширенный ASCII (SEASCII)
Ссылки
[ редактировать ]- ^ Слимик 1971 , с. 22.
- ^ Перейти обратно: а б Путешествия 1976 , с.
- ^ Перейти обратно: а б с Смит 1976 , с. 13.
- ^ Перейти обратно: а б Смит 1976 , с. 48.
- ^ Перейти обратно: а б с Смит 1976 , с. 11.
- ^ Смит 1976 , с. 15.
- ^ Смит 1976 , с. 17.
- ^ Смит 1976 , с. 19.
- ^ Смит 1976 , с. 18.
- ^ Перейти обратно: а б с Смит 1976 , с. 21.
- ^ Перейти обратно: а б Смит 1976 , с. 22.
- ^ Смит 1976 , с. 23.
- ^ Смит 1976 , с. 24.
- ^ Смит 1976 , с. 2.
- ^ Смит 1976 , с. 4.
- ^ Смит 1976 , с. 5.
- ^ Смит 1976 , с. 6.
- ^ Перейти обратно: а б Смит 1976 , с. 12.
- ^ Смит 1976 , с. 40.
- ^ Перейти обратно: а б Смит 1976 , с. 41.
- ^ Смит 1976 , с. 27.
- ^ Смит 1976 , с. 28.
- ^ «Функции strtok() и strtok_r() в C с примерами» .
- ^ Смит 1976 , с. 32.
- ^ Смит 1976 , с. 33.
- ^ Смит 1976 , с. 30.
- ^ Смит 1976 , стр. 2, 38.
- ^ Перейти обратно: а б Смит 1976 , с. 25.
- ^ Смит 1976 , с. 26.
- ^ Смит 1976 , с. 44.
- ^ Путешествия 1976 , стр. 83.
- ^ «Руководство ПАБа» . Nomodes.com . Архивировано из оригинала 5 февраля 2005 года . Проверено 30 декабря 2017 г.
- ^ Родбард, Д.; Коул, БР; Мансон, Пи Джей (1983). «Разработка дружественного, самообучающегося, интерактивного статистического пакета для анализа данных клинических исследований: BRIGHT STAT-PACK» . Proc Annu Symp Comput Appl Med Care . 8 (3): 701–704. дои : 10.1007/BF02224505 . ПМЦ 2578281 . ПМИД 6384409 .
- ^ Стеттен, ДеВитт (10 мая 2014 г.). НИЗ: Отчет об исследованиях в его лабораториях и клиниках . Академическая пресса. ISBN 9781483277554 – через Google Книги.
- ^ «ЭКСПЕРИМЕНТАЛЬНЫЙ КОМПЬЮТЕРНЫЙ РЕСУРС СТЭНФОРДСКОГО УНИВЕРСИТЕТА: RR - 00785: ГОДОВОЙ ОТЧЕТ - 05 ГОД» . Profiles.nlm.nih.gov . Проверено 30 декабря 2017 г.
- ^ «Годовой отчет: Национальные институты здравоохранения. Отдел компьютерных исследований и технологий» . Архив.орг . Бетесда, штат Мэриленд . Проверено 30 декабря 2017 г.
- ^ Жулин, Денис Ларионов и Александр. «Прочитайте электронную книгу «Годовой отчет: Национальные институты здравоохранения. Отдел компьютерных исследований и технологий (том 1981–83) Национальных институтов здравоохранения (США). Отдел онлайн бесплатно (стр. 4 из 56)» . Ebooksread.com . Проверено 30 декабря 2017 г.
- ^ «ПРОЕКТ PUFF/VM: Раздел 4.1.6» . Profiles.nlm.nih.gov . Проверено 30 декабря 2017 г.
- ^ «Раздел 9.2.6: Проект PUFF/WI» . Profiles.nlm.nih.gov . Проверено 30 декабря 2017 г.
- ^ «Раздел 4.1.7: Проект PUFF/VM» . Profiles.nlm.nih.gov . Проверено 30 декабря 2017 г.
- ^ «ЭКСПЕРИМЕНТАЛЬНЫЙ КОМПЬЮТЕРНЫЙ РЕСУРС СТЭНФОРДСКОГО УНИВЕРСИТЕТА: RR - 00785: ГОДОВОЙ ОТЧЕТ - 05 ГОД» (PDF) . Profiles.nlm.nih.gov . Проверено 30 декабря 2017 г.
Библиография
[ редактировать ]- Райзер, Джон (август 1976 г.). ПАРУС (PDF) (Технический отчет). Стэнфордская лаборатория искусственного интеллекта.
- Смит, Нэнси (октябрь 1976 г.). Учебное пособие по SAIL (PDF) (Технический отчет). Стэнфордская лаборатория искусственного интеллекта.
- Слимик, Джон (октябрь 1971 г.). «Текущие языки реализации систем: взгляд одного пользователя» (PDF) . Уведомления ACM SIGPLAN . 6 (9): 20–28. дои : 10.1145/942596.807056 .
Дальнейшее чтение
[ редактировать ]- Биб, Нельсон Х.Ф. (2005). «Материалы практической конференции TEX 2005: Дизайн TEX и METAFONT: ретроспектива» (PDF) . БУКСИР . 26 (1). Солт-Лейк-Сити, Юта, США: Университет Юты , математический факультет: 39–40 . Проверено 07 марта 2017 г.
Оператор подчеркивания в назначениях исходного кода SAIL печатается как стрелка влево в Стэнфордском варианте ASCII, но сайты PDP-10 в других местах воспринимают его просто как простое подчеркивание. Однако его использование в качестве оператора присваивания означало, что его нельзя было использовать в качестве расширенной буквы, чтобы сделать составные имена более читабельными, как это сейчас распространено во многих других языках программирования. Стрелка влево в Стэнфордском варианте ASCII была не единственным необычным символом.