Страница произведения
Войти
Зарегистрироваться
Страница произведения

Фокал - часть 3 (пишется)


Автор:
Опубликован:
24.05.2026 — 24.05.2026
Читателей:
1
Аннотация:
Типа продолжение к "Фокал снаружи и внутри"
 
↓ Содержание ↓
↑ Свернуть ↑
  Следующая глава
 
 

Фокал часть третья ред. 0.20.4

Говорят, Королёв, когда его спросили, как он относится к научной

фантастике, ответил, что мол предпочитает фантастику в чертежах. Полностью

солидарен! Ну а если в программном коде? Тогда вот это оно и есть — третья

часть своего рода фанфика: поскольку я таки взял уже готовый сюжет, сперва

по-своему переосмыслил (и это, можно сказать, была часть первая), ну а потом и

сочинил продолжение. Но получившаяся дилогия это ни то ни сё — сюжет просто

требует дальнейшего развития.

Да и изначально заявленные цели пока что так и не достигнуты...

Напоминаю содержание предыдущих серий... Частей?... Глав?... Для мультиков

вон какие-то "сезоны" придумали... Но у нас, уж коли это фанфик, пусть будет

"канон" и "часть первая", "часть вторая"...

В некоторо царстве, в компьютерном государстве жил да был алгоритмический

язык, Фокалом именуемый. Пожалуй что самый простой, из всех известных. Такой,

что проще уже некуда! Само имя которого: "формула-калькулятор", то есть

вычислитель по формулам. Слово "калькули" (вычислять) — дословно "гальковать".

От "галька" — мелкие камушки. Которые, не сподобившиеся даже к изобретению счет

дикари, так по древнегречесскому абаку и перекладывали. И про эти самые счеты

узнали только от вернувшихся из плена солдат Наполеона...

Был этот Фокал — языком интерпретируемым, потому как и вправду выполнял

роль калькулятора в те времена, когда карманных или даже настольных электронных

калькуляторов еще и в помине небыло — элементная база не позволяла. Ресурсов у

тогдашних ЭВМ было очень мало, и соответственно Фокал был заточен на

максимальную их экономию. Что впоследствии сыграло еще раз — в эпоху мини-ЭВМ.

У которых ресурсов тоже было кот наплакал: они предназначались вовсе не для

вычислений, а для управления оборудованием в "реальном времени". И занимали ту

же "экологическую нишу", что и современные микроконтроллеры размером с ноготь

мизинца. Вот и у них ресурсов было примерно столько же, хотя и имели габариты

хорошего такого ящика. (Так что оборудование, которым они управляли, было на

тот момент самое важное: типа реактора — химического или даже атомного...) Это

уже несколько потом наконец догадались, что общение с сидящим за терминалом

пользователем это тоже задача реального времени, и для этого появился класс

ЭВМ "супер-мини", занимающий уже пол комнаты, но за то обслуживающий целый

терминал-класс и имеющий ресурсов побольше, чем "большие" ЭВМ предыдущего

поколения. А до того ресурсов мини-ЭВМ (в основном оперативной памяти: внешней,

типа дисков, барабанов или хотя бы магнитных лент, как правило вообще небыло)

едва-едва хватало на самое простое и нетребовательное. Вот на Фокал хватало, а

на Бейсик — уже нет.

Да, появился Фокал в незапамятные времена, может и по-позже Фортрана, но

раньше Бейска. История об этом не то что бы умалчивает, но врёт как сивый

мерин: лично мне рассказывали совсем не то, что нынче пишут в Википедии...

Впрочем, не важно; важно то, что все упомянутые языки — языки первого

поколения. Где из структур данных — только массив, а из структур управления -

метки и переходы к ним: условный, безусловный и к подпрограмме (плюс возврат

из неё) — в точности как и у "аппаратной" машины и у отображающих машинные коды

языков низкого уровня, известных как "ассемблеры". Впрочем, тогда их у нас

называли "автокодами". Среди которых числится например автокод машины Эльбрус,

который по этому самому "семантическому уровню" будет повыше иных, самых

продвинутых тогдашних языков "высокого" уровня... (Впрочем, это уже совсем

другая история, так что как ни будь потом.) Ну так с куда более широко

