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

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.

主站蜘蛛池模板: 吉安县| 锦州市| 广宁县| 静安区| 沙田区| 沅江市| 定边县| 西平县| 独山县| 通州区| 晋城| 甘南县| 安远县| 安远县| 余干县| 罗田县| 资源县| 永昌县| 宁化县| 湖州市| 上饶县| 灵璧县| 青阳县| 吉安市| 逊克县| 伊春市| 曲阳县| 逊克县| 密山市| 高雄市| 芷江| 临夏市| 蕲春县| 同仁县| 丹寨县| 长岭县| 和田县| 望城县| 临汾市| 饶平县| 盐山县|