V8 初次接触(Qt5)


分类:
Qt
Qt5


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 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。相关的工程文件在

  • 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

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