zoukankan      html  css  js  c++  java
  • V8 初次接触(Qt5) 1+1=2 博客频道 CSDN.NET

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


    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

     

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

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

    参考

  • 相关阅读:
    全局索引 truncate有数据的分区,索引失效,没数据的分区,索引不失效
    数组的操作
    调存储过程shell
    Flex中的折线图
    SecurityError:Error #2048:安全沙箱冲突
    Flex中对表格中某列的值进行数字格式化并求百分比
    Flex中对表格中某列的值进行数字格式化
    ORA-00904:"T1"."AREA_ID" :标识符无效
    严重:IOException while loading persisted sessions:java.io.EOFException.
    开放的平台、向上的文化——揭秘万达电商(4)
  • 原文地址:https://www.cnblogs.com/lexus/p/2478160.html
Copyright © 2011-2022 走看看