Редактирование: Простые программы на Каллисто
Перейти к навигации
Перейти к поиску
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий ниже, чтобы убедиться, что это нужная вам правка, и запишите страницу ниже, чтобы отменить правку.
Текущая версия | Ваш текст | ||
Строка 1: | Строка 1: | ||
(Перед изучением программирования рекомендуется познакомиться с учебной статьёй [[Первое знакомство с Каллисто]]) | |||
[[Каллисто]] является расширением [[ЯМК|входного языка | [[Каллисто]] является расширением [[ЯМК|входного языка МК-161]]. Что это означает? Давайте проверим это утверждение на примере классических программ для советских [[ПМК]]. Вот простые, но широко известные программы для вычисления гиперболических функций из [[Справочник по расчётам на микрокалькуляторах, 3-е изд. (книга)|3-го изд. справочника проф. Дьяконова]] (стр. 174): | ||
[[Файл:DjakonovHyp.png]] | [[Файл:DjakonovHyp.png]] | ||
Строка 32: | Строка 32: | ||
== Программа, использующая переменную == | == Программа, использующая переменную == | ||
Теперь упражнение посложней. Программа 4.3 использует [[X1|регистр предыдущего результата X1]] | Теперь упражнение посложней. Программа 4.3 использует [[X1|регистр предыдущего результата X1]]. Поскольку в [[Каллисто]] нет такого регистра, простейшее решение — [[VALUE|объявить переменную]], куда и запишем промежуточный результат. Назовём её x1 (число в переменную x1 копирует фраза ↑ to x1 ): | ||
Поскольку в [[Каллисто]] нет такого регистра, простейшее решение — [[VALUE|объявить переменную]], куда и запишем промежуточный результат. Назовём её x1 (число в переменную x1 копирует фраза ↑ to x1 ): | |||
0 value 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 ÷ ; | ||
Строка 45: | Строка 41: | ||
Результат совпадает с точностью до последнего знака. | Результат совпадает с точностью до последнего знака. | ||
Конечно же, программы-«спагетти» переводить на [[Каллисто]] сложнее | Конечно же, программы-«спагетти» переводить на [[Каллисто]] сложнее. [[Каллисто]] подчиняется требованиям структурного программирования. Зато об адресах и метках можно забыть, используя условный оператор и циклы, один из которых совместим с ПМКшным [[FL0]]. | ||
== | == Программа с циклом == | ||
Переведём на [[Каллисто]] классическую программу вычисления факториала (стр. 148): | Переведём на [[Каллисто]] классическую программу вычисления факториала (стр. 148): | ||
Строка 55: | Строка 51: | ||
ВП П0 1 ИП0 × FL0 03 С/П | ВП П0 1 ИП0 × FL0 03 С/П | ||
Вот она же на [[Каллисто]] (кратчайшее имя ! | Вот она же на [[Каллисто]] (мы не можем использовать кратчайшее имя !, так как [[Слово !|восклицательный знак уже является важным словом]] [[Каллисто]]): | ||
: n! ( n -- n!) 1 ↔ for i × next ; | : n! ( n -- n!) 1 ↔ for i × next ; | ||
Строка 61: | Строка 57: | ||
10 n! . | 10 n! . | ||
[[Файл:fact.png|||264px|]] | [[Файл:fact.png|||264px|]] | ||
Если всё введено верно, результат опять совпадает со | Если всё введено верно, результат опять совпадает со справочником. | ||
Замер времени выполнения показывает, что 10! вычисляется на [[Каллисто]] за 1,98 с. Это в пять раз быстрее советских [[ПМК]] — хотя, разумеется, значительно медленней, чем вычислять 10! непосредственно на [[Язык МК|языке МК-161]]. | Замер времени выполнения показывает, что 10! вычисляется на [[Каллисто]] за 1,98 с. Это в пять раз быстрее советских [[ПМК]] — хотя, разумеется, значительно медленней, чем вычислять 10! непосредственно на [[Язык МК|языке МК-161]]. | ||
Как в программе для ПМК, в каллистянском факториале есть своя изюминка. Если в ПМКшном факториале ноль превращается в единицу [[ВП|командой ВП]], то в каллистянском варианте ноль на входе приведёт к тому, что цикл [[FOR]]…[[NEXT]] не выполнится ни разу. В результате в [[Стек данных|стеке]] остаётся та единица, которая | Как в программе для ПМК, в каллистянском факториале есть своя изюминка. Если в ПМКшном факториале ноль превращается в единицу [[ВП|командой ВП]], то в каллистянском варианте ноль на входе приведёт к тому, что цикл [[FOR]]…[[NEXT]] не выполнится ни разу. В результате в [[Стек данных|стеке]] остаётся та единица, которая выполняет роль первого сомножителя. | ||
[[Категория:Каллисто]] | [[Категория:Каллисто]] |