在Qt5中,javascript 和 C++一样,成了Qt中的一等公民;而Qt选中的javascript引擎则是 V8。
看来,有必要简单看看这个东西了。
V8
V8是什么?
-
项目主页:http://code.google.com/p/v8/
-
V8 是Google开发的开源的JavaScript引擎。
- V8 采用C++编写,且用于Google Chrome浏览器
-
据说,比用于IE的JScript,用于Firefox的SpiderMonkey,以及用于Safari的JavaScriptCore速度更快
构建V8
和大部分开源项目一样,在linux下比较方便(而在Windows下则有些复杂)。
只需要下载源码,然后在源码目录下,执行:
scons
即可得到 libv8.a
例子
一个在C++中嵌入V8的例子:
#include <v8.h>
using namespace v8;
int main()
{
HandleScope handle_scope;
Persistent<Context> context = Context::New();
Context::Scope context_scope(context);
Handle<String> source = String::New("'Hello' + ', World!'");
Handle<Script> script = Script::Compile(source);
Handle<Value> result = script->Run();
context.Dispose();
String::AsciiValue ascii(result);
printf("%s\n", *ascii);
return 0;
}
这堆代码真难看懂,幸好,编译倒还简单:
g++ dbzhang.cpp -I./include libv8.a -lpthread
Qt5
当前的Qt4.7中,Qt 中有两套 JavaScript 引擎
-
Qt WebKit 中有一个JavaScriptCore副本
-
Qt Script 中有另一个JavaScriptCore副本
-
Qt Script 本身被用作Qt Quick的JavaScript引擎
目标是:为Qt WebKit、Qt Script、QML提供一个统一引擎。
V8进入qtbase
V8 已经从 qtdeclarative 模块内部移出,作为qtbase中的一个独立模块。下一步就是将QJSEngine和QDeclarativeEngine移动到QtCore模块?
没碰过qml,不过可以先看看:如何在Qt5的C++程序中嵌入V8?
#include <QtCore/QCoreApplication>
#include <private/v8.h>
using namespace v8;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
HandleScope handle_scope;
Persistent<Context> context = Context::New();
Context::Scope context_scope(context);
Handle<String> source = String::New("'Hello' + ', World!'");
Handle<Script> script = Script::Compile(source);
Handle<Value> result = script->Run();
context.Dispose();
String::AsciiValue ascii(result);
printf("%s\n", *ascii);
return a.exec();
}
QT += v8-private
CONFIG += console
SOURCES += main.cpp
恩,直接运行 qmake、make 即可
QtScript
QtScript也是几经变化
但,从这儿
可以看出
-
QtScript 不太可能移植到V8之上了
- 准备引入一套新的script API接口??
QRegExp
文中说,QtCore的中的QRegExp引擎已经相当老了,而V8提供了性能更好的正则表达式引擎。所以在评估是否要支持JS类型的正则表达式并作为Qt5中默认的语法。
不过按照Thiago Macieira 今天在邮件列表中的说法,这个应该是被否决了。摘录如下:
-
Lars and I had discussed the idea of using V8's RE engine to replace QRegExp. But after investigating V8, I came to the conclusion that this idea was not acceptable.
The advantage of that would be that the C++ and QML sides of Qt would have access to the same RE syntax. And we wouldn't need two RE engines in memory.
PCRE looks more likely to be the replacement for QRegExp.
v8源码
- 源码默认放置在 qtbase/src/3rdparty/v8/
- 也可放置到其他位置,通过环境变量 V8DIR 指定
v8官方采用的构建系统是scons,而在Qt中,使用的是qmake。相关的工程文件在
不过从工程文件v8.pri可以看出,构建时需要python的参与
v8_js2c.commands = python $$V8DIR/tools/js2c.py $$V8_GENERATED_SOURCES_DIR/libraries.cpp $$V8_GENERATED_SOURCES_DIR/libraries-empty.cpp CORE
v8_js2c.commands += $$V8SRC/macros.py ${QMAKE_FILE_IN}
v8_js2c.output = $$V8_GENERATED_SOURCES_DIR/libraries.cpp
v8_js2c.input = V8_LIBRARY_FILES
v8_js2c.variable_out = SOURCES
v8_js2c.dependency_type = TYPE_C
v8_js2c.depends = $$V8DIR/tools/js2c.py $$V8SRC/macros.py
v8_js2c.CONFIG += combine
v8_js2c.name = generating[v8] ${QMAKE_FILE_IN}
silent:v8_js2c.commands = @echo generating[v8] ${QMAKE_FILE_IN} && $$v8_js2c.commands
QMAKE_EXTRA_COMPILERS += v8_js2c
一点牢骚
最后,抱怨一下,目前Qt5的东西真乱,都看不懂
libQtAddOnGallery.so.5.0.0 libQtPublishSubscribe.so.5.0.0
libQtCLucene.so.5.0.0 libQtQuick1.so.5.0.0
libQtCore.so.5.0.0 libQtQuickTest.so.5.0.0
libQtDBus.so.5.0.0 libQtScript.so.5.0.0
libQtDeclarative.so.5.0.0 libQtScriptTools.so.5.0.0
libQtDesignerComponents.so.5.0.0 libQtSensors.so.5.0.0
libQtDesigner.so.5.0.0 libQtServiceFramework.so.5.0.0
libQtFeedback.so.5.0.0 libQtSql.so.5.0.0
libQtGui.so.5.0.0 libQtSvg.so.5.0.0
libQtHelp.so.5.0.0 libQtSystemInfo.so.5.0.0
libQtLocation.so.5.0.0 libQtTest.so.5.0.0
libQtMultimediaKit.so.5.0.0 libQtV8.so.5.0.0
libQtMultimediaKitWidgets.so.5.0.0 libQtXmlPatterns.so.5.0.0
libQtNetwork.so.5.0.0 libQtXml.so.5.0.0
libQtOpenGL.so.5.0.0
还没编译全呢,就这么多了。而且许多东西似乎还要陆续拆分出来...
参考
分享到:
相关推荐
lvgl 8.0.1的QT5模拟器工程,现在lvgl已经升级到v8的版本,v8跟v7版本很多不兼容,为方便自己调试,现将V8的lvgl整理及移植到QT5上,此工程直接用qt5打开即可仿真及调试
用QT编写的V8手机桌面秀的设置工具。 其实就是用QSettings对文件的读取与存储。
Qt4连接KingBase数据库的驱动
ARM下Qt控制热敏打印机解决方案,QString转char* 乱码解决方案,Qt数据库查询回调解决方案,串口发十六进制数解决方案
J2V8 是 V8 引擎的 Java 封装版本,注重性能和紧密集成。示例代码:V8 v8 = V8.createV8Runtime(); V8Array result = v8.executeArrayScript("var buffer = new ArrayBuffer(256);\n" "var i32 = ...
详细描述了qt for android 编译、打包成apk的方法
Qt Concurrent .......................... yes Qt D-Bus ............................... yes Qt D-Bus directly linked to libdbus .... no Qt Gui ................................. yes Qt Network ........
虽然 QML 是解释型语言,性能要比 C++ 低一些,但是新版 QML 使用 V8,Qt 5.2 又引入了专为 QML 优化的 V4 引擎,使得其性能不再有明显降低。 在 Nokia 发布 Qt 4.7 的时候,QML 被用于开发手机应用程序,全面支持...
诸如qtwebengine之类的某些配方在构建主机上需要32bit multilib编译器,尤其是当要构建的目标是32bit时,例如arm,因为它构建了需要$CC -m32才能工作的v8引擎,因此请确保archlinux上的主机编译器可以生成32bit代码...
如果QT编译提示有错误,尝试在构建设置中重设目录:QT的左边栏-"项目"->"Desktop QT5.14.2 MinGW 32-bit"->"构建设置"->"概要"->"构建目录",填入一个目录,比如“../output”,参考“如有QT编译错误看这里.jpg” ...
维宏三轴雕刻机V8用户手册-R5rar,维宏三轴雕刻机V8用户手册-R5
chrome_v8_js引擎源码导读分析 第一章 v8 之整体流程 第二章 v8 之全局环境配置及初始化 2.1 全局模板 2.2 库函数 2.3 初始化 第三章 v8 之前端建立语法树 3.1 v8 编译中重要的类 3.2 compile之前的查找 ...
FFMPEG开发QTonAndroid的工程(QT5.12),附带FFMPEG库,可以直接编译到Android设备进行开发。 FFMPEG使用NDK_R19C编译。 这是一个简单的DEMO工程,可以直接使用QT打开,编译部署到...注意: 这个工程的库是arm64-v8的。
V8 Javascript Engine for PHP — This PHP extension embeds the Google V8 Javascript Engine 标签:v8js
编译openrasp-v8所需软件以及编译好的Jar包。提供给那些需要二次开发,又不想去编译v8包的人。
v8_context_snapshot
BackTrack 中文指南 V8 BackTrack中文指南V8
c# 、asp.net 在后台使用谷歌V8引擎执行js,将示例工程中的GoogleV8Engine.cs文件复制到你的项目中。将GoogleV8Engine_x64.dll 和 GoogleV8Engine_x86.dll 两个非托管DLL文件拷贝到工程部署的DLL目录下(ASP.Net拷贝...
人大金仓数据库V8R6 国产数据库安装包
一、Google v8 整体印象 1.1 Google v8是什么,能做什么? 1.2 Google v8的获取及编译 1.2.1 获取源码 1.2.2 编译类库及示例 二、Google v8入门 2.1 v8的基本概念 2.2 从HelloWorld开始 2.3 在C++中...