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

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.

主站蜘蛛池模板: 商水县| 漳平市| 越西县| 桦甸市| 邵武市| 宁都县| 天津市| 乌拉特后旗| 上蔡县| 侯马市| 仲巴县| 邵阳市| 连云港市| 彰化县| 德令哈市| 通江县| 崇明县| 镇原县| 台州市| 仁寿县| 高雄市| 西安市| 临安市| 沈丘县| 方城县| 香港| 武邑县| 辉县市| 嘉善县| 伊川县| 德昌县| 神农架林区| 乐亭县| 建瓯市| 广德县| 望江县| 房产| 崇文区| 安泽县| 吉木乃县| 根河市|