Compiler construction 是OCaml';s型系统静态?

Compiler construction 是OCaml';s型系统静态?,compiler-construction,static,ocaml,interpreter,type-systems,Compiler Construction,Static,Ocaml,Interpreter,Type Systems,各种资料中都提到OCaml有一个静态的强类型系统,而且它是一种解释语言 Wikepedia声明静态类型检查是在编译时完成的。现在,如果OCaml不是编译语言,那么静态类型检查如何应用于它 有些地方还提到OCaml有一个字节码编译器和一个VM。那么,OCaml如何判断何时作为解释语言,何时作为编译语言?OCaml配备了一个解释器和两个编译器。当您一次输入一个表达式时,解释器非常忠实地再现编译器的行为。它对每个表达式进行静态类型分析。如果键入正确,它将计算表达式 因此,OCaml不必决定何时成为编译

各种资料中都提到OCaml有一个静态的强类型系统,而且它是一种解释语言

Wikepedia声明静态类型检查是在编译时完成的。现在,如果OCaml不是编译语言,那么静态类型检查如何应用于它


有些地方还提到OCaml有一个字节码编译器和一个VM。那么,OCaml如何判断何时作为解释语言,何时作为编译语言?

OCaml配备了一个解释器和两个编译器。当您一次输入一个表达式时,解释器非常忠实地再现编译器的行为。它对每个表达式进行静态类型分析。如果键入正确,它将计算表达式

因此,OCaml不必决定何时成为编译器,何时成为解释器。用户通过运行解释器(通常称为“顶级”)来决定何时需要执行此操作。或者,如果他们想生成代码以供以后运行,则运行其中一个编译器


其中一个编译器为一组受支持的计算机生成本机代码(机器代码)。另一个编译器为在更多环境中工作的虚拟机生成字节码。这两种代码之间存在权衡;通常,本机代码速度更快,但字节码更具可移植性,并支持更有趣的调试类型(包括反向运行程序)。

静态类型检查在运行任何代码之前进行。在OCaml中就是这种情况,它的类型检查器在解释器或编译器启动之前运行,如果出现错误,就会出现类型错误


每次使用相关变量时,都会在运行时进行动态类型检查。例如,敲诈或阴谋。在这些情况下,您可能会在程序执行过程中遇到类型错误。

在编程中,“编译时”是一个松散的术语,通常指“非运行时”,即通过对源代码的静态分析来完成。更广泛地说,静态类型系统简单意味着每个变量都声明有一个类型,并且变量的类型永远不会改变(超过多态性约束)。一个好问题将链接到这些“各种来源”。定义“解释”。这是一件非常模糊的事情,您将无法轻松区分编译语言和解释语言的实现。为了让您的头脑更加清醒,请看一下类型化的Racket。它很早就进行了类型检查和降低,同时仍然保留了一个动态类型化的后端。另一个类似的例子是TypeScript.OCaml字节码解释器不“再现编译器的行为”。它只执行编译器生成的字节码。当然,字节码已经从类型信息中剥离出来。@SK logic您混淆了顶级(解释器)和字节码虚拟机。@LeoWhite,Jeffrey显然是指REPL以外的内容,因为REPL不会“再现编译器的行为”,它是完全相同的编译器。对于在REPL中键入的每个表达式,REPL都会进行类型分析,然后(如果类型为OK)对表达式求值。这就是我想说的。我的观点是,类型与编译代码中的类型一样强大和静态。关于字节码解释器(或VM),这是一个很好的观点。在我试图写的概述中加入这一点会很有帮助。