什么是JavaScript?
下崽课程ZY:
https://www.sisuoit.com/2547....
我们来确认一下JavaScript的定义:JavaScript
是一门解释型的动态语言。
解释型语言是相对于编译型语言存在的,源代码不是直接编译为目标代码,而是转成中间代码,再由解释器对中间代码进行解释运行。
主流编程语言有编译型(如 C++)、解释型(如 JavaScript
)、和半解释半编译(如 Java
)这几大类型。
代码是怎么运行的?
首先我们来了解一下代码是怎么运行的。
我们知道,代码是由CPU执行的,而目前的CPU并不能直接执行诸如if…else之类的语句,它只能执行二进制指令。但是二进制指令对人类实在是太不友好了:我们很难快速准确的判断一个二进制指令1000010010101001
代表什么?所以科学家们发明汇编语言。
汇编语言
汇编语言实际上就是二进制指令的助记符。
假设10101010代表读取内存操作,内存地址是10101111
,寄存器地址是11111010
,那么完整的操作101010101010111111111010
就代表读取某个内存地址的值并装载到寄存器,而汇编语言并没有改变这种操作方式,它只是二进制指令的映射:
`LD:10101010
id:10101111
R:11111010`
这样上述指令就可以表达为LD id R ,大大增强了代码的可读性。
但是这样还不够友好,CPU只能执行三地址表达式,和人的思考方式、语言模式相距甚远。所以伟大的科学家们又发明了高级语言。
高级语言
“代码是写给人看的,不是写给机器看的,只是顺便计算机可以执行而已。”
高级语言之所以称之为“高级”,就是因为它更加符合我们的思维和阅读习惯。if…else这种语句看起来要比1010101010
舒服的多了。但是计算机并不能直接执行高级语言,所以还需要把高级语言转化为汇编语言/机器指令才能执行。这个过程就是编译。
JavaScript 需要编译吗?
JavaScript毫无疑问是高级语言,所以它肯定是需要编译后才能执行。但为什么我们又称之为解释型语言呢?它和编译型语言、半解释半编译型语言又有什么区别呢?我们先从编译说起。
编译
之前我们已经了解编译的概念,下面我们来聊聊平台:同样一份C++代码在Windows
上会编译成.obj文件,而在Linux
上则生成.o文件,两者不能通用。这是因为一个可执行文件除了代码外还需要操作系统 API、内存、线程、进程等系统资源,而不同的操作系统其实现也不尽相同。比如我们熟悉的I/O多路复用(事件驱动的灵魂),在Windows上的实现方案是IOCP方案,在Linux上是epoll。所以针对不同的平台,编译型语言需要分别编译,甚至需要分别编写,而且生成的可执行文件其格式并不相同。
跨平台
Java在此之上更进一步,它通过引入字节码实现了跨平台运行:无论是在什么操作系统上.java文件编译出的都是.class文件(这就是字节码文件,一种中间形态的目标代码)。然后Java对不同的系统提供不同的Java虚拟机用于解释执行字节码文件。解释执行并不生成目标代码,但其最终还是要转为汇编/二进制指令来给计算机执行的。
假如我们自己完全独立的新写一个简单的操作系统,那么它能不能运行Java呢?很显然是不能的,因为并没有这个系统相应的JVM
。所以Java
的跨平台、任何其他语言的跨平台,都是有局限性的。
Java采用半解释半编译的好处就是大大提升了开发效率,然而相应的则降低了代码的执行效率,毕竟虚拟机是有性能损失的。
解释执行
JavaScript则更进一步。它是完全的解释执行,或者叫做即时编译。它不会有中间代码生成,也不会有目标代码生成。这个过程通常由宿主环境(如浏览器、Node.js)包办。
编译过程
现在我们确认了,即使是解释执行的语言,也是需要编译的。那么代码是如何编译的呢?我们来简单了解一下。
词法分析
词法分析会把语句分解成词法单元,即Token。
【破解JavaScript高级玩法吾爱fen享】`function square(n){
return n*n;
}`
推荐阅读
- js方法|Vuex入门(六)——mapState, mapGetters, mapMutations, mapActions全网最全详解终结篇(带源码)
- 区块链|夹子机器人/BSC,源码,部署教程
- 笔记|使用Vue时候报错,怎么查看错误位置,如何解决,方法,有哪些
- vue|Vue项目使用开发工具vuejs-devtools最新简单安装方法
- js方法|Vuex入门(五)—— 封装module全网最全详解(带源码)
- 前端优秀开源项目|cnchar - 功能全面、支持多端的汉字拼音笔画开源 JS 库
- 2.1 <script>元素
- scheme|monad 例子
- JavaScript/jQuery实现切换页面效果