известным Бейсиком, Фокал обычно и сравнивают. Хотя как по-мне, Фокал на фоне

это сляпанного на скорую руку подмножества Фортрана, как просвечивающая

насквозь чашечка китайского фарфора на фоне жестяной кружки из аглицкого паба.

Но в целом — да, исходно сопоставимы и по организации и по функциональности.

Только Фокал — язык куда более диалоговый; он более лаконичен, гораздо лучше

продуман и вообще рассчитан на хорошо подготовленных пользователей, а вовсе не

на начинающих, как Бейсик с его сомнительной "опорой на естественный язык".

(Больший маразм сыщется разве что в Коболе!) Впрочем, для начального обучения

программированию не годятся ни тот ни другой...

Надеюсь, Вы уже поняли, что всё это была только присказка.

И догадались, что произведение здесь — сам Фокал. А вот это — только его

описание. Сам же он выложен на old-dos.ru — в том числе вместе с исходными

текстами.

Но для понимания нижеизложенного надо проникнуться его духом, осознать

исходный сюжет как комплекс идей и возможные пути их развития. Поэтому

(увы-увы) сперва приходится хотя бы кратенько излагать всё с азов, не ссылаясь

на ранее уже понаписанное. А понаписано уже много... (Впрочем, каждое вот такое

описание "с нуля" — повод для очередной ревизии языка. Да и её результат...)

Постараюсь в этот раз без излишних подробностей. (Хелп есть.) Поехали!


* * *

Итак, Фокал — язык диалоговый, строчно ориентированный. В том смысле, что

человек-пользователь сидит за терминалом и ведёт с ейным интерпретатором

диалог, набирая командные строчки. Набрал, нажал "ввод" — Фокал что-то сделал

(и в том числе выдал результат этой своей деятельности на тот же терминал),

после чего выдаёт приглашение ко вводу следующей командной строки. Традиционно

это символ * (звёздочка). Для сравнения: Бейсик, как я его застал, делает то

же самое, печатая "ready" в отдельной строке (что мол готов к приёму следующей

команды).

Командная строка состоит из "операторов", каждый из которых предписывает

интерпретатору одно законченное, элементарное (для данного языка) действие.

(А сидящего за терминалом человека приходится называть "пользователем": так уж

исторически сложилось — извините!) Этот самый "оператор" в Фокале (да и в

Бейсике) обязательно начинается с ключевого слова, указывающего, что надо

сделать. И может состоять из него одного, или содержать что-то еще. Например:

Quit — выйти из интерпретатора обратно в операционную систему (ОС).

Но сначала его, разумеется, надо было запустить. Например написав в

командной строке операционнй системы: foc или foc.exe или даже foc.exe aaa

Если файл "aaa" есть — попытается загрузить якобы содержащуюся в нём программу.

Если нету — заругается... Так что запустим по-новой и продолжим:

Write — выдать на терминал всю имеющуюся в памяти программу

Go — запустить её выполнение

Go 7.3 — запустить со строки вот с таким номером

Write 7.3 — распечатать одну только эту строку.

Eraze 7.3 — удалить эту строку

Eraze — удалить переменные (запущенная программа заведёт их по-новой)

Eraze All — удалить вообще всё (обычно перед загрузкой новой программы)

Операторов в строке может быть как один так и несколько — сколько

поместится. Тогда они разделяются символом ; (точка с запятой), который внутри

оператора не встречается. Там, если есть несколько элементов, они разделяются

запятыми. А части таких конструкций — точками. Например: Type 1.23 , 4.56 , 7.8

выдаст на терминал вот эти вот три числа... Или: Type %5.4 , 32109876

выдаст 3.211E+07 потому что формат "%5.4" предписал выдать только четыре

значащие цифры. (В поле из пяти позиций, где это число заведомо не поместится!)

Командная строка сразу выполняется только если у неё в начале нету номера.

И тогда она называется "нулевой" или "прямой", а имеющая номер соответственно

"косвенной". Пронумерованные строки сохраняются в памяти и составляют

собственно программу. Которую можно запустить командой в прямой строке.

А вот остановить... Если сама не остановится, например выполнив оператор Quit.

