Что такое FOCAL?

FOCAL (FOrmula CALculator) — интерпретируемый язык программирования высокого уровня, разработанный в 1968 году компанией Digital Equipment Corporation (DEC) для мини-ЭВМ серии PDP. По замыслу создателей, он должен был стать простым и удобным средством для математических и инженерных расчётов, альтернативой более громоздкому FORTRAN.

Язык получился настолько лёгким в реализации, что его интерпретатор требовал всего 4–8 КБ оперативной памяти — по тем временам это был настоящий подвиг. Именно эта экономичность сделала FOCAL невероятно популярным в СССР, где его портировали на множество отечественных ЭВМ — от «СМ ЭВМ» до «Электроники-60» и машин на базе процессора К1801ВМ1, например БК 0010.

Интересный факт: в США FOCAL не прижился — ему предпочли более мощный BASIC. А вот в Советском Союзе он стал настоящим «народным языком» для научных лабораторий и заводских цехов.

Уровень языка: между ассемблером и C

По своей абстракции FOCAL стоит заметно выше машинного языка (ассемблера) и даже выше чистого C. Он оперирует переменными, функциями, циклами и условиями, скрывая от программиста регистры и управление памятью. При этом из-за интерпретируемого характера он работает медленнее компилируемых языков, но позволяет быстро тестировать алгоритмы.

Структура программы: нумерованные строки

Программа на FOCAL состоит из пронумерованных строк. Номер строки — это десятичное число, например 1.10. Целая часть обычно обозначает блок (логически связанную группу), а дробная — конкретную строку внутри блока.

Пример простейшей программы:

1.10 ASK X
1.11 TYPE !, X

Эта программа запрашивает у пользователя число X (строка 1.10), а затем выводит его на экран с переводом строки (строка 1.11). Символ ! — это управляющий код перевода строки.

Важное правило: строки внутри блока могут быть не подряд, например 1.10, 1.15, 1.20 — это допустимо. Интерпретатор выполняет их в порядке возрастания номеров.

Основные Операторы FOCAL

ОператорСинтаксисДействие
ASKASK XВвод числа с клавиатуры в переменную X
TYPETYPE !, "текст", XВывод данных на экран. ! — перевод строки, # — возврат каретки, $ — вывод списка всех переменных
SETSET X = 5Присваивание значения переменной
GOGO 2.10Безусловный переход на указанную строку
IFIF X, 10.1, 20.2, 30.3Условный переход: первая метка — для X<0, вторая — для X=0, третья — для X>0
FORFOR X = 1, 1, 10Цикл по X от 1 до 10 с шагом 1. После окончания цикла управление переходит на строку, следующую за FOR
DODO 5.10Вызов подпрограммы, начинающейся с указанной строки. Возврат — по оператору RETURN
RETURNRETURNВозврат из подпрограммы, вызванной DO
QUITQUITЗавершение работы программы
WRITEWRITE 3Вывести на экран строку с номером 3
ERASEERASE 2, TEXTУдалить строку 2 (или все строки с текстом, или все переменные)
COMMENTCOMMENT Это комментарийКомментарий
MODIFYMODIFY 4.10Перейти в режим редактирования строки 4.10
EXECUTEEXECUTE FCHR(65)Выполнить функцию без присваивания результата

Математические функции

FOCAL предоставлял набор встроенных математических функций (все они начинались с буквы F):

Как программировали условия без логических операторов?

Любопытная особенность: в классическом FOCAL не было операторов сравнения (>, <, =) в привычном виде. Вместо них использовался трёхпозиционный IF. Чтобы проверить, равно ли X нулю, писали:

IF X, 10.2, 10.1, 10.2

А чтобы проверить X > 0:

IF X, 10.1, 10.1, 10.2

Существовали готовые «шаблоны» для всех отношений:

УсловиеКонструкция IF
X = YIF X-Y, 10.2, 10.1, 10.2
X ≠ YIF X-Y, 10.1, 10.2, 10.1
X > YIF X-Y, 10.2, 10.2, 10.1
X < YIF X-Y, 10.1, 10.2, 10.2

Неожиданный факт: Это не было упущением, а сознательным решением. Такой подход укладывался в 4-килобайтный интерпретатор и был очень эффективен по памяти.

Переменные и типы данных

В FOCAL существовал единственный тип данных — вещественное число двойной точности (диапазон примерно от 10⁻³⁸ до 10³⁸). Имена переменных — латинские буквы (иногда с цифрой, например A1). Отсутствие строкового типа компенсировалось функцией FCHR() и возможностью ввести строку как число — в этом случае в переменную попадал закодированный код, где каждая буква давала вклад, пропорциональный её номеру в алфавите.

Пример кодирования:
Если на запрос числа ввести «NO», то система посчитает:
14*10¹ + 15*10⁰ = 155. Да, так тоже можно было программировать!

Пользовательские функции (хитрость с FSBR)

Функция FSBR(n, arg) позволяла эмулировать пользовательские функции. Номер строки n — это начало подпрограммы, которой присваивается специальная переменная &. После выполнения подпрограммы FSBR возвращает значение &.

Пример — вычисление котангенса:

1.10 ASK X
1.12 LET R = X * 3.14159 / 180
1.14 TYPE "ctg( ", X, " ) = ", FSBR(5, R)
1.16 QUIT

5.10 & = 1 / FTAN(&)

Коды ошибок

В советской версии ФОКАЛа сообщения об ошибках выглядели так:

КодЗначение
0Перезапуск системы
1Неверный номер строки
2Неизвестная функция или переменная
3Непарные скобки
4Неправильный оператор
5Строка не существует
6Строка не существует
7Ошибка присваивания / цикла
8Отсутствует оператор или отношение
9Переполнение
10Программа слишком длинна
11Слишком много переменных
12Слишком больше число
13Ошибочный адрес
14Деление на ноль
15Слишком большая или маленькая экспонента
16Слишком много символов во вводе
17Квадратный корень из отрицательного числа
18Переполнение

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Chat on Telegram