官术网_书友最值得收藏!

Static and dynamic environments

Let's develop a mental model for what happens in a program with types and values. At its core, a program is made up of a series of type and value definitions. For example:

/* src/Ch02/Ch02_Demo.re */
type person = {id: int, name: string};
type company = {id: int, name: string, employees: list(person)};

let bob = {id: 1, name: "Bob"};
let acmeCo = {id: 1, name: "Acme Co.", employees: [bob]};

Here, we're defining person and company types, and then allocating a person (bob) and a company he works for (acmeCo).

Without worrying too much about the syntax (we will introduce this in Chapter 4, Group Values Together in Types), let's think about how the programming environment sees this program.

In a statically typed programming language, the typechecker and runtime environment together make up the static and dynamic environments. These are areas where type definitions are stored while typechecking takes place, and where value definitions are stored during program execution (runtime). We can think of these as two distinct areas that are only relevant during the distinct phases of compilation and runtime. After compilation, all type information is wiped out (type erasure), but during runtime the dynamic environment becomes active in memory (that is, the stack and the heap).

Here is how the static and dynamic environments look for the preceding code:

Example of static and dynamic environments (evaluated top to bottom)

In each of the static and dynamic environments, each definition is allowed to refer to definitions that came before it. This is a crucial abstraction technique – it's how we build larger programs out of smaller ones at both the type and value levels.

There are no references between the static and dynamic environments – values don't exist at compile time and types don't exist at runtime. This may come a surprise as we do mix them in one place: the source code.

Among other things, this strict separation balances the needs of safety and efficiency. Note that this is in sharp contrast to dynamic typing, where types exist at runtime as well, and must be checked before every operation.

主站蜘蛛池模板: 绍兴县| 榆树市| 饶阳县| 堆龙德庆县| 启东市| 莱州市| 花垣县| 罗江县| 博湖县| 阿鲁科尔沁旗| 尉犁县| 资阳市| 中江县| 通河县| 仁怀市| 华宁县| 贞丰县| 大连市| 涪陵区| 江陵县| 徐汇区| 昭觉县| 静宁县| 象山县| 中方县| 开江县| 子长县| 桂林市| 阿合奇县| 昭平县| 嘉兴市| 平陆县| 阿尔山市| 密云县| 朝阳区| 衡阳市| 来安县| 固阳县| 金秀| 苍溪县| 酉阳|