Остановить — только по ошибке: если ожидает ввода оператор Ask — написать ему

нечто некорректное, а если не ожидает — два раза нажать любую клавишу: в

результате произойдёт переполнение буфера клавиатуры (который — всего под один

символ). А я в своей реализации еще и сделал реакцию на комбинацию кнопок

Ctrl/Ц — например вот для такого случая:

1.1 Type FCHr(-1); Go 1.1

Go

Здесь функция посимвольного ввода/вывода FCHr() забирает символы из буфера

клавиатуры всяко быстрее, чем я нажимаю кнопочки...

При любой ошибке выполнение программы всегда останавливается; каналы ввода

и вывода принудительно переключаются на терминал и клавиатуру; и сообщив что

именно произошло (типа: ошибка такая-то в строке такой-то) интерпретатор

передаёт управление пользователю — ждёт от него очередную командную строку.

Надеюсь, Вы уже догадались, что и в этих и во всех следующих примерах все

буквы на самом деле могут быть как заглавные так и строчные. Но заглавными

здесь — те, без которых не обойтись, а те которые строчные — писать не

обязательно. (Немножко синтаксического сахару.) Впрочем, так вроде все делают...

Элементарное для Фокала действие это вычислить выражение и как-то

использовать его результат. Как именно — как раз и указывается ключевым словом

оператора. А выражение указывает, как производить вычисления по формуле.

Например:

Type 3*(4+5) — выдать результат на терминал

Save Y=3*(4+5) — сохранить его в переменной Y, чтобы использовать потом

(Обычно пишут не "Save" — сохранить, а "Set" — установить. Типа установить

значение переменной такой-то равное вот тому-то. Но здесь это без разницы:

важна только первая буква, остальные всё равно игнорируются.)

Правила построения выражений — самые обычные, в точности как и в других

языках. Или как в школе учили. Разве что там для упрощения записи дозволялось

опускать знак операции умножения. Потому что неизвестные величины обозначались

всегда одной буквой (для каждой физической величины — всегда одной и той же:

V — скорость, a — ускорелие, l — пройденное расстояние, h — высота, m — масса,

t — время, T — температура, U — напряжение, I — ток, R — сопротивление... и так

далее и тому подобное), а буде их несколько — со всякими штрихами/засечками,

или в тяжелых случаях — с подстрочными или надстрочными индексами... А здесь

такой фокус не получается: играющие их роль переменные обозначаются СЛОВАМИ,

состоящими из букв и цифр. И, да — начинающимися обязательно с буквы. (Потому

что слово, начинающееся с цифры — это скорее всего константа.) А индексы

приходится писать после такого слова в скобках. Если их несколько — через

запятую. Так что Ax+By+C приходится записывать как A*x + B*y + C

Математических операций ровно пять: + — * / ^ (последняя — возведение в

степень). Скобки — любые: ([{<>}]) но разумеется они должны быть

"сбалансированны". Символы < > тоже считаются скобками — "угловыми". Операций

сравнения нет: во-первых некоторые из них будут из двух символов (>= <= ...)

что нарушает один из фокаловских принципов, а во-вторых ввести их только для

одного оператора (как это сделано в Бейсике) — нарушить другой фокаловский

принцип, более важный. А если разрешить их везде, то они потянут за собою

логический тип данных... (И типы вообще!) Нам такого счастья и даром не надь,

и за деньги не надь, и с деньгами не надь! (Ц) Поэтому в операторе условного

перехода If — сравнение с нулём (как, кстати, и в Фортране) и переход на три

стороны. Да, не очень удобно: сравнивать два числа приходится их друг из

дружки вычитанием... (Зато результат — готовое значение в трёхзначной логике с

"нейтральным" элементом 0. Или даже в нечеткой. Которые, в отличии от бинарной,

не приводят к парадоксам.)


* * *

Для сравнения: в Бейсике вроде как всё то же самое: единственный тип

данных, те же самые пять операций (разве что возведение в степень обозначается

**); переменные — только глобальные, как простые так и с одним или двумя

индексами; функции — только встроенные; операторы начинаются с ключевого слова;

программные строки — нумеруются. И эти номера тоже служат как метками для

