前言
“我花了几个星期…试着弄清楚“强类型”、“静态类型”、“安全”等术语,但我发现这异常的困难…这些术语的用法不尽相同,所以也就近乎无用。
来源:编程语言专家 Benjamin C. Pierce
今天,我突然发现,我虽然自认为会几门编程语言和会使用几种框架,却对编程语言的原理的理解停留在十分浅薄的层面,我原先对编程语言的理解不过是编译器将语言编译成机器代码,然后机器再执行机器代码,解释型语言是解释器边解释边运行,我还知道像java这种语言是先编译成bytecode(class文件),然后在jvm里面用JIT即时编译……过去我对编程语言的理解仅仅限于上面这些。如果问我诸如解释器和编译器的区别,即时编译、动态编译、AOT的异同,什么叫解释什么叫编译,静态语言和动态语言的区别,python算是强类型语言吗等问题,我八成会答错,更让人沮丧的是在很多博客网站上像csdn和简书里关于编程语言的基本认知错误有很多,笔者通过广泛的阅读维基百科相关内容和大学教材《编译原理》,同时阅读了msdn的官方文档和知乎上一些高质量回答,写下本文,希望抛砖引玉的同时能够对互联网上一些关于编程语言的错误言论起到正本清源的作用。
什么是编程语言
编程语言(英语:programming language),是用来定义计算机程序的形式语言。它是一种被标准化的交流技巧,用来向计算机发出指令,一种能够让程序员准确地定义计算机所需要使用数据的计算机语言,并精确地定义在不同情况下所应当采取的行动。
编程语言,其实就是一个能够让计算机明白使用者意图,同时能让使用者对计算机发出指令的有统一规则的交流技巧。这里可以打个拟人化的比喻,cpu所能听懂的语言和人说的语言是不一样的,所以需要有一个中间语言——编程语言来搭建交流的桥梁,事实上从人类的语言到cpu能听懂的语言往往并不是一个编程语言就能办到的,通常需要多个编程语言参与其中。
本篇文章的价值观为一切定义以维基百科为准,如果维基百科和《编译原理》的定义有冲突,则以《编译原理》为准。
强弱与动静态,从C语言说起
先说结论,c语言是弱类型、静态类型、有编译器的编译语言。
强弱类型和动静态类型不是一个东西,也不是一个标准下的产物。
强类型:如果一门语言倾向于不对变量的类型做隐式转换,那我们将其称之为强类型语言
弱类型:相反,如果一门语言倾向于对变量的类型做隐式转换,那我们则称之为弱类型语言
动态类型:如果一门语言可以在运行时改变变量的类型,那我们称之为动态类型语言
静态类型:相反,如果一门语言不可以在运行时改变变量的类型,则称之为静态类型语言
作者:网仙
链接:https://www.zhihu.com/question/43498005/answer/266431585
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
强弱类型指的是类型检查的严格程度,动静态区分的是类型检查在程序运行的哪个阶段发生的。(当然了,你如果说类型检查是早就在IDE编辑器里面发生的,那就没意思了。