Фокал (Focal, акроним от ) — интерпретируемый язык программирования высокого уровня, переработка языка JOSS.

Наибольший вклад в разработку языка внёс , один из ключевых разработчиков DEC PDP-8, создавший изначальный (в 1968 году) и классический (FOCAL-69) интерпретаторы Фокала для PDP-8. Компания DEC позиционировала Фокал как «язык типа JOSS».

Как и ранние версии Бейсика (который появился через 7 лет), интерпретатор Фокала сам обеспечивал всё необходимое программное окружение и не нуждался в операционной системе.

Фокал крайне нетребователен к ресурсам. Так, он работал на самых простых вариантах PDP-8, в том числе на системах без устройств хранения. Многопользовательские варианты интерпретатора поддерживали одновременную работу до четырёх пользователей на телетайпных терминалах. Позднее были созданы реализации для PDP-7/9 и PDP-11.

Компания Coca-Cola использовала внутри фирмы доработанную версию Фокала под названием COKE.

Из советских компьютеров Фокал существовал на Электронике БК-0010/0011 и ДВК встроенный в ПЗУ (в поздних моделях БК — доступный на картридже). Имелись также доступны расширения Фокала для этих машин, написанные различными энтузиастами. Расширения содержали разнообразные дополнительные команды и функции для работы с графикой, звуком, запуска двоичных программ, обработки строк и ряд других.

Существенно расширенная версия языка использовалась в качестве включающего языка в ДИАСП — Диалоговой системе проектирования — специализированной САПР, предназначенной для целей микроэлектроники.

В 1990-е годы энтузиастами была предпринята попытка переноса Фокала на IBM PC (Turbo Focal), но она не вышла из стадии бета-версии, распространявшейся по каналам BBS.

Работоспособность публично доступной в исходных текстах версии Focal-81 была успешно протестирована на следующих платформах и компиляторах:

Sun SPARC gcc 2.6.3 (ANSI C) и Sun cc (K&R C), под SunOS 4.1.3 gcc 2.6.3 (ANSI С) и SunPro cc 2.0.1 (ANSI С), под Solaris 2.3 HP (9000 модель 720) gcc 2.5.8 (ANSI C) и HP cc (ANSI C) под HP-UX 8.05 x86 MS C (ANSI C) и LSI C-86 (близко к ANSI C) под MS-DOS MS Visual C++ под Win32 (не тестировалась)

Из-за схожести синтаксиса Фокал часто сравнивался с Бейсиком. В целом язык уступает Бейсику по своим выразительным возможностям — так, в Фокале совершенно отсутствует строковый тип данных; все переменные на Фокале — числовые (как правило, дробные числа с плавающей запятой). Вместе с тем интерпретатор Фокала гораздо менее требователен к ресурсам (прежде всего к памяти), нежели Бейсик, что позволяло писать более сложные программы в системах с ограниченными ресурсами.

С конца 1980-х годов Фокал не развивается и практически не используется, вышеупомянутые порты Focal-81 были сделаны энтузиастами для развлечения.

Некоторые команды Фокала командаописаниеаналог в БейсикеCOMMENTкомментарий (текст следом за командой игнорируется)REMTYPEвывод на консоль значений констант и выраженийPRINTQUITштатное завершение выполнения программыENDSETприсваивание значения переменной (или элементу массива)LETASKввод значений с консолиINPUTGOTOбезусловный переходGOTODOвызов подпрограммыGOSUBRETURNвозврат из подпрограммыRETURNIFветвление по значению выражениячастично соответствует IF

Интерпретатор языка распознаёт команды по первой её букве, поэтому нет необходимости писать их полностью. Существовали также версии Фокала с ключевыми словами на европейских языках (поставляемые DEC).

Примеры программ Стандартный пример Hello World

1.05 C Программа выводит на экран тестовую строку 1.10 T "Hello World !" ! 1.20 Q

Решение квадратного уравнения вида ax² + bx + c = 0

1.05 C **** Программа для решения квадратного уравнения вида ax^2 + bx + c = 0 1.10 T "Введите коэффициенты a, b, c для уравнения ax^2 + bx + c = 0" ! 1.20 A "a = ", a ! "b = ", b ! "c = ", c 1.30 T ! "Решаем уравнение (", a, ")x2 + (", b, ")x + (", c, ") = 0" ! 1.35 C **** Вычисляем дискриминант 1.40 S d = b^2 - 4*a*c 1.50 T ! "D = ", d ! 1.55 C **** Выясняем количество корней 1.60 I (d) , 3, 4 1.65 С **** первая метка пропущена, поэтому при значении D 1.66 C **** меньшем нуля мы попадаем на следующую за IF строку 2.05 С **** Отрицательный дискриминант - корней нет 2.10 T "Уравнение не имеет действительных корней" ! 2.20 Q 3.05 С **** Нулевой дискриминант - один корень 3.10 T "Уравнение имеет один корень" ! 3.20 S s = 0 3.30 D 5 3.40 T "x = ", x ! 3.90 Q 4.05 С **** Положительный дискриминант - два корня 4.10 T "Уравнение имеет два корня" ! 4.20 S s = FSQT(d) 4.30 D 5 4.40 T "x1 = ", x ! 4.50 S s = -s 4.60 D 5 4.70 T "x2 = ", x ! 4.90 Q 5.05 C **** Подпрограмма вычисления корня, где s - корень дискриминанта со знаком 5.10 S x = (s - b) / (2*a) 5.90 R

Метки строк в Фокале имеют вид <номер_группы>.<номер_строки>. В командах GOTO, IF, DO может указываться как полная метка, так и номер группы без номера строки (вызывает переход на строку с наименьшим номером в этой группе).

Восклицательный знак («!») в командах ASK и TYPE (ввод-вывод с консоли) является (наравне с запятой) разделителем аргументов, и вызывает перевод строки перед вводом или выводом следующего элемента списка.

Команда IF вычисляет значение выражения и переходит по одной из трех меток из предоставленного списка в зависимости от результата — отрицательного, нулевого или положительного. Если метка опущена, то управление передается на следующую за IF строку.

Примечания

Литература

Ссылки The Retrocomputing Museum — интерпретатор FOCAL-81 для POSIX систем. Эмулятор различных ЭВМ, на котором можно запускать Фокал DEC’s FOCAL 1969 Promotional Booklet Focal-81 в исходниках (копия на github) Фокал для отечественных ЭВМ (Москва, Миэт 1988).

Категория:Языки с динамической типизацией