您的位置:首页 > 编程语言 > Qt开发

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

2012-05-01 20:53 411 查看
V8 初次接触(Qt5) - 1+1=2 - 博客频道 - CSDN.NET


V8 初次接触(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 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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: