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

From Qt Wiki
Jump to navigation Jump to search
No edit summary
 
 
(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 -&gt; qt_script":===
 
===V===
* [[V8 Port|V8_Port]]

Latest revision as of 15:56, 18 August 2015

This category currently contains no pages or media.