|
|
| (4 intermediate revisions by 2 users not shown) |
| Line 1: |
Line 1: |
| =QtScript=
| | #REDIRECT [[:Category:Developing Qt::Qt Script]] |
| | |
| QtScript provides a JavaScript environment for Qt applications and libraries.
| |
| | |
| The [http://doc.qt.nokia.com/latest/qtscript.html QtScript module] ''[doc.qt.nokia.com]'' provides a C++ <span class="caps">API</span> for embedding JavaScript into your application or library. The basic JavaScript environment (based on the [http://www.ecma-international.org/publications/standards/Ecma-262.htm <span class="caps">ECMAS</span>cript standard] ''[ecma-international.org]'') can be extended through a rich <span class="caps">API</span>.
| |
| | |
| ==Mission Statement==
| |
| | |
| The long-term goal of QtScript development is for QtScript to be '''the''' JavaScript engine used in the Qt/Nokia software stack, providing great integration with other Qt/C++ components (notably <span class="caps">QML</span>), and delivering the performance needed by JavaScript-intensive Qt applications.
| |
| | |
| ==Getting Involved==
| |
| | |
| There is a mailing list for QtScript development. You can subscribe to it at http://lists.qt.nokia.com/mailman/listinfo/qt-script ''[lists.qt.nokia.com]''
| |
| | |
| We have an <span class="caps">IRC</span> channel on FreeNode: #qt-script (For a full list of <span class="caps">IRC</span> channels of interest to Qt developers, see [[OnlineCommunities]].)
| |
| | |
| For contributing to QtScript, see the [http://qt.gitorious.org/qt/pages/QtContributionGuidelines Qt Contribution Guidelines] ''[qt.gitorious.org]''.
| |
| | |
| ==Scope==
| |
| | |
| The scope of QtScript — or more precisely, the scope of JavaScript support in Qt — has grown since the QtScript module was introduced in Qt 4.3.
| |
| | |
| ===Making Applications Scriptable===
| |
| | |
| The original scope of QtScript was to make Qt applications scriptable, primarily by making it easy to export Qt/C++ objects (properties and methods) to JavaScript.
| |
| | |
| ===QtWebKit===
| |
| | |
| The [http://doc.qt.nokia.com/4.7/qtwebkit.html QtWebKit module] ''[doc.qt.nokia.com]'' was introduced in Qt 4.4. It includes a JavaScript runtime. Ideally, QtScript and QtWebKit would share the JavaScript implementation, and you would be able to use the QtScript <span class="caps">API</span> to access the browser JavaScript environment from C++. This work can be tracked at http://bugreports.qt.nokia.com/browse/QTWEBKIT-2 .
| |
| | |
| ===Qt Quick===
| |
| | |
| In Qt 4.7, [http://doc.qt.nokia.com/4.7/qtquick.html Qt Quick] ''[doc.qt.nokia.com]'' was introduced. The basis of Qt Quick is the <span class="caps">QML</span> language. <span class="caps">QML</span> effectively embeds JavaScript into the language. The <span class="caps">QML</span>/JS implementation is powered by QtScript. In other words, Qt Quick relies on QtScript to perform well and be standards-compliant.
| |
| | |
| ====What’s <span class="caps">NOT</span> in Scope====
| |
| | |
| Providing Qt integration with languages other than JavaScript (such as Python and Lua).
| |
| | |
| ==History==
| |
| | |
| ===<span class="caps">QSA</span>===
| |
| | |
| QtScript was preceded by <span class="caps">QSA</span> — [http://doc.qt.nokia.com/qsa-1.2.2/index.html Qt Script for Applications] ''[doc.qt.nokia.com]''. <span class="caps">QSA</span> implements a subset of a draft of the (never-completed) <span class="caps">ECMAS</span>cript 4 language. It also contained <span class="caps">API</span> for embedding script editing and “user script execution” into your application (<span class="caps">QSA</span> Workbench).
| |
| | |
| ===Qt 4.3===
| |
| | |
| The QtScript module introduced in Qt 4.3 was inspired by <span class="caps">QSA</span>, but doesn’t share any <span class="caps">API</span> or implementation.
| |
| | |
| QtScript took the core idea of <span class="caps">QSA</span> (making Qt applications scriptable) and stripped away anything having to do with <span class="caps">GUI</span>. The scope of QtScript should be limited to JavaScript execution and essential C++ integration; script editing, graphical debugging and the like should be left to other components and tools (such as Qt Creator).
| |
| | |
| The QtScript runtime was built on an in-house-developed, bytecode-based interpreter that performed well for its time.
| |
| | |
| ===Qt 4.4===
| |
| | |
| Qt 4.4 added the [http://doc.qt.nokia.com/4.7/qscriptengineagent.html QScriptEngineAgent] ''[doc.qt.nokia.com]'' class, which provides an <span class="caps">API</span> for hooking into low-level events in the script engine. This class could be used to implement debugging- and profiling-related tools for QtScript.
| |
| | |
| Qt 4.4 also introduced [http://doc.qt.nokia.com/4.7/qscriptclass.html QScriptClass] ''[doc.qt.nokia.com]'', an interface for implementing “catch-all” (interceptor-based) access to script objects; and [http://doc.qt.nokia.com/4.7/qscriptstring.html QScriptString] ''[doc.qt.nokia.com]'', a class that represents interned property names (for faster comparison and property access).
| |
| | |
| ===Qt 4.5===
| |
| | |
| Qt 4.5 introduced the [http://doc.qt.nokia.com/4.5/qtscripttools.html QtScriptTools] ''[doc.qt.nokia.com]'' module, which provides a graphical debugger for QtScript.
| |
| | |
| ===Qt 4.6===
| |
| | |
| No new QtScript <span class="caps">API</span> was introduced in Qt 4.6. However, under the hood a significant change was made: The in-house interpreter was replaced by JavaScriptCore, the JavaScript runtime used by WebKit. JavaScriptCore features a Just-In-Time (<span class="caps">JIT</span>) compiler, and this contributed to dramatically improved performance of long-running scripts (see [http://labs.qt.nokia.com/2009/11/23/qtscript-in-46/ this blog] ''[labs.qt.nokia.com]'').
| |
| | |
| The constraint for replacing the engine was to preserve QtScript’s source and binary compability, but also maintain behavorial compatibility. This presented a challenge; the QtScript <span class="caps">API</span> was not originally designed with replacement of the JavaScript back-end in mind, and so parts of the <span class="caps">API</span> exposed implementation details (tracked at http://bugreports.qt.nokia.com/browse/QTBUG-15571). This made it necessary to patch JavaScriptCore in select places (tracked at http://bugreports.qt.nokia.com/browse/QTBUG-11467).
| |
| | |
| The patches to JavaScriptCore makes it incompatible with the version that QtWebKit expects, which is obviously the big blocker for being able to mix the QtScript <span class="caps">API</span> with the QtWebKit <span class="caps">API</span>.
| |
| | |
| ===Qt 4.7===
| |
| | |
| Qt 4.7 introduced [http://doc.qt.nokia.com/4.7/qscriptprogram.html QScriptProgram] ''[doc.qt.nokia.com]'', a class for retaining the compiled form a script for faster repeated execution. QtScript’s copy of JavaScriptCore was updated to a more recent version, which provided a nice speed boost, and the delta between QtScript’s patched JavaScriptCore and the upstream version was made smaller.
| |
| | |
| ==Tests and Benchmarks==
| |
| | |
| The autotest results effectively act as a progress indicator and “level of completeness” when QtScript is ported to a new back-end, such as JavaScriptCore or V8.<br /> There ''will'' be differences in the back-ends that are difficult to mask (e.g. different wording in error messages), but we try to keep the tests as back-end-agnostic as possible, so that the same tests can be run against different versions of Qt/QtScript.
| |
| | |
| ===Imported Test Suites===
| |
| | |
| ===Benchmarks===
| |
| | |
| In addition to benchmarks for the C++ <span class="caps">API</span>, the SunSpider and V8 benchmarks have been imported.<br /> These benchmarks can be used to compare the performance of different versions of Qt/QtScript, in particular to ensure that there are no performance regressions between versions.
| |
| | |
| ==Bug Tracker==
| |
| | |
| We use the [http://bugreports.qt.nokia.com Qt Bug Tracker] ''[bugreports.qt.nokia.com]'' to track QtScript bugs; QtScript has its own [http://bugreports.qt.nokia.com/browse/QTBUG/component/19162 category] ''[bugreports.qt.nokia.com]''. If a bug is specific to the back-end, we report it in the corresponding upstream bug tracker (e.g. http://bugs.webkit.org for JavaScriptCore bugs).
| |
| | |
| ==QtScript and JavaScriptCore==
| |
| | |
| The QtScript implementation introduced in Qt 4.6 uses internal JavaScriptCore <span class="caps">API</span>. An effort was started to upstream QtScript to the WebKit project (see [http://www.pubbs.net/200908/webkit/55633-webkit-dev-qtish-api-for-javascriptcore.html this thread] ''[pubbs.net]''), using only the public JavaScriptCore C <span class="caps">API</span>, since that <span class="caps">API</span> is stable and remains source/binary compatible. Information about this project can be found at https://trac.webkit.org/wiki/QtScript ''[trac.webkit.org]''.
| |
| | |
| The main challenge with this project is that the C <span class="caps">API</span> is limited compared to QtScript’s <span class="caps">API</span>, so a lot of functionality will have to be added to the C <span class="caps">API</span> before the QtScript <span class="caps">API</span> can be completed on top.
| |
| | |
| This project is currently paused while [http://code.google.com/p/v8/ V8] ''[code.google.com]'' is being investigated as an alternative.
| |
| | |
| ==QtScript and V8==
| |
| | |
| See [http://developer.qt.nokia.com/wiki/V8_Port separate article] ''[developer.qt.nokia.com]''.
| |
| | |
| ===There is only one article in "developing_qt -> qt_script":===
| |
| | |
| ===V===
| |
| * [[V8 Port|V8_Port]]
| |