JavaScript动态语言脚本定义

本文详细介绍了JavaScript作为动态脚本语言的特性,包括它的动态性、跨平台性以及与Java的区别。JavaScript的执行效率相对较低,因为它在运行时进行解释和类型检查。文章还探讨了V8引擎的工作原理,包括编译过程、内存管理和优化策略,如隐藏类、优化回滚等。此外,文章提供了编写高效JavaScript代码的实践建议,如避免破坏隐藏类、合理初始化数组和管理内存。
摘要由CSDN通过智能技术生成

一.JavaScript简介

JavaScript是一种动态类型的脚本语言;在1995年时,由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现而成。因为Netscape与Sun合作,Netscape管理层希望它外观看起来像Java,因此取名为JavaScript。

JavaScript脚本语言具有以下特点:

(1)脚本语言。JavaScript是一种解释型的脚本语言,是在程序的运行过程中逐行进行解释执行,不需要预编译。;而Java、C++等语言需要先编译后执行;

(2)动态性。JavaScript能够动态修改对象的属性,没有办法在编译的时候知道变量的类型,只有在运行的时候才能确定;而Java、C++等都是静态类型语言,他们在编译的时候就能够知道每个变量的类型;

(3)跨平台性。JavaScript脚本语言不依赖于操作系统,仅需要浏览器的支持。可以在多种平台下运行(如Windows、Linux、Mac、Android、IOS等);

二. JavaScript与Java语言区别

从上面介绍的JavaScript语言特点会发现JavaScript的效率会比Java、C++低很多;看以下这个实例:

当JavaScript引擎分析到该段代码的时候,根本不知道a和b是什么类型,唯一的办法就是运行的时候根据实际传过来的对象再来计算,这显然会导致严重的性能问题;

当编译上面Java代码的时候,根据右边类型Class1的定义,获取对象a的属性x的时候,其实就是对象a的地址,大小是一个整形。同时获取对象b的属性y的时候,其实就是对象b的地址加上4个字节,这些都是在生成本地代码的时候确定的,无需再运行本地代码的时候再决定他们的地址和类型是什么,这显然能够节省时间;

再看一下两者分别是怎样存储对象a和b的:

对于传统的JavaScript解释器来说,因为不知道a和b的具体类型,就用属性名-属性值对来保存,之后访问对象的属性值时就需要通过属性名匹配来获取对应的值;对象b也是同样的结果来保存相同的属性;随着对象的增多,这显然带来了巨大的空间浪费;

而上面的Java代码在编译时就确定了类Class1的成员类型,访问x就是对象a的地址,y就是a的地址加上4个字节;所以字符“x”和“y”运行时都不在需要;因为不再需要额外的查找这些属性地址的工作;

从上面实例可以看到JavaScript和Java语言区别包括以下几个部分:

编译确定位置:Java有编译和执行两个阶段,位置的偏移信息都是在编译器编译的时候决定的,当java生成本地代码之后,对象的属性和偏移信息都计算完成;而JavaScript没有类型,只有在对象执行创建的时候才确定这些信息,而且JavaScript语言能够在执行的时候修改对象的属性。
偏移信息共享:Java有类型定义,所有的对象都是共享偏移信息的;访问他们只需要按照编译时确定的偏移量即可。JavaScript则不同,每个对象都有自我描述,属性和位置偏移信息都包含在自身的结构中。
偏移信息查找:Java查找偏移地址很简单,都是在编译代码时,对使用到的类型成员变量直接设置偏移量;而JavaScript则需要通过属性名匹配才能查找到对应的值。
Java语言有明显的两个阶段:编译和运行,如下图所示:

Java代码经过编译器编译之后生成的是字节码,字节码是跨平台的一种中间表示,不同于本地代码。该字节码于平台无关,能够在不同的操作系统上运行。在运行字节码阶段,Java的运行环境是Java虚拟机加载字节码。Java虚拟机一般都引入JIT技术来将字节码转变成本地代码来提高执行效率。第一阶段对时间要求不严格,第二阶段对每个步骤所花费的时间非常敏感,时间越短越好。

JavaScript语言的编译和执行都是在运行阶段执行的,如下图所示:

因为都是在代码运行过程中来处理这些步骤,所以每个阶段的时间越短越好,而且每引入一个阶段都是额外的时间开销;所以一个JavaScript引起主要包含以下几个部分:

编译器:主要工作是将源代码编译成抽象语法树;

解释器:主要是接受字节码,解释执行这个字节码;

JIT工具:将字节码或抽象语法树转换成本地代码;

垃圾回收期和分析工具(Profiler):负责垃圾回收和收集引擎中的信息,帮助改善引擎的性能;

三. V8引擎介绍

V8是一个JavaScript引擎实现的开源项目,最开始由一些语言学家设计出来,后被Google收购,成为了JavaScript引擎和众多相关技术的引领者。V8支持众多的操作系统,包括Windows、Linux、Android、Mac OS X等;同时它也能够支持众多的硬件架构IA32、X64、ARM、MIPS等,他将主流软硬件平台一网打尽,由于它是一个开源项目,开发者可以自由使用它的强大能力,目前炙手可热的NodeJs项目就是基于V8项目研发的。

调用V8编程接口的例子和对应的内存管理方式:
第一条语句:表示建立一个域,用于包含一组Handle对象,便于管理和释放他们;

第二条语句:根据Isolate对象来获取一个Context对象,使用Handle来管理。Handle对象本身存放在栈上,而实际的Context对象保存在堆中。

第三条语句:根据两个对象Isolate和Context来创建一个函数间使用的对象,使用Persistent类来管理;

第四条语句:表示为Context对象创建一个基于栈的域,下面的执行步骤都是在该域中对应的上下文中来进行的;

第五条语句:读入一段JavaScript代码;

第六条语句:将代码字符串编译成V8的内部表示,并保存成一个Script对象;

第七条语句:执行编译后的内部表示,获得生成的结果;

V8的编译:
首先通过编译器将源代码编译成抽象语法树,不同于JavaScriptCore引擎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值