Category:Developing qt::qt script: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
[toc align_right="yes" depth="2"]
[toc align_right="yes" depth="2"]


= QtScript =
= QtScript =
Line 5: Line 5:
QtScript provides a JavaScript environment for Qt applications and libraries.
QtScript provides a JavaScript environment for Qt applications and libraries.


The "QtScript module":http://doc.qt.nokia.com/latest/qtscript.html provides a C++ API for embedding JavaScript into your application or library. The basic JavaScript environment (based on the "ECMAScript standard":http://www.ecma-international.org/publications/standards/Ecma-262.htm) can be extended through a rich API.
The "QtScript module":http://doc.qt.nokia.com/latest/qtscript.html provides a C++ API for embedding JavaScript into your application or library. The basic JavaScript environment (based on the "ECMAScript standard":http://www.ecma-international.org/publications/standards/Ecma-262.htm) can be extended through a rich API.


== Mission Statement ==
== Mission Statement ==
Line 13: Line 13:
== Getting Involved ==
== 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":http://lists.qt.nokia.com/mailman/listinfo/qt-script
There is a mailing list for QtScript development. You can subscribe to it at "http://lists.qt.nokia.com/mailman/listinfo/qt-script":http://lists.qt.nokia.com/mailman/listinfo/qt-script


We have an IRC channel on FreeNode: #qt-script (For a full list of IRC channels of interest to Qt developers, see [[OnlineCommunities]].)
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":http://qt.gitorious.org/qt/pages/QtContributionGuidelines.
For contributing to QtScript, see the "Qt Contribution Guidelines":http://qt.gitorious.org/qt/pages/QtContributionGuidelines.


== Scope ==
== Scope ==
Line 29: Line 29:
=== QtWebKit ===
=== QtWebKit ===


The "QtWebKit module":http://doc.qt.nokia.com/4.7/qtwebkit.html 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 .
The "QtWebKit module":http://doc.qt.nokia.com/4.7/qtwebkit.html 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 .
<br />h3. Qt Quick
<br />h3. Qt Quick
<br />In Qt 4.7, &quot;Qt Quick&amp;quot;:http://doc.qt.nokia.com/4.7/qtquick.html 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.
<br />In Qt 4.7, "Qt Quick":http://doc.qt.nokia.com/4.7/qtquick.html 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.
<br />h4. What's NOT in Scope
<br />h4. What's NOT in Scope
<br />Providing Qt integration with languages other than JavaScript (such as Python and Lua).
<br />Providing Qt integration with languages other than JavaScript (such as Python and Lua).
<br />h2. History
<br />h2. History
<br />h3. QSA
<br />h3. QSA
<br />QtScript was preceded by QSA — &quot;Qt Script for Applications&amp;quot;:http://doc.qt.nokia.com/qsa-1.2.2/index.html. QSA implements a subset of a draft of the (never-completed) ECMAScript 4 language. It also contained API for embedding script editing and &quot;user script execution&amp;quot; into your application (QSA Workbench).
<br />QtScript was preceded by QSA — "Qt Script for Applications":http://doc.qt.nokia.com/qsa-1.2.2/index.html. 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).
<br />h3. Qt 4.3
<br />h3. Qt 4.3
<br />The QtScript module introduced in Qt 4.3 was inspired by QSA, but doesn't share any API or implementation.
<br />The QtScript module introduced in Qt 4.3 was inspired by QSA, but doesn't share any API or implementation.
Line 45: Line 45:
=== Qt 4.4 ===
=== Qt 4.4 ===


Qt 4.4 added the &quot;QScriptEngineAgent&amp;quot;:http://doc.qt.nokia.com/4.7/qscriptengineagent.html 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 added the "QScriptEngineAgent":http://doc.qt.nokia.com/4.7/qscriptengineagent.html 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 &quot;QScriptClass&amp;quot;:http://doc.qt.nokia.com/4.7/qscriptclass.html, an interface for implementing &quot;catch-all&amp;quot; (interceptor-based) access to script objects; and &quot;QScriptString&amp;quot;:http://doc.qt.nokia.com/4.7/qscriptstring.html, a class that represents interned property names (for faster comparison and property access).
Qt 4.4 also introduced "QScriptClass":http://doc.qt.nokia.com/4.7/qscriptclass.html, an interface for implementing "catch-all" (interceptor-based) access to script objects; and "QScriptString":http://doc.qt.nokia.com/4.7/qscriptstring.html, a class that represents interned property names (for faster comparison and property access).


=== Qt 4.5 ===
=== Qt 4.5 ===


Qt 4.5 introduced the &quot;QtScriptTools&amp;quot;:http://doc.qt.nokia.com/4.5/qtscripttools.html module, which provides a graphical debugger for QtScript.
Qt 4.5 introduced the "QtScriptTools":http://doc.qt.nokia.com/4.5/qtscripttools.html module, which provides a graphical debugger for QtScript.


