Русская Википедия:JOSS

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Шаблон:Не путатьШаблон:Язык программирования

Файл:JOSS Session.jpg
Часть сеанса JOSS в RAND в 1970 году, в котором пользователь выполняет несколько простых вычислений в Шаблон:Code . Обратите внимание на разницу между точкой в конце операторов и точкой для умножения.

JOSS (акроним для JOHNNIAC Open Shop System)Шаблон:Sfn — один из первых интерактивных языков программирования с разделением времени. В нём впервые появились такие возможности, которые впоследствии стали обычными в языках с 1960-х по 1980-е годы, включая: использование номеров строк в качестве адресов для редактирования инструкций и целевых объектов для ветвей; операторы, основанных на логических условиях; встроенный редактор исходного кода, который может выполнять инструкции в прямом (direct) или немедленном (immediate) режиме, названном диалоговым пользовательским интерфейсом.

Первоначально JOSS был реализован на машине JOHNNIAC в RAND Corporation и введён в эксплуатацию в 1963 году. Он оказался очень популярным, и пользователи быстро перегрузили машину. К 1964 году потребовалась замена на машину с более высокой производительностью. JOHNNIAC был снят с производства в 1966 году и заменён PDP-6, который впоследствии вырос до поддержки сотен компьютерных терминалов на базе IBM Selectric. Терминалы использовали зелёные чернила для пользовательского ввода и черные для ответа компьютера. Любая команда, которая не была распознана, вызывала ответ: Шаблон:Code или Шаблон:Code.

Система оказала огромное влияние, породив множество портов и ответвлений. Некоторые остались похожими на оригинал, например TELCOMP и STRINGCOMP, CAL, CITRAN, ISIS, PIL/I, JEAN (серия ICT 1900), Algebraic Interpretive Dialogue (AID, на PDP-10); в то время как другие, такие как FOCAL и MUMPS, развивались в специфических направлениях. Он также очень похож на интерпретаторы BASIC, использовавшиеся в микрокомпьютерах 1980-х годов, отличаясь в основном деталями синтаксиса.

История

Первоначальная идея

В 1959 году Уиллис Уэр написал меморандум RAND на тему вычислений, в котором заявил, что будущие компьютеры будут иметь «множество персональных станций ввода-вывода, чтобы многие люди могли взаимодействовать с машиной одновременно»Шаблон:Sfn. Меморандум вызвал интерес у ВВС США, основных спонсоров Rand, и в 1960 году они сформировали проект «Информационный процессор» для изучения этой концепции, которая вскоре стала известна как разделение времени. Проект не был конкретно связан с разделением времени, но был направлен на улучшение взаимодействия человека и компьютера в целом. Тогда идея заключалась в том, что постоянное взаимодействие между пользователем и компьютером в манере запрос-ответ более естественноШаблон:Sfn. Как позже выразился директор JOSS Кит Анкафер:

«

Текст цитаты

»
— Анонимус

Шаблон:Конец цитатыШаблон:Оригинальный текст

Официальное предложение разработать то, что впоследствии стало JOSS на компьютере JOHNNIAC, было принято в марте 1961 годаШаблон:Sfn.

JOSS-1

JOSS был почти полностью реализован Клиффордом Шоу, математиком, работавшим в растущем подразделении вычислений в Rand. Он был написан на символическом языке ассемблера под названием EasyFox (E и F в тогдашнем фонетическом алфавите вооруженных сил США), также разработанном ШоуШаблон:Sfn.

Система JOSS была впервые официально запущена в мае 1963 года и поддерживала пять консолей: одну в машинном зале и ещё четыре в офисах по всему зданиюШаблон:Sfn. Ранние консоли были основаны на передающей пишущей машинке IBM Model 868, поскольку на момент начала разработки Selectric ещё не был представлен на рынкеШаблон:Sfn. Первое расписание было опубликовано 17 июня. В то время JOSS работал по три часа с 9:00 до 12:00 ежедневноШаблон:Sfn. В январе 1964 года было объявлено, что он полностью функционирует на восьми терминалахШаблон:Sfn. Окончательная версия была развернута в январе 1965 годаШаблон:Sfn.

