Types INTERPRETERS和静态类型检查

Types INTERPRETERS和静态类型检查,types,programming-languages,interpreter,static-typing,Types,Programming Languages,Interpreter,Static Typing,读完这篇文章: 我有一个问题: 在只有解释器(例如Basic)的编程语言中(如上面链接中第二个答案中的照片所示),是否可以进行静态类型检查??。 据我所知,每次我们执行程序时,解释器都会运行每一行命令。那么,在我们运行程序之前,如何能够静态地检查类型呢?一种语言是一种语言,它在运行之前既不会被解释也不会被编译。也就是说,同一种语言可以动态解释,也可以编译成二进制。事实上,解释器会将代码实时编译成字节码 编译语言和解释语言之间的主要区别在于,解释程序需要一个单独的运行时,而编译程序通常可以自己运

读完这篇文章:

我有一个问题:

在只有解释器(例如Basic)的编程语言中(如上面链接中第二个答案中的照片所示),是否可以进行静态类型检查??。

据我所知,每次我们执行程序时,解释器都会运行每一行命令。那么,在我们运行程序之前,如何能够静态地检查类型呢?

一种语言是一种语言,它在运行之前既不会被解释也不会被编译。也就是说,同一种语言可以动态解释,也可以编译成二进制。事实上,解释器会将代码实时编译成字节码

编译语言和解释语言之间的主要区别在于,解释程序需要一个单独的运行时,而编译程序通常可以自己运行,或者在操作系统的引导帮助最小的情况下运行。编译器通常也会比解释器花费更多的时间在编译步骤上,在解释器中它可以进行更深入的错误检查和代码优化。解释器这样做不仅仅是因为它是一个缓慢的过程,而不是因为它根本不可能

类型提示/推断是一个完全独立的问题。许多主要编译的语言广泛使用类型提示,因为编译器有时间使用这些信息。主要解释型语言通常放弃类型提示,因为额外的类型检查在运行时花费时间,并且该语言的设计目标是一个快速的开发周期,这包括更少的类型。这并不意味着这些语言无论如何都是“无类型的”,每个值都有一个类型,并且该类型是已知的。事实上,即使现在许多编译语言在不需要显式类型注释时也放弃了显式类型注释。例如:

Foo foo = new Foo();

let foo = new Foo();
这里的
Foo
类型提示是多余的;当然,编译器可以推断
foo
在这里属于
foo
类型,只需查看赋值的右侧即可。对于任何其他类型,包括数字、字符串等,情况也是如此。编译器或静态类型分析器可以跟踪分配给变量或从函数返回的值,并在没有单个显式注释的情况下推断大量类型

话虽如此,在严重依赖于运行时信息的非注释语言中,在某些情况下,直到运行时才可能知道变量的类型。在这种情况下,静态类型分析器或编译器无法提前提供帮助,并且无法在编译时捕获由不兼容类型导致的错误。例如,TypeScript是Javascript静态类型的栓接解决方案,它走这条路线。您在TypeScript中所做的所有注释都经过严格的类型检查;任何您没有注释或保留为
any
的内容都无法进行类型检查,并且在运行时可能会在您的脸上爆炸


静态类型语言和动态类型语言中的类型系统有不同的用途(注意静态类型与动态类型,“编译”与“解释”)。静态类型主要用于在编译时捕获错误,并为编译器提供更多信息以生成更好的代码;动态类型用于定义程序行为,即两种类型的值在操作时的行为,包括对不兼容的类型抛出错误。静态分析器仍然可以预测此类不兼容的类型错误,即使不是在所有情况下。

通常说静态类型的编程语言是“在编译时”进行类型检查的,因此很容易说“解释器没有编译时1,因此不能静态类型”,但实际上是“静态的”不一定意味着“在编译时”,它意味着“在运行时之前”或“不运行代码”

因此,静态类型语言是指程序中任何地方的类型错误都会导致程序无法运行的语言。然而,在动态类型语言中,只有当控制流到达类型错误的语句时,类型错误才会中止执行

那么给定这个定义,静态类型的语言可以用解释器实现吗?当然只需让解释器在程序开始执行任何操作之前找到程序中的类型错误(使用编译器将使用的相同算法),然后就可以进行静态类型检查

您可能不想这样做的原因是它增加了启动时间,因为它在代码开始执行之前引入了一个额外的步骤。根据类型系统的复杂性,类型检查实际上可能会占用大量时间。所以这对口译员来说很烦人,但这绝对是可能的



1但这只适用于非常简单的口译员。大多数真实世界的解释器都涉及一些代码生成,不管是字节码还是JIT机器码。

解释器的定义不是意味着“无类型”吗?这取决于您对“静态类型”的定义。如果您的意思是“编译时已知”,那么不,仅解释语言不能有静态类型的变量,因为没有“编译时”步骤。如果您的意思是“变量被锁定到类型”,那么是的,解释语言可以有静态类型的变量。这两种定义我都看过,这就是我提出它的原因。通常这个术语指的是第一个定义,但整个问题是模糊的,因为许多解释语言也有编译步骤,它只发生在运行时。所以你要问的情况应该明确,否则唯一能给出的答案是“这取决于情况”。@Lasse V.Karlsen,我的意思是“编译时已知”,谢谢你的回答,我只是想确定我是否认为这是正确的谢谢!!!!例如:Haskell是一个众所周知的静态类型PL。您可以通过解释器
runhaskell hello.hs