Простые программы на Каллисто: различия между версиями

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Нет описания правки
 
(не показано 45 промежуточных версий этого же участника)
Строка 1: Строка 1:
[[Каллисто]] является расширением [[ЯМК|входного языка МК-161]]. Что это означает? Давайте проверим это утверждение на примере классических программ для советских [[ПМК]]. Вот простые, но широко известные программы для вычисления гиперболических функций из [[Справочник по расчётам на микрокалькуляторах, 3-е изд. (книга)|3 изд. справочника проф. Дьяконова]] (стр. 174):
''Перед изучением программирования рекомендуется ознакомиться с учебной статьёй «[[Первое знакомство с Каллисто]]»''
 
 
[[Каллисто]] является расширением [[ЯМК|входного языка]] [[Электроника МК-161|«Электроники МК-161»]]. Что это означает? Давайте проверим это утверждение на примере классических программ для советских [[ПМК]]. Вот простые и широко известные программы для вычисления [https://ru.wikipedia.org/wiki/Гиперболические_функции гиперболических функций] из [[Справочник по расчётам на микрокалькуляторах, 3-е изд. (справочник)|3-го изд. справочника проф. Дьяконова]] (стр. 174):


[[Файл:DjakonovHyp.png]]
[[Файл:DjakonovHyp.png]]


== Наша первая программа на Каллисто ==
== Наша первая программа на Каллисто ==
В качестве первого упражнения возьмём программу 4.1 для вычисления гиперболического синуса sh, которая на языке МК выглядит так:
В качестве первого упражнения возьмём программу 4.1 для вычисления гиперболического синуса sh, которая на [[ЯМК|языке МК]] выглядит так:
  Fe<sup>x</sup> ↑ F1/x − 2 ÷ С/П БП 00
  Fe<sup>x</sup> ↑ F1/x − 2 ÷ С/П БП 00


Строка 10: Строка 13:
  : sh  e<sup>x</sup> ↑ 1/x − 2 ÷ . ;
  : sh  e<sup>x</sup> ↑ 1/x − 2 ÷ . ;


Каллистянская программа для вычисления гиперболического синуса начинается с [[Слово :|двоеточия]] и заканчивается [[Слово ;|точкой с запятой]]. Это аналоги команд калькулятора [[F ПРГ]] и [[F АВТ]]. Они переключают [[Каллисто]] из состояния интерпретации в состояние компиляции и обратно. В состоянии интерпретации слова исполняются сразу же (как в [[Режим автоматической работы|автоматическом режиме калькулятора]]), а в состоянии компиляции — запоминаются, чтобы исполниться позже (похоже на [[режим программирования]]).
Каллистянская программа для вычисления (и вывода на [[индикатор]]) гиперболического синуса начинается с [[Слово :|двоеточия]] и заканчивается [[Слово ;|точкой с запятой]]. Предки этих двух коротких слов — команды калькулятора [[F ПРГ]] и [[F АВТ]]. Они переключают [[Каллисто]] из состояния интерпретации в состояние компиляции и обратно. В состоянии интерпретации слова исполняются сразу же (как в [[Режим автоматической работы|автоматическом режиме калькулятора]]), а в состоянии компиляции — запоминаются, чтобы исполниться позже (похоже на [[режим программирования]]).


Первое отличие в том, что после [[Слово :|двоеточия]] идёт слово sh. Это имя программы, а точнее нового слова для вычисления (и вывода на экран) гиперболического синуса. [[Каллисто]] может хранить [[Словарь|в своём словаре]] не одну программу, как советские [[ПМК]], а множество слов. Чтобы их различать, каждому слову положено уникальное имя. Слова можно сравнить с программой для советского [[ПМК]]. Чаще всего они даже превосходят по своим возможностям такие программы.
Первое отличие в том, что после [[Слово :|двоеточия]] идёт слово sh. Это имя программы, а точнее нового слова для вычисления гиперболического синуса. [[Каллисто]] может хранить [[Словарь|в своём словаре]] не одну программу, как советские [[ПМК]], а многие сотни слов. Чтобы их различать, каждому слову положено уникальное имя. Слова можно сравнить с программой для советского [[ПМК]]. Чаще всего они даже превосходят по своим возможностям такие программы.


Также можно заметить, что каллистянские команды для вычисления функций (они тоже являются словами) похожи на ПМКшные, но не требуют начальной буквы F.  [[F EXP|Fe<sup>x</sup>]] и [[F1/x]] превратились в обычные [[Eˣ|e<sup>x</sup>]] и [[Слово 1/X|1/x]]. Некоторые справочники по ПМК уже использовали подобное соглашение. Перед [[Слово ;|точкой с запятой]] в определении нашего слова sh стоит [[Слово .|точка]]. Эта точка нужна для вывода результата на [[индикатор]], являясь своеобразным аналогом команды С/П. Такой вывод нужен в учебном примере. Настоящий библиотечный sh, разумеется, будет оставлять конечный результат в стеке. Ведь он может понадобиться в цепочечных вычислениях.
Также можно заметить, что каллистянские имена функций (они тоже являются словами) похожи на ПМКшные, но не требуют начальной буквы F.  [[F EXP|Fe<sup>x</sup>]] и [[F1/x]] превратились в обычные [[Eˣ|e<sup>x</sup>]] и [[Слово 1/X|1/x]]. Некоторые справочники по ПМК уже использовали подобное соглашение. Перед [[Слово ;|точкой с запятой]] в определении нашего слова sh стоит [[Слово .|точка]]. Эта точка нужна для вывода результата на [[индикатор]], являясь своеобразным аналогом команды С/П. Такой вывод нужен в учебном примере. Настоящий библиотечный sh, разумеется, будет оставлять конечный результат в стеке. Ведь он может понадобиться в вычислениях «по цепочке».


Давайте проверим, правильно ли вычисляет наше новое слово sh гиперболический синус:
Давайте проверим, правильно ли вычисляет наше новое слово sh гиперболический синус:
  1 sh
  1 sh
[[Файл:sh.png|||264px|]]
Как видим, результат совпадает с тем, что приводит в справочнике профессор Дьяконов.


Если вы создаёте библиотеку гиперболических функций (слов) на [[Каллисто]], конечный результат будет выглядеть вот так:
Если вы пишите на [[Каллисто]] библиотеку гиперболических функций, окончательное определение гиперболического синуса sh будет выглядеть в ней так:
  : sh  ( x -- sh x)  e<sup>x</sup> ↑ 1/x − 2 ÷ ;
  : sh  ( x -- sh x)  e<sup>x</sup> ↑ 1/x − 2 ÷ ;


Строка 26: Строка 31:
Согласитесь, переносить простые программы с [[ЯМК|языка МК]] на [[Каллисто]] легко. При этом их исходный текст выглядит лучше, а обращаться к ним удобней! Попробуйте самостоятельно перенести на [[Каллисто]] программу 4.2.
Согласитесь, переносить простые программы с [[ЯМК|языка МК]] на [[Каллисто]] легко. При этом их исходный текст выглядит лучше, а обращаться к ним удобней! Попробуйте самостоятельно перенести на [[Каллисто]] программу 4.2.


== Наша первая каллистянская переменная ==
== Программа, использующая переменную ==
Теперь упражнение посложней. Программа 4.3 использует [[X1|регистр промежуточного результата X1]]. Поскольку в [[Каллисто]] нет такого регистра, одно из решений — [[VALUE|объявить промежуточную переменную]], куда и запишем промежуточный результат. Назовём её x1 :
Теперь упражнение посложней. Программа 4.3 использует [[X1|регистр предыдущего результата X1]]:
  0 VALUE x1
 
Fe<sup>x</sup> ↑ ↑ F1/x + 2 ÷ − FВx ÷ С/П БП 00
 
Поскольку в [[Каллисто]] нет такого регистра, простейшее решение — [[VALUE|объявить переменную]], куда и запишем промежуточный результат. Назовём её x1 (число в переменную x1 копирует фраза ↑ to x1 ):
  0 value x1
  : th  ( x -- sh x/ch x)  e<sup>x</sup> ↑ ↑ 1/x + 2 ÷  ↑ to x1  − x1 ÷ ;
  : th  ( x -- sh x/ch x)  e<sup>x</sup> ↑ ↑ 1/x + 2 ÷  ↑ to x1  − x1 ÷ ;
Проверим результат на примере из справочника:
  1 th .
  1 th .
[[Файл:th.png|||264px|]]
Результат совпадает с точностью до последнего знака.
Конечно же, программы-«спагетти» переводить на [[Каллисто]] сложнее и потребует чуть больше подготовительных действий. [[Каллисто]] настаивает на структурном программировании. Зато об адресах и метках можно забыть, используя условный оператор и циклы, один из которых совместим с ПМКшным [[FL0]].
== Цикл со счётчиком ==
Переведём на [[Каллисто]] классическую программу вычисления факториала (стр. 148):
[[Файл:DjakonovFact.png]]
На [[ЯМК|языке МК]] она выглядит так:
ВП П0 1 ИП0 × FL0 03 С/П
Вот она же на [[Каллисто]] (кратчайшее имя ! использовать нехорошо, так как [[Слово !|восклицательный знак уже является важным словом]] [[Каллисто]]):
: n!  ( n -- n!)  1 ↔ for i × next ;
Роль [[R0|регистра 0]] выполняет переменная цикла, обращение к которой производит [[слово I]]. Проверим n! на примере из справочника:
10 n! .
[[Файл:fact.png|||264px|]]
Если всё введено верно, результат опять совпадает со справочным.
Замер времени выполнения показывает, что 10! вычисляется на [[Каллисто]] за 1,98 с. Это в пять раз быстрее советских [[ПМК]] — хотя, разумеется, значительно медленней, чем вычислять 10! непосредственно на [[Язык МК|языке МК-161]].
Как в программе для ПМК, в каллистянском факториале есть своя изюминка. Если в ПМКшном факториале ноль превращается в единицу [[ВП|командой ВП]], то в каллистянском варианте ноль на входе приведёт к тому, что цикл [[FOR]]…[[NEXT]] не выполнится ни разу. В результате в [[Стек данных|стеке]] остаётся та единица, которая обычно выполняет роль первого сомножителя.


{{нет иллюстраций}}
== Ссылки ==
{{заготовка}}
* [http://tinyurl.com/Callisto161-2 tinyurl.com/Callisto161-2] — короткий адрес этой страницы (через зарубежный сайт)


[[Категория:Каллисто]]
[[Категория:Каллисто]]

Текущая версия от 04:23, 25 января 2020

Перед изучением программирования рекомендуется ознакомиться с учебной статьёй «Первое знакомство с Каллисто»


Каллисто является расширением входного языка «Электроники МК-161». Что это означает? Давайте проверим это утверждение на примере классических программ для советских ПМК. Вот простые и широко известные программы для вычисления гиперболических функций из 3-го изд. справочника проф. Дьяконова (стр. 174):

Наша первая программа на Каллисто[править]

В качестве первого упражнения возьмём программу 4.1 для вычисления гиперболического синуса sh, которая на языке МК выглядит так:

Fex ↑ F1/x − 2 ÷ С/П БП 00

Вот она же, написанная на Каллисто:

: sh   ex ↑ 1/x − 2 ÷ . ;

Каллистянская программа для вычисления (и вывода на индикатор) гиперболического синуса начинается с двоеточия и заканчивается точкой с запятой. Предки этих двух коротких слов — команды калькулятора F ПРГ и F АВТ. Они переключают Каллисто из состояния интерпретации в состояние компиляции и обратно. В состоянии интерпретации слова исполняются сразу же (как в автоматическом режиме калькулятора), а в состоянии компиляции — запоминаются, чтобы исполниться позже (похоже на режим программирования).

Первое отличие в том, что после двоеточия идёт слово sh. Это имя программы, а точнее нового слова для вычисления гиперболического синуса. Каллисто может хранить в своём словаре не одну программу, как советские ПМК, а многие сотни слов. Чтобы их различать, каждому слову положено уникальное имя. Слова можно сравнить с программой для советского ПМК. Чаще всего они даже превосходят по своим возможностям такие программы.

Также можно заметить, что каллистянские имена функций (они тоже являются словами) похожи на ПМКшные, но не требуют начальной буквы F. Fex и F1/x превратились в обычные ex и 1/x. Некоторые справочники по ПМК уже использовали подобное соглашение. Перед точкой с запятой в определении нашего слова sh стоит точка. Эта точка нужна для вывода результата на индикатор, являясь своеобразным аналогом команды С/П. Такой вывод нужен в учебном примере. Настоящий библиотечный sh, разумеется, будет оставлять конечный результат в стеке. Ведь он может понадобиться в вычислениях «по цепочке».

Давайте проверим, правильно ли вычисляет наше новое слово sh гиперболический синус:

1 sh

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

Если вы пишите на Каллисто библиотеку гиперболических функций, окончательное определение гиперболического синуса sh будет выглядеть в ней так:

: sh  ( x -- sh x)   ex ↑ 1/x − 2 ÷ ;

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

Согласитесь, переносить простые программы с языка МК на Каллисто легко. При этом их исходный текст выглядит лучше, а обращаться к ним удобней! Попробуйте самостоятельно перенести на Каллисто программу 4.2.

Программа, использующая переменную[править]

Теперь упражнение посложней. Программа 4.3 использует регистр предыдущего результата X1:

Fex ↑ ↑ F1/x + 2 ÷ − FВx ÷ С/П БП 00

Поскольку в Каллисто нет такого регистра, простейшее решение — объявить переменную, куда и запишем промежуточный результат. Назовём её x1 (число в переменную x1 копирует фраза ↑ to x1 ):

0 value x1
: th  ( x -- sh x/ch x)  ex ↑ ↑ 1/x + 2 ÷  ↑ to x1  − x1 ÷ ;

Проверим результат на примере из справочника:

1 th .

Результат совпадает с точностью до последнего знака.

Конечно же, программы-«спагетти» переводить на Каллисто сложнее и потребует чуть больше подготовительных действий. Каллисто настаивает на структурном программировании. Зато об адресах и метках можно забыть, используя условный оператор и циклы, один из которых совместим с ПМКшным FL0.

Цикл со счётчиком[править]

Переведём на Каллисто классическую программу вычисления факториала (стр. 148):

На языке МК она выглядит так:

ВП П0 1 ИП0 × FL0 03 С/П

Вот она же на Каллисто (кратчайшее имя ! использовать нехорошо, так как восклицательный знак уже является важным словом Каллисто):

: n!  ( n -- n!)   1 ↔ for i × next ;

Роль регистра 0 выполняет переменная цикла, обращение к которой производит слово I. Проверим n! на примере из справочника:

10 n! .

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

Замер времени выполнения показывает, что 10! вычисляется на Каллисто за 1,98 с. Это в пять раз быстрее советских ПМК — хотя, разумеется, значительно медленней, чем вычислять 10! непосредственно на языке МК-161.

Как в программе для ПМК, в каллистянском факториале есть своя изюминка. Если в ПМКшном факториале ноль превращается в единицу командой ВП, то в каллистянском варианте ноль на входе приведёт к тому, что цикл FORNEXT не выполнится ни разу. В результате в стеке остаётся та единица, которая обычно выполняет роль первого сомножителя.

Ссылки[править]

  • tinyurl.com/Callisto161-2 — короткий адрес этой страницы (через зарубежный сайт)