К этому времени JOHNNIAC было уже более десяти лет. Его ламповая логика никогда не отличалась высокой надёжностью. Система была очень популярна, поэтому была перегружена даже когда работала хорошо. Пользователи были в восторге, один заявил:

«

Текст цитаты

»
— Анонимус

Шаблон:Оригинальный текст.

Другой выразился более кратко:

«

Текст цитаты

»
— Анонимус

Шаблон:Оригинальный текст

Переход на JOSS-2

В мае 1964 года было принято решение найти новую машину на замену JOHNNIAC и полностью выделить её для работы с расширенной версией JOSS. Машина также должна была поддерживать новые терминалы, изготовленные по спецификациям Rand, и должна быть доставлена к 31 октября 1965Шаблон:Sfn.

Всего было получено девять предложений. Digital Equipment Corporation (DEC) выиграла конкурс со своей новой системой PDP-6, на покупку было выделено финансирование ВВС США. DEC также согласилась построить тридцать терминалов на базе пишущей машинки IBM Selectric, модифицированной специальным механизмом для перехода к следующей странице при фальцованной веером подаче бумаги. Несколько других частей системы были поставлены другими компаниямиШаблон:Sfn.

PDP-6 прибыл в конце июля 1965 года и первоначально тестировался с использованием телетайпов модели 33 в качестве терминалов. Новая версия кода была разработана Чарльзом Л. Бейкером, Джозефом В. Смитом, Ирвином Д. Гринвальдом и Г. Эдвардом Брайаном. Система была впервые введена в эксплуатацию в октябре, хотя она требовала шесть часов планового обслуживания в неделюШаблон:Sfn. Первый прототип терминала прибыл в ноябре. В декабре к машине впервые удаленно подключили терминал в Лас-ВегасеШаблон:Sfn. В феврале 1966 года он был отправлен на базу ВВС Макклеллан, затем ещё один в августе в Академию ВВС и два в сентябре в ARPA и офис ВВС в Пентагоне. Первое постоянное дистанционное телетайпное соединение для телетайпов модели 35 было установлено на базе ВВС Лэнгли в феврале 1967 годаШаблон:Sfn.

JOHNNIAC был отключён 11 февраля 1966 года после установки и запуска новой машины. Официально он вышел на пенсию 18 февраля. Его последняя запущенная программа была написана на JOSS и отсчитывала секунды до отключения. Машина была отправлена в Музей округа Лос-АнджелесШаблон:Sfn и в итоге оказалась в Музее компьютерной истории за пределами Сан-Франциско[1]. После замены на систему JOSS-2 оригинал стали называть JOSS-1Шаблон:Sfn.

Использование JOSS-2

К концу 1966 года новая система JOSS-2 стала полностью функциональной и была полностью посвящена выполнению JOSS-2 24/7. Новая машина имела примерно в 30 раз большую скорость вычислений, в пять раз больше места для хранения данных на одного пользователя и множество новых функций в самом языкеШаблон:SfnШаблон:Sfn. Согласно подсчётам, новая платформа могла бы поддерживать одновременное использование до 100 терминаловШаблон:Sfn. Владельцем системы оставались Военно-воздушные силы, а Rand и другие выступали в качестве консультантов. Процессорное время оплачивалось внешними пользователями по цене около 1 USD за минуту. Учитывалось только время фактического выполнения программы; время, затрачиваемое на набор текста и печать, было бесплатнымШаблон:Sfn.

К 1970 году насчитывалось от 500 до 600 пользователей из Rand и на различных объектах ВВС США по всей странеШаблон:Sfn. Многие из них были случайными пользователями, для чего и была предназначена система. Для их поддержки нестандартные терминалы были оснащены специальными «штекерами JOSS», чтобы их можно было возить из офиса в офис и подключать к специальным розеткам. Вокруг Rand было установлено двести розеток, а шасси терминала было спроектировано так, чтобы оно было достаточно узким, чтобы проходить через двери, оставляя при этом место для кофеШаблон:Sfn. Переключение выключателя питания на терминале приводило к его подключению в новом местеШаблон:Sfn.

