当我决定要了解某事时,我会变得迷恋,直到我最终明白。 我最近的尝试? 静态与动态键入 。
Stack Overflow的答案令人困惑,冗长甚至矛盾。 事实证明,这些术语通常会被误解,因此我的搜索将非常困难。 我继续阅读我能找到的任何东西,但没有任何东西满足我对平易近人和简明事物的渴望。
我将从一些基本术语入手,然后轻轻地带给您启示。
编译与解释
“翻译源代码时”
- 源代码 :原始代码(通常由人类输入到计算机中)
- 翻译 :将源代码转换为计算机可以读取的内容(即机器代码)
- 运行时间 :程序执行命令的时间段(编译后,如果已编译)
- 编译 :运行前翻译的代码
- 解释 :执行期间即时翻译的代码
打字
“检查类型时”
"3" + 5
将在强类型语言(例如Python和Go)中引发类型错误,因为它们不允许“类型强制”:在某些情况下值隐式更改类型的能力(例如,合并两个类型使用+
)。 诸如JavaScript之类的弱类型语言不会引发类型错误(结果: '35'
)。
- 静态 :运行时检查的类型
- 动态 :执行期间即时检查类型
“静态和编译”和“动态和解释”的定义非常相似……但请记住,它是“何时检查类型”与“何时翻译源代码”。
类型检查与正在编译或解释的语言无关! 您需要在概念上分开这些术语。
Python示例
动态,口译
def foo(a):
if a > 0:
print 'Hi'
else:
print "3" + 5
foo(2)
因为Python既是解释型的又是动态类型的,所以它只翻译和类型检查在其上执行的代码。 else
块永远不会执行,因此甚至不会查看"3" + 5
!
如果它是静态类型的怎么办?
代码甚至在运行之前都会引发类型错误。 即使它被解释,它仍然在运行时之前执行类型检查。
如果已编译怎么办?
else
块将在运行时被翻译/查看,但是因为它是动态键入的,所以不会抛出错误! 动态类型语言在执行之前不会检查类型,并且该行永远不会执行。
去例子
静态,已编译
package main
import ("fmt"
)
func foo(a int) {
if (a > 0) {
fmt.Println("Hi")
} else {
fmt.Println("3" + 5)
}
}
func main() {
foo(2)
}
在运行(静态)之前检查类型,并立即捕获类型错误! 如果对类型进行了解释,则在运行时仍将对其进行检查,其结果相同。 如果它是动态的,则即使在编译过程中查看代码,也不会引发任何错误。
性能
如果是静态类型的,则编译后的语言在运行时将具有更好的性能,因为类型的知识可以实现机器代码的优化。
静态类型的语言本质上在运行时具有更好的性能,因为不需要在执行时动态检查类型(它在运行之前进行检查)。
同样,编译后的语言在运行时速度更快,因为代码已被翻译,而不需要即时“解释” /翻译代码。
请注意,编译语言和静态类型语言在运行翻译和类型检查之前都会分别有一个延迟。
更多差异
静态类型可以及早发现错误,而不是在执行过程中发现错误(这对长程序尤其有用)。 它更具“严格性”,因为它不允许在程序的任何位置出现类型错误,并且通常防止变量更改类型,从而进一步防止了意外错误。
num = 2
num = '3' // ERROR
动态类型化更灵活(有些人赞赏),但允许变量更改类型(有时会产生意外错误)。
那为您清理了一切吗? 在评论中让我知道!
From: https://hackernoon.com/i-finally-understand-static-vs-dynamic-typing-and-you-will-too-ad0c2bd0acc7