О кешировании. Вводная.
"Предыдущая" серия была тут - http://programmingmindstream.blogspot.ru/2015/12/1145.html
Теперь хотелось бы поговорить о кешировании значений функций.
Для понимания всего написанного далее неплохо было бы ознакомиться с https://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D1%80%D1%82_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F).
У нас все элементы, что "модели", что вообще говоря "словаря скриптовой машины" выглядят примерно так:
Что тут написано?
Договоримся для начала, что "элемент словаря" и "слово" - это ТОЖДЕСТВЕННЫЕ понятия, если другое не оговорено особо.
: - определяет новый элемент словаря (который может снимать со стека сколько угодно значений и класть на стек так же сколько угодно значений).
CONST - определяет константу внутри элемента словаря.
VAR - определяет переменную внутри элемента словаря.
[XXX]ElementCode[YYY] - "код" слова, который будет выполнен при "вызове" слова.
; - завершает определение слова.
Далее.
Давайте для начала разберёмся с "кодом слова".
Пусть есть пример:
Что он сделает?
Он вызовет "код слова" A, который в данном случае равен "1"
Что мы в итоге получим?
Мы получим то, что в консоль выведется целочисленное значение "1".
Как это происходит?
Сначала конструкция ": A" - определит в словаре слово A.
Потом конструкция "1" - определит "код слова A" который будет уметь класть значение "1" на стек.
Потом конструкция "A Print" - вызовет сначала слово A (которое положит на стек значение "1"), а потом слово Print (которое возьмёт со стека значение "1" и напечатает его в консоль).
Теперь поговорим о константах.
Константы у нас, как и в любых других (известных мне) языках программирования, это просто именованные неизменяемые значения.
Перепишем наш пример:
Что тут происходит?
Ну вообще говоря - код делает то же самое, что и в предыдущем примере. А именно - выводит в консоль целочисленное значение "1".
Что изменилось?
Мы, вместо того, чтобы "напрямую" обращаться к значению "1" - ввели константу - "One", которая представляет собой значение "1".
И далее "код слова" A изменился с "1" на "One".
Слово "One" так же как и слово "1" кладёт на стек значение "1".
То есть константа "One" является как бы псевдонимом к значению "1".
Ну и понятно, что можно написать так:
Хотя это на самом деле и не очевидно.
Надеюсь тут всё понятно.
Пойдём далее.
Поговорим о переменных.
Переменные у нас, как и в любом другом (известном мне) языке программирования - это "именованные ячейки памяти", которые могут содержать вычисленные значения.
Эти "ячейки памяти" могут изменяться по ходу выполнения нашей программы.
Как их можно использовать?
Перепишем наш пример:
Что делает этот пример?
Да ровно то же самое, что и предыдущий - печатает целочисленное значение "1" в консоль.
Но только пользуется для этих целей не константами, а переменными.
Надеюсь тут тоже всё понятно.
Пойдём далее.
Совместим переменные и константы.
Перепишем наш пример:
Что тут делается?
Тут в консоль печатается целочисленное значение "3" как результат вычисления выражения One + Two.
Где One это - переменная, а Two - константа. На этом закончим вводную.
Что мы в ней сделали?
Мы определили "константы", "переменные" и "слова".
Также мы проиллюстрировали как можно пользоваться этими понятиями.
"Предыдущая" серия была тут - http://programmingmindstream.blogspot.ru/2015/12/1145.html
Теперь хотелось бы поговорить о кешировании значений функций.
Для понимания всего написанного далее неплохо было бы ознакомиться с https://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D1%80%D1%82_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F).
У нас все элементы, что "модели", что вообще говоря "словаря скриптовой машины" выглядят примерно так:
: OuterElement1 CONST Const1 Value1 ... CONST ConstN ValueN VAR Var1 ... VAR VarN : InnerElement1 InnerElementCode1 ; // InnerElement1 ... : InnerElementN InnerElementCodeN ; // InnerElementN OuterElementCode1 ; // OuterElement1 ... : OuterElementN CONST Const1 Value1 ... CONST ConstN ValueN VAR Var1 ... VAR VarN : InnerElement1 InnerElementCode1 ; // InnerElement1 ... : InnerElementN InnerElementCodeN ; // InnerElementN OuterElementCodeN ; // OuterElementN
Что тут написано?
Договоримся для начала, что "элемент словаря" и "слово" - это ТОЖДЕСТВЕННЫЕ понятия, если другое не оговорено особо.
: - определяет новый элемент словаря (который может снимать со стека сколько угодно значений и класть на стек так же сколько угодно значений).
CONST - определяет константу внутри элемента словаря.
VAR - определяет переменную внутри элемента словаря.
[XXX]ElementCode[YYY] - "код" слова, который будет выполнен при "вызове" слова.
; - завершает определение слова.
Далее.
Давайте для начала разберёмся с "кодом слова".
Пусть есть пример:
: A 1 ; // A A Print
Что он сделает?
Он вызовет "код слова" A, который в данном случае равен "1"
Что мы в итоге получим?
Мы получим то, что в консоль выведется целочисленное значение "1".
Как это происходит?
Сначала конструкция ": A" - определит в словаре слово A.
Потом конструкция "1" - определит "код слова A" который будет уметь класть значение "1" на стек.
Потом конструкция "A Print" - вызовет сначала слово A (которое положит на стек значение "1"), а потом слово Print (которое возьмёт со стека значение "1" и напечатает его в консоль).
Теперь поговорим о константах.
Константы у нас, как и в любых других (известных мне) языках программирования, это просто именованные неизменяемые значения.
Перепишем наш пример:
: A CONST One 1 One ; // A A Print
Что тут происходит?
Ну вообще говоря - код делает то же самое, что и в предыдущем примере. А именно - выводит в консоль целочисленное значение "1".
Что изменилось?
Мы, вместо того, чтобы "напрямую" обращаться к значению "1" - ввели константу - "One", которая представляет собой значение "1".
И далее "код слова" A изменился с "1" на "One".
Слово "One" так же как и слово "1" кладёт на стек значение "1".
То есть константа "One" является как бы псевдонимом к значению "1".
Ну и понятно, что можно написать так:
: A CONST One 1 CONST OneAlias One OneAlias ; // A A Print
Хотя это на самом деле и не очевидно.
Надеюсь тут всё понятно.
Пойдём далее.
Поговорим о переменных.
Переменные у нас, как и в любом другом (известном мне) языке программирования - это "именованные ячейки памяти", которые могут содержать вычисленные значения.
Эти "ячейки памяти" могут изменяться по ходу выполнения нашей программы.
Как их можно использовать?
Перепишем наш пример:
: A VAR One // - тут мы объявили переменную One 1 >>> One // - тут мы присвоили переменной "One" значение "1" One // - тут кладём значение переменной One на стек ; // A A Print
Что делает этот пример?
Да ровно то же самое, что и предыдущий - печатает целочисленное значение "1" в консоль.
Но только пользуется для этих целей не константами, а переменными.
Надеюсь тут тоже всё понятно.
Пойдём далее.
Совместим переменные и константы.
Перепишем наш пример:
: A VAR One // - тут мы объявили переменную One 1 >>> One // - тут мы присвоили переменной "One" значение "1" CONST Two 2 // - тут мы объявили константу Two One // - тут кладём значение переменной One на стек Two // - тут кладём значение константы Two на стек + // - складываем значения на стеке и кладём результат обратно на стек ; // A A Print
Что тут делается?
Тут в консоль печатается целочисленное значение "3" как результат вычисления выражения One + Two.
Где One это - переменная, а Two - константа. На этом закончим вводную.
Что мы в ней сделали?
Мы определили "константы", "переменные" и "слова".
Также мы проиллюстрировали как можно пользоваться этими понятиями.
Хорошо бы ещё понять, что кэшируем и, главное, зачем...
ОтветитьУдалитьПро это чуть позже. Вообще говоря - кешируем значения функций. Но я сначала вынес в заголовок слова про кеширование, а потом понял, что начинать надо с 17-го года.
Удалить