ФОКАЛ (язык программирования)
Парадигма | императив |
---|---|
Семья | ДЖОСС |
Разработано | Ричард Меррилл |
Разработчик | Декабрь |
Впервые появился | 1968 год |
Под влиянием | |
ДЖОСС | |
Под влиянием | |
БЕЙСИК-ПЛЮС |
ФОКАЛ (аббревиатура от «Формулирование онлайн-вычислений на алгебраическом языке» , [ 1 ] или ФОРМУЛА КАЛЬКУЛЯТОР [ 2 ] ) — это интерактивный интерпретируемый язык программирования, основанный на JOSS и в основном используемый в Digital Equipment Corporation (DEC) машинах серии программируемых процессоров данных (PDP) .
JOSS был разработан как простой интерактивный язык, позволяющий легко писать программы непрограммистам. FOCAL очень похож на JOSS по поддерживаемым командам и общему синтаксису языка. Он отличается тем, что многие расширенные функции JOSS, такие как диапазоны и определяемые пользователем функции, были удалены для упрощения синтаксического анализатора . Некоторые из зарезервированных слов (ключевых слов) были переименованы, и теперь все они начинаются с уникальной первой буквы. Это позволяет пользователям вводить программы, используя односимвольные операторы, что еще больше снижает потребность в памяти. Это было важным соображением для PDP-8 , размер которого часто ограничивался несколькими килобайтами (КБ).
Подобно JOSS и более поздним версиям BASIC , FOCAL на PDP-8 представлял собой полноценную среду, включавшую строковый редактор , интерпретатор и процедуры ввода/вывода . Пакет в целом получил название FOCAL-8 , который также работал на PDP-5 и PDP-12 . При портировании на PDP-11 получившийся FOCAL-11 опирался на базовую операционную систему RT -11 для обеспечения поддержки и редактирования файлов. Определение языка обновлялось дважды: до FOCAL-69 и слегка модифицированного FOCAL-71 . Также был доступен порт на Intel 8080 .
FOCAL известен как язык, на котором были написаны оригинальные версии ранних видеоигр Hamurabi и Lunar Lander . Оба позже были портированы на BASIC, где стали гораздо более известными. [ 3 ] FOCAL не пользовался популярностью за пределами платформы PDP и практически исчез во время перехода на VAX-11 . Он получил сильное возрождение в Советском Союзе , где клоны PDP-11 использовались в качестве образовательных и домашних компьютеров ( серия BK ).
История
[ редактировать ]ДЖОСС
[ редактировать ]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 в полной мере воспользовался его мощностью и объемом памяти. Программисты 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 .
Компания Processor Technology также предложила версию 8k FOCAL в комплекте с Lunar Lander для Intel 8080 на базе системы Altair 8800 . Это было предоставлено в счет оплаты копирования ленты, а исходный код предоставлялся бесплатно вместе с другими покупками. [ 5 ]
БАЗОВЫЙ
[ редактировать ]В то время как FOCAL становился популярным на машинах DEC, BASIC становился более популярной альтернативой на других платформах. К концу 1960-х годов несколько компаний вторглись в оплот миникомпьютеров DEC , продавая аналогичные машины, работающие на версиях BASIC с разделением времени. Среди них следует отметить серию HP 2100 , работающую под управлением HP Time-Shared BASIC . [ 6 ]
Дэвид Х. Ал недавно присоединился к группе DEC PDP-8, как раз в тот момент, когда компания заинтересовалась продажей машины в образовательных учреждениях. Из-за популярности BASIC на рынке образования, особенно с учетом растущей библиотеки программ BASIC от Миннесотского образовательного вычислительного консорциума , Ал обнаружил, что продавать машину с FOCAL сложно, несмотря на ее преимущества. [ 6 ] Как он позже заметил:
Язык FOCAL от DEC во многих аспектах был равен BASIC, а в некоторых даже превосходил его, но у него был один огромный недостаток: DEC не желала лицензировать его другим производителям компьютеров. FOCAL вел тяжелую борьбу с BASIC, который был доступен на компьютерах GE, Honeywell, HP и других компьютерах.
Я думаю, что это привело к ситуации, подобной Sony и Betamax. Sony заявила: «Betamax — наш формат, и это лучший формат, чем VHS», и так оно и было. Но затем JVC говорит: «У нас есть VHS и Toshiba. Эй, вы хотите его использовать? Хорошо, мы предоставим вам лицензию на него почти бесплатно». [ 6 ]
Аль взял на себя задачу создать систему BASIC для этой платформы, наняв компанию, которая, как он позже узнал, представляла собой единственного программиста в Бруклине, для создания версии для 4-киловаттного PDP-8. DEC начала продавать упакованные версии PDP-8 с терминалами и BASIC как линейку «EduSystem», причем более крупные системы этой серии имели расширенные версии BASIC, а в некоторых случаях также FOCAL и FORTRAN . Также были созданы некоторые EduSystems на базе PDP-11. [ 7 ]
Затем Аль начал портировать программы с FOCAL на BASIC, в частности The Sumer Game (которую он переименовал в Hamurabi ), версию Lunar Lander и множество небольших демо-версий FOCAL. Объединив свои порты с материалами сторонних программистов, ему удалось собрать достаточно материала, чтобы DEC опубликовала «101 компьютерную игру BASIC» в 1973 году. Книга имела немедленный успех и в конечном итоге выдержала три издания до 1975 года. [ 8 ] [ 6 ]
К середине 1970-х годов BASIC стал стандартной функцией всех машин DEC, и использование FOCAL прекратилось. [ 8 ]
Возрождение в Советском Союзе
[ редактировать ]PDP-11 был клонирован в Советском Союзе в 1970-х годах для военных целей. В 1980-х годах были произведены однокристальные варианты, аналогичные LSI-11 , которые дали начало серии домашних компьютеров, совместимых с PDP-11 . Наиболее заметной среди нескольких моделей была серия Electronika BK , выпущенная в 1985 году. Первоначально они поставлялись с FOCAL на картридже ПЗУ . [ 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 ]
Команды
[ редактировать ]ПРОСИТЬ
[ редактировать ]The ASK
Команда (аббревиатура A) возьмет список строк и переменных, выведет строки и сохранит введенные пользователем данные в переменных. [ 15 ] Эквивалент BASIC INPUT
.
01.01 ASK "NAME", NAME 01.02 ASK "COORDINATES", X, Y 01.03 ASK "A1",A1,"OMEGA",W,"T0",T0,"DAMPING FACTOR",DAMPINGFACTOR
Если пользователь не вводит число, а вводит текст, система преобразует исходный символ в число с «А»=1, «Б»=2 и т. д.
КОММЕНТАРИЙ
[ редактировать ]The COMMENT
команда (аббревиатура C) создает примечание. [ 16 ] Эквивалент BASIC REM
. В оригинальном руководстве перечислены CONTINUE
как синоним КОММЕНТАРИЯ, используется для обозначения пустых строк, но внутреннего различия не имеет. [ 17 ]
01.01 COMMENT: THE SUMER GAME, BY RICHARD MERRILL
ДЕЛАТЬ
[ редактировать ]The DO
команда (аббревиатура D) переводит выполнение в подпрограмму. Это эквивалент BASIC. GOSUB
. На подпрограмму ссылаются либо по номеру группы, либо по номеру строки. Если указан номер строки, эта единственная строка запускается, а затем возвращается к оператору после DO
. Если номер строки не указан, выполнение начинается с первой строки блока и продолжается до тех пор, пока не будет достигнут конец блока или RETURN
встречается. RETURN
требуется только вернуться пораньше из группы, в конце группы это не нужно. [ 18 ]
01.15 DO 7.24 01.16 DO 8
ДЛЯ
[ редактировать ]The FOR
команда (аббревиатура F) реализует цикл for . Если указаны три аргумента, первый — это начальное значение переменной цикла, второй — приращение, а третье значение — конечное значение цикла. Если указаны только два значения, первое — это начальное значение, а второе — конечное значение, а приращение установлено равным 1. Это шаблон из FORTRAN . DO
циклы, в отличие от BASIC FOR
где приращение — это последнее значение, если оно присутствует.
В отличие от других частей языка, где несколько операторов в строке независимы, FOR
всегда выполняет инструкции, следующие за ним в строке до достижения завершения, а затем переходит к следующей строке. Таким образом, циклы должны располагаться в одной строке или, альтернативно, вызывать подпрограмму с помощью DO
. Не существует эквивалента BASIC. NEXT
. [ 14 ]
01.01 FOR X=1,10; TYPE X,! 01.02 FOR X=0,10,100; DO 2
Пример цикла FOR:
01.10 ASK "HOW MUCH MONEY DO YOU WANT TO BORROW ?",PRINCIPAL 01.20 ASK "FOR HOW MANY YEARS ?",TERM 01.30 FOR RATE=4.0,.5,10;DO 2.0 01.40 QUIT 02.10 SET INTEREST=PRINCIPAL*(RATE/100)*TERM 02.20 TYPE "RATE",RATE," ","INTEREST",INTEREST,!
ПЕРЕЙТИ К
[ редактировать ]The GOTO
команда (аббревиатура G) переводит выполнение программы на указанный номер строки. [ 18 ] Он идентичен одноименному оператору в BASIC. В ФОКАЛе GOTO
также используется для начала выполнения, как в BASIC RUN
, но при таком использовании в документации он упоминается как GO
вместо GOTO
несмотря на то, что основная команда та же самая.
01.05 GOTO 1.01 02.90 TYPE !!,"TRY AGAIN.",!!!!!;GOTO 1.1
ЕСЛИ
[ редактировать ]The IF
Команда (аббревиатура I) предоставляет условный переход на основе знака выражения. После числового выражения команда IF может содержать от одного до трех номеров строк. Если выражение меньше нуля, выполнение переходит к первому номеру строки; если равно нулю, то ко второму номеру строки; если больше нуля, то к третьему номеру строки. В языке отсутствовали относительные операторы, такие как больше, равно или меньше. Чтобы разветвиться, если X > 5, необходимо сравнить X - 5. [ 19 ]
02.20 IF (25-25) 2.4,2.3,2.4 03.01 IF (X) 3.1,3.02,3.1
IF можно сократить, поставив точку с запятой (или конец строки) после номера первой строки. Например:
02.20 IF (X)1.8; TYPE "Q" 02.30 IF (X)1.8,2.50 02.40 TYPE "P"
В этом случае тест 2.20 заставит программу перейти к строке 1.8, если тест отрицательный, в противном случае она продолжит работу и наберет «Q» в консоли. Строка 2.30 перейдет на 1,8 или 2,5, если значение отрицательное или нулевое, в противном случае продолжайте вводить «P» в консоль. [ 19 ]
ПОКИДАТЬ
[ редактировать ]The QUIT
команда (аббревиатура Q) завершает выполнение программы и возвращает управление среде редактирования. [ 16 ] Эквивалент BASIC STOP
или END
.
01.10 FOR X=-10,1,10;TYPE X 01.20 QUIT
ВОЗВРАЩАТЬСЯ
[ редактировать ]The RETURN
команда (аббревиатура R) выполняет переход от подпрограммы обратно к вызывающей позиции. [ 16 ] Использование RETURN
не является обязательным в последней строке подпрограммы, подпрограмма в любом случае возвращается на последнюю строку в группе. Ниже приведен пример подпрограммы для преобразования запроса «да/нет» в значение. [1]
22.78 COMMENT: 'YES OR NO' SUBROUTINE 22.80 ASK "ANSWER YES OR NO ? ",AN 22.82 IF (AN-0YES)22.84,22.86 22.84 IF (AN-0NO)22.8,22.88,22.8 22.86 SET X=2;RETURN 22.88 SET X=1;RETURN
НАБОР
[ редактировать ]The SET
команда (аббревиатура S) присваивает результаты выражения указанной переменной. [ 20 ] Эквивалент BASIC LET
.
01.30 SET PI=3.14156 01.60 SET INTEREST=PRINCIPAL*(RATE/100)*TERM
ТИП
[ редактировать ]The TYPE
команда (аббревиатура Т) обеспечивает вывод одного или нескольких элементов, разделенных запятыми. [ 21 ] Эквивалент BASIC PRINT
.
Элементами могут быть переменные, литеральные строки, заключенные в двойные кавычки, или различные управляющие символы. К управляющим символам относятся !
для вывода возврата каретки и перевода строки, #
только для возврата каретки, и :
для символа табуляции. Управляющие символы можно объединять, например: !!!
выведет три CR/LF без необходимости разделять их запятыми. [ 15 ]
TYPE [NUMBERS, E1, "TEXT", !, #, :, $ OR %] ...OUTPUT 01.10 TYPE "HI THERE, GOOD LOOKING. HOW MUCH MONEY DO YOU WANT TO BORROW?",! 01.50 TYPE "INTEREST",INTEREST,! 01.80 TYPE "THE INTEREST FOR",TERM," YEARS",!,"IS",INTEREST, " DOLLARS.",!! 01.90 TYPE "NEW YORK",!,"WASHINGTON",!,"ATLANTA",!,"DALLAS",! 02.10 TYPE "X",X," ","X^2",X^2," ","SQRT",FSQT(X) 03.20 TYPE ".",# 02.20 TYPE !!!!!
TYPE
также включен необязательный спецификатор формата, указанный с помощью формата %x.yz
, где x — количество цифр слева от десятичной запятой, а yz — количество цифр справа от точки. Формат по умолчанию был %8.4
, что означает максимум восемь цифр и четыре справа от точки. [ 22 ] Так, например:
SET A=67823 TYPE %6.01,A = 67823.0 TYPE %5,A = 67823 TYPE %8.03,A = 67823.000 TYPE %,A = 6.7823E4
Обратите внимание на дополнительные начальные пробелы в некоторых примерах, дополняющие полную определенную ширину. Использование только % приводило к печати вывода в «формате с плавающей запятой» с использованием символа E. [ 23 ]
Специальный управляющий персонаж был $
что привело к печати таблицы всех определенных переменных и их значений. Будут напечатаны только первые две буквы имени, дополненные при необходимости нулем. Элементы массива печатаются в отдельных строках, а переменные, содержащие только один элемент, будут проиндексированы (00). Например: [ 24 ]
TYPE $ A0(00)=67823
Переменные
[ редактировать ]Имена переменных могут начинаться с любой буквы, кроме F (F зарезервировано для функций), и могут содержать любую последовательность букв и цифр. Однако только первые два символа имеют значение. Например, следующий пример кода из FOCAL: новый разговорный язык. [ 25 ] ссылается на ту же переменную, что и DESTINATION, а затем DES. Внутри обе ссылки относятся к переменной, обозначенной DE:
01.80 ASK DESTINATION 02.30 IF (DES-14) 2.4,3.1,2.4
Любую переменную можно рассматривать как массив, допуская индексы от -2048 до 2047. [2]
Математика
[ редактировать ]FOCAL-69 содержал пять математических операторов: [ 26 ]
^
для экспонент – показатель преобразуется в 12-битное целое число*
для умножения/
для разделения+
для добавления-
для вычитания
Одной из особенностей FOCAL было то, что все операторы имели независимый приоритет, как в приведенном выше порядке. Это означает, что формула SET T=2-3+1
, он будет оценен в порядке 2-(3+1) и, таким образом, выдаст -2. Это сильно отличалось от большинства языков, где + и - имели одинаковый приоритет и оценивались (2-3)+1 для получения 0. [ 26 ] Это может вызвать незначительные ошибки при преобразовании исходного кода FOCAL в другие системы.
FOCAL был необычен тем, что математические выражения могли использовать (), [] и <> взаимозаменяемо в совпадающих парах для установления приоритета. [ 26 ] Например, следующее является допустимым выражением:
01.30 SET A=<10*[5+1]*(1+5)>
Все они имеют один и тот же уровень приоритета и на одном уровне читаются слева направо, поэтому этот оператор будет оцениваться [], затем (), затем <>, чтобы получить 360. [ 26 ]
Язык содержал следующие встроенные функции: [ 27 ]
FABS()
– Абсолютное значениеFATN()
– АрктангенсFCOS()
– Косинус аргумента в радианахFEXP()
– Естественная основа силы аргумента.FITR()
– Целая часть аргументаFLOG()
- Наперианский журналFRAN()
– Случайное числоFSGN()
– Знак аргумента; FSGN(0)=1 в FOCAL-69, но FSGN(0)=0 в FOCAL-71 и более поздних версиях.FSIN()
– Синус угла, заданный в радианах.FSQT()
– Квадратный корень
Символьные функции
[ редактировать ]В FOCAL-71 добавлены две новые функции для ввода односимвольных значений, аналогичные ASK, но возвращающие значения ASCII.
FIN
останавливается до тех пор, пока пользователь не введет символ, а затем не вернет код ASCIIFOUT
выводит значение ASCII в виде символа на консоль или в файл
Другие функции
[ редактировать ]FOCAL также включал в себя несколько функций специального назначения: [ 28 ]
FADC
считывает значение из аналого-цифровых преобразователей PDP-8, используя номер канала в качестве параметра.FDIS
графики в заданном месте YFDXS
графики в заданном месте X
Команды среды
[ редактировать ]Запуск программ
[ редактировать ]ФОКАЛ б/у GOTO
в редакторе, чтобы запустить программу. Однако общепринятым правилом было сократить это значение до GO
. Это эквивалент RUN
на БЕЙСИКЕ. GOTO
также может использоваться в редакторе для запуска выполнения с указанной строки.
Команды редактирования
[ редактировать ]Новые строки вводятся в программу, просто начиная команду с номера строки. Команды редактирования были ERASE
(аббревиатура Е), [ 26 ] MODIFY
(аббревиатура М), [ 29 ] и 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
. Имена программ могут состоять из шести символов. Команда LIBRARY (аббревиатура 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
ФОКАЛ-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, и две обновленные версии. ФОКАЛ, 1969 г. и ФОКАЛ, 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 заканчиваются точкой, что делает их похожими на письменные заявления, тогда как в FOCAL нет обязательного окончания строки.
Одним из основных отличий является то, что JOSS включает в себя полный набор операций сравнения и систему логической логики , действующую внутри if
и for
конструкции. Более того, ветвления и циклы можно было применять к любому оператору, в отличие от FOCAL, где единственная операция, которую они могли выполнить, была эквивалентна переходу. Например, в JOSS можно:
1.10 Type A if X>10. 1.20 Type i for i=1(1)10.
Первая строка опционально печатает A на основе значения X, а вторая — числа от 1 до 10. Напротив, в FOCAL не было возможности сравнивать значения, и циклы применялись путем перехода к следующей строке после их завершения. Эквивалентный код в FOCAL будет:
1.10 IF (X-10),,1.30 1.20 TYPE A! 1.30 FOR I=1,1,10;TYPE I,!
Реализация JOSS упрощает создание общих конструкций и более точно соответствует намерениям программиста, но за счет усложнения среды выполнения. Например, JOSS позволяет гибко описывать диапазоны в циклах, например 1,2,3,10(5)50,75,78. За эту гибкость приходится платить; в FOCAL начало, остановка и шаг могут быть записаны в специальной структуре в памяти и легко обновляются по мере выполнения цикла, тогда как JOSS требует повторного вычисления выражения, которое может быть, но часто не является более сложным.
Чтобы сделать код в FOCAL более кратким, изменения были относительно незначительными. Например, JOSS' Do part 20.
становится немного меньшим FOCAL DO 20
, пока Do step 20.1
становится DO 20.1
. Ключевые слова команд также были сокращены, где это возможно, поэтому JOSS Demand
становится FOCAL ASK
, чтобы сделать его короче и позволить однозначно использовать букву D для DO
.
Для упрощения парсера были удалены некоторые конструкции JOSS. Например, JOSS может выполнять несколько заданий с помощью Set S=P, P=Q, Q=S.
тогда как в FOCAL приходилось делать отдельные заявления, SET S=P; SET P=Q; SET Q=S
. Аналогично, JOSS' Form
, используемый для форматирования вывода, был объединен в FOCAL. TYPE
с %
.
Сравнение с БЕЙСИКОМ
[ редактировать ]Сравнение FOCAL и BASIC было неизбежным, поскольку оба языка были распространены на мини-компьютерах одной и той же эпохи, и эти два языка имеют много общего в синтаксисе и структуре. В большинстве случаев происходит прямое преобразование кода FOCAL в BASIC и обратно. Например, чтобы попросить пользователя ввести значение, в FOCAL нужно:
ASK "What is your age?",AGE
в то время как в BASIC эквивалент:
INPUT "What is your age?",AGE
За исключением нескольких функций, отсутствующих в одном или другом, и некоторых относительно небольших различий в синтаксисе, эти два языка очень похожи.
Одним заметным исключением является IF
в BASIC, что позволяло размещать любой оператор после THEN
, что делает его более похожим на структуры управления JOSS. BASIC изменил порядок кода по сравнению с JOSS, поместив условное выражение в начале строки, а не в конце; в BASIC используется IF this THEN that
тогда как JOSS использовал that IF this
. ФОКАЛ IF
в BASIC было больше похоже на вычисленный goto , ON X GOTO 10,20,30
, но ON...GOTO
разрешено любое количество строк в качестве целей, а не только три для отрицательных, нулевых и положительных значений, как в FOCAL.
Еще одно важное различие между ними заключается в том, что в FOCAL не было встроенной поддержки строк как элементов данных, которые можно было бы присвоить переменным. Как и в ранних версиях BASIC или FORTRAN до добавления строк (в F77), этого ограничения обычно можно было избежать за счет использования литеральных строк в командах ввода и вывода. И только при манипулировании отдельными строками или символами в них это стало серьезной проблемой.
Поскольку строковые переменные не поддерживались, при вводе строки использовался кладж , который преобразовывал любые символы, введенные пользователем, в их числовое значение. Например, если кто-то напечатал HELLO в операторе ввода FOCAL преобразует H в «8», числовое значение «H» в шестибитных кодах символов PDP-8 («H» - восьмая буква). Затем он будет интерпретировать «E» как начало экспоненты, а затем попытается вычислить «8» для степени «LLO», что займет несколько секунд процессорного времени и приведет к значению 0,76593020E + 103, а не полезный ответ. Тем не менее, задавая вопросы, на которые можно было бы ответить однобуквенными ответами, например « Вам нужны инструкции, Да или Нет? ", программисты могли проверить результат на соответствие известным значениям символов, чтобы получить то, что выглядело как ввод символов.
Добавление нуля к строке приведет к тому, что она станет числовой, поэтому программы смогут проверять определенные многосимвольные строки с помощью операторов IF, таких как I (A-0BROWN) 1.00,2.00,1.00
который будет переходить к 2,00, если A = «КОРИЧНЕВЫЙ», или к 1,00 в противном случае. Однако программа выдаст ошибку переполнения, если пользователь введет текст с неудачно размещенными символами «E». Например, можно проверить «КОРИЧНЕВЫЙ» или «КРАСНЫЙ», но не «ЗЕЛЕНЫЙ» или «ЖЕЛТЫЙ».
В реализации FOCAL PDP-8 использовалось представление с плавающей запятой , которое представляло числа в виде четырех 12-битных слов, всего сорок восемь бит, с тридцатью шестью битами мантиссы и двенадцатью битами показателя степени. Это позволило обеспечить как значительно более высокую точность, так и значительно более широкий диапазон значений, чем у большинства современных интерпретаторов, что сделало 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, поэтому на многих сайтах были добавлены специализированные команды для работы с нестандартным оборудованием.
Общество пользователей компьютеров цифрового оборудования собрало множество патчей и улучшений для FOCAL. Существовали даже крупные усовершенствованные ответвления FOCAL, такие как FOCAL-W, которые добавляли множество функций, включая улучшенный ввод-вывод файлов запоминающего устройства и даже виртуальную переменную память.
В середине 1970-х годов DELTA представляла собой более совершенную версию FOCAL. Номера строк программы варьировались от 00 до 99 «частей» и от 000000 до 999999 «шагов», выполняемых в буквенно-цифровом порядке. У DELTA было несколько специализированных команд для дисплея Tektronix 4010/14.
В России он нашел применение еще в начале 1990-х годов в серийных домашних компьютерах серии «Электроника БК» .
Microsoft продавала версию FOCAL на бумажной ленте. [ 30 ] По словам Рэймонда Чена, мастер-пленка отсутствует, и FOCAL больше не доступен.
Пример кода
[ редактировать ]Оригинальный Lunar Lander представляет собой отличный пример для изучения кода FOCAL, поскольку он использует большинство функций языка. Этот код взят из оригинала, найденного на странице Джима Сторера Lunar Lander . [ 31 ]
01.04 T "CONTROL CALLING LUNAR MODULE. MANUAL CONTROL IS NECESSARY"! 01.06 T "YOU MAY RESET FUEL RATE K EACH 10 SECS TO 0 OR ANY VALUE"! 01.08 T "BETWEEN 8 & 200 LBS/SEC. YOU'VE 16000 LBS FUEL. ESTIMATED"! 01.11 T "FREE FALL IMPACT TIME-120 SECS. CAPSULE WEIGHT-32500 LBS"! 01.20 T "FIRST RADAR CHECK COMING UP"!!!;E 01.30 T "COMMENCE LANDING PROCEDURE"!"TIME,SECS ALTITUDE," 01.40 T "MILES+FEET VELOCITY,MPH FUEL,LBS FUEL RATE"! 01.50 S A=120;S V=1;S M=32500;S N=16500;S G=.001;S Z=1.8 02.10 T " ",%3,L," ",FITR(A)," ",%4,5280*(A-FITR(A)) 02.20 T %6.02," ",3600*V," ",%6.01,M-N," K=";A K;S T=10 02.70 T %7.02;I (200-K)2.72;I (8-K)3.1,3.1;I (K)2.72,3.1 02.72 T "NOT POSSIBLE";F X=1,51;T "." 02.73 T "K=";A K;G 2.7 03.10 I (M-N-.001)4.1;I (T-.001)2.1;S S=T 03.40 I ((N+S*K)-M)3.5,3.5;S S=(M-N)/K 03.50 D 9;I (I)7.1,7.1;I (V)3.8,3.8;I (J)8.1 03.80 D 6;G 3.1 04.10 T "FUEL OUT AT",L," SECS"! 04.40 S S=(FSQT(V*V+2*A*G)-V)/G;S V=V+G*S;S L=L+S 05.10 T "ON THE MOON AT",L," SECS"!;S W=3600*V 05.20 T "IMPACT VELOCITY OF",W,"M.P.H."!,"FUEL LEFT:"M-N," LBS"! 05.40 I (1-W)5.5,5.5;T "PERFECT LANDING !-(LUCKY)"!;G 5.9 05.50 I (10-W)5.6,5.6;T "GOOD LANDING-(COULD BE BETTER)"!;G 5.9 05.60 I (22-W)5.7,5.7;T "CONGRATULATIONS ON A POOR LANDING"!;G 5.9 05.70 I (40-W)5.81,5.81;T "CRAFT DAMAGE. GOOD LUCK"!;G 5.9 05.81 I (60-W)5.82,5.82;T "CRASH LANDING-YOU'VE 5 HRS OXYGEN"!;G 5.9 05.82 T "SORRY,BUT THERE WERE NO SURVIVORS-YOU BLEW IT!"!"IN " 05.83 T "FACT YOU BLASTED A NEW LUNAR CRATER",W*.277777," FT.DEEP." 05.90 T !!!!"TRY AGAIN?"! 05.92 A "(ANS. YES OR NO)"P;I (P-0NO)5.94,5.98 05.94 I (P-0YES)5.92,1.2,5.92 05.98 T "CONTROL OUT"!!!;Q 06.10 S L=L+S;S T=T-S;S M=M-S*K;S A=I;S V=J 07.10 I (S-.005)5.1;S S=2*A/(V+FSQT(V*V+2*A*(G-Z*K/M))) 07.30 D 9;D 6;G 7.1 08.10 S W=(1-M*G/(Z*K))/2;S S=M*V/(Z*K*(W+FSQT(W*W+V/Z)))+.05;D 9 08.30 I (I)7.1,7.1;D 6;I (-J)3.1,3.1;I (V)3.1,3.1,8.1 09.10 S Q=S*K/M;S J=V+G*S+Z*(-Q-Q^2/2-Q^3/3-Q^4/4-Q^5/5) 09.40 S I=A-G*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
, поэтому оставшееся топливо M-N
и у посадочного модуля кончается топливо, когда M-N
равно 0. Также обратите внимание на E
rase в конце строки 01.20 , что сбрасывает все значения переменных.
Основной игровой цикл управляется группой 2. Когда код «проходит» через группу 1 в группу 2 во время первого запуска, начальные значения выводятся в первых двух строках. В конце строки 02.20 пользователь A
попросили ввести скорость горения как K
, а затем таймер цикла сбрасывается с помощью S T=10
. Строка 02.70 проверяет введенные пользователем данные по нескольким возможностям: если оно больше 200 или меньше 8, он печатает " НЕ ВОЗМОЖНО " и ряд точек, а затем возвращается назад, чтобы попросить пользователя повторить попытку. Если значение находится между этими значениями, происходит переход к группе 3. Обратите внимание, что ограниченные возможности FOCAL IF
команды здесь очевидны, в BASIC это можно свести к одной IF K>200 OR K<8 THEN...
Группа 3 сначала проверяет, закончилось ли топливо, и переходит в группу 4, если оно закончилось. Затем он проверяет, был ли 10-секундный период в T
истек и, если да, возвращается, чтобы распечатать все снова, что имеет побочный эффект сброса Т и S до 10. Строка 03.40 проверяет, сгорело ли количество топлива за этот период, S*K
, уменьшит массу автомобиля в целом, S*K-M
, за пределами пустого веса, N. Если нет, он движется дальше, если да, то вместо этого он устанавливает таймер цикла на количество времени, в течение которого сгорит оставшееся топливо, тем самым досрочно завершая цикл. В любом случае он вызывает группу 9 для обновления скорости и положения. Затем он проходит по группам 7, 8 и 9, пока значение I не сойдется.
Когда 10-секундный таймер истечет или достигнет конца из-за проверки топлива в строке 03.10 или проверки высоты в 07.10 . В последних случаях он перейдет в группу 4 и попадет в группу 5 или сразу перейдет в группу 5. Группа 5 вводит результаты завершения игры, а затем спрашивает пользователя, хотят ли они попробовать еще раз. Если да, то он переходит к 01.20, чтобы очистить все значения и снова распечатать заголовки, если нет, то он переходит к 05.98 и Q
вне
См. также
[ редактировать ]- JOSS , язык Рэнда, вдохновивший FOCAL
- MUMPS — язык манипулирования данными, основанный на концепциях JOSS и FOCAL.
Ссылки
[ редактировать ]- ^ Руководство 1968 г. , с. 1.1.
- ^ Декабрь 1957 г. по настоящее время (PDF) . ДЕКАБРЬ. 1978. с. 38.
- ^ Маккракен, Гарри (29 апреля 2014 г.). «Пятьдесят лет BASIC, языка программирования, сделавшего компьютеры персональными» . Время . Архивировано из оригинала 05 февраля 2016 г. Проверено 12 февраля 2016 г.
- ^ Jump up to: а б Маркс, Ширли (декабрь 1971 г.). Годы JOSS: Размышления об эксперименте (PDF) (Технический отчет). Рэнд.
- ^ «Смотри, как растет твой Альтаир!» . Байт . Апрель 1976 г. с. 48 .
- ^ Jump up to: а б с д Щепаньяк 2014 .
- ^ Справочник EduSystem (PDF) . Цифровой. 1973. с. В.
- ^ Jump up to: а б Савец 2013 .
- ^ Стэплтон, РА; Гудман, SE (июнь 1988 г.). Советский Союз и персональный компьютер «Революция» (PDF) (Технический отчет). Университет Аризоны. п. 8.
- ^ «Электроника БК-0010» . Музей старого компьютера .
- ^ Руководство 1968 года .
- ^ Jump up to: а б Руководство 1968 года , с. 2.1.
- ^ Jump up to: а б с Руководство 1968 года , с. 2.7.
- ^ Jump up to: а б Руководство 1968 года , с. 3.7.
- ^ Jump up to: а б с Руководство 1968 года , с. 3.2.
- ^ Jump up to: а б с Руководство 1968 года , с. 3.6.
- ^ Руководство 1968 г. , с. А.1.
- ^ Jump up to: а б Руководство 1968 года , с. 3.4.
- ^ Jump up to: а б Руководство 1968 года , с. 3.5.
- ^ Руководство 1968 г. , с. 3.3.
- ^ Руководство 1968 г. , с. 3.1.
- ^ Руководство 1968 г. , с. 2.2.
- ^ Руководство 1968 г. , с. 2.3.
- ^ Руководство 1968 г. , с. 2.5.
- ^ ФОКАЛ: Новый разговорный язык . Цифровой.
- ^ Jump up to: а б с д и Руководство 1968 года , с. 2.4.
- ^ Руководство 1968 г. , с. 3.10.
- ^ Руководство 1968 г. , с. А.3.
- ^ Руководство 1968 г. , с. 3.8.
- ^ «Что случилось с интерпретатором Microsoft FOCAL?» . Ютуб . Проверено 18 сентября 2022 г.
- ^ «Лунный посадочный модуль» . Документы, относящиеся к игре «Лунная посадка» .
Библиография
[ редактировать ]- Руководство по программированию 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-source, работающая под несколькими операционными системами, включая Linux.
- исходный код C для современной версии DOS, подходящей для обучения
- Abramov V.A. Dialogue language FOCAL (in Russian) ISBN 5-06-001785-0
- Осетинский LG FOCAL для мини-компьютеров (на русском языке) ISBN 5-217-00323-5
- Фокал снаружи и изнутри. (пишется) – FOCAL outside and inside. (in progress) (in Russian)
- Файл справки к фокалу-1б – Help file for FOCAL-1B (in Russian)