foreword(前言)
这是本人关于Typescript的第一篇笔记,之所以选择将“强类型语言和弱类型语言、静态语言和动态语言”作为第一个想要去总结的主题,是因为个人觉得它很重要。
如今这个年代,可以供我们选择的编程语言非常之多,我们也不能在我们的编程生涯中仅仅只使用一门语言(除非你能够不断钻研一门语言并达到业界先驱者的层次),所以当我们在使用不同的编程语言时,如果我们连各种语言的性质、区别都不知道的话,我们如何在正确的场合、领域去使用某一种语言并尽可能发挥其优势呢?
所以,正因为如此,我觉得“强类型语言和弱类型语言、静态语言和动态语言”这个主题我有必要优先去理清它。
Javascript是一门动态弱类型语言,相应的,也会有静态强类型语言。也就是说,语言可以分为强类型语言和弱类型语言、静态语言和动态语言。
以下内容基本摘自“极客时间梁宵的视频教程——Typescript”,为了方便回顾,以笔记的方式进行记录。
强类型语言和弱类型语言
什么是强类型语言和弱类型语言?
1.强类型语言
在强类型语言中,当一个对象从调用函数传递到被调用函数时,其类型必须与被调用函数中声明的类型兼容。——Liskov, Zilles 1974
这是1974年两位计算机科学家对强类型语言的定义,那我们如何去理解这句话呢?
让我们来看一下下面的伪代码:
A() {
B(x)
}
B(y) {
// x可以被赋值给x,且程序能够运行良好
}
上面伪代码中,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;
}
上面代码在被编译时,完全不知道变量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;
}
C++代码在编译的时候就已经能确定变量a和b的类型了。
接下来,再从内存分配的角度进行对比:
1.Javascript
- 在程序运行时,动态计算属性偏移量(对象中的属性a、b相对于对象基地址的偏移量);
- 需要额外的空间存储属性名;
- 所有对象的偏移量信息各存一份;
2.C++
- 编译阶段确定属性偏移量
- 用偏移量访问代替属性名访问
- 偏移量信息共享;
总结
强类型语言 | 弱类型语言 |
---|---|
强类型语言不允许改变变量的数据类型,除非进行强制类型转换 | 弱类型语言中,变量的值其类型是宽泛的,可以被赋值多种类型的值 |
静态类型语言 | 动态类型语言 |
---|---|
对类型极度严格 | 对类型非常宽松 |
立即发现错误 | Bug可能隐藏数月甚至数年 |
运行时性能好 | 运行时性能差 |
自文档化 | 可读性差 |
基于上面,我们多半会觉得静态语言明显好于动态语言啊,为什么JavaScript现在这么火呢?
动态类型语言(JavaScript)的支持者认为:
- 性能是可以改善的(V8引擎),而语言的灵活性更加重要;
- 隐藏的错误可以通过单元测试发现;
- 文档可以通过工具生成;
所以,任何语言其都具有两面性,同时也是在不断发展与进化的,不能一概而论。
最后给出一张象限图:
last(最后)
非常感谢您能阅读完这篇文章,您的阅读是我不断前进的动力。对于上面所述,有什么新的观点或发现有什么错误,希望您能指出。
最后,附上个人常逛的社交平台:
知乎:https://www.zhihu.com/people/bi-an-yao-91/activities
csdn:https://blog.csdn.net/YaoDeBiAn
github: https://github.com/yaodebian个人目前能力有限,并没有自主构建一个社区的能力,如有任何问题或想法与我沟通,请通过上述某个平台联系我,谢谢!!!