看完这篇文章后:
How does an interpreter/compiler work
我有一个问题:
在只有解释器(例如Basic)的编程语言中(如上面链接中的第二个答案中的照片所示),是否可以进行静态类型检查?
据我所知,每次执行程序时,解释器都会运行每一行命令。那么,在我们运行程序之前,如何能够静态地检查类型呢?
发布于 2016-09-08 10:26:47
语言是一种语言,它既不被解释,也不被编译,直到它被解释或编译。意思是,同一种语言可以即时解释,也可以编译成二进制语言。事实上,解释器确实会动态地将代码编译成字节码。
编译语言和解释语言的主要区别在于,解释程序需要单独的运行时,而编译后的程序通常可以自己运行,或者使用操作系统提供的最小引导帮助。编译器通常也会花费更多的时间在编译步骤上,而不是在解释器上,在那里它可以进行更深入的错误检查和代码优化。解释器这样做并不仅仅是因为它是一个缓慢的过程,而不是因为根本上是不可能的。
类型提示/推理是一个完全独立的问题。许多主要编译的语言广泛地使用类型提示,因为编译器有时间使用这些信息。主要解释的语言经常放弃类型提示,因为额外的类型检查在运行时花费时间,而且语言的设计目标是一个快速的开发周期,包括更少的输入。这并不意味着这些语言以任何方式都是“类型自由”,每个值仍然有一个类型,并且这个类型是已知的。事实上,现在甚至很多编译语言都放弃了显式类型注释,因为它不需要简洁。例如:
Foo foo = new Foo();
let foo = new Foo();这里的Foo类型提示是多余的;当然,编译器可以推断foo在这里是Foo类型,只需查看赋值的右边。对于任何其他类型也是如此,包括数字、字符串等等。编译器或静态类型分析器可以跟踪分配给变量的值或函数返回的值,并且可以在没有任何显式注释的情况下推断许多类型。
尽管如此,在严重依赖运行时信息的未注释语言中,在某些情况下,直到运行时才可能知道变量的类型。在这种情况下,静态类型分析器或编译器无法预先提供帮助,也无法在编译时捕获由不兼容类型造成的错误。例如,TypeScript是一种针对Javascript的静态类型的螺栓式解决方案,它走在这条线上。您在TypeScript中所做的所有注释都是严格的类型检查;任何您没有注释或离开的东西,因为any不能被类型检查,并且可能在运行时在您的脸上爆炸。
静态类型化语言和动态类型化语言中的类型系统有不同的用途(注意静态类型与动态类型,非“已编译”与“解释”)。静态类型主要用于捕捉编译时的错误,并向编译器提供更多信息以生成更好的代码;动态类型用于定义程序行为,即两种类型的值在操作时应如何运行,包括对不兼容类型抛出错误。即使不是在所有情况下,静态分析器仍然可以预测这种不兼容的类型错误。
https://stackoverflow.com/questions/39387311
复制相似问题