首页IT科技V8 初次接触(Qt5) 1+1=2 博客频道 CSDN.NET

V8 初次接触(Qt5) 1+1=2 博客频道 CSDN.NET

时间2025-08-03 03:00:31分类IT科技浏览4598
导读:分类: Qt Qt5 2011-09-03 18:41 1881人阅读 评论(4 收藏 举报 在Qt5中...

分类:

Qt

Qt5

2011-09-03 18:41 1881人阅读 评论(4) 收藏 举报

在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

http://code.google.com/intl/sv/apis/v8/build.html

http://code.google.com/p/v8/wiki/BuildingOnWindows

和大部分开源项目一样                    ,在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

https://bugreports.qt.nokia.com//browse/QTBUG-12502

当前的Qt4.7中,Qt 中有两套 JavaScript 引擎

Qt WebKit 中有一个JavaScriptCore副本

Qt Script 中有另一个JavaScriptCore副本

Qt Script 本身被用作Qt Quick的JavaScript引擎

目标是:为Qt WebKit            、Qt Script                   、QML提供一个统一引擎                  。

V8进入qtbase

https://bugreports.qt.nokia.com/browse/QTBUG-20963

https://bugreports.qt.nokia.com/browse/QTBUG-20893

V8 已经从 qtdeclarative 模块内部移出                 ,作为qtbase中的一个独立模块           。下一步就是将QJSEngine和QDeclarativeEngine移动到QtCore模块?

没碰过qml                   ,不过可以先看看:如何在Qt5的C++程序中嵌入V8?

main.cpp #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(); } hello.pro QT += v8-private CONFIG += console SOURCES += main.cpp

恩   ,直接运行 qmake        、make 即可

QtScript

QtScript也是几经变化

最早是:Qt Script for Applications (QSA)

从 Qt4.3 开始正式包含一个QtScript模块

Qt4.6时             ,QtScript采用JavaScriptCore进行了重写      。

现在                    ,在评估是否可以用V8作为引擎...

但      ,从这儿

https://bugreports.qt.nokia.com/browse/QTBUG-12503

可以看出

QtScript 不太可能移植到V8之上了

准备引入一套新的script API接口??

QRegExp

https://bugreports.qt.nokia.com/browse/QTBUG-20888

文中说         ,QtCore的中的QRegExp引擎已经相当老了                    ,而V8提供了性能更好的正则表达式引擎                  。所以在评估是否要支持JS类型的正则表达式并作为Qt5中默认的语法              。

不过按照Thiago Macieira 今天在邮件列表中的说法         ,这个应该是被否决了   。摘录如下:

Lars and I had discussed the idea of using V8s 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 wouldnt 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                  。相关的工程文件在

qtbase/src/v8

不过从工程文件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

还没编译全呢                 ,就这么多了                 。而且许多东西似乎还要陆续拆分出来...

参考

http://code.google.com/intl/sv/apis/v8/intro.html

https://bugreports.qt.nokia.com//browse/QTBUG-12502

http://en.wikipedia.org/wiki/V8_%28JavaScript_engine%29

声明:本站所有文章                   ,如无特殊说明或标注   ,均为本站原创发布。任何个人或组织             ,在未征得本站同意时                    ,禁止复制         、盗用                  、采集           、发布本站内容到任何网站      、书籍等各类媒体平台               。如若本站内容侵犯了原著者的合法权益      ,可联系我们进行处理                    。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
电脑bios报警(BIOS报警的一些原因分析解答) 提高网站搜索排名的方法(提高网站知名度的方法)