FOCAL - это интерактивный интерпретируемый язык программирования, основанный на JOSS и в основном используемый на машинах серии PDP Digital Equipment Corporation (DEC) . Название является аббревиатурой F ormulating О н-линии C alculations в A lgebraic L anguage, [1] или для FO rmula CAL culator. [2]
Разработчик | Ричард Меррилл, DEC |
---|---|
Впервые появился | 1968 |
Под влиянием | |
JOSS | |
Под влиянием | |
БАЗОВЫЙ-ПЛЮС |
FOCAL очень похож на JOSS с точки зрения поддерживаемых команд и общего синтаксиса языка. Он отличается тем, что многие расширенные функции JOSS, такие как диапазоны и пользовательские функции, были удалены для упрощения синтаксического анализатора. Некоторые ключевые слова были переименованы, поэтому все они начинаются с уникальной первой буквы. Это позволяет пользователям вводить программы, используя односимвольные операторы, что еще больше снижает потребность в памяти. Это было важным соображением для PDP-8 , которое часто ограничивалось несколькими килобайтами (КБ).
Подобно JOSS и более поздним версиям BASIC , FOCAL на PDP-8 представлял собой законченную среду, включающую строковый редактор, интерпретатор и процедуры ввода / вывода. Пакет в целом назывался FOCAL-8 , он также работал на PDP-5 и PDP-12 . Когда перенесен на PDP-11 , полученный в результате Focal-11 опиралась на базовой операционной системы , РТ-11 , чтобы обеспечить поддержку файлов и редактирования. Определение языка обновлялось дважды, до FOCAL-69 и до FOCAL-71 с очень незначительными изменениями . Также был доступен порт для Intel 8080 .
FOCAL известен как язык, на котором были написаны оригинальные версии ранних видеоигр Hamurabi и Lunar Lander . Позже оба были перенесены на BASIC, где стали намного более известными. [3] FOCAL не пользовался популярностью за пределами платформы PDP и в значительной степени исчез во время перехода на VAX-11 . Он получил сильное возрождение в Советском Союзе, где клоны PDP-11 использовались в качестве учебных и домашних компьютеров .
История
JOSS
JOSS был выпущен в мае 1963 года на одноразовом компьютере JOHNNIAC корпорации RAND . Использование в RAND быстро росло, и машина, первоначально построенная в 1953 году, быстро исчерпала свои возможности. JOHNNIAC был выведен из эксплуатации в 1966 году, а JOSS был заменен на недавно приобретенную PDP-6 , первую «большую» машину Digital Equipment Corporation (DEC). Количество пользователей продолжало расти, и к 1970 году система использовалась от 500 до 600 пользователей по всей стране и породила ряд инноваций, таких как мобильные компьютерные терминалы, которые можно было перемещать из комнаты в комнату и подключать для мгновенного доступа. [4]
JOSS был очень влиятельным. Это появилось как раз тогда, когда вводили разделение времени . Был значительный интерес к человеко-машинному взаимодействию, и компьютеры получили более широкое распространение. В то время как большинство таймшер- операционных систем того времени концентрировались на учетных записях пользователей и управлении файлами, предоставляя пользователям возможность самостоятельно программировать, JOSS предоставил редактирование файлов и язык программирования в одном пакете. RAND продемонстрировал систему параду специалистов отрасли. [4]
ФОКУСНЫЙ
PDP-6 был первым мэйнфреймом DEC , и JOSS в полной мере использовал его мощность и объем памяти. Написанный Ричардом Мерриллом , FOCAL удалил функции из JOSS по мере необходимости, чтобы иметь возможность работать в гораздо более ограниченном пространстве памяти PDP-8 и других 12-битных машин в линейке DEC. Чтобы добиться этого, было внесено серьезное изменение, направленное на уменьшение количества временных данных или « состояния », необходимых для синтаксического анализа операторов. Одним из заметных последствий этого решения было то, что условные выражения можно было использовать только для ветвей , в отличие от JOSS, где условные выражения можно применять к любому оператору.
Другое заметное изменение заключалось в перестановке ключевых слов так, чтобы каждое начиналось с уникальной буквы. Это упростило синтаксический анализатор , который должен был читать только первую букву команды в строке кода, а затем мог перейти к следующему символу пробела . Затем он сравнивает это с внутренним списком возможных ключевых слов, который состоит из одного символа для каждой записи. Напротив, JOSS пришлось продолжить чтение, пока он не прочитал все командное слово, а затем сравнил его со списком, содержащим полные слова. Это изменение не только сэкономило память в анализаторе, но и пользователи могли сэкономить память, введя только эту букву, уменьшив размер исходного кода .
Первая версия FOCAL была выпущена в 1968 году для PDP-8 . В следующем году последовала обновленная версия, которая позже была известна как FOCAL-69. Система в целом, независимо от версии, была известна как FOCAL-8, когда она была перенесена на другие машины в 12-битной серии, включая PDP-5 и PDP-12 . Он был популярен, поскольку был очень эффективным с точки зрения использования памяти, которое на этих машинах часто сильно ограничивалось несколькими килобайтами (КБ). Аналогичный FOCAL-11 работал на PDP-11 под RT-11 .
Процессорная технология также предложена версия 8k FOCAL, в комплекте с Lunar Lander, для Intel 8080 -На Altair 8800 системы. Это было предусмотрено для платы за копирование ленты, в то время как исходный код был предоставлен бесплатно с другими покупками. [5]
БАЗОВЫЙ
В то время как FOCAL становился популярным на машинах DEC, BASIC становился все более популярной альтернативой на других платформах. К концу 1960-х годов ряд компаний вторглись в оплот миникомпьютеров DEC, продавая аналогичные машины, работающие с версиями BASIC с разделением времени. Среди них выделялась серия HP 2100 , работающая под управлением HP Time-Shared BASIC . [6]
Дэвид Х. Аль недавно присоединился к группе PDP-8 DEC, когда компания заинтересовалась продажей машины в образовательных учреждениях. Из-за популярности BASIC на образовательном рынке, особенно с растущей библиотекой программ BASIC от Консорциума образовательных вычислений Миннесоты , Аль обнаружил, что продавать машину с FOCAL было сложно, несмотря на его преимущества. [6] Как он позже заметил:
- Язык FOCAL DEC был равен BASIC во многих аспектах и даже лучше в некоторых, но у него был один огромный недостаток: DEC не желала лицензировать его другим производителям компьютеров. FOCAL вела тяжелую битву против BASIC, который был доступен на компьютерах GE, Honeywell, HP и других.
Думаю, дело дошло до Sony и Betamax. Sony заявила: «Betamax - наш, и это лучший формат, чем VHS», что так и было. Но затем JVC сказал: «У нас есть VHS и Toshiba. Эй, вы хотите его использовать? Хорошо, мы предоставим вам лицензию на это почти бесплатно». [6]
Аль взял на себя создание системы BASIC для платформы, наняв компанию, которая, как он позже узнал, была единственным программистом в Бруклине, для производства версии для PDP-8 мощностью 4 кВт. DEC начала продавать упакованные версии PDP-8 с терминалами и BASIC в виде линейки «EduSystem», причем более крупные системы этой серии имеют расширенные версии BASIC, а в некоторых случаях также FOCAL и FORTRAN . Также были созданы некоторые системы EduSystems на основе PDP-11. [7]
Затем Аль начал портировать программы с FOCAL на BASIC, в частности, The Sumer Game (которую он переименовал в Hamurabi ), версию Lunar Lander и ряд небольших демонстраций FOCAL. Объединив свои порты с материалами, полученными от внешних программистов, ему удалось собрать достаточно материала, чтобы в 1973 году DEC опубликовала 101 BASIC Computer Games . Книга имела немедленный успех и в конечном итоге выдержала три тиража до 1975 года [8] [6]
К середине 1970-х годов BASIC был стандартной функцией всех машин DEC, и использование FOCAL прекратилось. [8]
Возрождение в Советском Союзе
PDP-11 был клонирован в Советском Союзе в 1970-х годах для военных целей. В 1980-х годах были произведены однокристальные вариации, похожие на LSI-11, которые дали начало серии домашних компьютеров, совместимых с PDP-11 . Наиболее заметный среди нескольких моделей были Electronika ОК серии, выпущенная в 1985 году Они были изначально поставляются с фокусным на картридже ROM , [9] в то время как BASIC картридж был необязательное дополнение. Более поздние модели по умолчанию поставлялись с BASIC. [10]
Язык
Следующее описание основано на FOCAL-69, как показано в справочном руководстве по языку FOCAL-8. [11]
Прямой и косвенный режимы
FOCAL следовал модели JOSS для взаимодействия через интерфейс командной строки . Это позволяло пользователям вводить команды в «прямом режиме», которые выполнялись немедленно, или ставить перед ними префикс с номером строки, и в этом случае они были добавлены в программу, если они были уникальными, или заменяли существующий код, если тот же номер имел ранее использовался. [12]
Метод работы аналогичен «немедленному режиму» и «программному режиму» BASIC. Это контрастирует с JOSS, в котором все команды, как программные, так и прямые, сохранялись и загружались как часть рабочего пространства пользователя. Это позволило JOSS иметь команды без номеров строк, которые они использовали для Form
определений и других задач. FOCAL не обладал этой возможностью, поэтому те инструкции, которые необходимо было загрузить и сохранить, стали опциями для других команд программного режима, таких как Type
. [12]
Операторы программы
Каждая строка в программе FOCAL должна начинаться с номера строки. Как и в случае с JOSS, номера строк представляют собой числа с фиксированной точкой, состоящие из двух двузначных целых чисел, разделенных точкой. В FOCAL-8 допустимые номера строк находятся в диапазоне от 1.01 до 31.99. При распечатке с использованием WRITE
FOCAL, эквивалентного BASIC LIST
, начальные нули будут добавлены, чтобы все номера строк были выровнены. Это означает, что все номера строк будут состоять из пяти символов, включая точку; 1.10 будет напечатан как 01.10
. Заявления , относящиеся к этим линиям не нужны ведущие нули, например, GOTO 1.10
. [13]
Число слева от точки известно как "номер группы". Группы обеспечивают некоторый уровень организации кода, который отсутствует в таких языках, как Fortran или BASIC. Основное их использование заключалось в использовании группы в качестве подпрограммы, которая может быть вызвана DO
, например, DO 5
для перехода к подпрограмме, записанной в группе 5. Редактор также использовал их во время редактирования, например, можно WRITE 2
было создать список кода в группе 2 или ERASE 4
удалить все строки в группе 4. [13]
Каждая строка должна начинаться с ключевого слова команды, следующего за номером строки. [13] Не существует концепции «команды по умолчанию», как в случае с BASIC с его необязательным LET
оператором. В одной строке можно разместить несколько операторов, разделенных точкой с запятой. Обычно поведение ничем не отличается от поведения, если бы операторы были на отдельных строках, за исключением циклов FOR. [14]
Команды
СПРОСИТЬ
Команда ASK
(сокращение A) принимает список строк и переменных, выводит строки и сохраняет введенные пользователем данные в переменных. [15] Эквивалент BASIC INPUT
.
01.01 СПРОСИТЕ "ИМЯ", ИМЯ01.02 СПРОСИТЕ «КООРДИНАТЫ», X, Y01.03 СПРОСИТЕ "A1", A1, "OMEGA", W, "T0", T0, "DAMPING FACTOR", DAMPINGFACTOR.
Если пользователь не вводит число, а вводит текст, система преобразует начальный символ в число с «A» = 1, «B» = 2 и т. Д.
КОММЕНТАРИЙ
Команда COMMENT
(сокращение C) создает примечание. [16] Эквивалент BASIC REM
.
01.01 КОММЕНТАРИЙ: ЛЕТНЯЯ ИГРА, РИЧАРД МЕРРИЛЛ
ДЕЛАТЬ
Команда DO
(сокращение D) выполняет переход к подпрограмме. Это эквивалент BASIC GOSUB
. На подпрограмму ссылаются либо по номеру группы, либо по номеру строки. Если указан номер строки, эта единственная строка запускается, а затем возвращается к оператору после DO
. Если номер строки не указан, выполнение начинается с первой строки блока и продолжается до тех пор, пока не будет достигнут конец блока или не RETURN
будет обнаружено a . RETURN
требуется только для досрочного возвращения из группы, в конце группы это не требуется. [17]
01.15 DO 7.2401.16 DO 8
ДЛЯ
Команда FOR
(сокращение F) реализует цикл for . Когда указаны три аргумента, первый - это начальное значение переменной цикла, второй - приращение, а третье значение - это конечное значение для цикла. Если предоставлены два значения, первое - это начальное значение, а второе - конечное значение, а приращение устанавливается на 1.
В отличие от других частей языка, где несколько операторов в строке независимы, FOR
всегда запускает операторы, которые следуют за ним в строке до того, как будет выполнено завершение, а затем переходит к следующей строке. Таким образом, циклы должны находиться в одной строке или, наоборот, вызывать подпрограмму с помощью DO
. Нет эквивалента BASIC NEXT
. [14]
01.01 ДЛЯ X = 1,10; ТИП X ,!01.02 ДЛЯ X = 0,10,100; ДЕЛАЙ 2
Пример цикла FOR:
01.10 СПРОСИТЕ «СКОЛЬКО ДЕНЕГ ВЫ ХОТИТЕ ЗАЙМИТЬ?», ГЛАВНЫЙ01.20 СПРОСИТЕ «СКОЛЬКО ЛЕТ?», СРОК01.30 ДЛЯ СТАВКИ = 4.0, .5,10; DO 2.001.40 ВЫЙТИ02.10 УСТАНОВИТЬ ПРОЦЕНТ = ОСНОВНОЙ * (СТАВКА / 100) * СРОК02.20 ТИП «СТАВКА», СТАВКА, «», «ПРОЦЕНТЫ», ПРОЦЕНТЫ ,!
ПЕРЕЙТИ К
Команда GOTO
(сокращение G) переводит выполнение программы на указанный номер строки. [17] Он идентичен одноименной инструкции в BASIC. В FOCAL GOTO
также используется для начала выполнения, как и в BASIC RUN
, но в этом случае документация ссылается на него как на, GO
а не GOTO
на то, что основная команда одинакова.
01.05 GOTO 1.0102.90 ТИП !!, «ПОПРОБУЙТЕ СНОВА.», !!!!!; НАЙТИ 1.1
ЕСЛИ
Команда IF
(сокращение I) обеспечивает условный переход на основе знака выражения. После числового выражения команда IF может занимать от одного до трех номеров строк. Если выражение меньше нуля, выполнение переходит к номеру первой строки; если равно нулю, то ко второму номеру строки; если больше нуля, до третьего номера строки. В языке отсутствовали относительные операторы, такие как больше, равно или меньше. Для перехода, если X> 5, нужно сравнить X - 5. [18]
02.20 IF (25-25) 2.4,2.3,2.403.01 ЕСЛИ (X) 3.1,3.02,3.1
IF можно сократить, поместив точку с запятой (или конец строки) после номера первой строки. Например:
02.20 IF (X) 1.8; ТИП "Q"02.30 IF (X) 1.8,2.5002.40 ТИП "П"
В этом случае тест на 2.20 заставит программу перейти к строке 1.8, если тест отрицательный, в противном случае она продолжит и наберет «Q» в консоли. Строка 2.30 перейдет к 1,8 или 2,5, если значение отрицательное или нулевое, и в противном случае продолжит вводить «P» в консоль. [18]
ПОКИДАТЬ
Команда QUIT
(сокращение Q) завершает выполнение программы и возвращает управление среде редактирования. [16] Эквивалент BASIC STOP
или END
.
01.10 ДЛЯ X = -10,1,10; ТИП X01.20 ВЫЙТИ
ВОЗВРАЩАТЬСЯ
Команда RETURN
(сокращение R) выполняет переход от подпрограммы обратно к месту вызова. [16] Использование RETURN
необязательно в последней строке подпрограммы, подпрограмма в любом случае возвращается на последней строке в группе. Ниже приведен пример подпрограммы для преобразования запроса «да / нет» в значение. [1]
22.78 КОММЕНТАРИЙ: «ДА ИЛИ НЕТ» ПОДПРОГРАММА22.80 СПРОСИТЕ «ОТВЕТИТЕ ДА ИЛИ НЕТ?», AN22,82 ЕСЛИ (АН-0ДА) 22,84,22,8622,84 ИФ (АН-0НО) 22,8,22,88,22,822,86 УСТАНОВИТЬ X = 2; ВОЗВРАТ22,88 УСТАНОВИТЬ X = 1; ВОЗВРАТ
НАБОР
Команда SET
(сокращение S) присваивает результаты выражения указанной переменной. [19] Эквивалент BASIC LET
.
01.30 УСТАНОВИТЬ PI = 3,1415601.60 УСТАНОВИТЬ ПРОЦЕНТ = ОСНОВНОЙ * (СТАВКА / 100) * СРОК
ТИП
Команда TYPE
(сокращение T) обеспечивает вывод одного или нескольких элементов, разделенных запятыми. [20] Эквивалент BASIC PRINT
.
Элементы могут быть переменными, буквальными строками, заключенными в двойные кавычки, или различными управляющими символами. Управляющие символы включают символы !
для вывода возврата каретки и перевода строки, только #
для возврата каретки и :
для символа табуляции. Управляющие символы могут быть объединены вместе, например, !!!
будут выводиться три CR / LF без необходимости разделять их запятыми. [15]
ТИП [НОМЕРА, E1, "ТЕКСТ",!, #,:, $ OR%] ... ВЫВОД01.10 ТИП «ПРИВЕТ, ПРИЯТНЫЙ ВИД. СКОЛЬКО ДЕНЕГ ВЫ ХОТИТЕ ЗАЙТИ?» ,!01.50 ТИП "ИНТЕРЕС", ПРОЦЕНТ ,!01.80 ТИП «ПРОЦЕНТ НА», СРОК, «ЛЕТ»,!, «ЕСТЬ», ПРОЦЕНТ, «ДОЛЛАРЫ.», !!01.90 ТИП «НЬЮ-ЙОРК», !, «ВАШИНГТОН», !, «АТЛАНТА»,!, «ДАЛЛАС» ,!02.10 ТИП "X", X, "", "X ^ 2", X ^ 2, "", "SQRT", FSQT (X)03.20 ТИП ".", #02.20 ТИП !!!!!
TYPE
также включен необязательный спецификатор формата, указанный с помощью формата %x.yz
, где x - количество цифр слева от десятичной дроби, а yz - количество цифр справа от точки. Формат по умолчанию: %8.4
максимум восемь цифр и четыре справа от точки. [21] Так, например:
УСТАНОВИТЬ A = 67823ТИП% 6.01, A= 67823,0ТИП% 5, A= 67823ТИП% 8.03, A= 67823,000НАБЕРИТЕ "А= 6.7823E4
Обратите внимание на дополнительные начальные пробелы в некоторых примерах, заполняющие всю заданную ширину. Использование только% приводило к тому, что вывод выводился в «формате с плавающей запятой» с использованием E. [22]
Это был специальный управляющий символ, $
который приводил к печати таблицы всех определенных переменных и их значений. Будут напечатаны только первые две буквы имени, при необходимости дополненные нулем. Элементы массивов печатаются на отдельных строках, а переменные, содержащие только один элемент, будут проиндексированы (00). Например: [23]
ТИП $A0 (00) = 67823
Переменные
Имена переменных могут начинаться с любой буквы, кроме F (F зарезервировано для функций), и могут содержать любую последовательность букв и цифр. Однако важны только первые два символа. Например, следующий пример кода из FOCAL: A New Conversational Language [24] ссылается на ту же переменную, что и DESTINATION, а затем DES. Внутри обе ссылки относятся к переменной с именем DE:
01.80 СПРОСИТЬ НАЗНАЧЕНИЕ02.30 IF (DES-14) 2.4,3.1,2.4
Любая переменная может рассматриваться как массив, допускающий индексы от -2048 до 2047. [2]
Математика
FOCAL-69 содержал пять математических операторов: [25]
^
для экспонент - показатель преобразуется в 12-битное целое число*
для умножения/
для разделения+
для дополнения-
для вычитания
Одним из любопытных фактов FOCAL было то, что все операторы имели независимый приоритет, как в указанном выше порядке. Это означает, что формула SET T=2-3+1
будет вычислена в порядке 2- (3 + 1) и, таким образом, даст -2. Это сильно отличалось от большинства языков, где + и - имели равный приоритет и оценивались (2-3) +1 для получения 0. [25] Это может вызвать небольшие ошибки при преобразовании исходного кода FOCAL в другие системы.
FOCAL был необычен тем, что математические выражения могли использовать (), [] и <> взаимозаменяемо в совпадающих парах для установления приоритета. [25] Например, допустимым выражением является следующее:
01.30 НАБОР A = <10 * [5 + 1] * (1 + 5)>
Все они имеют одинаковый уровень приоритета и читаются слева направо на одном уровне, поэтому этот оператор будет вычислен [], затем (), затем <>, чтобы получить 360. [25]
Язык содержит следующие встроенные функции: [26]
FABS()
- Абсолютная величинаFATN()
- АрктангенсFCOS()
- Косинус аргумента в радианахFEXP()
- Естественное основание для силы аргументацииFITR()
- Целая часть аргументаFLOG()
- Наперин бревноFRAN()
- Случайное числоFSGN()
- Признак аргумента; FSGN (0) = 1 в FOCAL-69, но FSGN (0) = 0 в FOCAL-71, а также в более поздних версияхFSIN()
- Синус угла в радианахFSQT()
- Квадратный корень
Прочие функции
FOCAL также включает ряд специальных функций: [27]
FDIS
взял два значения и нанес точку на экране графических терминаловFADC
считывает значение с пронумерованного аналогового входа и возвращает целочисленное значение
Команды среды
Запуск программ
FOCAL используется GOTO
в редакторе для запуска программы. Однако практическое правило заключалось в том, чтобы сократить это до GO
. Это эквивалент RUN
в BASIC. GOTO
также может использоваться в редакторе для запуска выполнения с указанной строки.
Команды редактирования
Новые строки вводятся в программу простым началом команды с номера строки. Команды редактирования: ERASE (сокращение E), [25] MODIFY (сокращение M) [28] и WRITE (сокращение W): [15]
ERASE
- обнуляет все переменные. это иногда можно найти в программах для их сбросаERASE line number
- удаляет оператор в указанной строкеERASE group number
- удаляет все операторы в указанной группеERASE ALL
- удаляет всю программуMODIFY line number
- позволяет программисту редактировать указанную строкуWRITE line number
- отображать выписку в указанной строкеWRITE group number
- отображать все заявления в указанной группеWRITE ALL
- отобразить указанную программу
Файловые команды
Команда файла была ОТКРЫТА (сокращение O):
OPEN INPUT [device:][file][,ECHO]
- подготовиться к чтению с начала файлаOPEN OUTPUT [device:][file][,ECHO]
- подготовиться к записи с начала файлаOPEN RESTORE INPUT[,ECHO]
- возобновить вводOPEN RESTORE OUTPUT[,ECHO]
- возобновить выводOUTPUT CLOSE
- вывести буфер и закрыть файл
Команды библиотеки
FOCAL включает возможность управления коллекциями программ FOCAL в виде библиотеки кода. Программы могут вызывать другие программы по цепочке с помощью LIBRARY CALL
или вызывать одну подпрограмму в другой программе с помощью LIBRARY GOSUB
. Имена программ могут состоять из шести символов. Команда БИБЛИОТЕКА (сокращение L) имела следующие подкоманды:
LIBRARY DELETE [device:]program name
- удалить программуLIBRARY LIST [device:][file name]
- каталогLIBRARY RUN [device:]program name [line number]
- связать программу с возможностью возобновления с указанного номера строкиLIBRARY SAVE [device:]program name
- сохранить программуLIBRARY EXIT
- вернуться в программу монитора PDP-8
FOCAL-71 добавил:
LIBRARY CALL [device:]program name
- загрузить программуLIBRARY GOSUB [device:]program name [group number]
- вызвать подпрограмму во внешней программе
Коды ошибок
Поскольку интерпретатору не хватало места в памяти для хранения сообщений об ошибках или даже таблицы номеров ошибок, FOCAL использовал обходной путь, сообщая адрес кода обнаружения ошибок в виде числа с фиксированной запятой. Например, была обнаружена ошибка деления на ноль, и он сообщит ?28.73 @ 01.10
, где 28,73 представляет собой проверку кода для этой ошибки на странице памяти 28 плюс смещение в 73 слова, а 01,10 - это номер строки, в которой произошла ошибка. Страницы в PDP-8 имели длину 128 байт, поэтому этот адрес соответствует адресу 3657.
Изменения между версиями
DEC выпустила три версии FOCAL для серии PDP-8, оригинальную, известную просто как FOCAL, и две обновленные версии, FOCAL, 1969 и FOCAL, 1971. FOCAL, 1969 был во многом идентичен оригиналу, но FOCAL, 1971 был крупным обновлением, добавившим обработку файлов, новую математику и множество других изменений. В отличие от первых двух версий, которые были автономными системами, FOCAL, 1971 был основан на развивающейся OS / 8 (тогда еще известной как PS / 8) и больше полагался на эту операционную систему для обработки и редактирования файлов.
ФОКАЛЬНЫЙ, 1971
Одним из изменений в новой версии стал 10-значный математический пакет для повышения точности. FSGN
Функция Теперь возвращается к нулю , если выражение входного оценивается в ноль. Раньше это возвращало бы один. FRAN
Теперь используется лучший алгоритм , который произвел более случайным образом распределенных чисел. Он также добавил новую FIN
функцию, которая принимает строку и возвращает ее значение ASCII (аналогично BASIC ASC
), а также FOUT
принимает число и возвращает строку с этим символом ASCII ( CHR
).
Поскольку все эти параметры занимали ограниченную память, при запуске FOCAL, 1971 открывал диалоговое окно, в котором спрашивалось у пользователя, какие функции они хотели бы использовать.
Сравнение с JOSS
FOCAL - это, по сути, очищенная версия JOSS с изменениями, которые делают синтаксис более лаконичным и более легким для анализа. Практически все команды FOCAL имеют однозначное соответствие с JOSS и отличаются только деталями. Некоторые функции JOSS отсутствовали в FOCAL.
Одно из основных отличий состоит в том, что JOSS включает полный набор операций сравнения и систему логической логики , которая работает в конструкциях if и for. Кроме того, if и циклы могут быть применены к любому оператору, в отличие от FOCAL, где единственная операция, которую можно было выполнить, была эквивалентна goto. Например, в JOSS можно:
1.10 Введите A, если X> 10. 1.20 Тип i для i = 1 (1) 10.
Первая строка необязательно печатает A на основе значения X, а вторая печатает числа от 1 до 10. Напротив, FOCAL не имеет возможности сравнивать значения, и циклы применялись путем перехода к следующей строке, когда они завершались. Эквивалентный код в FOCAL будет:
1,10 IF (X-10) ,, 1,301.20 ТИП А!1,30 ДЛЯ I = 1,1,10; ТИП I ,!
Реализация JOSS упрощает создание общих конструкций и более точно соответствует намерениям программиста за счет усложнения среды выполнения. Например, JOSS позволяет гибко описывать диапазоны в циклах, например 1,2,3,10 (5) 50,75,78. За эту гибкость приходится платить; в FOCAL начало, остановка и шаг могут быть записаны в настраиваемой структуре в памяти и легко обновлены по мере выполнения цикла, тогда как JOSS требует, чтобы он переоценивал выражение, которое может быть, но часто не является более сложным.
Что касается сокращения кода, то изменения были относительно незначительными. Например, JOSS Do part 20.
становится немного меньшим FOCAL DO 20
, а Do step 20.1
становится DO 20.1
. Ключевые слова команды также укорачиваются , где это возможно, так JOSS» Demand
становится фокальными - х ASK
, как сделать его короче, а также позволяет буква D , чтобы быть однозначно использован для DO
. Точка, необходимая для обозначения конца строки в JOSS, была удалена.
Чтобы упростить синтаксический анализатор, некоторые параметры FOCAL были удалены. Например, JOSS может выполнять несколько заданий с в Set S=P, P=Q, Q=S.
то время как в FOCAL они должны были быть сделаны отдельные заявления, SET S=P; SET P=Q; SET Q=S
. Точно так же JOSS Form
, используемый для форматирования вывода, был объединен в FOCAL TYPE
с расширением %
.
Сравнение с BASIC
Сравнения между FOCAL и BASIC были неизбежны, поскольку оба языка были распространены на миникомпьютерах одной эпохи, и эти два языка имеют много общего с точки зрения синтаксиса и структуры. В большинстве случаев происходит прямое преобразование кода FOCAL в BASIC и обратно. Например, чтобы попросить пользователя ввести значение, в FOCAL нужно:
СПРОСИТЕ «Сколько тебе лет?», ВОЗРАСТ
в то время как в BASIC эквивалент:
ВВОД «Сколько тебе лет?», ВОЗРАСТ
За исключением нескольких функций, которые отсутствовали в одном или другом, и некоторых относительно незначительных различий в синтаксисе, эти два языка очень похожи.
Одним примечательным исключением является IF
BASIC, который позволяет размещать любой оператор после THEN
символа, что делает его более похожим на управляющие структуры JOSS. BASIC изменил порядок кода по сравнению с JOSS, поместив условное выражение в начало строки, а не в конец; в BASIC используется, IF this THEN that
тогда как используется FOCAL that IF this
, как в JOSS. Версия BASIC имеет то преимущество, что среда выполнения может немедленно прервать чтение остальной части оператора, если выражение не было истинным. В отличие от этого , FOCAL - х IF
было больше похоже на BASIC в вычисленной Гото , ON X GOTO 10,20,30
, но ON...GOTO
разрешено любое количество строк в качестве мишеней, в отличие от только три для отрицательного, нулевого и положительным , как в JOSS и FOCAL.
Еще одно важное различие между ними заключается в том, что FOCAL не имеет встроенной поддержки строк как элементов данных, которые могут быть присвоены переменным. Как и в ранних версиях BASIC или FORTRAN до добавления строк (в F77), этого ограничения обычно избегали за счет использования буквальных строк в командах ввода и вывода. Это стало серьезной проблемой только тогда, когда нужно было манипулировать отдельными строками или символами внутри них.
Поскольку строковые переменные не поддерживались, при вводе строки использовался кладж , преобразующий любые символы, введенные пользователем, в их числовые символьные значения. Например, если ввести «HELLO» в операторе ввода, FOCAL преобразует H в «8», числовое значение «H» в шестибитных кодах символов PDP-8 («H» - восьмая буква) . Затем он будет интерпретировать «E» как начало экспоненты, затем он попытается вычислить «8» в степени «LLO», что займет несколько секунд процессорного времени и приведет к значению 0,76593020E + 103, а не к особенно полезный ответ. Тем не менее, задавая вопросы, на которые можно было бы ответить с помощью однобуквенных ответов, например Do you need instructions, Y or N"
, программисты могли проверить результат по известным значениям символов, чтобы получить то, что выглядело как ввод символов.
Реализация FOCAL PDP-8 использовала представление с плавающей запятой, которое представляло числа как четыре 12-битных слова, всего 48 бит, с тридцатью шестью битами мантиссы и двенадцатью битами экспоненты. Это обеспечило как значительно более высокую точность, так и значительно более широкий диапазон значений, чем у большинства современных интерпретаторов, что сделало FOCAL разумным выбором для серьезной числовой работы. Такая высокая точность и хороший выбор форматирования вывода десятичных чисел по умолчанию означали, что трудности с округлением двоичных чисел в десятичные не были очевидны для начинающих пользователей. Для сравнения, Microsoft BASIC изначально использовал 32-битный формат , в то время как более поздние версии расширили его до 40-битного. У большинства BASIC были проблемы с округлением, что приводило к простым уравнениям, приводящим к крошечным ненулевым остаткам.
Принято считать, что FOCAL более эффективно использовал ресурсы, чем сопоставимые системы BASIC. На типичной машине дня, часто с памятью на магнитных сердечниках от 6 до 24 килобайт , FOCAL может справляться с более крупными и сложными задачами программирования, чем BASIC.
Версии и спин-оффы
Корпорация Coca-Cola использовала адаптированную версию FOCAL под названием COKE. [ необходима цитата ]
Позднее FOCAL был реализован на PDP-7, PDP-9, PDP-10, PDP-11, PDP-12, PDP-5 и LINC-8.
В руководстве FOCAL показано, как добавлять команды в парсер FOCAL, поэтому многие сайты добавили специализированные команды для работы с пользовательским оборудованием.
Общество Digital Equipment компьютерных пользователей собрано множество исправлений и улучшений для FOCAL. Были даже серьезные усовершенствованные ответвления FOCAL, такие как FOCAL-W, которые добавили много функций, включая улучшенный ввод-вывод файлов массового хранилища и даже память виртуальных переменных.
В середине 1970-х годов DELTA была более сложной версией FOCAL. Номера строк программы менялись от 00 до 99 «частей» и от 000000 до 999999 «шагов», выполняемых в алфавитно-цифровом порядке. У DELTA было несколько специализированных команд для осциллографа Tektronix 4010/14.
В России он использовался еще в начале 1990-х годов в массовых домашних компьютерах серии « Электроника БК ».
Пример кода
Оригинальный Lunar Lander является отличным примером для изучения кода FOCAL, поскольку он использует большинство функций языка. Этот код взят из оригинала, который можно найти на странице Джима Сторера Lunar Lander . [29]
01.04 Т «УПРАВЛЕНИЕ ВЫЗОВОМ ЛУННОГО МОДУЛЯ. НЕОБХОДИМО РУЧНОЕ УПРАВЛЕНИЕ»!01.06 T «ВЫ МОЖЕТЕ СБРОСИТЬ РАСХОД ТОПЛИВА K КАЖДЫЕ 10 СЕК ДО 0 ИЛИ ЛЮБОЕ ЗНАЧЕНИЕ»!01.08 Т «МЕЖДУ 8 И 200 ФУНТОВ / СЕК. У ВАС 16000 ФУНТОВ ТОПЛИВА. ОЦЕНКА»!01.11 Т «ВРЕМЯ БЕСПЛАТНОГО УДАРА - 120 СЕК. ВЕС КАПСУЛЫ - 32500 ФУНТОВ»!01.20 T "ПРИХОДИТ ПЕРВАЯ ПРОВЕРКА РАДАРА" !!!; E01.30 Т «НАЧАЛО ПОСАДКИ»! «ВРЕМЯ, СЕК ВЫСОТА,»01.40 T "МИЛЬ + СКОРОСТЬ НОЖА, ТОПЛИВО МИЛЬ / Ч, ФУНТ ТОПЛИВА"!01,50 SA = 120; SV = 1; SM = 32500; SN = 16500; SG = 0,001; SZ = 1,802.10 T "",% 3, L, "", FITR (A), "",% 4,5280 * (A-FITR (A))02.20 T% 6.02, "", 3600 * V, "",% 6.01, MN, "K ="; AK; ST = 1002,70 T% 7,02; I (200-K) 2,72; I (8-K) 3,1,3,1; I (K) 2,72,3,102.72 T "НЕВОЗМОЖНО"; FX = 1,51; T "."02.73 T "K ="; AK; G 2.703.10 I (MN-.001) 4.1; I (T-.001) 2.1; SS = T03,40 I ((N + S * K) -M) 3,5,3,5; SS = (MN) / K03,50 D 9; I (I) 7.1,7.1; I (V) 3.8,3.8; I (J) 8.103.80 D 6; G 3.104.10 Т «ТОПЛИВО В КОНТАКТЕ», Л, «СЕК»!04.40 SS = (FSQT (V * V + 2 * A * G) -V) / G; SV = V + G * S; SL = L + S05.10 T «НА ЛУНУ АТ», L, «СЕК»!; SW = 3600 * V05.20 T «СКОРОСТЬ УДАРА», W, «МИЛЬ / Ч» !, «ТОПЛИВО СЛЕВА:« МН, «ФУНТ»!05.40 I (1-W) 5.5,5.5: T «ИДЕАЛЬНАЯ ПОСАДКА! - (УДАЧИ)» !; G 5.905.50 I (10-W) 5.6,5.6; T "ХОРОШАЯ ПОСАДКА- (МОЖЕТ БЫТЬ ЛУЧШЕ)" !; G 5.905.60 I (22-W) 5.7,5.7; T «ПОЗДРАВЛЯЕМ С НЕДОСТАТОЧНЫМ ПОСАДКОЙ»!; G 5.905.70 I (40-W) 5.81,5.81; T «ПОВРЕЖДЕНИЕ МАШИНЫ. УДАЧИ»!; G 5.905.81 I (60-W) 5.82,5.82; T "АВАРИЙНАЯ ПОСАДКА - ВЫ 5 ЧАСОВ КИСЛОРОДА"!; G 5.905.82 T «ИЗВИНИТЕ, НО НЕ БЫЛО ВЫЖИВШИХ - ВЫ ЭТО ПРОПАЛИ!»! «В»05.83 T «ФАКТ, ВЫ ВЗРЫВЛЕННЫЙ НОВЫЙ ЛУННЫЙ КРАТЕР», W * .277777, «FT.DEEP.05.90 Т !!!! «ПОПРОБУЙТЕ СНОВА?»!05.92 A "(ОТВ. ДА ИЛИ НЕТ)" P; I (P-0NO) 5.94,5.9805.94 I (П-0 ДА) 5.92,1.2,5.92 05.98 T "КОНТРОЛЬНЫЙ ВЫХОД" !!!; Q06.10 SL = L + S; ST = TS; SM = MS * K; SA = I; SV = J07.10 I (S-.005) 5.1; SS = 2 * A / (V + FSQT (V * V + 2 * A * (GZ * K / M)))07.30 D 9; D 6; G 7.108.10 SW = (1-M * G / (Z * K)) / 2; SS = M * V / (Z * K * (W + FSQT (W * W + V / Z))) +. 05; D 908.30 I (I) 7.1,7.1; D 6; I (-J) 3.1,3.1; I (V) 3.1,3.1,8.109.10 SQ = S * K / M; SJ = V + G * S + Z * (- QQ ^ 2/2-Q ^ 3/3-Q ^ 4/4-Q ^ 5/5)09.40 SI = AG * S * S / 2-V * S + Z * S * (Q / 2 + Q ^ 2/6 + Q ^ 3/12 + Q ^ 4/20 + Q ^ 5/30)
Программа четко разделена на несколько подпрограмм. Это было почти универсально в программах FOCAL (и JOSS), поскольку схема нумерации строк делала такие конструкции простыми в использовании. Эта программа использует девять подпрограмм. Первая, группа 1, просто распечатывает инструкции с помощью T
оператора ype и устанавливает начальные значения для выполнения. Масса топлива не записывается напрямую, вместо этого используется текущая M
заданная и пустая масса, N
поэтому оставшееся топливо составляет MN, а в посадочном E
модуле заканчивается топливо, когда MN равно 0. Также обратите внимание на расцветку в конце строки 1.20, который сбрасывает все значения переменных.
Основной игровой цикл управляется группой 2. Поскольку код «попадает» из группы 1 в группу 2 во время первого запуска, начальные значения распечатываются в первых двух строках. Ближе к концу строки 2.20 пользователю предлагается A
ввести скорость записи как K
, а затем таймер цикла сбрасывается с помощью S T=10
. Строка 2.70 проверяет ввод пользователя на соответствие нескольким возможностям. Если он больше 200 или меньше 8, он набирает «НЕВОЗМОЖНО» и ряд точек, а затем возвращается назад, чтобы попросить пользователя повторить попытку. Если значение находится между этими значениями, он переходит к группе 3. Обратите внимание, что ограниченные возможности команды FOCAL IF
очевидны здесь, в BASIC это может быть сокращено до одногоIF K>200 OR K<8 THEN...
Группа 3 сначала проверяет, закончилось ли топливо, и переходит в группу 4, если да. Затем он проверяет, T
истек ли 10-секундный период , и, если да, возвращается, чтобы снова распечатать все, что имеет побочный эффект сброса T и S на 10. Строка 3.40 проверяет, было ли сожжено количество топлива. этот период, S * K, уменьшит массу транспортного средства в целом, S * KM, сверх веса пустого, N. Если нет, он движется дальше, если будет, он вместо этого устанавливает таймер цикла на величину время сгорает оставшееся топливо, таким образом преждевременно завершая цикл. В любом случае он вызывает группу 9 для обновления скорости и положения. Затем он перебирает группы 7, 8 и 9, пока значение I не сойдется.
Когда истекает 10-секундный таймер или когда он достигает конца из-за проверки топлива в строке 3.10 или проверки высоты в 7.10. В последнем случае он перейдет в группу 4 и перейдет в группу 5 или сразу перейдет в группу 5. Группа 5 вводит результаты в конце игры, а затем спрашивает пользователя, хотят ли они повторить попытку. Если это так, он переходит к 1,20, чтобы очистить все значения и снова распечатать заголовки, если нет, если он упадет до 5,98 и Q
единиц.
Смотрите также
- JOSS , язык Rand, вдохновивший FOCAL
- MUMPS , язык обработки данных, основанный на концепциях JOSS и FOCAL.
Рекомендации
- ↑ Руководство 1968 , стр. 1.1.
- ↑ DEC, 1957 г. по настоящее время (PDF) . Дек. 1978. стр. 38.
- ^ Маккракен, Гарри (29 апреля 2014 г.). «Пятьдесят лет BASIC, языка программирования, который сделал компьютеры персональными» . Время . Архивировано 5 февраля 2016 года . Проверено 12 февраля 2016 .
- ^ а б Маркс, Ширли (декабрь 1971 г.). Годы JOSS: Размышления об эксперименте (PDF) (Технический отчет). Rand.
- ^ "Смотрите, как растет ваш Альтаир!" . Байт . Апрель 1976 г. с. 48 .
- ^ а б в г Szczepaniak 2014 .
- ^ Справочник EduSystem (PDF) . Цифровой. 1973. с. В.
- ^ a b Savetz 2013 .
- ^ Стэплтон, РА; Гудман, С.Е. (июнь 1988 г.). Советский Союз и «революция» персональных компьютеров (PDF) (Технический отчет). Университет Аризоны. п. 8.
- ^ «Электроника БК-0010» . Музей старых компьютеров .
- ^ Руководство 1968 .
- ^ a b Руководство 1968 г. , стр. 2.1.
- ^ a b c Руководство 1968 г. , стр. 2.7.
- ^ a b Руководство 1968 г. , стр. 3.7.
- ^ a b c Руководство 1968 г. , стр. 3.2.
- ^ a b c Руководство 1968 г. , стр. 3.6.
- ^ a b Руководство 1968 г. , стр. 3.4.
- ^ a b Руководство 1968 г. , стр. 3.5.
- ↑ Руководство 1968 , стр. 3.3.
- ↑ Руководство 1968 , стр. 3.1.
- ↑ Руководство 1968 , стр. 2.2.
- ↑ Руководство 1968 , стр. 2.3.
- ↑ Руководство 1968 , стр. 2.5.
- ^ FOCAL: новый разговорный язык . Цифровой.
- ^ a b c d e Руководство 1968 г. , стр. 2.4.
- ↑ Руководство 1968 , стр. 3.10.
- ↑ Руководство 1968 , стр. А.3.
- ↑ Руководство 1968 , стр. 3.8.
- ^ «Лунный посадочный модуль» . Документы, связанные с Lunar Landing Game .
Библиография
- Руководство по программированию FOCAL (PDF) . Корпорация цифрового оборудования. 1968 г.
- Щепаниак, Джон (1 мая 2014 г.). «Основная история BASIC в день его 50-летия» . Гамасутра .
- Савец, Кевин (апрель 2013 г.). «Дэйв Ал и Бетси Ал» (Интервью).
Внешние ссылки
- Исходный код FOCAL, исходный код FOCAL для нескольких программ, включая Lunar Lander, Sumer Game и другие
- Рекламный буклет DEC FOCAL 1969
- Проект моделирования компьютерной истории (Focal доступен для бесплатной загрузки здесь)
- ftp://www.cozx.com/pub/langs/focal.tar.gz Версия с исходным кодом на языке C, работающая под управлением нескольких операционных систем, включая Linux.
- C-source для современной версии DOS, пригодной для обучения
- Абрамов В.А. язык Диалог FOCAL (на русском языке ) ISBN 5-06-001785-0
- Осетинский LG FOCAL для мини-компьютеров (на русском языке ) ISBN 5-217-00323-5
- Фокал снаружи и изнутри. (пишется) - ФОКУСНЫЙ снаружи и внутри. (в процессе) (на русском языке)
- Файл справки к фокалу-1б - Файл справки для FOCAL-1B