Специальные терминалы для JOSS были разработаны потому, что инженеры считали, что «телекоммуникационные функции Model 33 являются загадкой для неподготовленного человека» и будут слишком запутанными для изучения случайными пользователямиШаблон:Sfn. На практике же механизмы на базе Selectric оказались слишком хрупкими для постоянного использования, и их часто ремонтировали в полевых условиях сотрудники IBM. В 1970 году треть терминалов были полностью переделаны, а вывод из компьютера замедлился для повышения надёжности. К этому времени ВВС решили использовать вместо них модель 35, поскольку она была легко доступна и стоила намного дешевлеШаблон:SfnШаблон:Sfn.

Пользователи были полны энтузиазма, и чтобы удовлетворить их, Рэнд начал публиковать Информационный бюллетень JOSS под редакцией Ширли Маркс. В конечном итоге с ноября 1967 г. по июнь 1971 г. было опубликовано 44 выпускаШаблон:Sfn.

JOSS-3

В начале 1970-х программисты одного из заводов IBM на западном побережье построили JOSS-3 для IBM 370/158, работавшей под управлением OS/360. Существует мало информации об этой системе, за исключением того, что именно на этой машине JOSS окончательно ушел в отставкуШаблон:Sfn. Согласно примечанию в историческом обзоре, Rand не решилась разрешить IBM использовать имя JOSS, в результате чего «версия IBM никогда не использовалась широко»Шаблон:Sfn.

Реализация

Файл:IBM Selectric typeball.jpg
Для вывода математических символов на своих терминалахIBM Selectric JOSS использовал нестандартный пишущий шарик, подобный этому.

JOSS-II на PDP-6 был разделен на две части в соответствии с особенностями внутренней памяти машины. Машина была оснащена двумя банками основной памяти, по 16 тысяч 36-битных слов в каждом банке. Сама система JOSS, включавшая в себя операционную систему, код управления пользователями и файлами, обработчик терминалов и интерпретатор, занимала большую часть памяти первого банка. Второй банк использовался для пользовательских программ. Хотя это был относительно большой объём памяти для той эпохи, система использовалась настолько интенсивно, что пользовательского хранилища объёмом 16 тысяч слов было недостаточно, поэтому данные копировались на магнитный барабанШаблон:Sfn. Барабан управлялся внешним оборудованием и не требовал внимания со стороны главного процессораШаблон:Sfn.

Для поддержки возможности выполнения нескольких пользовательских программ аппаратное обеспечение PDP-6 было модифицировано для проверки 20-го бита адресных ссылок. Если этот бит был установлен, адрес находился в «пользовательском пространстве» и изменялся таким образом, что нулевой адрес указывал на базовый адрес этого пользователя. Таким образом, пользовательские программы можно было перемещать в памяти, не вызывая проблем для системы, а операционная система могла переключаться между пользователями, просто изменяя один внутренний регистрШаблон:Sfn.

Постоянное хранилище обеспечивалось жёстким диском Storage Products емкостью 5,7 млн слов. Как и в случае с барабаном, фактический ввод/вывод в барабан и из барабана обрабатывался извне, хотя в этом случае движение данных вызывалось действиями пользователя для загрузки и сохранения своих программ. Ленточный накопитель, совместимый с IBM, использовался для перемещения данных на накопитель и с него по мере необходимости. Операция также не зависела от ЦП. Также были доступны два устройства DECtape, которые работали так же, как диск IBMШаблон:Sfn.

Терминалы присоединялись через специальный «концентратор», который состоял из механического переключателя Строуджера, который мог подключать любую из 300—400 возможных вилок терминала к любому из 40 выходов. Ещё восемь линий были выделены для входов Teletype Model 33, отличавшихся от вилок Selectrics в стиле JOSS. Затем эти 48 линий подключались к электронному мультиплексору, подключённому к центральному процессору. Мультиплексор управлялся прерываниями, то есть простаивающие терминалы не использовали циклыШаблон:Sfn.

Специальные терминалы JOSS были изготовлены компанией DEC. Они состояли из механизма Selectric, встроенного в специальное шасси, содержащее систему связи, источник питания и другие компоненты. Нестандартный пишущий шарик использовался для предоставления основных математических символов, таких как ≠, что отменяло надобность в таких двухсимвольных комбинациях, как <>. Система связи была основана на 6-битном символьном коде в 8-битном пакете со стартовым и стоповым битами. Данные передавались со скоростью 120 бит/с, чтобы соответствовать максимальной скорости 15 символов в секунду механизма Selectric. Коды shift-in и shift-out использовались для перемещения ленты с зелёного на чёрный и обратно. Эти коды также детектировались системой связи и изменяли состояние индикаторов на передней панели, чтобы указать, кто контролирует терминал в данный момент: пользователь или компьютерШаблон:Sfn.

