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

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.

主站蜘蛛池模板: 陵水| 宁德市| 喀喇沁旗| 玛纳斯县| 三门县| 景宁| 临城县| 宣城市| 龙海市| 内黄县| 五指山市| 永顺县| 民权县| 莫力| 循化| 西林县| 西吉县| 木里| 水城县| 十堰市| 彭泽县| 贵德县| 沂源县| 新乡市| 延安市| 柳河县| 宣恩县| 芒康县| 仁布县| 曲阳县| 肥城市| 青海省| 泸州市| 晋州市| 连城县| 澄江县| 新源县| 宝山区| 丰都县| 隆安县| 永靖县|