v8javascript编译
❶ 为什么用c++写的v8引擎可以编译js
v8本来就是js的解释器啊, chrome的js就是运行在v8上面的。
❷ google v8 javascript 能实现ajax吗
ajax 的全称是什么,是:Asynchronous JavaScript And XML 翻译过来就是: 异步的js和xml 所以ajax是用异步的js和xml实现的,但是随着异步的使用增多,异步的js有时候也被叫做ajax,说白了,没有js,就没有ajax。
❸ 如何在应用程序中集成V8 JS引擎
switch(input){case1:case"1":document.write("初中");break;case2:case"2":document.write("高中");break;case3:case"3":document.write("大学");break;default:document.write("输入不正确");break;}
❹ 如何在程序中嵌入google的V8 Javascript引擎
V8是一个由丹麦Google开发的开源JavaScript引擎,用于Google Chrome中。V8在执行之前将JavaScript编译成了机器码,而非位元组码或是直译它,以此提升效能。更进一步,使用了如内联缓存(inline caching)。
下面是一个简单的Demo,通过google的V8引擎的来实现这个功能。
Demo的JavaScript代码如下:
function draw(dc)
{
drawer.drawLine(dc, 0xFF, 5, 100, 100, 200, 200);
drawer.drawLine(dc, 0xFF0000, 10, 50, 50, 300, 200);
drawer.drawFrame(dc, 0x00FF00, 2, 350, 200, 500, 400);
drawer.fillRect(dc, 0xFF00FF, 50, 400, 150, 500);
}
具体怎么实现的可以参考上面源码。
❺ 有没有纯C#改写的 V8 javascript 解释器
只找到个封装好的
V8.NET - Home
https://v8dotnet.codeplex.com/
❻ evented i/o for v8 javascript是什么进程
这里main函数中引用了b.c中的函数func。因为所有的函数都是全局的,所以对函数的extern用法和对全局变量的修饰基本相同,需要注意的就是,需要指明返回值的类型和参数。
❼ 什么是Google V8 JavaScript引擎
V8是一个由丹麦Google开发的开源JavaScript引擎,用于Google Chrome中。[2]Lars Bak是这个项目的组长。[3]
V8在执行之前将JavaScript编译成了机器码,而非位元组码或是直译它,以此提升效能。更进一步,使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序与V8引擎的速度媲美二进制编译。[4]
传统的javascript是动态语言,又可称之为Prototype-based Language,JavaScript继承方法是使用prototype,透过指定prototype属性,便可以指定要继承的目标。属性可以在运行时添加到或从对象中删除,引擎会为执行中的物件建立一个属性字典,新的属性都要透过字典查找属性在内存中的位置。V8为object新增属性的时候,就以上次的hidden class为父类别,创建新属性的hidden class的子类别,如此一来属性访问不再需要动态字典查找了。
为了缩短由垃圾收集造成的停顿,V8使用stop-the-world, generational, accurate的垃圾收集器。[5]在执行回收之时会暂时中断程序的执行,而且只处理物件堆叠。还会收集内存内所有物件的指标,可以避免内存溢位的情况。V8组译器是基于Strongtalk组译器。[6]。
❽ v8引擎是如何知道js数据类型的
Java引擎是一个执行Java代码的程序或解释器。Java引擎可以被实现为标准解释器,或者实现为以某种形式将Java编译为字节码的即时编译器。下面是实现了Java引擎的一个热门项目列表:V8— 开源,由Google开发,用C++编写的Rhino— 由Mozilla基金所管理,开源,完全用Java开发SpiderMonkey—第一个Java引擎,最早用在Netscape Navigator上,现在用在Firefox上。JavaCore— 开源,以Nitro销售,由苹果公司为Safari开发KJS—KDE的引擎最初由Harri Porten开发,用于KDE项目的Konqueror浏览器Chakra(J9) — Internet Explorer
Chakra(Java) — Microsoft EdgeNashorn— 开源为OpenJDK的一部分,由Oracle的Java语言和工具组开发Jerry— 是用于物联网的轻量级引擎创建V8引擎的由来Google构建的V8引擎是开源的,用C++编写的。该引擎被用在Google Chrome中。不过,与其他引擎不同的是,V8还被用作很受欢迎的Node.js的运行时。V8最初是设计用来提升Web浏览器中Java执行的性能。为了获得速度,V8将Java代码转换为更高效的机器码,而不是使用解释器。它通过实现像很多现代Java引擎(比如SpiderMonkey或Rhino)所用的JIT(即时)编译器,从而将Java代码编译成机器码。这里主要区别在于V8不会产生字节码或任何中间代码。
❾ 下了chrome源码还要下JSV8源码么
您好,
虽然Chrome浏 览器没有完全解决内存尺寸问题,但是,它通过减少碎片来控制这个问题。在传统的浏览器中,浏览器为一个线程分配一套虚拟内存。当然,每一个标签都占用这个 总内存集中的一个内存块。随着你打开更多的标签,系统将分配更多的内存。但是,在你关闭标签的时候,内存没有完全恢复,不足以运行未来的标签。你最终将遇 到标准的内存碎片问题。
但是,在Chrome浏览器中,每一个标签都有自己的线程。你没有看错,不是每一个Chrome的窗口,而是每一个标签。Cogswell说,我做了20多年的开发工作。我从来没有看到一个窗口能够托管多个线程。但是,Chrome浏览器确实做到了。
Cogswell说,如果我目前的标签上有一个网页,我在地址栏输入一个新的URL地址的时候,与那个网页有关的chrome.exe命令请求就关闭了,并且开始一个新的chrome.exe命令请求。这样做是很完美的:不用输入命令清除分配给已经关闭的网页的内 存,Chrome浏览器将完全消除整个线程,然后开始一个新的线程。这是Chrome浏览器阻止内存碎片以及保护和隔离每一个网页的又一种方法。
更有趣的是在我装载雅虎网站www.yahoo.com的时候发现了一个奇怪的现象。我看到启动了两个线程。但是,对于谷歌搜索引擎 www.google.com那种比较小的网页,我仅看到了一个流程。当我查看命令行的时候我发现原来输入命令行参数设置了一个插件。那是一个叫做插件路 径的额外的参数,设置是c:/windows/system32/macromed/flash/npswf32.dll
那是Flash播放器。Chrome为嵌入在网页的Flash播放器启动了另一个线程。当我在Chrome浏览器 中保持雅虎网页处于打开状态并且关闭分配给Flash播放器的线程的时候,Chrome在雅虎网页上面显示一个提示并且用一个Flash标识取代了那个 Flash窗口,Flash标识上面有一个失望的面孔。
❿ 为什么V8 JavaScript引擎这么快
1.针对上下文的Snapshot技术
什么是上下文(Contexts)?实际是JS应用程序的运行环境,避免应用程序的修改相互影响,例如一个页面js修改内置对象方法toString,不应该影响到另外页面。chrome浏览器每个process只有一个V8引擎实例,浏览器中的每个窗口、iframe都对应一个上下文。
V8启动时(在执行client js前),需要对全局上下文(第一个context)初始化,读取和解析自实现的内置JS代码(另一种技术,第2点),建立起function、array、string等内置对象及方法(参见bootstrapper中的Genesis类);后续context的创建只需要创建内置对象即可;为了减少全局上下文创建时的CPU、内存消耗,V8使用了Snapshot技术(参见v8_mksnapshot工程),(1)全局上下文初始化后,将目前堆内存序列化为字节代码,保存至磁盘文件;这个过程最重要的是空间地址和对象保存,具体操作(参见serialize文件)是:模拟线性内存空间的分配,遍历堆内存中的所有JS对象,并在模拟空间分配内存(实际是记录对象相对偏移地址),然后序列化对象大小、偏移地址、子对象、对象内容;最后是序列化global handler和stack上的context;(2)加载时,将该snapshot文件反序列化进内存,避免第一个上下文初始化,从而加快V8的启动。
2. Built-in的js代码
利用JS自表达内置对象、方法,V8在实现代码转译时只需注重基本操作,以%符号开头的函数来自V8运行时函数(参见runtime和codegen);
3. 建立AST(Abstract SyntaxTree)时内存的管理
V8在建立AST后,对其进行汇编生成动态机器语言,所以AST在code generated后需要回收;针对AST建立过程中多结点内存申请和一次性回收的特点,V8使用了内存段链表管理,并结合scopelock模式,实现少数申请(Segment,8KB~1MB)、多次分配AST结点、一次回收各个Segment的管理方式,既能避免内存碎片,又可以避免遍历AST结点逐个回收内存。
4. CompileCache避免相同代码重复编译
对于一段JS代码,在开始进行词法分析前,会从编译缓存区CompilationCache查找该段代码是否已经被编译过,如果是,则直接取出编译过的机器代码,并返回,这样降低CPU的使用率,换来内存空间一定的占用;如果一个页面中重复加载JS文件,这方法的提速是很明显的;这种做法应该有平衡对比过。
5. 属性的快速访问
C++、Java等语言有着类的概念,且属性、方法和类绑定在一起,访问时可根据对象地址+位移快速获得;而JS对象并没有类概念,它实际为hash map,属性可以动态增加、删除,而且在执行时才能获知对象类型。
V8没有像其它JS Engine使用词典结构或红黑树实现的map来管理属性,而是在每个对象附加一个指针,指向hidden class(如果第一次创建该类型对象,则新建hidden class);当对象每添加一个属性时,将新建一个class(记录了每个属性的位移/位置),而原来的class指向新class,即建立起一个hidden class的转换链表。
6. Heap堆内存管理
7. Inline caching减少函数调用开销
通过该技术可以记录函数入口,避免重复查找.
8. 一次性编译生成机器语言
一般JS engine会在AST生成后,将之编译为中间语言(bytecode),在执行时候再解析这些bytecode;Java 也同样编译为这些bytecode,再采用VM(实现跨平台)作为解释器,为了提高效能,Java采用混杂方式,把无关平台、常用的代码编译为机器代码。V8则是一次性把AST编译为机器语言。从assembler相关文件头的Copyright可以看出,这些不同平台(ia32, arm)下的编译器,原型来自Sun Microsystems。