операторов передачи управления, так и используются командами, обслуживающими

саму программу. Например RUN запускающей её выполнение, LIST выдающей

пользователю, SAVE сохраняющей на некотором внешнем носителе, или удаляющей

ненужные уже строки DELETE...

Первое, что лично мне тогда бросилось в глаза: в Бейсике это именно что

"команды", отдельные от операторов языка, и допустимые только в "прямой"

строке. А вот в Фокале — это тоже операторы (Do, Write, Eraze), вполне

уместные и в "косвенных". Так что программа вполне может обслуживать самоё

себя. (Шаг к самомодификации!)

Впрочем, на предыдущем этапе компьютеризации этих команд в Бейсике еще

небыло: программа грузилась с перфокарт в точности так же, как и фортрановская.

(О чем, кстати, говорят до сих пор сохранившиеся перфокарточные "рудименты":

операторы DATA и READ.) А на следующем — уже небыло: Бейсик сделали в виде

"турбо-среды" — программа набиралась и обслуживалась с помощью встроенного в

турбо-среду редактора и системы меню.

А вот Фокал и изначально был диалоговым, и желает таковым оставаться впредь!

((Лирическое отступление.

Так называемый "интерфейс командной строки", который и использует Фокал,

это реально круто, что бы нынче о нём глупцы ни думали... Он на порядок мощнее

более "современных" и "продвинутых", и при том на два порядка дешевле и проще

в реализации. Позволяет "с помощью хилободов управлять гигабайтами" (Ц).

Но недостатки — продолжение достоинств: ненаглядно и трудоёмко (по

сравнению, например, с тыканьем в иконки мышкою, когда на экране всё наглядно

разрисовано): надо набирать командные строчки, знать командный язык, иметь

алгоритмическое мышление и держать в голове модель предметной области... Да,

сейчас это уровень крутых профессионалов. Хотя, казалось бы — чего же тут

особенного?!

Чтобы достоинства реализовались, что и позволит мириться с недостатками,

командный язык обязательно должен быть языком программирования, по-возможности

хорошо продуманным. Как например UNIX`овский sh. Фокалу есть на кого равняться!

Конец лирического отступления.))

Следующее принципиальное отличие: в Бейсике номера строк — целые числа,

а в Фокале — дробные. В результате бейсиковская программа — сплошной массив

строк, а фокаловская распадается на "группы". В каждой из которых удобно

разместить "подпрограмму", выполняющую одно законченное сложное действие.

Более того, в Фокале группа — это "естественная подпрограмма": получив

123 ... 121314
 
↓ Содержание ↓
↑ Свернуть ↑
  Следующая глава



Иные расы и виды существ 11 списков
Ангелы (Произведений: 91)
Оборотни (Произведений: 181)
Орки, гоблины, гномы, назгулы, тролли (Произведений: 41)
Эльфы, эльфы-полукровки, дроу (Произведений: 230)
Привидения, призраки, полтергейсты, духи (Произведений: 74)
Боги, полубоги, божественные сущности (Произведений: 165)
Вампиры (Произведений: 241)
Демоны (Произведений: 265)
Драконы (Произведений: 164)
Особенная раса, вид (созданные автором) (Произведений: 122)
Редкие расы (но не авторские) (Произведений: 107)
Профессии, занятия, стили жизни 8 списков
Внутренний мир человека. Мысли и жизнь 4 списка
Миры фэнтези и фантастики: каноны, апокрифы, смешение жанров 7 списков
О взаимоотношениях 7 списков
Герои 13 списков
Земля 6 списков
Альтернативная история (Произведений: 213)
Аномальные зоны (Произведений: 73)
Городские истории (Произведений: 306)
Исторические фантазии (Произведений: 98)
Постапокалиптика (Произведений: 104)
Стилизации и этнические мотивы (Произведений: 130)
Попадалово 5 списков
Противостояние 9 списков
О чувствах 3 списка
Следующее поколение 4 списка
Детское фэнтези (Произведений: 39)
Для самых маленьких (Произведений: 34)
О животных (Произведений: 48)
Поучительные сказки, притчи (Произведений: 82)
Закрыть
Закрыть
Закрыть
↑ Вверх