编译型和解释型语言的区别
我们常说java是编译型语言,js、python是解释型语言。那么什么是编程语言为什么要有【编译型】和【解释型】的区别?
形象类比:就好比你看一本英语书,需要一个翻译。java是请一个翻译花一天时间,将这本书一次性翻译成册,然后你只要读这本翻译手册就行了(看的多快取决你的读速度);而js是请一个翻译在旁边,你读一句他翻译解释一句,读书的速度取决于它翻译的速度 && 且你每次读这本书都需要带上这个翻译。
这取决于这门语言要使用的地方需要什么?如果你希望程序启动快、对程序执行的速度要求不高,例如:浏览器之类的
-
为什么做前端选用js而不是java
静态类型语言和动态类型语言
编译型语言就是静态类型语言,解释型语言是动态类型语言,是吗?错❌,这两个是完全正交的概念。
- 编译型和解释型区分的核心是:代码何时被编译(运行前 vs 运行时)
- 静态语言和动态语言区分的核心是:变量的类型检查发生在什么时候(编译时 vs 运行时)
- java 编译阶段 对变量进行类型检查-> 生成.class编译文件(如果类型检查不通过,则编译失败)
- js / python 编译阶段只是将对代码进行词法->语法->AST->字节码(将字节码交给执行引擎)
为什么java要在生成.class的编译阶段进行类型检查?这明显是舍弃了代码的灵活性和前期开发速度?因为java是为了保证项目代码的健壮性,不得不舍弃的。js/python虽然快,但是时间久了开发人员类型混乱,不利于长期维护。Java 要求声明类型,是为了编译时优化性能和捕获错误,代价是灵活性;JS/Python 不要求,是为了运行时灵活和开发速度,代价是性能和部分健壮性,没有绝对的好坏。
回到原来的问题:(java设计哲学是:倾向于编译时候提前算好,js/python设计哲学:先跑起来再说)
- java的语言编译阶段的类型检查机制,导致程序开发时候需要对变量进行提前类型声明
- java编译时分配固定内存
类比:贴标签的快递箱
- 静态类型(Java) :箱子(变量)出厂时就印好了固定标签,比如“只放易碎品”。你只能往里放符合标签的东西,放错了编译器就不让你装车。java对贴好标签的箱子放什么很讲究
- 动态类型(JS) :箱子(变量)没有标签,但每个物品(值)自己带着一个小牌子(类型标签)。你随时可以往箱子里换不同的物品,操作员(引擎)每次打开箱子,先看物品的牌子,再决定怎么处理(是轻拿轻放还是随便扔)。js是箱子放什么,贴什么标签,不讲究(js不需要类型声明,是变量赋予的值本身自带一个类型标签,例如:a = 3,值3自带类型number标签,然后把number给变量a,如果a = 'str',则给string标签给a)