Язык

Прямой и косвенный режим

JOSS представила идею единого редактора командной строки, который работал и как интерактивный язык, и как программный редактор. Команды, которые были введены без номера строки, выполнялись немедленно, в том, что JOSS назвал «прямым режимом». Если же перед командой стоял номер строки, вместо выполнения она копировалась в область хранения кода программы, которую JOSS назвал «косвенным режимом» (indirect mode). Если номер был уникальным, новая строка добавлялась в программу. Если номер был неуникальным, существующая строка с таким номером заменялась или удалялась из программы, если вводился только существующий номер строки, без командыШаблон:Sfn.

В отличие от большинства разновидностей BASIC, JOSS сохранял в файлах весь пользовательский ввод, а не только программный код. JOSS при загрузке программы, по сути, снова вводил строки. Это означало, что программные файлы могли содержать как операторы программы, так и инструкции прямого (direct) режима. Например, было обычным делом видеть программы, в которых перечислялись строки операторов, а затем файл заканчивался на Шаблон:Code для немедленного запуска программы, как только она завершит загрузку. Были некоторые функции, которые можно было использовать только в прямом режиме, такие как Шаблон:Code и Шаблон:Code, которые вводились без номеров строк, но все же выполнялись при загрузке программыШаблон:Sfn.

Инструкции прямого и косвенного режимов можно было свободно смешивать в рабочей области. Это позволяло вставлять комментарии в исходный код, добавляя строки прямого режима, начинающиеся с Шаблон:CodeШаблон:Sfn или помещая этот символ в конец строки кода, а затем добавляя комментарий после него. Пустые строки также игнорировались, что позволяло разбивать программу для ясностиШаблон:Sfn.

type "Hello" *Выведет "Hello"
1.1 type "Hello" *запишет команду по адресу 1.1
1.1 type "World" *перезапишет команду по адресу 1.1
*удаление команды по адресу 1.1:
1.1

Операторы

Каждая строка в программе JOSS должна начинаться с номера строки. Номера строк — это числа с фиксированной точкой, состоящие из двух двузначных целых чисел, разделенных точкой. Как и в BASIC, номера строк используются как в качестве меток для целевых операторов Шаблон:Code и Шаблон:Code, так и для редактирования. Ввод строки кода с новым номером строки вставляет её в программу. Ввод строки с существующим номером строки заменяет предыдущую версию. Ввод пустой строки с существующим номером строки удаляет эту строку.

Часть номера строки слева от точки называется страницей (page) или частью (part), а часть справа называется строкой (line). Таким образом, номер строки Шаблон:Code относится к странице 10, строке 12. Ветви могут быть нацелены либо на страницу, либо на строку внутри страницы. В более позднем формате, объединённые вместе страница и строка называются шагом .

Страницы используются для определения подпрограмм. Подпрограммы возвращают управление назад, когда следующая строка находится на другой странице. Например, если подпрограмма для вычисления квадратного корня числа находится на странице 3, у неё может быть три строки кода 3.1, 3.2 и 3.3, и она будет вызываться с использованием Шаблон:Code Код вернётся к оператору после Do, когда дойдёт до следующей строки на другой странице, например, 4.1. Для возврата из подпрограммы используется Шаблон:Code (эквивалент Шаблон:Code в других языках программирования). Нет необходимости использовать Шаблон:Code в конце подпрограммы.

Каждая строка должна начинаться с ключевого слова команды, следующего за номером строки. Не существует понятия команды по умолчанию, как в случае с BASIC с его необязательным оператором Шаблон:Code . В одной строке можно разместить несколько операторов, разделённых двоеточием или точкой с запятой. Каждая строка должна заканчиваться точкой.

Циклы и условия

