|
@@ -4650,7 +4650,7 @@ A straightforward way to compute the interference graph is to look at
|
|
|
the set of live locations between each instruction and add an edge to
|
|
|
the graph for every pair of variables in the same set. This approach
|
|
|
is less than ideal for two reasons. First, it can be expensive because
|
|
|
-it takes $O(n^2)$ time to consider at every pair in a set of $n$ live
|
|
|
+it takes $O(n^2)$ time to consider every pair in a set of $n$ live
|
|
|
locations. Second, in the special case where two locations hold the
|
|
|
same value (because one was assigned to the other), they can be live
|
|
|
at the same time without interfering with each other.
|
|
@@ -12949,6 +12949,9 @@ from the set.
|
|
|
|
|
|
\section{Further Reading}
|
|
|
|
|
|
+\citet{Appel90} describes many data representation approaches,
|
|
|
+including the ones used in the compilation of Standard ML.
|
|
|
+
|
|
|
There are many alternatives to copying collectors (and their bigger
|
|
|
siblings, the generational collectors) when its comes to garbage
|
|
|
collection, such as mark-and-sweep~\citep{McCarthy:1960dz} and
|
|
@@ -12971,6 +12974,7 @@ meet every year at the International Symposium on Memory Management to
|
|
|
present these findings.
|
|
|
|
|
|
|
|
|
+
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
\chapter{Functions}
|
|
|
\label{ch:Lfun}
|
|
@@ -14771,7 +14775,8 @@ the point where the \code{lambda} is applied. An efficient solution to
|
|
|
the problem, due to \citet{Cardelli:1983aa}, is to bundle the values
|
|
|
of the free variables together with a function pointer into a tuple,
|
|
|
an arrangement called a \emph{flat closure} (which we shorten to just
|
|
|
-``closure''). \index{subject}{closure}\index{subject}{flat closure}
|
|
|
+``closure'').\index{subject}{closure}\index{subject}{flat closure}
|
|
|
+%
|
|
|
Fortunately, we have all the ingredients to make closures:
|
|
|
Chapter~\ref{ch:Lvec} gave us tuples and Chapter~\ref{ch:Lfun} gave us
|
|
|
function pointers. The function pointer resides at index $0$ and the
|
|
@@ -16307,16 +16312,18 @@ dialect of LISP adopted lexical scoping and
|
|
|
\citet{Guy-L.-Steele:1978yq} demonstrated how to efficiently compile
|
|
|
Scheme programs. However, environments were represented as linked
|
|
|
lists, so variable lookup was linear in the size of the
|
|
|
-environment. In this chapter we represent environments using flat
|
|
|
-closures, which were invented by
|
|
|
+environment. \citet{Appel91} gives a detailed description of several
|
|
|
+closure representations. In this chapter we represent environments
|
|
|
+using flat closures, which were invented by
|
|
|
\citet{Cardelli:1983aa,Cardelli:1984aa} for the purposes of compiling
|
|
|
-the ML language~\citep{Gordon:1978aa,Milner:1990fk}. With flat
|
|
|
+the ML language~\citep{Gordon:1978aa,Milner:1990fk}. With flat
|
|
|
closures, variable lookup is constant time but the time to create a
|
|
|
closure is proportional to the number of its free variables. Flat
|
|
|
closures were reinvented by \citet{Dybvig:1987ab} in his Ph.D. thesis
|
|
|
and used in Chez Scheme version 1~\citep{Dybvig:2006aa}.
|
|
|
|
|
|
|
|
|
+
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
\chapter{Dynamic Typing}
|
|
|
\label{ch:Ldyn}
|