编译与解释
“当源代码被翻译时”
-
源代码:原始代码(通常由人输入计算机)
-
翻译:将源代码转换为计算机可以读取的内容(即机器码)
-
Run-Time:程序执行命令的时间段(编译后,如果已编译)
-
编译语言:在运行前翻译代码
-
解释语言:在执行期间动态翻译代码
打字
“检查类型时”
5 + '3' 是 Go 和 Python 等 强类型 语言中的类型错误示例,因为它们不允许“类型强制” -> 值更改的能力在某些上下文中键入,例如合并两种类型。 弱类型语言,例如 JavaScript,不会引发类型错误(导致 '53')。
-
静态:运行前检查的类型
-
动态:在执行期间动态检查类型
“静态和编译”和“动态和解释”的定义非常相似……但请记住,它是“检查类型时”与“翻译源代码时”。
无论该语言是编译型还是解释型,都会出现相同类型的错误!您需要在概念上区分这些术语。
Python 示例
动态的,解释的
def silly(a):
if a > 0:
print 'Hi'
else:
print 5 + '3'
silly(2)
因为 Python 既是解释型的又是动态类型的,它只翻译和类型检查它正在执行的代码。 else 块永远不会执行,所以 5 + '3' 甚至都不会被查看!
如果是静态类型呢?
在代码运行之前会抛出一个类型错误。即使它被解释,它仍然会在运行时之前执行类型检查。
如果编译了呢?
else 块将在运行时之前被翻译/查看,但因为它是动态类型的,所以不会引发错误!动态类型语言在执行之前不会检查类型,并且该行永远不会执行。
Go 示例
静态,已编译
package main
import ("fmt"
)
func silly(a int) {
if (a > 0) {
fmt.Println("Hi")
} else {
fmt.Println("3" + 5)
}
}
func main() {
silly(2)
}
在运行之前检查类型(静态)并立即捕获类型错误!如果类型被解释,仍然会在运行时之前检查类型,结果相同。如果它是动态的,即使在编译期间会查看代码,它也不会抛出任何错误。
性能
如果编译语言是静态类型的(相对于动态类型),它在运行时的性能会更好;类型的知识允许机器代码优化。
由于不需要在执行时动态检查类型(它在运行前检查),静态类型语言本质上在运行时具有更好的性能。
同样,编译语言在运行时速度更快,因为代码已经被翻译,而不需要即时“解释”/翻译。
请注意,编译语言和静态类型语言在分别运行翻译和类型检查之前都会有延迟。
更多差异
静态类型可以及早发现错误,而不是在执行过程中发现它们(对于长程序特别有用)。它更“严格”,因为它不允许在程序中的任何地方出现类型错误,并且通常会阻止变量更改类型,从而进一步防止意外错误。
num = 2
num = '3' // ERROR
动态输入更加灵活,有些人对此表示赞赏。它通常允许变量更改类型,这可能会导致意外错误。