четверг, 10 декабря 2015 г.

#1147. О кешировании. Вводная

О кешировании. Вводная.

"Предыдущая" серия была тут - 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 - константа. На этом закончим вводную.

Что мы в ней сделали?

Мы определили "константы", "переменные" и "слова".

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

2 комментария:

  1. Хорошо бы ещё понять, что кэшируем и, главное, зачем...

    ОтветитьУдалить
    Ответы
    1. Про это чуть позже. Вообще говоря - кешируем значения функций. Но я сначала вынес в заголовок слова про кеширование, а потом понял, что начинать надо с 17-го года.

      Удалить