QtScript

QtScript provides a JavaScript environment for Qt applications and libraries.

The QtScript module [doc.qt.nokia.com] provides a C++ API for embedding JavaScript into your application or library. The basic JavaScript environment (based on the ECMAScript standard [ecma-international.org]) can be extended through a rich API.

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 QML), 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 IRC channel on FreeNode: #qt-script (For a full list of IRC channels of interest to Qt developers, see OnlineCommunities.)

For contributing to QtScript, see the 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 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 API 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, Qt Quick [doc.qt.nokia.com] was introduced. The basis of Qt Quick is the QML language. QML effectively embeds JavaScript into the language. The QML/JS implementation is powered by QtScript. In other words, Qt Quick relies on QtScript to perform well and be standards-compliant.

What’s NOT in Scope

Providing Qt integration with languages other than JavaScript (such as Python and Lua).

History

QSA

QtScript was preceded by QSAQt Script for Applications [doc.qt.nokia.com]. QSA implements a subset of a draft of the (never-completed) ECMAScript 4 language. It also contained API for embedding script editing and “user script execution” into your application (QSA Workbench).

Qt 4.3

The QtScript module introduced in Qt 4.3 was inspired by QSA, but doesn’t share any API or implementation.

QtScript took the core idea of QSA (making Qt applications scriptable) and stripped away anything having to do with GUI. 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 QScriptEngineAgent [doc.qt.nokia.com] class, which provides an API 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 QScriptClass [doc.qt.nokia.com], an interface for implementing “catch-all” (interceptor-based) access to script objects; and 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 QtScriptTools [doc.qt.nokia.com] module, which provides a graphical debugger for QtScript.

Qt 4.6

No new QtScript API 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 (JIT) compiler, and this contributed to dramatically improved performance of long-running scripts (see 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 API was not originally designed with replacement of the JavaScript back-end in mind, and so parts of the API 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 API with the QtWebKit API.

Qt 4.7

Qt 4.7 introduced 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 QtScript autotests are located in the

  1. tests/auto
directory in the Qt repository (all subdirectories with prefix “qscript” — see script.pro).

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.
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

In addition to tests for the C++ API, there are two imported JavaScript test suites:

  1. qscriptjstestsuite
(from the Mozilla project), and
  1. qscriptv8testsuite
(from the V8 project), that have been integrated into Qt’s automated test system. These are useful for testing ECMA compliance and compatibility with other JS engines. A handful of the tests are failing on various Qt platforms. The failures are marked as expected, since they are due to the back-end, which is now maintained outside of Qt. However, not all failures have been reported upstream yet, which is something we should try to fix (http://bugreports.qt.nokia.com/browse/QTBUG-16606).

Benchmarks

The QtScript benchmarks are located in the

  1. tests/benchmarks/script
directory in the Qt repository.
In addition to benchmarks for the C++ API, the SunSpider and V8 benchmarks have been imported.
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 Qt Bug Tracker [bugreports.qt.nokia.com] to track QtScript bugs; QtScript has its own 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 API. An effort was started to upstream QtScript to the WebKit project (see this thread [pubbs.net]), using only the public JavaScriptCore C API, since that API 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 API is limited compared to QtScript’s API, so a lot of functionality will have to be added to the C API before the QtScript API can be completed on top.

This project is currently paused while V8 [code.google.com] is being investigated as an alternative.

QtScript and V8

See separate article [developer.qt.nokia.com].

There is only one article in "Developing_Qt -> Qt_Script":