`
tomhibolu
  • 浏览: 1430595 次
文章分类
社区版块
存档分类
最新评论

V8 初次接触(Qt5)

 
阅读更多

在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?

  • 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作为引擎...

但,从这儿

可以看出

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

  • 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

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

参考


分享到:
评论
1 楼 dl3399 2012-08-05  
一直期待qt中引入v8,毕竟现在qt的js引擎库好多js都不能正确解析。不知道qt是否会受nokia影响,停止发展了。

相关推荐

    lvgl 8.0.1的QT5模拟器工程

    `build-lvgl-Qt_5_5_1_mingw492_32-Debug`则是编译生成的调试版本库,是将LVGL与QT5结合后的产物,适合在QT Creator或类似的IDE中进行调试。 在使用这个工程时,首先需要确保你已经在本地安装了QT5开发环境,包括QT...

    用QT编写的V8手机桌面秀的设置工具。

    本项目"用QT编写的V8手机桌面秀的设置工具"是基于QT框架构建的一款应用,主要功能是针对V8手机桌面秀进行个性化设置。V8手机桌面秀可能是一款能够让用户自定义手机主屏幕效果的软件,而这个设置工具则提供了对各种...

    Qt5.9.9-arm64

    总的来说,Qt5.9.9-arm64结合了强大的arm64硬件性能和高效的Qt5框架,为开发者提供了便利的开发工具,无论是在移动还是嵌入式领域,都能实现高质量的应用开发。同时,通过使用gcc5.4.0编译器,确保了代码的稳定性和...

    Qt4连接KingBase数据库的驱动

    在IT领域,数据库连接是应用程序开发中的重要环节。Qt是一个跨平台的应用程序开发框架,而KingBase是一款由人大金仓公司开发...同时,考虑到Qt5和Qt6的发布,你也可以考虑升级到较新的Qt版本,以获取更多的功能和优化。

    Qt5.12.4产物-银河麒麟-ARM64

    Qt5.12.4产物_银河麒麟_ARM64

    untitled2_QWeb_QTqwebengine加载网页_htts://www.2qt5.com_www.2qt5.com

    1. **性能提升**:由于QWebEngine是基于Chromium,它可以利用多线程渲染和V8 JavaScript引擎,提供更快的页面加载和执行速度。 2. **安全更新**:Chromium项目持续进行安全更新,因此QWebEngine能够及时修复浏览器中...

    android Qt 编译

    在Android平台上使用Qt进行开发,可以借助Qt for Android框架,它允许开发者利用Qt库和工具集在Android设备上创建原生应用。本文将详细介绍Qt for Android的编译过程以及如何将项目打包成APK。 首先,确保你已经...

    Linux Qt5.13.2 编译QWebEngine源码支持音视频<aarch64>

    - **依赖库**: QWebEngine需要一系列的依赖库,包括但不限于:Qt5基类、Qt5网络、Qt5Multimedia、OpenSSL、V8 JavaScript引擎、Chromium库等。确保这些库已经安装并且版本与Qt5.13.2兼容。 2. **获取源码**: - ...

    jlink-v8固件(MDK5可用)

    《JLink-V8固件与MDK5的完美结合》 在嵌入式开发领域,JLink是一款广泛应用的调试工具,它提供了强大的仿真、下载、调试功能,深受工程师喜爱。而JLink-V8作为其中的一个版本,其固件的更新与优化对开发者的工作...

    miniblink c++ qt 浏览器

    7. **JavaScript引擎V8**:miniblink集成了Google的高性能JavaScript引擎V8,用于执行网页中的JavaScript代码。 8. **事件处理**:浏览器应用需要处理各种用户交互事件,如点击、滚动等,miniblink提供了相应接口供...

    Qt下串口控制微型热敏打印机(嵌入式打印机)

    在本文中,我们将深入探讨如何在Qt环境下对嵌入式热敏打印机进行串口控制,同时解决在ARM平台上遇到的一些常见问题,如QString与char*转换时的乱码问题、Qt数据库查询的回调机制以及通过串口发送十六进制数据的方法...

    Qt交叉编译后aarch64-linux-gnu-成功运行在Zynq UltraScale+MPSoC上

    在本文中,我们将深入探讨如何将Qt交叉编译为aarch64-linux-gnu架构,并成功在Zynq UltraScale+ MPSoC平台上运行。这个过程适用于公司项目,特别是在Zynq UltraScale+ MPSoC(ZU9EG)处理器上运行具有软键盘功能的Qt...

    配置Qt5.13.2的安卓开发环境.docx

    创建新工程,选择安卓编译器,arm64-v8a,开始编译。在构建过程中,可能会出现一些错误,例如下载中断,可以重新点击“运行”按钮直到没有错误出现。 六、解决 Android 设备不弹出调试授权提醒 安装 Android SDK,...

    V8调用例子 易语言

    5. 执行JavaScript代码:使用Script对象的Run方法执行编译后的JavaScript代码,获取执行结果。 6. 处理结果:根据执行结果类型,可能是数值、字符串、对象等,使用易语言的相应类型进行处理。 7. 清理资源:执行...

    已经交叉编译好的arm64版本的qt5.12.1以及qtmqtt的完整产物

    Qt Concurrent .......................... yes Qt D-Bus ............................... yes Qt D-Bus directly linked to libdbus .... no Qt Gui ................................. yes Qt Network ........

    google V8引擎源码工程 (V8 version 3.14.0.1)

    5. **垃圾回收**:V8引擎使用了一种称为“增量标记-整理”(incremental marking-compaction)的垃圾回收策略,有效地管理内存并避免长时间的阻塞。 6. **API接口**:V8引擎提供了一套C++ API,允许开发者与...

    delphi 调用google v8 引擎 最新版本

    5. 处理JavaScript的异常和错误:确保在执行过程中捕获和处理可能出现的错误。 6. 释放资源:结束V8上下文,释放相关内存。 在实际应用中,我们可能会遇到如何在Delphi和V8之间传递数据的问题。V8提供了多种数据...

    威尔威 v8 写频软件

    软件界面一般直观易懂,但初次接触可能需要一定的学习和实践才能熟练掌握。 总的来说,威尔威V8写频软件是优化对讲机性能、提升通信体验的重要工具,通过它,用户可以充分利用对讲机的功能,满足多样化的通信需求。...

    V8的Java封装版本J2V8.zip

    J2V8 是 V8 引擎的 Java 封装版本,注重性能和紧密集成。示例代码:V8 v8 = V8.createV8Runtime(); V8Array result = v8.executeArrayScript("var buffer = new ArrayBuffer(256);\n"  "var i32 = ...

    delphi调用v8引擎.zip

    5. **异步执行**:为了不阻塞主线程,可能需要在后台线程中执行JavaScript代码。这涉及到多线程编程和同步原语的理解,确保线程安全。 6. **绑定Delphi函数到JavaScript**:通过V8的API,可以将Delphi的函数或方法...

Global site tag (gtag.js) - Google Analytics