Введение
Интерактивный язык программирования
JOSS (аббревиатура от JOHNNIAC Open Shop System) был одним из первых интерактивных языков программирования с разделением времени. Он стал пионером многих функций, которые стали распространёнными в языках с 1960-х по 1980-е годы, включая использование номеров строк как для инструкций редактирования, так и в качестве целей для переходов, операторов, обусловленных логическими решениями, и встроенный редактор исходного кода, способный выполнять инструкции в прямом или непосредственном режиме, что они назвали диалоговым пользовательским интерфейсом. JOSS был первоначально реализован на машине JOHNNIAC в RAND Corporation и запущен в 1963 году. Он оказался очень популярным, и пользователи быстро перегрузили машину. К 1964 году потребовалась замена с более высокой производительностью. JOHNNIAC был выведен из эксплуатации в 1966 году и заменен PDP 6, который в конечном итоге был расширен для поддержки сотен компьютерных терминалов на основе IBM Selectric. Терминалы использовали зелёные чернила для ввода данных пользователем и чёрные – для ответа компьютера. Любая непонятная команда вызывала ответ. Система оказала большое влияние, породив множество портов и производных. Некоторые оставались похожими на оригинал, такие как TELCOMP и STRINGCOMP, CAL, CITRAN, ISIS, PIL/I, JEAN (серия ICT 1900), Algebraic Interpretive Dialogue (AID, на PDP 10). Другие, такие как FOCAL и MUMPS, развивались в различных направлениях. JOSS также имеет большое сходство с интерпретаторами BASIC, которые можно было найти на микрокомпьютерах в 1980-х годах, отличаясь в основном деталями синтаксиса.
The system was highly influential, spawning a variety of ports and offshoots. Some remained similar to the original, like TELCOMP and STRINGCOMP, CAL, CITRAN, ISIS, PIL/I, JEAN (ICT 1900 series), Algebraic Interpretive Dialogue (AID, on PDP 10). Others, such as FOCAL and MUMPS, developed in distinctive directions. JOSS also bears a strong resemblance to the BASIC interpreters found on microcomputers in the 1980s, differing mainly in syntax details.
Первоначальная идея
В 1959 году Уиллис Уэр написал служебную записку для RAND на тему вычислительной техники, в которой утверждал, что будущие компьютеры будут иметь "множество персональных станций ввода-вывода, позволяющих многим людям взаимодействовать с машиной одновременно". Записка привлекла внимание ВВС США, основных спонсоров RAND, и в 1960 году они сформировали Проект обработки информации для изучения этой концепции, которая вскоре стала известна как разделение времени. Проект был посвящен не столько разделению времени, сколько улучшению взаимодействия человека с компьютером в целом. Идея заключалась в том, что постоянное взаимодействие пользователя с компьютером, в режиме диалога, сделает такое взаимодействие более естественным. Как позже выразился директор JOSS Кит Ункафер:
"Я думаю, эксперимент был обусловлен двумя факторами. Первый – с 1950 года, когда я пришел в RAND, в компьютерном отделе RAND всегда уделялось внимание плавному и удобному взаимодействию с пользователем. Это было заложено в нас. Мы этому научились у Ганнинга, и только об этом и думали. Второй – мы видели, как математики мучаются с калькуляторами Marchant, не в силах использовать JOHNNIAC в его исходном виде. Это было слишком сложно. Им приходилось учиться программировать, что было для них крайне неприятным опытом. Мы хотели создать что-то, что они воспринимали бы как естественный способ мышления, как инструмент для решения их задач, не требующий длительного обучения и не вызывающий ощущения, что они становятся программистами, потому что это их отпугнуло бы. Официальное предложение о разработке JOSS на компьютере JOHNNIAC было одобрено в марте 1961 года."
Переключение на JOSS-2
В мае 1964 года было принято решение найти новую машину для замены JOHNNIAC и полностью посвятить ее работе с расширенной версией JOSS. Машина также должна была поддерживать новые терминалы, изготовленные по спецификациям Рэнда, и быть поставлена к 31 октября 1965 года. Всего было получено девять заявок на новую машину. Digital Equipment Corporation (DEC) выиграла конкурс со своей новой системой PDP 6, и финансирование ВВС было выделено для ее приобретения. DEC также согласилась изготовить тридцать терминалов на базе пишущей машинки IBM Selectric, модифицированной специальным механизмом для автоматического перехода на следующую страницу при использовании бумаги с перфорацией. Несколько других компонентов системы поставлялись другими компаниями. PDP 6 прибыла в конце июля 1965 года и первоначально тестировалась с использованием терминалов Teletype Model 33. Новую версию кода разработали Чарльз Л. Бейкер, Джозеф В. Смит, Ирвин Д. Гринвальд и Г. Эдвард Брайан. Система была впервые признана работоспособной в октябре, хотя это включало в себя шесть часов планового технического обслуживания в неделю. Первый прототип терминала прибыл в ноябре. В декабре терминал в Лас-Вегасе был подключен к машине удаленно впервые. В феврале 1966 года он был отправлен на авиабазу Макклеллана, затем в августе – в Военную академию ВВС, а в сентябре – в ARPA и офис ВВС в Пентагоне. Первое постоянное внешнее телетайповое соединение для Teletype Model 35 было установлено на авиабазе Лэнгли в феврале 1967 года. После запуска новой машины JOHNNIAC был отключен 11 февраля 1966 года и официально выведен из эксплуатации 18 февраля. Его последняя работающая программа была написана на JOSS и отсчитывала секунды до выключения. Машина была отправлена в Музей округа Лос-Анджелес, а затем попала в Музей истории компьютеров близ Сан-Франциско. После замены системой JOSS 2, оригинальная система ретроспективно получила название JOSS 1.
Использование JOSS-2
К концу 1966 года новая система JOSS 2 была полностью функциональной и передана в круглосуточное использование JOSS (24/7). Новая машина обеспечивала примерно в 30 раз более высокую вычислительную скорость, в пять раз больший объем памяти на пользователя и множество новых функций в самом языке. Новая платформа в конечном итоге могла поддерживать до 100 терминалов, работающих одновременно. Военно-воздушные силы оставались владельцем системы, а Rand и другие организации выступали в качестве консультантов. Время работы центрального процессора оплачивалось внешним пользователям по тарифу около 1 доллара в минуту, но только во время фактического выполнения программы, время, затраченное на ввод и печать, было бесплатным. К 1970 году в Rand и на различных объектах ВВС по всей стране насчитывалось от 500 до 600 пользователей. Многие из них были эпизодическими пользователями, именно для таких пользователей и предназначалась система. Для их поддержки специальные терминалы были оснащены уникальными "JOSS-штекерами", позволявшими перемещать их из офиса в офис и подключать к специальным розеткам. Около Rand было установлено двести таких штекеров, а корпус терминала был спроектирован достаточно узким, чтобы проходить в дверные проемы, при этом оставалось место для чашки кофе сбоку. Включение питания терминала обеспечивало его подключение в новом месте. Специальные терминалы были разработаны для JOSS, поскольку инженеры полагали, что "телекоммуникационные функции модели 33 непонятны для неподготовленного пользователя" и были бы слишком сложны для эпизодических пользователей. На практике механизмы на основе Selectric оказались слишком хрупкими для интенсивного использования и часто ремонтировались на месте специалистами IBM. В 1970 году треть терминалов была полностью перестроена, а производительность компьютера была снижена для повышения надежности. К этому времени ВВС решили использовать модель 35, поскольку она была легкодоступна и значительно дешевле. Пользователи были в восторге, и для их обслуживания Rand начала издавать информационный бюллетень The JOSS Newsletter под редакцией Ширли Маркс. Всего было выпущено 44 номера с ноября 1967 года по июнь 1971 года.
JOSS-3
В начале 1970-х годов программисты одного из центров IBM на западном побережье создали JOSS 3 для IBM 370/158, работающей под управлением OS/360. Информации об этой системе сохранилось немного, за исключением того, что именно на этом компьютере JOSS прекратил своё существование. Согласно заметке в историческом обзоре, компания RAND не хотела давать IBM право использовать название JOSS, и в результате "версия IBM не получила широкого распространения".
Реализация
JOSS II на PDP 6 был разделен на две части, соответствующие организации внутренней памяти машины. Машина была оснащена двумя блоками основной памяти, каждый объемом 16 К 36-битных слов. Сама система JOSS, включавшая операционную систему, код управления пользователями и файлами, обработчик терминалов и интерпретатор, занимала большую часть первого из этих блоков. Второй блок использовался для пользовательских программ. Хотя для того времени это был довольно большой объем памяти, система была настолько интенсивно используема, что 16 К слов пользовательской памяти оказалось недостаточно, и она дополнялась магнитным барабаном для организации подкачки. Управление барабаном осуществлялось внешним оборудованием и не требовало внимания со стороны центрального процессора. Для поддержки нескольких пользовательских программ аппаратное обеспечение PDP 6 было модифицировано для проверки 20-го бита в любом адресном запросе. Если этот бит был установлен, адрес относился к "пользовательскому пространству" и изменялся таким образом, чтобы нулевой адрес указывал на базовый адрес данного пользователя. Таким образом, пользовательские программы могли перемещаться в памяти без возникновения проблем в работе системы, а операционная система могла переключаться между пользователями, просто изменяя один внутренний регистр. Для постоянного хранения использовался жесткий диск Storage Products объемом 5,7 миллиона слов. Как и в случае с барабаном, операции ввода-вывода с барабаном выполнялись внешним оборудованием, хотя в данном случае перемещением данных инициировались действиями пользователя при загрузке и сохранении программ. Для передачи данных на диск и с диска по мере необходимости использовался магнитофон IBM, совместимый с IBM, что также было независимо от центрального процессора. Также были доступны два устройства DECtape, работавшие аналогичным образом. Терминалы обслуживались через специальный "концентратор", состоящий из механического коммутатора Строуджера, который мог соединять любой из 300–400 возможных терминальных разъемов с любым из 40 выходов. Еще восемь линий были выделены для входов Teletype Model 33, в отличие от терминалов Selectric, используемых в JOSS. Эти 48 линий затем подключались к электронному мультиплексору, подключенному к процессору. Мультиплексор работал по принципу прерываний, то есть неактивные терминалы не потребляли процессорное время. Специальные терминалы JOSS были разработаны и изготовлены DEC. Они состояли из механизма Selectric, встроенного в специальное шасси, содержащее систему связи, блок питания и другие компоненты. Для отображения основных математических символов, таких как ≠, использовался специальный печатающий ролик, что избавляло от необходимости использовать комбинации символов, такие как <>. Система связи была основана на 6-битном коде символов в 8-битном пакете с начальными и стоп-битами. Скорость передачи данных по линиям составляла 120 бит/с, что соответствовало максимальной скорости печати механизма Selectric – 15 символов в секунду. Коды Shift in и Shift out использовались для перемещения ленты с зеленого на черный цвет и обратно. Система связи также распознавала эти коды и изменяла индикаторы на передней панели, чтобы показать, кто в данный момент контролирует терминал – компьютер или пользователь.
Прямой и косвенный режим
JOSS представил идею единого редактора командной строки, который функционировал и как интерактивный язык, и как редактор программ. Команды, вводимые без номера строки, выполнялись немедленно, в том, что JOSS называл "прямым режимом". Если та же строка предварялась номером строки, она вместо этого копировалась в область хранения программного кода, которую JOSS называл "косвенным режимом". Новые строки добавлялись в программу, если номер строки был уникальным, заменяли существующие строки с тем же номером или удалялись из программы, если существующий номер строки вводился без последующего кода. В отличие от большинства версий BASIC, JOSS сохранял весь пользовательский ввод в файлы, а не только код программы. При загрузке JOSS фактически повторно вводил строки. Это означало, что файлы программ могли содержать как операторы программы, так и команды прямого режима. Например, было обычным делом видеть программы, которые перечисляли строки операторов, а затем заканчивались командой для немедленного запуска программы после завершения загрузки. Некоторые функции можно было использовать только в прямом режиме, например, и , которые вводились без номеров строк, но всё равно возвращались при загрузке программы. Команды прямого и косвенного режимов можно было свободно смешивать в рабочей области. Это позволяло вставлять комментарии в исходный код, добавляя строки прямого режима, начинающиеся с , или размещая комментарий в конце строки кода. Пустые строки также игнорировались, что позволяло разбивать программу для большей ясности.
Заявления о программе
Каждая строка в программе JOSS должна начинаться с номера строки. Номера строк – это числа с фиксированной точкой, состоящие из двух двухзначных целых чисел, разделенных точкой. Как и в BASIC, номера строк используются как метки для переходов и операторов, так и для поддержки редактирования. Ввод строки кода с новым номером строки вставляет её в программу, а ввод строки с существующим номером строки заменяет предыдущую версию или удаляет её, если она пуста. Часть номера строки слева от точки называется страницей или частью, а часть справа – строкой. Таким образом, номер строки 10.12 относится к странице 10, строке 12. Переходы могут быть направлены либо на страницу, либо на строку внутри страницы. При использовании второго формата, комбинация страницы и строки называется шагом. Страницы используются для определения подпрограмм, которые возвращаются, когда следующая строка находится на другой странице. Например, если подпрограмма для вычисления квадратного корня числа находится на странице 3, она может состоять из трех строк кода: 3.1, 3.2 и 3.3, и вызывается с использованием . Код вернется к оператору после Do, когда достигнет следующей строки на другой странице, например, 4.1. Нет необходимости в эквиваленте оператора RETURN в конце, хотя если требуется ранний возврат, это достигается с помощью . Каждая строка должна начинаться с командного ключевого слова, следующего за номером строки. Концепции команды по умолчанию не существует, как это имеет место в BASIC с его необязательным оператором . На одну строку можно поместить несколько операторов, разделенных двоеточием или точкой с запятой. Каждая строка должна заканчиваться точкой.
Настройка
Команда присваивает результаты выражения указанной переменной. Эквивалент BASIC 01.30 Set p=3.14156. 01.60 Set i=l*(r/100)*t. Команда `Set` была необязательной при использовании в прямом режиме, когда можно было вводить выражение без неё. Это было запрещено в косвенном режиме, в отличие от BASIC.
was optional when used in direct mode, where one could type without the Set command. This was not allowed in indirect mode, in contrast to BASIC.
Спрос
The принимает список переменных и сохраняет ввод пользователя в этих переменных. Необязательный квалификатор добавляет пользовательское приглашение. Эквивалентно командам BASIC: 01.01 Введите "Сколько вам лет?". 01.02 Запросите значение для A. 01.03 Выведите "Вы", A. 01.04 Запросите значение для H как "Какой у вас рост?". 01.05 Выведите H,"? Такого роста?".
01.01 Type "What is your age?". 01.02 Demand A. 01.03 Type "You are", A. 01.04 Demand H as "What is your height?". 01.05 Type H,"? That tall? ".
Тип
Команда выводит один или несколько элементов, разделенных запятыми. В своей базовой форме она эквивалентна команде BASIC's PRINT. Однако команда включает в себя ряд дополнительных форм, которые делают её сильно перегруженной, выполняя множество несвязанных задач вывода. При использовании для вывода значений, параметры могут быть переменными, строковыми литералами, заключенными в двойные кавычки, и специальным символом, который создает перевод строки. Команда также поддерживает форматированный вывод с использованием строк формата. Подробности см. в разделе о форматировании ниже. Команда также используется как эквивалент оператора BASIC's LIST, выводя исходный код программы. Например, команда LIST 1 выведет одну строку кода, команда LIST PART выведет всю часть программы, а команда LIST выведет всю программу. Кроме того, она может использоваться для вывода списков внутренних значений. Команда VARS выводит список всех переменных и их значений, а команда SIZE выводит размер программы. Ключевые слова включают PRINT, LIST и VARS.
Страница
запускает выдачу страницы на специальных терминалах JOSS. Обычно JOSS выдавал страницу, когда терминал доходил до 54-й строки на бумаге, поэтому, если кто-то хотел гарантировать, что блок данных не будет разбит пополам, можно было:
1.10 Выдать страницу, если $>44. – это псевдопеременная, возвращающая текущий номер строки.
Линия
вызывает перевод строки на специальных терминалах JOSS.
Для
Команда переходит выполнение программы к указанной части или номеру шага, используя или соответственно. Это эквивалент оператора BASIC's GOTO. В отличие от , это косвенная команда, используемая из командной строки для запуска программ, эквивалент оператора BASIC's RUN 01.01 Требуется ввод A как "ВВЕДИТЕ ЧИСЛО". 01.05 Перейти к шагу 1.01. 01.10 Перейти в первую часть.
Сделай это .
похож на , но переходит к подпрограмме. Как и в случае с , вы можете или Если указан шаг, выполняется только эта строка, после чего управление возвращается к инструкции, следующей за . Если указана часть, выполнение начинается с первой строки блока и продолжается до конца блока или до встречи инструкции . 01.15 Выполнить шаг 7.24. 01.16 Выполнить часть 8. имела одну специальную сокращенную форму для поиска, что было обусловлено её широким распространением в большинстве программ. В случае простых циклов использовался модификатор вместо обычного . Следующие строки эквивалентны: выполнить часть 1 для i=1(1)5. Выполнить часть 1, 5 раз. JOSS поддерживает указатель на текущую выполняемую строку, который изменится при . Однако в ней была предусмотрена специальная "до-конструкция в скобках", которую можно было использовать в прямом режиме для тестирования определенных участков кода, не изменяя основной указатель. Например, если программа остановилась из-за ошибки и было неясно, какой участок вызвал проблему, можно было протестировать определенную подпрограмму следующим образом:
had one special short form for looking in keeping with it being very common in most programs. This used the modifier instead of a normal , in the case for simple loops. So the following lines are equivalent:
Do part 1 for i=1(1)5. Do part 1, 5 times. JOSS maintains a pointer to the currently executing line, which a would change. However, it included a special "parenthetic do" that could be used in direct mode to test certain sections of the code without changing the main pointer. For instance, if the program stopped due to an error and it was not clear which section caused the problem, one might test a particular subroutine with:
(Do part 2.)
(Выполнить часть 2.)
had one special short form for looking in keeping with it being very common in most programs. This used the modifier instead of a normal , in the case for simple loops. So the following lines are equivalent:
Do part 1 for i=1(1)5. Do part 1, 5 times. JOSS maintains a pointer to the currently executing line, which a would change. However, it included a special "parenthetic do" that could be used in direct mode to test certain sections of the code without changing the main pointer. For instance, if the program stopped due to an error and it was not clear which section caused the problem, one might test a particular subroutine with:
(Do part 2.)
Остановись .
Команда прекращает выполнение программы и возвращает управление в среду редактирования. Эквивалентна командам BASIC `END` или `STOP`, хотя `STOP` в BASIC предназначен для того, чтобы позволить продолжить выполнение программы с того же места, чего нет в системе JOSS, ориентированной на рабочее пространство. 01.10 Тип X. 01.20 Стоп.
Иди .
Доступен только в прямом режиме, эквивалентен командам BASIC `STOP` и `END`, в зависимости от того, остановлена ли программа в данный момент из-за ошибки или команды `STOP`.
Отменить
Другая команда, работающая только в прямом режиме, используется, когда программа остановилась из-за ошибки, и пользователь хочет перезапустить программу, что она делает, обнуляя счетчик команд. Программа бы продолжила выполнение с последнего места, но выполнение этой команды заставляет программу начать выполнение с самого начала. Если текущая точка останова была вызвана скобкой, можно выполнить отмену скобки, чтобы остановить только это подвыполнение и позволить программе продолжить с последней строки, не являющейся скобкой.
Управление файлами
Система JOSS использовала жесткий диск для хранения пользовательских программ в выделенном пространстве. В этом пространстве было несколько файлов, которые идентифицировались многокомпонентным именем, состоящим из целого числа и пятибуквенного имени в скобках, например. Целое число эквивалентно каталогу, а имя – подфайлу внутри него, который поддерживался самой системой JOSS. Файлы записывались и загружались с помощью . Также можно было читать или сохранять только определенные части рабочей области, например, для сохранения отдельной подпрограммы в файл. Кроме того, можно было установить файл по умолчанию, к которому все обращения предполагались. Файлы можно было удалять с помощью .
Образец программы
1.1 Спрос p, q. 1.2 Остановить, если q<0 или r(q,2)=0. 1.3 Установите a=1. 1.4 Выполнять часть 2, пока q>1 и a≠0. 1.5 Вывести a в формате 3. 1.6 Остановить. 2.1 Выполнить часть 20. 2.1 Выполнить часть 11, если p<0. 2.2 Выполнить часть 12, если p≥q. 2.3 Выполнить часть 13, если p=0. 2.4 Завершить, если a=0. 2.5 Установить p=p/4, пока r(p,4)=0. 2.6 Выполнить часть 14, если r(p,2)=0. 2.7 Выполнить часть 20. 2.8 Установить a=a, если r(p,4)=r(q,4)=3. 2.9 Установить s=p, p=q, q=s. 2.95 Выполнить часть 20. 11.1 Установить a=a, если r(q,4)=3. 11.2 Установить p=|p|. 11.3 Выполнить часть 20. 12.1 Установить p=r(p,q). 12.2 Выполнить часть 20. 13.1 Установить a=0, p=1, q=1. 14.1 Установить a=a, если r(q,8)=3 или r(q,8)=5. 14.2 Установить p=p/2. 20.1 Вывести p, q в формате 1, если a=1. 20.2 Вывести p, q в формате 2, если a=1. Форма 1: " L(%.0f,%.0f) =" Форма 2: " L(%.0f,%.0f) =" Форма 3: " %.0f\n"
Form 2: " L(%.0f,%.0f) ="
Form 3: " %.0f\n"
Note that this is not an original sample, but rather one from a modern simulator. There are some syntactic differences from the original JOSS language.