欢迎光临
我们一直在努力

概念 | 强类型语言和弱类型语言、静态语言和动态语言

如今这个年代,可以供我们选择的编程语言非常之多,我们也不能在我们的编程生涯中仅仅只使用一门语言(除非你能够不断钻研一门语言并达到业界先驱者的层次),所以当我们在使用不同的编程语言时,如果我们连各种语言的性质、区别都不知道的话,我们如何在正确的场合、领域去使用某一种语言并尽可能发挥其优势呢?

所以,正因为如此,我觉得“强类型语言和弱类型语言、静态语言和动态语言”这个主题我有必要优先去理清它。

Javascript是一门动态弱类型语言,相应的,也会有静态强类型语言。也就是说,语言可以分为强类型语言和弱类型语言、静态语言和动态语言。

以下内容基本摘自“极客时间梁宵的视频教程——Typescript”,为了方便回顾,以笔记的方式进行记录。

强类型语言和弱类型语言

什么是强类型语言和弱类型语言?

1.强类型语言

在强类型语言中,当一个对象从调用函数传递到被调用函数时,其类型必须与被调用函数中声明的类型兼容。——Liskov, Zilles 1974

这是1974年两位计算机科学家对强类型语言的定义,那我们如何去理解这句话呢?

让我们来看一下下面的伪代码:

A() {
  B(x)
}

B(y) {
  // x可以被赋值给x,且程序能够运行良好
}
1234567

上面伪代码中,A函数中调用B函数,并传入参数x,前面说到的定义就是说参数x能够被赋值给y,并保证函数B的正常运行。

到目前为止,这个定义还是比较宽泛模糊的,所以后人给出了更加精确的定义:

强类型语言不允许改变变量的数据类型,除非进行强制类型转换。

即我们声明的变量,不能被赋值其他类型的变量,除非对赋值的变量先进行强制类型转换。

2.弱类型语言

与强类型语言相反,弱类型语言中,变量的值其类型是宽泛的,可以被赋值多种类型的值,比如我们使用的javascript,假如声明了一个变量a,a的值可以是数字1,可以是字符串“abcd”,也可以是对象、数组、函数。。。

静态语言和动态语言

首先,给出一个比较通俗的定义:

  • 静态类型语言:在编译阶段确定所有变量的类型;
  • 动态类型语言:在执行阶段确定所有变量的类型;

首先看一段js代码:

Javascript:

class C {
    constructor (x, y) {
        this.x = x;
        this.y = y;
    }
}

function add (a, b) {
    return a.x + a.y + b.x + b.y;
}
123456789101112

上面代码在被编译时,完全不知道变量a和b是什么类型,只有当程序运行时,对a、b参数传入值时,才知道变量a和b是什么类型。

接着,我们再看一段功能类似的C++代码:

class C {
    public:
        int x;
        int y;
}

int add (C a, C b) {
    return a.x + a.y + b.x + b.y;
}
123456789

C++代码在编译的时候就已经能确定变量a和b的类型了。

接下来,再从内存分配的角度进行对比:

1.Javascript

  • 在程序运行时,动态计算属性偏移量(对象中的属性a、b相对于对象基地址的偏移量);
  • 需要额外的空间存储属性名;
  • 所有对象的偏移量信息各存一份;

2.C++

  • 编译阶段确定属性偏移量
  • 用偏移量访问代替属性名访问
  • 偏移量信息共享;

总结

强类型语言 弱类型语言
强类型语言不允许改变变量的数据类型,除非进行强制类型转换 弱类型语言中,变量的值其类型是宽泛的,可以被赋值多种类型的值
静态类型语言 动态类型语言
对类型极度严格 对类型非常宽松
立即发现错误 Bug可能隐藏数月甚至数年
运行时性能好 运行时性能差
自文档化 可读性差

基于上面,我们多半会觉得静态语言明显好于动态语言啊,为什么JavaScript现在这么火呢?

动态类型语言(JavaScript)的支持者认为:

  • 性能是可以改善的(V8引擎),而语言的灵活性更加重要;
  • 隐藏的错误可以通过单元测试发现;
  • 文档可以通过工具生成;

所以,任何语言其都具有两面性,同时也是在不断发展与进化的,不能一概而论。

最后给出一张象限图:
file

赞(1) 打赏
未经允许不得转载:散人研 » 概念 | 强类型语言和弱类型语言、静态语言和动态语言
分享到: 更多 (0)

相关推荐

评论 抢沙发

1 + 6 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