=== Qt 4.6 ===
=== 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 &quot;this blog&amp;quot;:http://labs.qt.nokia.com/2009/11/23/qtscript-in-46/).
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":http://labs.qt.nokia.com/2009/11/23/qtscript-in-46/).


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 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).
Line 63: Line 63:
=== Qt 4.7 ===
=== Qt 4.7 ===


Qt 4.7 introduced &quot;QScriptProgram&amp;quot;:http://doc.qt.nokia.com/4.7/qscriptprogram.html, 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.
Qt 4.7 introduced "QScriptProgram":http://doc.qt.nokia.com/4.7/qscriptprogram.html, 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 ==
== Tests and Benchmarks ==


The QtScript autotests are located in the <code>tests/auto<code> directory in the Qt repository (all subdirectories with prefix &quot;qscript&amp;quot; — see script.pro).
The QtScript autotests are located in the <code>tests/auto<code> directory in the Qt repository (all subdirectories with prefix "qscript" — see script.pro).


The autotest results effectively act as a progress indicator and &quot;level of completeness&amp;quot; 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.
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 ===
=== Imported Test Suites ===
Line 81: Line 81:
== Bug Tracker ==
== Bug Tracker ==


We use the &quot;Qt Bug Tracker&amp;quot;:http://bugreports.qt.nokia.com to track QtScript bugs; QtScript has its own &quot;category&amp;quot;:http://bugreports.qt.nokia.com/browse/QTBUG/component/19162. 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).
We use the "Qt Bug Tracker":http://bugreports.qt.nokia.com to track QtScript bugs; QtScript has its own "category":http://bugreports.qt.nokia.com/browse/QTBUG/component/19162. 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 ==
== 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 &quot;this thread&amp;quot;:http://www.pubbs.net/200908/webkit/55633-webkit-dev-qtish-api-for-javascriptcore.html), 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 &quot;https://trac.webkit.org/wiki/QtScript&amp;quot;:https://trac.webkit.org/wiki/QtScript.
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":http://www.pubbs.net/200908/webkit/55633-webkit-dev-qtish-api-for-javascriptcore.html), 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":https://trac.webkit.org/wiki/QtScript.


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.
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 &quot;V8&amp;quot;:http://code.google.com/p/v8/ is being investigated as an alternative.
This project is currently paused while "V8":http://code.google.com/p/v8/ is being investigated as an alternative.


== QtScript and V8 ==
== QtScript and V8 ==

Revision as of 06:42, 25 February 2015

[toc align_right="yes" depth="2"]

QtScript

QtScript provides a JavaScript environment for Qt applications and libraries.

The "QtScript module":http://doc.qt.nokia.com/latest/qtscript.html provides a C++ API for embedding JavaScript into your application or library. The basic JavaScript environment (based on the "ECMAScript standard":http://www.ecma-international.org/publications/standards/Ecma-262.htm) 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":http://lists.qt.nokia.com/mailman/listinfo/qt-script

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":http://qt.gitorious.org/qt/pages/QtContributionGuidelines.

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":http://doc.qt.nokia.com/4.7/qtwebkit.html 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 .
h3. Qt Quick
In Qt 4.7, "Qt Quick":http://doc.qt.nokia.com/4.7/qtquick.html 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.
h4. What's NOT in Scope
Providing Qt integration with languages other than JavaScript (such as Python and Lua).
h2. History
h3. QSA
QtScript was preceded by QSA — "Qt Script for Applications":http://doc.qt.nokia.com/qsa-1.2.2/index.html. 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).
h3. 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":http://doc.qt.nokia.com/4.7/qscriptengineagent.html 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":http://doc.qt.nokia.com/4.7/qscriptclass.html, an interface for implementing "catch-all" (interceptor-based) access to script objects; and "QScriptString":http://doc.qt.nokia.com/4.7/qscriptstring.html, a class that represents interned property names (for faster comparison and property access).

Qt 4.5

Qt 4.5 introduced the "QtScriptTools":http://doc.qt.nokia.com/4.5/qtscripttools.html 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":http://labs.qt.nokia.com/2009/11/23/qtscript-in-46/).

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":http://doc.qt.nokia.com/4.7/qscriptprogram.html, 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

tests/auto<code> 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.<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 ===

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

qscriptjstestsuite (from the Mozilla project), and 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 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":http://bugreports.qt.nokia.com to track QtScript bugs; QtScript has its own "category":http://bugreports.qt.nokia.com/browse/QTBUG/component/19162. 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":http://www.pubbs.net/200908/webkit/55633-webkit-dev-qtish-api-for-javascriptcore.html), 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":https://trac.webkit.org/wiki/QtScript.

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":http://code.google.com/p/v8/ is being investigated as an alternative.

QtScript and V8

This category currently contains no pages or media.