stringtranslate.com

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

FOCAL (аббревиатура от « Формулирование онлайн-вычислений на алгебраическом языке» , [1] или FORmula CALculator [2] ) — это интерактивный интерпретируемый язык программирования, основанный на JOSS и в основном используемый в машинах серии программируемых процессоров данных (PDP) Digital Equipment Corporation (DEC ). .

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 для системы Altair 8800 на базе Intel 8080 . Это было предоставлено в счет оплаты копирования ленты, а исходный код предоставлялся бесплатно вместе с другими покупками. [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 года.

К середине 1970-х годов BASIC стал стандартной функцией всех машин DEC, и использование FOCAL прекратилось. [8]

Возрождение в Советском Союзе

PDP-11 был клонирован в Советском Союзе в 1970-х годах для военных целей. В 1980-х годах были произведены однокристальные варианты, аналогичные LSI-11 , которые дали начало серии домашних компьютеров, совместимых с PDP-11 . Наиболее примечательной среди нескольких моделей была серия Electronika BK , выпущенная в 1985 году. Первоначально они поставлялись с FOCAL на картридже 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. При распечатке с использованием WRITEFOCAL, эквивалентного 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

Если пользователь не вводит число, а вводит текст, система преобразует исходный символ в число с «А»=1, «Б»=2 и т. д.

КОММЕНТАРИЙ

Команда COMMENT(аббревиатура C) создает примечание. [16] Эквивалент BASIC REM. В исходном руководстве CONTINUEв качестве синонима используется КОММЕНТАРИЙ, используемый для обозначения пустых строк, но это не имеет внутренней разницы. [17]

01.01 КОММЕНТАРИЙ: ЛЕТНЯЯ ИГРА РИЧАРДА МЕРРИЛА

ДЕЛАТЬ

Команда DO(аббревиатура D) переводит выполнение в подпрограмму. Это эквивалент BASIC GOSUB. На подпрограмму ссылаются либо по номеру группы, либо по номеру строки. Если указан номер строки, эта единственная строка запускается, а затем возвращается к оператору после DO. Если номер строки не указан, выполнение начинается с первой строки блока и продолжается до тех пор, пока не будет достигнут конец блока или RETURNне встретится a. RETURNтребуется только вернуться пораньше из группы, в конце группы это не нужно. [18]

01.15 ДО 7.2401.16 ДО 8

ДЛЯ

Команда FOR(аббревиатура F) реализует цикл for . Если указаны три аргумента, первый — это начальное значение переменной цикла, второй — приращение, а третье значение — конечное значение цикла. Если указаны только два значения, первое — начальное значение, а второе — конечное значение, а приращение установлено равным 1. Это шаблон из циклов FORTRAN ,DO в отличие от BASIC, FORгде приращение является последним значением. , если имеется.

В отличие от других частей языка, где несколько операторов в строке независимы, оператор FORвсегда выполняет операторы, следующие за ним в строке, до того, как будет достигнуто завершение, а затем переходит к следующей строке. Таким образом, циклы должны быть в одной строке или, альтернативно, вызывать подпрограмму с помощью DO. Не существует эквивалента BASIC NEXT. [14]

01.01 ДЛЯ Х=1,10; ТИП X,!01.02 ДЛЯ Х=0,10,100; ДЕЛАТЬ 2

Пример цикла FOR:

01.10 СПРОСИТЕ «СКОЛЬКО ДЕНЕГ ВЫ ХОТИТЕ ЗАНЯТЬ?», ДИРЕКТОР01.20 СПРОСИТЬ «НА СКОЛЬКО ЛЕТ?», СРОК01.30 FOR RATE=4.0,.5,10;DO 2.001.40 ВЫХОД02.10 УСТАНОВКА ПРОЦЕНТОВ=ОСНОВНАЯ ИНФОРМАЦИЯ*(СТАВКА/100)*СРОК02.20 ВВЕДИТЕ «СТАВКА»,СТАВКА,» «,»ПРОЦЕНТ»,ПРОЦЕНТ,!

ИДТИ К

Команда GOTO(аббревиатура G) переводит выполнение программы на указанный номер строки. [18] Он идентичен одноименному оператору в BASIC. В FOCAL GOTOон также используется для начала выполнения, как и в BASIC RUN, но в этом случае в документации он упоминается как GOвместо, GOTOнесмотря на то, что базовая команда та же самая.

01.05 ПЕРЕХОД К 1.0102.90 ТИП !!,"ПОПРОБУЙТЕ СНОВА",!!!!!;ПЕРЕЙДИТЕ К 1.1

ЕСЛИ

Команда IF(аббревиатура I) обеспечивает условный переход на основе знака выражения. После числового выражения команда IF может содержать от одного до трех номеров строк. Если выражение меньше нуля, выполнение переходит к первому номеру строки; если равно нулю, то ко второму номеру строки; если больше нуля, то к третьему номеру строки. В языке отсутствовали относительные операторы, такие как больше, равно или меньше. Чтобы разветвиться, если X > 5, необходимо сравнить X - 5. [19]

02.20 ЕСЛИ (25-25) 2.4,2.3,2.403.01 ЕСЛИ(Х) 3.1,3.02,3.1

IF можно сократить, поставив точку с запятой (или конец строки) после номера первой строки. Например:

02.20 ЕСЛИ (Х)1,8; ТИП «К»02.30 ЕСЛИ(Х)1.8,2.5002.40 ТИП «П»

В этом случае тест 2.20 заставит программу перейти к строке 1.8, если тест отрицательный, в противном случае она продолжит работу и наберет «Q» в консоли. Строка 2.30 перейдет на 1,8 или 2,5, если значение отрицательное или нулевое, в противном случае продолжайте вводить «P» в консоль. [19]

ПОКИДАТЬ

Команда QUIT(аббревиатура Q) завершает выполнение программы и возвращает управление среде редактирования. [16] Эквивалент BASIC STOPили END.

01.10 ДЛЯ X=-10,1,10;ТИП X01.20 ВЫХОД

ВОЗВРАЩАТЬСЯ

Команда RETURN(аббревиатура R) выполняет разветвление выполнения от подпрограммы обратно к месту вызова. [16] Использование RETURNв последней строке подпрограммы необязательно, подпрограмма в любом случае возвращается на последнюю строку группы. Ниже приведен пример подпрограммы для преобразования запроса «да/нет» в значение.[1]

22.78 КОММЕНТАРИЙ: ПОДПРОГРАММА «ДА ИЛИ НЕТ»22.80 ЗАДАТЬ «ОТВЕТИТЬ ДА ИЛИ НЕТ?»,АН22.82 ЕСЛИ (АН-0ДА)22.84,22.8622,84 ЕСЛИ (АН-0НО)22,8,22,88,22,822.86 УСТАНОВИТЬ X=2;ВОЗВРАТ22.88 УСТАНОВИТЬ X=1;ВОЗВРАТ

НАБОР

Команда SET(аббревиатура S) присваивает результаты выражения указанной переменной. [20] Эквивалент BASIC LET.

01.30 УСТАНОВИТЬ ПИ=3,1415601.60 УСТАНОВКА ПРОЦЕНТОВ = ОСНОВНАЯ ИНФОРМАЦИЯ*(СТАВКА/100)*СРОК

ТИП

Команда TYPE(аббревиатура Т) предусматривает вывод одного или нескольких элементов, разделенных запятыми. [21] Эквивалент BASIC PRINT.

Элементами могут быть переменные, литеральные строки, заключенные в двойные кавычки, или различные управляющие символы. К управляющим символам относятся символы !для вывода возврата каретки и перевода строки, #только для возврата каретки и :для символа табуляции. Управляющие символы могут быть объединены вместе, например, !!!выведут три CR/LF без необходимости разделять их запятыми. [15]

ТИП [ЦИФРЫ, E1, «ТЕКСТ», !, #, :, $ ИЛИ %] ...ВЫВОД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, что означает максимум восемь цифр и четыре справа от точки. [22] Так, например:

НАБОР А=67823ТИП %6.01,А= 67823,0ТИП %5,А= 67823ТИП %8.03,А= 67823,000ВВЕДИТЕ= 6,7823Е4

Обратите внимание на дополнительные начальные пробелы в некоторых примерах, дополняющие полную определенную ширину. Использование только % приводило к печати вывода в «формате с плавающей запятой» с использованием E. [23]

Специальный управляющий символ вызывал $вывод на печать таблицы всех определенных переменных и их значений. Будут напечатаны только первые две буквы имени, дополненные при необходимости нулем. Элементы массива печатаются в отдельных строках, а переменные, содержащие только один элемент, будут проиндексированы (00). Например: [24]

ТИП $А0(00)=67823

Переменные

Имена переменных могут начинаться с любой буквы, кроме F (F зарезервировано для функций), и могут содержать любую последовательность букв и цифр. Однако только первые два символа имеют значение. Например, следующий пример кода из FOCAL: Новый разговорный язык [25] ссылается на ту же переменную, что и DESTINATION, а затем DES. Внутри обе ссылки относятся к переменной, обозначенной DE:

01.80 СПРОСИТЬ НАЗНАЧЕНИЕ02.30 ИФ (ДЭС-14) 2.4,3.1,2.4

Любую переменную можно рассматривать как массив, допуская индексы от -2048 до 2047.[2]

Математика

FOCAL-69 содержал пять математических операторов: [26]

Одной из особенностей 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]

Символьные функции

В FOCAL-71 добавлены две новые функции для ввода односимвольных значений, аналогичные ASK, но возвращающие значения ASCII.

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

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

Команды среды

Запуск программ

FOCAL используется GOTOв редакторе для запуска программы. Тем не менее, эмпирическим правилом было сократить это значение до GO. Это эквивалент RUNBASIC. GOTOтакже может использоваться в редакторе для запуска выполнения с указанной строки.

Команды редактирования

Новые строки вводятся в программу, просто начиная команду с номера строки. Командами редактирования были ERASE(аббревиатура E), [26] MODIFY (аббревиатура M), [29] и WRITE(аббревиатура W): [15]

Файловые команды

Команда файла была ОТКРЫТЬ (аббревиатура O):

Команды библиотеки

FOCAL включал возможность управлять коллекциями программ FOCAL как библиотекой кода. Программы могут вызывать другие программы по цепочке, используя LIBRARY CALL, или вызывать одну подпрограмму в другой программе, используя LIBRARY GOSUB. Имена программ могут состоять из шести символов. Команда LIBRARY (аббревиатура L) имела следующие подкоманды:

ФОКАЛ-71 добавил:

Коды ошибок

Поскольку интерпретатору не хватало места в памяти для хранения сообщений об ошибках или даже таблицы номеров ошибок, 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 заканчиваются точкой, что делает их похожими на письменные заявления, тогда как в FOCAL нет обязательного окончания строки.

Одним из основных отличий является то, что JOSS включает в себя полный набор операций сравнения и систему логической логики , которая работает внутри ifи forсоздает. Более того, ветвления и циклы можно было применять к любому оператору, в отличие от FOCAL, где единственная операция, которую они могли выполнить, была эквивалентна переходу. Например, в JOSS можно:

1.10 Тип А, если X>10. 1.20 Введите i для i=1(1)10.

Первая строка опционально печатает A на основе значения X, а вторая печатает числа от 1 до 10. Напротив, в FOCAL не было возможности сравнивать значения, и циклы применялись путем перехода к следующей строке после их завершения. Эквивалентный код в FOCAL будет:

1,10 ЕСЛИ (Х-10),,1,301.20 ТИП А!1,30 ДЛЯ I=1,1,10;ТИП 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.

Для упрощения парсера были удалены некоторые опции FOCAL. Например, 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 нужно:

СПРОСИТЕ «Сколько вам лет?», ВОЗРАСТ

в то время как в BASIC эквивалент:

 ВВОД «Сколько вам лет?» , ВОЗРАСТ 

За исключением нескольких функций, отсутствующих в одном или другом, и некоторых относительно небольших различий в синтаксисе, эти два языка очень похожи.

Заметным исключением является IFin BASIC, который позволяет размещать любой оператор после THEN, что делает его более похожим на управляющие структуры JOSS. BASIC изменил порядок кода по сравнению с JOSS, разместив условное выражение в начале строки, а не в конце; в BASIC используется, IF this THEN thatтогда как в JOSS используется that IF this. FOCAL был больше похож на вычисленный gotoIF BASIC , , но допускал любое количество строк в качестве целей, а не только три для отрицательных, нулевых и положительных значений, как в FOCAL.ON X GOTO 10,20,30ON...GOTO

Еще одно важное различие между ними заключается в том, что в 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 = «BROWN», или к 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, поскольку он использует большинство функций языка. Этот код взят из оригинала, найденного на странице лунного модуля Джима Сторера. [31]

01.04 Т "УПРАВЛЕНИЕ ВЫЗОВОМ ЛУННОГО МОДУЛЯ. НЕОБХОДИМО РУЧНОЕ УПРАВЛЕНИЕ"!01.06 T «ВЫ МОЖЕТЕ СБРОСИТЬ РАСХОД ТОПЛИВА K КАЖДЫЕ 10 СЕКУНД НА 0 ИЛИ ЛЮБОЕ ЗНАЧЕНИЕ»!01.08 T «МЕЖДУ 8 ДО 200 ФУНТОВ/СЕК. У ВАС 16000 ФУНТОВ ТОПЛИВА. ПРИМЕРНО»!01.11 Т ​​"ВРЕМЯ УДАРА СВОБОДНОГО ПАДЕНИЯ - 120 СЕК. ВЕС КАПСУЛЫ - 32500 ФУНТОВ"!01.20 T "ПЕРВАЯ ПРОВЕРКА РАДАРА"!!!;E01.30 T «НАЧАТЬ ПРОЦЕДУРУ ПОСАДКИ»!»ВРЕМЯ,СЕК ВЫСОТЫ»,»01.40 T «СКОРОСТЬ МИЛЬ+ФУТОВ, ТОПЛИВО в МИЛЬ/Ч, РАСХОД ТОПЛИВА в ФУНТАХ»!01.50 SA=120;SV=1;SM=32500;SN=16500;SG=.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 Т %7,02;I (200-К)2,72;I (8-К)3,1,3,1;I (К)2,72,3,102.72 T "НЕ ВОЗМОЖНО";FX=1,51;T "."02.73 Т "К=";АК;Г 2.703.10 I (МН-.001)4.1;I (Т-.001)2.1;СС=Т03.40 I ((N+S*K)-M)3,5,3,5;SS=(MN)/K03.50 Д 9;И(И)7.1,7.1;И(В)3.8,3.8;И(К)8.103.80 Д 6;Г 3.104.10 Т "ТОПЛИВО ЗАКОНЧЕНО АТ",Л,"СЕКС"!04.40 СС=(FSQT(V*V+2*A*G)-V)/G;SV=V+G*S;SL=L+S05.10 Т "НА ЛУНЕ В",L,"СЕК"!;SW=3600*V05.20 T «СКОРОСТЬ УДАРЕНИЯ», W, «MPH»!, «ОСТАЛОСЬ ТОПЛИВА: «МН», «ФУН»!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 А"(ОТВЕТ. ДА ИЛИ НЕТ)"P;I(P-0NO)5.94,5.9805.94 Я (П-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 Д 9;Д 6;Г 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 И(И)7.1,7.1;Д 6;И(-J)3.1,3.1;И(В)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поэтому оставшееся топливо равно M-Nи у посадочного модуля заканчивается топливо, когда M-Nравно 0. Также обратите внимание на Eснятие в конце строки 01.20, которое сбрасывает все значения переменных.

Основной игровой цикл управляется группой 2. Когда код «проходит» через группу 1 в группу 2 во время первого запуска, начальные значения выводятся в первых двух строках. Ближе к концу строки 02.20 пользователю Aпредлагается ввести скорость сжигания как K, а затем таймер цикла сбрасывается с помощью S T=10. Строка 02.70 проверяет введенные пользователем данные по нескольким возможностям: если оно больше 200 или меньше 8, он печатает "НЕВОЗМОЖНОIF" и ряд точек, а затем возвращается назад, чтобы попросить пользователя повторить попытку. Если значение находится между этими значениями, происходит переход к группе 3. Обратите внимание, что здесь очевидны ограниченные возможности команды FOCAL , в BASIC это может быть сведено к одномуIF K>200 OR K<8 THEN...

Группа 3 сначала проверяет, закончилось ли топливо, и переходит в группу 4, если оно закончилось. Затем он проверяет, истек ли 10-секундный период, Tи, если да, возвращается назад, чтобы распечатать все снова, что имеет побочный эффект сброса T и S на 10. Строка 03.40 проверяет, было ли количество сожженного топлива. этот период, , уменьшит массу транспортного средства в целом, сверх веса пустого, N. Если нет, он движется дальше, если да, то вместо этого он устанавливает таймер цикла на количество времени, в течение которого сгорит оставшееся топливо. , тем самым досрочно завершая цикл. В любом случае он вызывает группу 9 для обновления скорости и положения. Затем он проходит по группам 7, 8 и 9, пока значение I не сойдётся.S*KS*K-M

Когда 10-секундный таймер истечет или достигнет конца из-за проверки топлива в строке 03.10 или проверки высоты в 07.10. В последних случаях он перейдет в группу 4 и попадет в группу 5 или сразу перейдет в группу 5. Группа 5 вводит результаты завершения игры, а затем спрашивает пользователя, хотят ли они попробовать еще раз. Если да, то он переходит к 01.20, чтобы очистить все значения и снова распечатать заголовки, если нет, то он переходит к 05.98 и Qвыходит из строя.

Смотрите также

Рекомендации

  1. ^ Руководство 1968 г., с. 1.1.
  2. ^ Декабрь 1957 г. по настоящее время (PDF) . ДЕКАБРЬ. 1978. с. 38.
  3. ^ Маккракен, Гарри (29 апреля 2014 г.). «Пятьдесят лет BASIC, языка программирования, сделавшего компьютеры персональными». Время . Архивировано из оригинала 5 февраля 2016 г. Проверено 12 февраля 2016 г.
  4. ^ аб Маркс, Ширли (декабрь 1971 г.). Годы JOSS: Размышления об эксперименте (PDF) (Технический отчет). Рэнд.
  5. ^ «Смотрите, как растет ваш Альтаир!». Байт . Апрель 1976 г. с. 48.
  6. ^ abcd Щепаньяк 2014.
  7. ^ Справочник EduSystem (PDF) . Цифровой. 1973. с. В.
  8. ^ аб Савец 2013.
  9. ^ Стэплтон, РА; Гудман, SE (июнь 1988 г.). Советский Союз и персональный компьютер «Революция» (PDF) (Технический отчет). Университет Аризоны. п. 8.
  10. ^ "Электроника БК-0010". Музей старого компьютера .
  11. ^ Руководство 1968 года.
  12. ^ ab Руководство 1968, с. 2.1.
  13. ^ Руководство abc 1968, с. 2.7.
  14. ^ ab Руководство 1968, с. 3.7.
  15. ^ Руководство abc 1968, с. 3.2.
  16. ^ Руководство abc 1968, с. 3.6.
  17. ^ Руководство 1968 г., с. А.1.
  18. ^ ab Руководство 1968, с. 3.4.
  19. ^ ab Руководство 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. ^ abcde Руководство 1968, стр. 2.4.
  27. ^ Руководство 1968 г., с. 3.10.
  28. ^ Руководство 1968 г., с. А.3.
  29. ^ Руководство 1968 г., с. 3.8.
  30. ^ «Что случилось с интерпретатором Microsoft FOCAL?» YouTube . Проверено 18 сентября 2022 г.
  31. ^ "Лунный посадочный модуль". Документы, связанные с игрой Lunar Landing .

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

Внешние ссылки