Jump to content

ФОКАЛ (язык программирования)

(Перенаправлено с FOCAL-69 )
ФОКАЛЬНЫЙ
Парадигма императив
Семья ДЖОСС
Разработано Ричард Меррилл
Разработчик Декабрь
Впервые появился 1968 год ; 56 лет назад ( 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 должен был продолжать чтение до тех пор, пока не было прочитано все командное слово, а затем сравнивать его со списком, содержащим полные слова. Это изменение не только позволило сэкономить память в синтаксическом анализаторе, но и пользователи могли сэкономить память, введя только эту букву, уменьшив размер исходного кода .

PDP-8 Перфоленты , в том числе лента FOCAL-69 от 9.07.69

Первая версия 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 останавливается до тех пор, пока пользователь не введет символ, а затем не вернет код ASCII
  • FOUT выводит значение ASCII в виде символа на консоль или в файл

Другие функции

[ редактировать ]

FOCAL также включал в себя несколько функций специального назначения: [ 28 ]

  • FADC считывает значение из аналого-цифровых преобразователей PDP-8, используя номер канала в качестве параметра.
  • FDIS графики в заданном месте Y
  • FDXS графики в заданном месте 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, просто распечатывает инструкции, используя Type и устанавливает начальные значения для запуска. Масса топлива не записывается напрямую, вместо этого используется текущая Mзадница и пустая масса, N, поэтому оставшееся топливо M-N и у посадочного модуля кончается топливо, когда M-N равно 0. Также обратите внимание на Erase в конце строки 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.
  1. ^ Руководство 1968 г. , с. 1.1.
  2. ^ Декабрь 1957 г. по настоящее время (PDF) . ДЕКАБРЬ. 1978. с. 38.
  3. ^ Маккракен, Гарри (29 апреля 2014 г.). «Пятьдесят лет BASIC, языка программирования, сделавшего компьютеры персональными» . Время . Архивировано из оригинала 05 февраля 2016 г. Проверено 12 февраля 2016 г.
  4. ^ Jump up to: а б Маркс, Ширли (декабрь 1971 г.). Годы JOSS: Размышления об эксперименте (PDF) (Технический отчет). Рэнд.
  5. ^ «Смотри, как растет твой Альтаир!» . Байт . Апрель 1976 г. с. 48 .
  6. ^ Jump up to: а б с д Щепаньяк 2014 .
  7. ^ Справочник EduSystem (PDF) . Цифровой. 1973. с. В.
  8. ^ Jump up to: а б Савец 2013 .
  9. ^ Стэплтон, РА; Гудман, SE (июнь 1988 г.). Советский Союз и персональный компьютер «Революция» (PDF) (Технический отчет). Университет Аризоны. п. 8.
  10. ^ «Электроника БК-0010» . Музей старого компьютера .
  11. ^ Руководство 1968 года .
  12. ^ Jump up to: а б Руководство 1968 года , с. 2.1.
  13. ^ Jump up to: а б с Руководство 1968 года , с. 2.7.
  14. ^ Jump up to: а б Руководство 1968 года , с. 3.7.
  15. ^ Jump up to: а б с Руководство 1968 года , с. 3.2.
  16. ^ Jump up to: а б с Руководство 1968 года , с. 3.6.
  17. ^ Руководство 1968 г. , с. А.1.
  18. ^ Jump up to: а б Руководство 1968 года , с. 3.4.
  19. ^ Jump up to: а б Руководство 1968 года , с. 3.5.
  20. ^ Руководство 1968 г. , с. 3.3.
  21. ^ Руководство 1968 г. , с. 3.1.
  22. ^ Руководство 1968 г. , с. 2.2.
  23. ^ Руководство 1968 г. , с. 2.3.
  24. ^ Руководство 1968 г. , с. 2.5.
  25. ^ ФОКАЛ: Новый разговорный язык . Цифровой.
  26. ^ Jump up to: а б с д и Руководство 1968 года , с. 2.4.
  27. ^ Руководство 1968 г. , с. 3.10.
  28. ^ Руководство 1968 г. , с. А.3.
  29. ^ Руководство 1968 г. , с. 3.8.
  30. ^ «Что случилось с интерпретатором Microsoft FOCAL?» . Ютуб . Проверено 18 сентября 2022 г.
  31. ^ «Лунный посадочный модуль» . Документы, относящиеся к игре «Лунная посадка» .

Библиография

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 24703cd2536b9f2cd9c9a24069f4c542__1721392500
URL1:https://arc.ask3.ru/arc/aa/24/42/24703cd2536b9f2cd9c9a24069f4c542.html
Заголовок, (Title) документа по адресу, URL1:
FOCAL (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)