JOSS использует суффиксальную нотацию для обозначения условных операторов, «сделайте это действие, если это условие верно», в отличие от большинства языков, которые помещают условие впереди (префиксная нотация), «если это условие верно, сделайте это действие». Подобно BASIC, но в отличие от FORTRAN или FOCAL, к любому оператору может быть добавлено условие. Например, чтобы напечатать строку только при выполнении условия, можно объединить if с Шаблон:Code:

1.1 Type "Hello, World!" if X=5.

JOSS поддерживает шесть инфиксных сравнений, Шаблон:Code, Шаблон:Code, Шаблон:Code, Шаблон:Code, Шаблон:Code, Шаблон:Code и логические операторы Шаблон:Code, Шаблон:Code, и Шаблон:CodeШаблон:Sfn.

Циклы обрабатывались аналогичным образом, используя команду Шаблон:Code и специфичный формат для указания границ цикла и значения шага: Шаблон:Code . Например, для выполнения цикла от 1 до 10 с шагом в 2 используется формат Шаблон:Code . Подобно Шаблон:Code, Шаблон:Code можно применить к любому другому оператору:

1.2 Type "Hello, Wikipedia!" for i=1(2)10.

Обратите внимание, что for применяется только к одному оператору; если необходимо запустить несколько операторов в цикле, они должны быть выделены в отдельную страницу и вызваны с помощью do:

1.3 Do part 5 for i=1(1)100.
5.1 Type "Hello, Wikipedia!".
5.2 Type "This is JOSS.".

Как и в BASIC, любые параметры цикла for могут быть константами, переменными или другими выражениями.

Поскольку такого рода диапазоны могут быть применены к любой строке кода, можно определить ограничения и циклы при вызове программы. Например, рассмотрим программу:

1.1 Type X.

Если этот участок кода будет вызван командой Шаблон:Code (аналог Шаблон:Code в BASIC):

Do part 1.

Он выведет:

0

Однако можно изменить это поведение, добавив к вызову конструкцию цикла:

Do part 1 for i=1(1)5.
Do part 1, 5 times.

Полученный вывод будет:

1
2
3
4
5

Это позволяет создавать формулы в программах, не помещая их в циклы. Циклы, при желании, могут быть быть добавлены пользователем при запуске программы.

Выражения и предложения

Уникальной особенностью JOSS является обработка логических выражений. Большинство языков программирования позволяют формировать математические выражения из нескольких частей: например, Шаблон:Code установит в переменную x значение 9. J,OSS расширил эту концепцию, чётко определив понятие «предложение» («proposition») — выражение, которое возвращает логическое значение (истинное или ложное), вместо числового. В основном они используются в операторах Шаблон:Code, как в приведенных выше примерах, но логическое значение также можно хранить в переменныхШаблон:Sfn или преобразовывать значение true в 1, а значение false в 0 с помощью функции Шаблон:Code (значение истинности)Шаблон:Sfn.

В дополнение к предложениям в JOSS также вводит понятие «условных выражений». Они состоят из строк утверждений вместе с кодом, который выполняется, если это утверждение истинно. Это позволяет записывать многоступенчатые деревья решений в одну строку. Они служат цели, аналогичной тернарному оператору в современных языках, таких как C или Java, где они используются для возврата значения из компактной структуры, реализующей if-then-else . JOSS допускает любое количество условных выражений, так что это скорее компактный оператор switch, чем компактный if-thenШаблон:Sfn.

В этом примере воссоздается функция функции Шаблон:CodeШаблон:Sfn:

Let s(x)=[x=0:0; x>0:1; x<0:-1].

Эта строка определяет функцию «s», которая принимает один параметр «x» и последовательно выполняет три проверки. Если какая-то проверка пройдена, будет возвращено её значение, указываемое через двоеточиеШаблон:Sfn.

Диапазоны

Ещё одной продвинутой особенностью JOSS является концепция диапазона как встроенного типа, который можно хранить и которым можно манипулировать. Диапазоны обычно используются в качестве входных данных для циклов for, где они являются частью синтаксиса самого цикла. Например, в BASIC можно написать цикл for, используя этот базовый синтаксис:Шаблон:SyntaxhighlightЭта строка выполнит цикл, который присваивает значения 1, 3, 5, а затем завершается.

