-
Notifications
You must be signed in to change notification settings - Fork 762
/
prolog_epilog.tex
executable file
·57 lines (46 loc) · 3.57 KB
/
prolog_epilog.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
% done
\section{\IFRU{Пролог и эпилог в функции}{Function prologue and epilogue}}
\label{sec:prologepilog}
\IFRU{Пролог функции это инструкции в самом начале функции. Как правило это что-то вроде:}
{Function prologue is instructions at function start. It is often something like this:}
\begin{lstlisting}
push ebp
mov ebp, esp
sub esp, X
\end{lstlisting}
\IFRU
{Эти инструкции делают следующее: сохраняют значение регистра \EBP на будущее, выставляют \EBP равным \ESP,
затем подготавливают место в стеке для хранения локальных переменных.}
{What these instruction do: save \EBP register value, set \EBP to \ESP and then allocate space in stack
for local variables.}
\IFRU{\EBP сохраняет свое значение на протяжении всей функции, он будет использоваться здесь для доступа
к локальным переменным и аргументам. Можно было бы использовать и \ESP, но он постоянно меняется и
это не очень удобно.}
{\EBP value is fixed over a period of function execution and it will be used for local variables and
arguments access.
One can use \ESP, but it changing over time and it is not handy.}
\IFRU{Эпилог функции аннулирует выделенное место в стеке, возвращает значение \EBP на то что было и возвращает
управление в вызывающую функцию:}
{Function epilogue annuled allocated space in stack, returning \EBP value to initial state
and returning control flow to callee:}
\begin{lstlisting}
mov esp, ebp
pop ebp
ret 0
\end{lstlisting}
\IFRU{Наличие эпилога и пролога может несколько ухудшить эффективность рекурсии.
Например, однажды я написал функцию для поиска нужного узла дерева.
Рекурсивно она выглядела очень красиво, но из-за того что при каждом вызове тратилось время на эпилог и пролог,
все это работало в несколько раз медленнее чем та же функция но без рекурсии.}
{Epilogue and prologue can make recursion performance worse.
For example, once upon a time I wrote a function to seek right tree node.
As a recursive function it would look stylish but because some time was spent at each function call
for prologue/epilogue, it was working couple of times slower than the implementation
without recursion.}
\newcommand{\URLT}{\url{http://en.wikipedia.org/wiki/Tail_call}}
\IFRU
{Кстати, поэтому есть такая вещь как хвостовая рекурсия\footnote{\URLT}:
когда компилятор или интерпретатор превращает рекурсию (с которой возможно это проделать:
\IT{хвостовую}) в итерацию для эффективности.}
{By the way, that is the reason of tail call\footnote{\URLT} existence: when compiler (or interpreter)
transforms recursion (with which it's possible: \IT{tail recursion}) into iteration for efficiency.}