Редактирование: Простые программы на Каллисто

Перейти к навигации Перейти к поиску

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

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

Текущая версия Ваш текст
Строка 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
  
Строка 13: Строка 10:
 
  : 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 ÷ ;
  
Строка 31: Строка 26:
 
Согласитесь, переносить простые программы с [[ЯМК|языка МК]] на [[Каллисто]] легко. При этом их исходный текст выглядит лучше, а обращаться к ним удобней! Попробуйте самостоятельно перенести на [[Каллисто]] программу 4.2.
 
Согласитесь, переносить простые программы с [[ЯМК|языка МК]] на [[Каллисто]] легко. При этом их исходный текст выглядит лучше, а обращаться к ним удобней! Попробуйте самостоятельно перенести на [[Каллисто]] программу 4.2.
  
== Программа, использующая переменную ==
+
== Наша первая каллистянская переменная ==
Теперь упражнение посложней. Программа 4.3 использует [[X1|регистр предыдущего результата X1]]:
+
Теперь упражнение посложней. Программа 4.3 использует [[X1|регистр промежуточного результата X1]]. Поскольку в [[Каллисто]] нет такого регистра, одно из решений — [[VALUE|объявить промежуточную переменную]], куда и запишем промежуточный результат. Назовём её 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] — короткий адрес этой страницы (через зарубежный сайт)
+
{{заготовка}}
  
 
[[Категория:Каллисто]]
 
[[Категория:Каллисто]]

Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:

Отменить Справка по редактированию (в новом окне)