JOSS использует особенный формат для определения границ цикла. Эквивалентный код в JOSS будет таким:

 I=1(2)5

В этом коде нет for. Это потому, что в JOSS диапазоны являются отдельными конструкциями языка, а не частью цикла, в отличие от BASIC. Диапазоны могут быть определены и использованы во многих контекстах вне циклов. Например, вот условное выражение, вычисляющее факториал параметра xШаблон:Sfn:

Let f(x)=[x=0:1 ; fp(x)=0:prod(i=1(1)x:i)].

В этом примере есть два основных предложения, разделённых точкой с запятой. Первое (левое) утверждает, что если параметр x равен 0, условие должно немедленно вернуть 1. Если это предложение не подходит (условие ложно), вычисление переходит ко второму предложению(правому). Оно проверяет, равна ли дробная часть x нулю (то есть является ли это число целым), и если да, то вызывает функцию Шаблон:Code для умножения диапазона значений. Параметр, принимаемый в данном примере функцией Шаблон:Code, также является предложением, но в данном случае он заменяется итератором цикла, который выполняется от 1 до x с шагом 1. Если предложение истинно (а оно истинно для всех значений цикла), оно возвращает индекс i. Это приводит к отправке в Шаблон:Code ряда значений от 1 до xШаблон:Sfn.

Комбинация этих функций позволяет писать сложные функции с помощью нескольких команд. Такого рода функциональность стала распространённой только в гораздо более современных языках, которые обычно используют итераторы или функцию map для получения тех же результатов. Способность JOSS объединять решения и циклы в компактной форме отсутствовала в других языках той эпохи, включая такие ответвления, как FOCAL.

Команды

Set

Команда Шаблон:Code присваивает результаты выражения указанной переменной. Эквивалент Шаблон:Code в BASIC.

01.30 Set p=3.14156.
01.60 Set i=l*(r/100)*t.

Шаблон:Code необязательна в прямом (direct) режиме, и выражение можно записать как Шаблон:Code без команды Set. В отличие от BASIC, в JOSS необходимо всегда прописывать команду Set при работе в косвенном (indirect) режимеШаблон:Sfn.

Let

Шаблон:Code используется для определения пользовательских функцийШаблон:Sfn. Эквивалент в BASIC: Шаблон:CodeШаблон:Sfn.

Let t(x)=sin(x)/cos(x).
Set j=t(1.1).
Type j.

Шаблон:Code также может может быть использована для присвоения переменной константного значения с помощью формулы:

Let x=5.

После этого переменную можно использовать так же, как созданную с помощью Шаблон:Code . Однако есть существенная разница: когда на такую переменную ссылаются в коде, её значение (правая часть) будет вычисляться каждый раз. Шаблон:Code вычисляется только один раз, поэтому он намного быстрееШаблон:Sfn.

Обычно система предлагала использовать Шаблон:Code только в прямом (direct) режиме, сохраняя их результаты для использования в программе, вставляя их вверху или внизу файла. Это позволяло избежать многократного вызова Шаблон:Code во время выполнения, вызывая его только один раз в процессе загрузкиШаблон:Sfn.

Demand

Шаблон:Code принимает список переменных и сохраняет а них пользовательский ввод. Необязательный квалификатор Шаблон:Code добавляет пользовательское приглашение. Эквивалентно Шаблон:Code в BASIC.

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?".

Type

Команда Шаблон:Code принимает на вход несколько разделённых запятыми элементов и последовательно выводит их. В своей основной форме он эквивалентен Шаблон:Code BASIC. Однако Шаблон:Code включает в себя ряд необязательных форм, которые сильно перегружают его, выполняя ряд несвязанных задач выводаШаблон:Sfn.

При использовании для печати значений параметры могут быть переменными, литеральными строками, заключёнными в двойные кавычки, и специальным символом Шаблон:Code, выводящим перевод строкиШаблон:Sfn. Шаблон:Code также поддерживает форматированный вывод с использованием форматных строк. Подробнее см. в разделе Шаблон:Code нижеШаблон:Sfn.

Type также используется как эквивалент оператора Шаблон:Code языка BASIC, выводящего программу. Например, Шаблон:Code распечатает одну строку кода, в то время как Шаблон:Code распечатает страницу, а Шаблон:Code распечатывает всю программу целикомШаблон:Sfn.

