Введение
Язык программирования, используемый на машинах серии DEC PDP, и несвязанный набор функций, связанных с программированием, на калькуляторах HP41. FOCAL (акроним от Formulating On-line Calculations in Algebraic Language, или FOrmula CALculator) — это интерактивный интерпретируемый язык программирования, основанный на JOSS и в основном использовавшийся на машинах серии Programmed Data Processor (PDP) компании Digital Equipment Corporation (DEC). JOSS был разработан как простой интерактивный язык, позволяющий непрограммистам легко писать программы. FOCAL очень похож на JOSS по поддерживаемым командам и общему синтаксису языка. Он отличается тем, что многие продвинутые возможности JOSS, такие как диапазоны и пользовательские функции, были удалены для упрощения парсера. Некоторые зарезервированные слова (ключевые слова) были переименованы так, чтобы все они начинались с уникальной первой буквы. Это позволяло пользователям вводить программы, используя односимвольные операторы, что дополнительно снижало требования к памяти. Это было важным фактором для PDP 8, который часто был ограничен несколькими килобайтами (KB). Как и 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, где стали гораздо более известными. FOCAL не был популярен за пределами платформы PDP и в значительной степени исчез с переходом на VAX 11. Он пережил сильное возрождение в Советском Союзе, где клоны PDP 11 использовались в качестве учебных и домашних компьютеров (серия BK).
the unrelated set of programming related features on HP41 calculators
FOCAL (acronym for Formulating On line Calculations in Algebraic Language, or FOrmula CALculator) is an interactive interpreted programming language based on JOSS and mostly used on Digital Equipment Corporation (DEC) Programmed Data Processor (PDP) series machines. JOSS was designed to be a simple interactive language to allow programs to be easily written by non programmers. FOCAL is very similar to JOSS in the commands it supports and the general syntax of the language. It differs in that many of JOSS' advanced features like ranges and user defined functions were removed to simplify the parser. Some of the reserved words (keywords) were renamed so that they all start with a unique first letter. This allows users to type in programs using one character statements, further reducing memory needs. This was an important consideration on the PDP 8, which was often limited to a few kilobytes (KB). Like JOSS, and later BASICs, FOCAL on the PDP 8 was a complete environment that included a line editor, an interpreter, and input/output routines. The package as a whole was named FOCAL 8, which also ran on the PDP 5 and PDP 12. When ported to the PDP 11, the resulting FOCAL 11 relied on the underlying operating system, RT 11, to provide file support and editing. The language definition was updated twice, to FOCAL 69 and a very slightly modified FOCAL 71. A port to the Intel 8080 was also available. FOCAL is notable as the language in which the original versions of the early video games Hamurabi and Lunar Lander were written. Both were later ported to BASIC, where they became much better known. FOCAL was not popular outside the PDP platform and largely disappeared during the move to the VAX 11. It had a strong revival in the Soviet Union where PDP 11 clones were used as educational and home computers (BK series).
Джосс
JOSS был выпущен в мае 1963 года на уникальном компьютере JOHNNIAC в RAND Corporation. В RAND использование быстро росло, и машина, изначально построенная в 1953 году, быстро достигла предела своих возможностей. JOHNNIAC был выведен из эксплуатации в 1966 году, и JOSS был повторно реализован на недавно приобретенном PDP 6, первой "большой" машине компании Digital Equipment Corporation (DEC). Использование продолжало расти, и к 1970 году системой пользовались от 500 до 600 пользователей по всей стране, что привело к появлению нескольких инноваций, таких как мобильные компьютерные терминалы, которые можно было перемещать из комнаты в комнату и подключать для быстрого доступа. JOSS оказал значительное влияние. Он появился в эпоху становления разделения времени. Возрос интерес к взаимодействию человека и машины, и компьютеры стали получать более широкое распространение. В то время как большинство операционных систем разделения времени того времени были сосредоточены на управлении учетными записями пользователей и файлами, оставляя программирование на усмотрение самих пользователей, JOSS предоставлял в одном пакете средства редактирования файлов и язык программирования. RAND продемонстрировал систему множеству специалистов отрасли.
Основные
В то время как FOCAL набирал популярность на машинах DEC, BASIC становился более востребованной альтернативой на других платформах. К концу 1960-х годов несколько компаний начали завоевывать позиции на рынке мини-компьютеров DEC, предлагая аналогичные машины, работающие под управлением BASIC с разделением времени. Особенно выделялась серия HP 2100, работающая на HP Time Shared BASIC. Дэвид Х. Ахл недавно присоединился к группе PDP 8 в DEC, как раз когда компания проявила интерес к продаже машин для образовательных учреждений. В связи с популярностью BASIC на образовательном рынке, особенно благодаря растущей библиотеке программ BASIC, созданной Консорциумом образовательных вычислений Миннесоты, Ахл обнаружил, что продавать машину с FOCAL было сложно, несмотря на его преимущества. Как он позже заметил:
Ахл взял на себя задачу создать систему BASIC для этой платформы, наняв компанию, которая, как он впоследствии узнал, состояла из единственного программиста в Бруклине, для разработки версии для PDP 8 объемом 4 кВорда. DEC начала продавать комплекты PDP 8 с терминалами и BASIC под названием линейки "EduSystem", а более мощные системы в этой серии оснащались расширенными версиями BASIC, а в некоторых случаях также FOCAL и FORTRAN. Были созданы и некоторые EduSystem на базе PDP 11. Затем Ахл приступил к портированию программ из FOCAL в BASIC, в частности, The Sumer Game (которую он переименовал в Hamurabi), версию Lunar Lander и множество небольших демонстрационных программ FOCAL. Объединив свои порты с материалами, предоставленными сторонними программистами, он собрал достаточно контента для публикации DEC книги "101 BASIC Computer Games" в 1973 году. Книга имела мгновенный успех и выдержала три переиздания до 1975 года. К середине 1970-х годов BASIC стал стандартной функцией всех машин DEC, а использование FOCAL сошло на нет.
Возрождение в Советском Союзе
PDP 11 был клонирован в Советском Союзе в 1970-х годах для военных нужд. В 1980-х годах появились одночиповые варианты, подобные LSI 11, которые привели к созданию серии домашних компьютеров, совместимых с PDP 11. Наиболее известными из нескольких моделей были компьютеры серии Electronika BK, выпущенные в 1985 году. Первоначально они поставлялись с FOCAL на картридже ROM, а картридж BASIC был доступен в качестве опции. В более поздних моделях BASIC поставлялся по умолчанию.
Язык
Нижеследующее описание основано на FOCAL 69, как это представлено в справочном руководстве по языку FOCAL 8.
Прямые и косвенные режимы
FOCAL следовал модели JOSS для взаимодействия через интерфейс командной строки. Это позволяло пользователям вводить команды в "непосредственном режиме", которые выполнялись немедленно, или добавлять к ним номер строки, в этом случае они добавлялись в программу, если номер был уникальным, или заменяли существующий код, если тот же номер уже использовался. Метод работы аналогичен "непосредственному режиму" BASIC и "режиму программы". В отличие от JOSS, где все команды, как программные, так и непосредственного ввода, сохранялись и загружались как часть рабочей области пользователя. Это позволяло JOSS использовать команды без номеров строк для определений и других задач. FOCAL не обладал такой возможностью, поэтому инструкции, которые требовалось загружать и сохранять, стали опциями других команд режима программы, таких как .
Заявления о программе
Каждая строка в программе FOCAL должна начинаться с номера строки. Как и в JOSS, номера строк – это числа с фиксированной точкой, состоящие из двух двухзначных целых чисел, разделенных точкой. В FOCAL 8 допустимые номера строк находятся в диапазоне от 1.01 до 31.99. При выводе, используя , FOCAL, подобно BASIC, добавит ведущие нули; например, 1.10 будет выведено как . Это делает все номера строк пятизначными при выводе, чтобы обеспечить их выравнивание. Операторы, ссылающиеся на эти строки, не требуют ведущих нулей, например, . Число слева от точки называется "номером группы". Группы обеспечивают определенный уровень организации кода, которого нет в таких языках, как Fortran или BASIC. Основное назначение групп – использование их в качестве подпрограмм, которые можно вызвать с помощью , например, перейдет к подпрограмме, написанной в группе 5. Редактор также использовал их во время редактирования, например, можно было для получения листинга кода в группе 2 или для удаления всех строк в группе 4. Каждая строка должна начинаться с командного ключевого слова, следующего за номером строки. В FOCAL нет понятия "команды по умолчанию", как в BASIC с его необязательным оператором . Несколько операторов могут быть размещены на одной строке, разделенных точками с запятой. Обычно поведение не отличается от того, как если бы операторы были на отдельных строках, за исключением циклов FOR.
The number on the left of the period is known as the "group number". Groups provide some level of code organization that is lacking in languages like Fortran or BASIC. The primary use of these was to use a group as a subroutine which can be called with , for example, will jump to the subroutine written in group 5. The editor also used these during edit time, for example, one could to produce a listing of the code in group 2, or to delete all of the lines in group 4. Every line must start with a command keyword following the line number. There is no concept of a "default command" as is the case in BASIC with its optional statement. Multiple statements can be placed on a single line, separated by semicolons. Usually, the behavior is no different than if the statements had been on separate lines, except in the case of FOR loops.
Спроси
Команда (сокращение A) будет принимать список строк и переменных, выводить строки на экран и сохранять ввод пользователя в переменных. Эквивалент командам BASIC:
01.01 ASK "NAME", NAME
01.02 ASK "COORDINATES", X, Y
01.03 ASK "A1",A1,"OMEGA",W,"T0",T0,"DAMPING FACTOR",DAMPINGFACTOR
If the user doesn't enter a number but enters text, the system will convert the initial character to a number with "A"=1, "B"=2, etc.
01.01 ASK "NAME", NAME
01.02 ASK "COORDINATES", X, Y
01.03 ASK "A1",A1,"OMEGA",W,"T0",T0,"DAMPING FACTOR",DAMPINGFACTOR
01.01 ASK "NAME", NAME
01.02 ASK "COORDINATES", X, Y
01.03 ASK "A1",A1,"OMEGA",W,"T0",T0,"DAMPING FACTOR",DAMPINGFACTOR
If the user doesn't enter a number but enters text, the system will convert the initial character to a number with "A"=1, "B"=2, etc.
Если пользователь вводит не число, а текст, система преобразует первый символ в число, где "A"=1, "B"=2 и так далее.
01.01 ASK "NAME", NAME
01.02 ASK "COORDINATES", X, Y
01.03 ASK "A1",A1,"OMEGA",W,"T0",T0,"DAMPING FACTOR",DAMPINGFACTOR
If the user doesn't enter a number but enters text, the system will convert the initial character to a number with "A"=1, "B"=2, etc.
Комментарий
Команда (сокращение C) создает замечание. Эквивалент BASIC's. Оригинальный справочник указывает как синоним COMMENT, используемый для обозначения пустых строк, но внутренне это не различается. 01.01 COMMENT: THE SUMER GAME, автор Ричард Меррилл.
СО
Команда (сокращение D) разветвляет выполнение в подпрограмму. Это эквивалент оператора BASIC. Подпрограмма адресуется либо по номеру группы, либо по номеру строки. Если указан номер строки, выполняется только эта строка, после чего управление возвращается к оператору, следующему за командой DO. Если номер строки не указан, выполнение начинается с первой строки блока и продолжается до конца блока или до встречи оператора RETURN. Оператор RETURN требуется только для преждевременного выхода из группы, он не нужен в конце группы. 01.15 DO 7.24 01.16 DO 8
01.16 DO 8
Гото
Команда (сокращение G) переходит выполнение программы к указанному номеру строки. Она идентична оператору с тем же именем в BASIC. В FOCAL также используется для начала выполнения, как и в BASIC, но в этом случае документация называет её не GOTO, а GO TO, хотя базовая команда остается той же. 01.05 GOTO 1.01 02.90 TYPE ! !,"TRY AGAIN.",!!!!! ;GOTO 1.1
02.90 TYPE ! !,"TRY AGAIN.",!!!!! ;GOTO 1.1
ИФ
Команда (сокращение I) обеспечивает условный переход, основанный на знаке выражения. После числового выражения команда IF может принимать от одного до трех номеров строк. Если выражение меньше нуля, выполнение переходит к первой строке; если равно нулю – ко второй строке; если больше нуля – к третьей строке. В языке отсутствовали относительные операторы, такие как "больше", "равно" или "меньше". Чтобы выполнить переход, если X > 5, необходимо сравнить X с 5. 02.20 IF (25 25) 2.4,2.3,2.4 03.01 IF (X) 3.1,3.02,3.1
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"
02.30 IF (X)1.8,2.50
02.40 TYPE "P"
В этом случае проверка на строке 2.20 приведет к переходу программы на строку 1.8, если результат проверки отрицательный, иначе программа продолжит выполнение и выведет "Q" в консоль. Строка 2.30 перейдет на строку 1.8 или 2.5, если значение отрицательное или равно нулю, в противном случае программа продолжит выполнение и выведет "P" в консоль.
Прекратить
Команда (сокращение Q) завершает выполнение программы и возвращает управление в среду редактирования. Эквивалентна командам BASIC STOP или 01.10 FOR X= 10,1,10;TYPE X 01.20 QUIT.
01.20 QUIT
ВРЕМЕННО
Команда (сокращение R) перенаправляет выполнение из подпрограммы обратно в место вызова. Использование RETURN в последней строке подпрограммы необязательно, так как подпрограмма в любом случае возвращается в конце группы команд. Ниже приведен пример подпрограммы для преобразования запроса "да/нет" в числовое значение. 22.78 КОММЕНТАРИЙ: "ДА ИЛИ НЕТ" ПОДПРОГРАММА
22.80 ЗАПРОС "ОТВЕТ: ДА ИЛИ НЕТ? ", AN
22.82 ЕСЛИ (AN = "YES") 22.84, 22.86
22.84 ЕСЛИ (AN = "NO") 22.8, 22.88, 22.8
22.86 УСТАНОВИТЬ X=2; ВЕРНУТЬСЯ
22.88 УСТАНОВИТЬ X=1; ВЕРНУТЬСЯ
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
СОЗНАНИЕ
Команда (сокращение S) присваивает результат выражения указанной переменной. Эквивалентна оператору BASIC 01.30 SET PI=3.14156 и 01.60 SET INTEREST=PRINCIPAL*(RATE/100)*TERM.
01.60 SET INTEREST=PRINCIPAL*(RATE/100)*TERM
Переменные
Названия переменных могут начинаться с любой буквы, кроме F (буква F зарезервирована для функций) и могут содержать любую последовательность букв и цифр. Однако, учитываются только первые два символа. Например, в следующем фрагменте кода из FOCAL: A New Conversational Language, переменные DESTINATION и DES обозначают одно и то же. Внутри системы обе ссылки относятся к переменной, обозначенной как DE:
01.80 ASK DESTINATION
02.30 IF (DES 14) 2.4,3.1,2.4
01.80 ASK DESTINATION
02.30 IF (DES 14) 2.4,3.1,2.4
Любая переменная может использоваться как массив, допускающий индексы от 2048 до 2047.
Запуск программ
В FOCAL используется в редакторе для запуска программы. Однако, обычно это сокращали до эквивалента оператора RUN в BASIC. Также в редакторе можно использовать для начала выполнения с указанной строки.
Коды ошибок
Поскольку интерпретатору не хватало достаточного объема памяти для хранения сообщений об ошибках или даже таблицы номеров ошибок, FOCAL использовал обходной путь, сообщая адрес кода, обнаруживающего ошибку, в виде числа с фиксированной точкой. Например, при обнаружении ошибки деления на ноль, сообщалось , где 28.73 представляет собой код проверки этой ошибки на странице памяти 28 со смещением в 73 слова, а 01.10 – номер строки, в которой произошла ошибка. Страницы в PDP-8 имели длину 128 байт, поэтому этот адрес соответствует позиции 3657.
ФОКАЛ, 1971 год
Одним из изменений в новой версии был 10-значный математический пакет для повышения точности. Функция теперь возвращала ноль, если входное выражение вычислялось как ноль. Ранее возвращалось значение один. Теперь использовался улучшенный алгоритм, который генерировал более равномерно распределенные числа. Также была добавлена новая функция, принимающая строку и возвращающая её ASCII-код (аналогично BASIC) и функция, принимающая число и возвращающая строку, содержащую соответствующий ASCII-символ. Поскольку все эти возможности требовали ограниченный объем памяти, при запуске FOCAL,1971 система запрашивала у пользователя, какие функции он хотел бы использовать.
As all of these options used up limited memory, when started, FOCAL,1971 entered a dialog that asked the user what features they wanted to use.
Сравнение с JOSS
FOCAL – это, по сути, очищенная версия JOSS с изменениями, призванными сделать синтаксис более лаконичным и удобным для разбора. Почти все команды FOCAL имеют однозначное соответствие командам JOSS и отличаются лишь в деталях. Наиболее заметное отличие на первый взгляд заключается в том, что JOSS не чувствителен к регистру и выводит ключевые слова в смешанном регистре, тогда как FOCAL использовал только заглавные буквы. Кроме того, операторы JOSS заканчиваются точкой, придавая им вид обычных предложений, в то время как FOCAL не требует завершения строки. Важное отличие состоит в том, что JOSS включал полный набор операций сравнения и систему булевой логики, работающую в конструкциях `И` и `ИЛИ`. Более того, ветвления и циклы могли применяться к любому оператору, в отличие от FOCAL, где единственной доступной операцией был эквивалент команды `goto`. Например, в JOSS можно было написать:
1.10 Type A if X>10. 1.20 Type i for i=1(1)10. The first line optionally prints A based on the value of X, and the second prints the numbers 1 to 10. In contrast, FOCAL lacked the ability to compare values, and loops were applied by skipping to the next line when they completed. The equivalent code in FOCAL would be:
1.10 IF (X 10),,1.30
1.20 TYPE A! 1.30 FOR I=1,1,10;TYPE I,! JOSS' implementation makes common constructs easier to build and more closely match a programmer's intentions, at the cost of making the runtime more complex. For example, JOSS allowed ranges in loops to be described in a flexible fashion like 1,2,3,10(5)50,75,78. This flexibility comes at a cost; in FOCAL the start, stop, and step can be written in a custom in memory structure and easily updated as the loop is performed, whereas JOSS requires it to reevaluate an expression that may be, but often isn't, more complex. In order to make the code terser in FOCAL, changes were relatively minor. For example, JOSS' becomes the slightly smaller FOCAL , while becomes Command keywords were also shortened where possible, so JOSS' becomes FOCAL's , both to make it shorter and to allow the letter D to be uniquely used for
To simplify the parser, some FOCAL options were removed. For example, JOSS could perform multiple assignments with while in FOCAL these had to be made individual statements, Likewise, JOSS' , used to format output, was combined into FOCAL's with the .
1.10 TYPE A IF X>10. 1.20 TYPE i FOR i=1(1)10. Первая строка условно выводит A в зависимости от значения X, а вторая – числа от 1 до 10. В отличие от этого, FOCAL не поддерживал сравнение значений, а циклы реализовывались путем перехода к следующей строке после завершения. Эквивалентный код на FOCAL выглядел бы так:
1.10 Type A if X>10. 1.20 Type i for i=1(1)10. The first line optionally prints A based on the value of X, and the second prints the numbers 1 to 10. In contrast, FOCAL lacked the ability to compare values, and loops were applied by skipping to the next line when they completed. The equivalent code in FOCAL would be:
1.10 IF (X 10),,1.30
1.20 TYPE A! 1.30 FOR I=1,1,10;TYPE I,! JOSS' implementation makes common constructs easier to build and more closely match a programmer's intentions, at the cost of making the runtime more complex. For example, JOSS allowed ranges in loops to be described in a flexible fashion like 1,2,3,10(5)50,75,78. This flexibility comes at a cost; in FOCAL the start, stop, and step can be written in a custom in memory structure and easily updated as the loop is performed, whereas JOSS requires it to reevaluate an expression that may be, but often isn't, more complex. In order to make the code terser in FOCAL, changes were relatively minor. For example, JOSS' becomes the slightly smaller FOCAL , while becomes Command keywords were also shortened where possible, so JOSS' becomes FOCAL's , both to make it shorter and to allow the letter D to be uniquely used for
To simplify the parser, some FOCAL options were removed. For example, JOSS could perform multiple assignments with while in FOCAL these had to be made individual statements, Likewise, JOSS' , used to format output, was combined into FOCAL's with the .
1.10 IF (X 10),,1.30
1.20 TYPE A! 1.30 FOR I=1,1,10;TYPE I,!
1.10 Type A if X>10. 1.20 Type i for i=1(1)10. The first line optionally prints A based on the value of X, and the second prints the numbers 1 to 10. In contrast, FOCAL lacked the ability to compare values, and loops were applied by skipping to the next line when they completed. The equivalent code in FOCAL would be:
1.10 IF (X 10),,1.30
1.20 TYPE A! 1.30 FOR I=1,1,10;TYPE I,! JOSS' implementation makes common constructs easier to build and more closely match a programmer's intentions, at the cost of making the runtime more complex. For example, JOSS allowed ranges in loops to be described in a flexible fashion like 1,2,3,10(5)50,75,78. This flexibility comes at a cost; in FOCAL the start, stop, and step can be written in a custom in memory structure and easily updated as the loop is performed, whereas JOSS requires it to reevaluate an expression that may be, but often isn't, more complex. In order to make the code terser in FOCAL, changes were relatively minor. For example, JOSS' becomes the slightly smaller FOCAL , while becomes Command keywords were also shortened where possible, so JOSS' becomes FOCAL's , both to make it shorter and to allow the letter D to be uniquely used for
To simplify the parser, some FOCAL options were removed. For example, JOSS could perform multiple assignments with while in FOCAL these had to be made individual statements, Likewise, JOSS' , used to format output, was combined into FOCAL's with the .
Реализация JOSS упрощала создание распространенных конструкций и лучше соответствовала намерениям программиста, но при этом усложняла время выполнения. Например, JOSS позволял гибко задавать диапазоны в циклах, такие как 1,2,3,10(5)50,75,78. Эта гибкость достигалась ценой: в FOCAL начальное, конечное значения и шаг можно было записать в пользовательскую структуру в памяти и легко обновлять во время выполнения цикла, в то время как JOSS требовал повторной оценки выражения, которое могло быть, но часто не было, более сложным. Чтобы сделать код в FOCAL более лаконичным, изменения были относительно небольшими. Например, JOSS' `IF` становится немного короче FOCAL's `IF`, а `THEN` становится . Ключевые слова команд также были сокращены, где это было возможно, поэтому JOSS' `PRINT` становится FOCAL's `TYPE`, как для сокращения длины, так и для того, чтобы буква D могла использоваться исключительно для .
1.10 Type A if X>10. 1.20 Type i for i=1(1)10. The first line optionally prints A based on the value of X, and the second prints the numbers 1 to 10. In contrast, FOCAL lacked the ability to compare values, and loops were applied by skipping to the next line when they completed. The equivalent code in FOCAL would be:
1.10 IF (X 10),,1.30
1.20 TYPE A! 1.30 FOR I=1,1,10;TYPE I,! JOSS' implementation makes common constructs easier to build and more closely match a programmer's intentions, at the cost of making the runtime more complex. For example, JOSS allowed ranges in loops to be described in a flexible fashion like 1,2,3,10(5)50,75,78. This flexibility comes at a cost; in FOCAL the start, stop, and step can be written in a custom in memory structure and easily updated as the loop is performed, whereas JOSS requires it to reevaluate an expression that may be, but often isn't, more complex. In order to make the code terser in FOCAL, changes were relatively minor. For example, JOSS' becomes the slightly smaller FOCAL , while becomes Command keywords were also shortened where possible, so JOSS' becomes FOCAL's , both to make it shorter and to allow the letter D to be uniquely used for
To simplify the parser, some FOCAL options were removed. For example, JOSS could perform multiple assignments with while in FOCAL these had to be made individual statements, Likewise, JOSS' , used to format output, was combined into FOCAL's with the .
Для упрощения парсера некоторые возможности FOCAL были удалены. Например, JOSS мог выполнять множественное присваивание с помощью `=`, в то время как в FOCAL это требовало отдельных операторов. Аналогично, JOSS' `FORMAT`, использовавшийся для форматирования вывода, был объединен в FOCAL's `TYPE` с помощью `.
1.10 Type A if X>10. 1.20 Type i for i=1(1)10. The first line optionally prints A based on the value of X, and the second prints the numbers 1 to 10. In contrast, FOCAL lacked the ability to compare values, and loops were applied by skipping to the next line when they completed. The equivalent code in FOCAL would be:
1.10 IF (X 10),,1.30
1.20 TYPE A! 1.30 FOR I=1,1,10;TYPE I,! JOSS' implementation makes common constructs easier to build and more closely match a programmer's intentions, at the cost of making the runtime more complex. For example, JOSS allowed ranges in loops to be described in a flexible fashion like 1,2,3,10(5)50,75,78. This flexibility comes at a cost; in FOCAL the start, stop, and step can be written in a custom in memory structure and easily updated as the loop is performed, whereas JOSS requires it to reevaluate an expression that may be, but often isn't, more complex. In order to make the code terser in FOCAL, changes were relatively minor. For example, JOSS' becomes the slightly smaller FOCAL , while becomes Command keywords were also shortened where possible, so JOSS' becomes FOCAL's , both to make it shorter and to allow the letter D to be uniquely used for
To simplify the parser, some FOCAL options were removed. For example, JOSS could perform multiple assignments with while in FOCAL these had to be made individual statements, Likewise, JOSS' , used to format output, was combined into FOCAL's with the .
Версии и спин-оффы
Корпорация Coca Cola использовала специализированную версию FOCAL под названием COKE. FOCAL позже был реализован на PDP 7, PDP 9, PDP 10, PDP 11, PDP 12, PDP 5 и LINC 8. Руководство по FOCAL описывало, как добавлять команды в синтаксический анализатор FOCAL, поэтому многие пользователи добавляли специализированные команды для управления нестандартным оборудованием. Общество пользователей компьютеров Digital Equipment Computer Users' Society собирало множество патчей и улучшений для FOCAL. Существовали даже значительные расширенные версии FOCAL, такие как FOCAL W, которые добавляли множество функций, включая улучшенный ввод-вывод файлов для накопителей и даже виртуальную память с переменными. В середине 1970-х годов DELTA представляла собой более сложную версию FOCAL. Номера строк программы варьировались от 00 до 99 "частей" и от 000000 до 999999 "шагов", выполняемых в алфавитно-цифровом порядке. DELTA имел специальные команды для дисплейного осциллографа Tektronix 4010/14. В России он использовался до начала 1990-х годов в серийно выпускаемых домашних компьютерах серии Electronika BK. Microsoft продавала версию FOCAL на перфоленте. По словам Рэймонда Чена, основная копия записи утеряна, и FOCAL больше не доступен.