Кроме того, его также можно использовать для печати списков внутренних значений. Шаблон:Code создает список всех переменных и их значений, а Шаблон:Code распечатывает размер программы. Список ключевых слов также включает Шаблон:Code, Шаблон:Code и Шаблон:CodeШаблон:Sfn.

Page

Шаблон:Code запускает подачу новой страницы на специальных JOSS терминалахШаблон:Sfn. JOSS обычно отправляет сигнал перевода страницы, когда терминал достигает 54-ой строки на бумаге, по этому если нужно, чтобы блок данных не был разделён, можно использовать следующую конструкциюШаблон:Sfn:

1.10 Page if $>44.

Данная конструкция сделает перенос, если номер текущей строки больше 44.

Шаблон:Code это псевдопеременная, возвращающая номер текущей строкиШаблон:Sfn.

Line

Шаблон:Code вызывает переход на новую строку на специальных терминалах JOSSШаблон:Sfn.

To

Команда Шаблон:Code переводит выполнение программы на указанную страницу или шаг, используя Шаблон:Code или Шаблон:Code соответственноШаблон:Sfn. Является эквивалентом команды Шаблон:Code в BASIC.

01.01 Demand A as "TYPE A NUMBER".
01.05 To step 1.01.
01.10 To part 1.

Do

Шаблон:Code похож на Шаблон:Code, но Шаблон:Code вызывает подпрограмму. Как и в случае с To, можно использовать Шаблон:Code и Шаблон:Code для вызова конкретной страницы или конкретного шага соответственно. Если в качестве аргумента указан шаг, выполнится конкретна эта строка, после чего управление передаётся коду, следующему за командой Do. Если в качестве аргумента передана страница, выполнение начинается с первой строки страницы и продолжается до тех пор, пока не будет достигнут конец страницы или не встретится оператор Done, после чего управление, как и в случае с шагом, передаётся команде, следующей за командой Do

01.15 Do step 7.24.
01.16 Do part 8.

У Шаблон:Code есть специальная короткая форма для выполнения подпрограммы несколько раз. При этом используется модификатор times вместо обычного for в случае простых циклов. Таким образом, следующие строки эквивалентныШаблон:Sfn:

Do part 1 for i=1(1)5.
Do part 1, 5 times.

JOSS поддерживает указатель на текущую исполняемую строку (счётчик команд), который изменяет команда Шаблон:Code Однако есть специальная «скобочная» версия, которую можно использовать в прямом (direct) режиме для проверки определённых участков кода без изменения основного указателя. Например, если программа остановилась из-за ошибки и неясно, какой раздел вызвал проблему, можно протестировать конкретную подпрограмму с помощьюШаблон:Sfn:

 (Do part 2.)

Последующий вызов Шаблон:Code вернёт основной указатель команд.

Done

Команда Шаблон:Code возвращает управление из подпрограммы. Шаблон:Code используется только для раннего возврата и часто используется с условным выражением, поскольку подпрограммы возвращают управление автоматически, когда достигнут конец страницы. Эквивалент Шаблон:Code в BASIC.

*Routine to ask the user for a positive value and repeat until it gets one
01.10 Demand X as "Enter a positive value greater than zero".
01.20 Done if X>0.
01.30 To step 1.1

Stop

Команда Шаблон:Code завершает выполнение программы и возвращает управление среде редактирования. Эквивалентен Шаблон:Code в BASIC. Команда Шаблон:Code в BASIC предназначена для возможности продолжения выполнения программы с того же места с помощью команды Шаблон:Code. В системе JOSS, ориентированной на рабочее пространство, отсутствует прямой эквивалент команды Шаблон:Code из BASIC .

01.10 Type X.
01.20 Stop.

Go

Доступна только в прямом (direct) режиме. Вызов Шаблон:Code эквивалентен вызову Шаблон:Code и Шаблон:Code в BASIC в зависимости от того, остановлена ли программа в данный момент из-за ошибки или команды Шаблон:Code Шаблон:Sfn.

Cancel

Доступна только в прямом (direct) режиме, Шаблон:Code, используется, когда программа остановлена из-за ошибки, и пользователь хочет сбросить программу. Шаблон:Code очищает cчётчик команд . Обычно Шаблон:Code продолжает выполнение программы, но использование Шаблон:Code заставляет Шаблон:Code начинать программу сначалаШаблон:Sfn.

Если выполнение было приостановлено во время выполнения Шаблон:Code, можно выполнить команду Cancel в скобках Шаблон:Code, чтобы сбросить только это подвыполнение и вернуть счётчик основной счётчик команд (см команду Do). Тогда вызов Шаблон:Code продолжит выполнение с того места, на котором была остановлена программа до выполнения Шаблон:Code.

Math

JOSS хранит все числа в формате radix-10 с плавающей запятойШаблон:Sfn.

JOSS содержит шесть математических операторовШаблон:Sfn:

Математические выражения могут использовать () и [] взаимозаменяемо в соответствующих парах для установления приоритета. Например:

  1.30 Set A=|-10·[5+1]·(1+5)|.

Запишет в переменную A значение 360Шаблон:Sfn.

Функции

Язык содержит следующие встроенные функции:

Math

Boolean

  • Шаблон:Code — возвращает 1 если аргумент истинен и 0 в противном случае

Циклические функции

В JOSS также определён ряд функций, чтобы программисту не приходилось писать цикл Шаблон:Code для выполнения простых задач, таких как суммирование ряда чисел. Параметрами могут быть либо список простых выражений, разделённых запятыми, либо конструкция диапазона, командой которой может быть любой оператор или вызов функции.

  • Шаблон:Code — Максимальное значение среди введённых выражений
  • Шаблон:Code — Минимальное значение среди введённых выражений
  • Шаблон:Code — Сумма всех введённых выражений
  • Шаблон:Code — Произведение всех введённых выражений
  • Шаблон:Code — Первый элемент из списка значений, удовлетворяющий условиям

Управление файлами

Система JOSS хранила пользовательские программы в выделенном пространстве на жестком диске. В этом пространстве можно было хранить несколько файлов. Имя файла было составным и состояло из целого числа и пятибуквенного имени в круглых скобках, например, Шаблон:Code . Целая часть является эквивалентом каталога, а имя — название файла внутри него, поддерживаемым самой JOSSШаблон:Sfn.

Файлы записываются конструкцией Шаблон:Code и загружаются конструкцией Шаблон:Code. Также можно прочитать или сохранить конкретные части рабочей области, например, Шаблон:Code для сохранения одной процедуры (страницы) в файлШаблон:Sfn. Кроме того, с помощью конструкции Шаблон:Code можно было установить файл по умолчанию, на который ссылались все ссылки. Файлы можно было удалить с помощью Шаблон:CodeШаблон:Sfn.

1.1 Demand p,q.
1.2 Stop if q<0 or r(q,2)=0.
1.3 Set a=1.
1.4 Do part 2 while q>1 and a≠0.
1.5 Type a in form 3.
1.6 Stop.

2.1  Do part 20.
2.1  Do part 11 if p<0.
2.2  Do part 12 if p≥q.
2.3  Do part 13 if p=0.
2.4  Done if a=0.
2.5  Set p=p/4 while r(p,4)=0.
2.6  Do part 14 if r(p,2)=0.
2.7  Do part 20.
2.8  Set a=-a if r(p,4)=r(q,4)=3.
2.9  Set s=p, p=q, q=s.
2.95 Do part 20.

11.1 Set a=-a if r(q,4)=3.
11.2 Set p=|p|.
11.3 Do part 20.

12.1 Set p=r(p,q).
12.2 Do part 20.

13.1 Set a=0, p=1, q=1.

14.1 Set a=-a if r(q,8)=3 or r(q,8)=5.
14.2 Set p=p/2.

20.1 Type p, q in form 1 if a=1.
20.2 Type p, q in form 2 if a=-1.

Form 1: "  L(%.0f,%.0f)  ="
Form 2: "  -L(%.0f,%.0f)  ="
Form 3: "  %.0f\n"

Обратите внимание, что это не оригинальный пример, а код для современного симулятора. Есть некоторые синтаксические отличия от оригинального языка JOSS.

Примечания

Шаблон:Примечания

Литература

Шаблон:Языки программирования