<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <id>https://nuitka.net/</id>
  <title>Nuitka Blog - Posted in 2014</title>
  <updated>2026-10-05T17:30:39.151584+00:00</updated>
  <link href="https://nuitka.net/"/>
  <link href="https://nuitka.net/blog/2014/atom.xml" rel="self"/>
  <generator uri="https://ablog.readthedocs.io/" version="0.11.6">ABlog</generator>
  <entry>
    <id>https://nuitka.net/posts/nuitka-release-056.html</id>
    <title>Nuitka Release 0.5.6</title>
    <updated>2014-12-19T07:54:00+01:00</updated>
    <author>
      <name>Kay Hayen</name>
    </author>
    <content type="html">&lt;section id="nuitka-release-0-5-6"&gt;

&lt;p&gt;This is to inform you about the new stable release of &lt;a class="reference external" href="https://nuitka.net"&gt;Nuitka&lt;/a&gt;. It is the extremely compatible Python compiler,
&lt;a class="reference external" href="/doc/download.html"&gt;“download now”&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release brings bug fixes, important new optimization, newly
supported platforms, and important compatibility improvements. Progress
on all fronts.&lt;/p&gt;
&lt;section id="bug-fixes"&gt;
&lt;h2&gt;Bug Fixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Closure taking of global variables in member functions of classes
that had a class variable of the same name was binding to the class
variable as opposed to the module variable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Overwriting compiled function’s &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;__doc__&lt;/span&gt;&lt;/code&gt; attribute more than once
could corrupt the old value, leading to crashes. Fixed in 0.5.5.2
already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compatibility Python2: The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;exec&lt;/span&gt;&lt;/code&gt; statement &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;execfile&lt;/span&gt;&lt;/code&gt; were
changing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;locals()&lt;/span&gt;&lt;/code&gt; was given as an argument.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;function&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="n"&gt;exec&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;locals&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Cannot change local &amp;quot;a&amp;quot;.&lt;/span&gt;
    &lt;span class="n"&gt;exec&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;  &lt;span class="c1"&gt;# Can change local &amp;quot;a&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;exec&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Previously Nuitka treated all 3 variants the same.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compatibility: Empty branches with a condition were reduced to only
the condition, but they need in fact to also check the truth value:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;span class="c1"&gt;# must be treated as&lt;/span&gt;
&lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# and not (bug)&lt;/span&gt;
&lt;span class="n"&gt;condition&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Detection of Windows virtualenv was not working properly. Fixed in
0.5.5.2 already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Large enough constants structures are now unstreamed via &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;marshal&lt;/span&gt;&lt;/code&gt;
module, avoiding large codes being generated with no point. Fixed in
0.5.5.2 already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Windows: Pressing CTRL-C gave two stack traces, one from the
re-execution of Nuitka which was rather pointless. Fixed in 0.5.5.1
already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Windows: Searching for virtualenv environments didn’t terminate in
all cases. Fixed in 0.5.5.1 already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;During installation from PyPI with Python3 versions, there were
errors given for the Python2 only scons files. Fixed in 0.5.5.3
already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix, the arguments of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;yield&lt;/span&gt; &lt;span class="pre"&gt;from&lt;/span&gt;&lt;/code&gt; expressions could be leaked.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix, closure taking of a class variable could have in a sub class
where the module variable was meant.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

    &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;D&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="c1"&gt;# was C.var, now correctly addressed top level var&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix, setting &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;CXX&lt;/span&gt;&lt;/code&gt; environment variable because the installed gcc
has too low version, wasn’t affecting the version check at all.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix, on Debian/Ubuntu with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;hardening-wrapper&lt;/span&gt;&lt;/code&gt; installed the
version check was always failing, because these report a shortened
version number to Scons.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="optimization"&gt;
&lt;h2&gt;Optimization&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Local variables that must be assigned also have no side effects,
making use of SSA. This allows for a host of optimization to be
applied to them as well, often yielding simpler access/assign code,
and discovering in more cases that frames are not necessary.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Micro optimization to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;dict&lt;/span&gt;&lt;/code&gt; built-in for simpler code generation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="organizational"&gt;
&lt;h2&gt;Organizational&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Added support for ARM “hard float” architecture.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added package for Ubuntu 14.10 for download.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added package for openSUSE 13.2 for download.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Donations were used to buy a Cubox-i4 Pro. It got Debian Jessie
installed on it, and will be used to run an even larger amount of
tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Made it more clear in the user documentation that the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;.exe&lt;/span&gt;&lt;/code&gt; suffix
is used for all platforms, and why.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Generally updated information in User Manual and Developer Manual
about the optimization status.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using Nikola 7.1 with external filters instead of our own, outdated
branch for the web site.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="cleanups"&gt;
&lt;h2&gt;Cleanups&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;PyLint clean for the first time ever. We now have a Buildbot driven
test that this stays that way.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Massive indentation cleanup of keyword argument calls. We have a rule
to align the keywords, but as this was done manually, it could easily
get out of touch. Now with a auto-format tool based on RedBaron, it’s
correct. Also, spacing around arguments is now automatically
corrected. More to come.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;exec&lt;/span&gt;&lt;/code&gt; statements, the coping back to local variables is now an
explicit node in the tree, leader to cleaner code generation, as it
now uses normal variable assignment code generation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;MaybeLocalVariables&lt;/span&gt;&lt;/code&gt; became explicit about which variable they
might be, and contribute to its SSA trace as well, which was
incomplete before.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Removed some cases of code duplication that were marked as TODO
items. This often resulted in cleanups.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do not use &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;replaceWith&lt;/span&gt;&lt;/code&gt; on child nodes, that potentially were
re-used during their computation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="summary"&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;The release is mainly the result of consolidation work. While the
previous release contained many important enhancements, this is another
important step towards full SSA, closing one loop whole (class variables
and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;exec&lt;/span&gt;&lt;/code&gt; functions), as well as applying it to local variables,
largely extending its use.&lt;/p&gt;
&lt;p&gt;The amount of cleanups is tremendous, in huge part due to infrastructure
problems that prevented release repeatedly. This reduces the
technological debt very much.&lt;/p&gt;
&lt;p&gt;More importantly, it would appear that now eliminating local and
temporary variables that are not necessary is only a small step away.
But as usual, while this may be easy to implement now, it will uncover
more bugs in existing code, that we need to address before we continue.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</content>
    <link href="https://nuitka.net/posts/nuitka-release-056.html"/>
    <summary>This is to inform you about the new stable release of Nuitka. It is the extremely compatible Python compiler,
“download now”.</summary>
    <category term="Nuitka" label="Nuitka"/>
    <category term="Python" label="Python"/>
    <category term="compiler" label="compiler"/>
    <published>2014-12-19T07:54:00+01:00</published>
  </entry>
  <entry>
    <id>https://nuitka.net/posts/nuitka-release-055.html</id>
    <title>Nuitka Release 0.5.5</title>
    <updated>2014-10-05T23:15:00+02:00</updated>
    <author>
      <name>Kay Hayen</name>
    </author>
    <content type="html">&lt;section id="nuitka-release-0-5-5"&gt;

&lt;p&gt;This is to inform you about the new stable release of &lt;a class="reference external" href="https://nuitka.net"&gt;Nuitka&lt;/a&gt;. It is the extremely compatible Python compiler,
&lt;a class="reference external" href="/doc/download.html"&gt;“download now”&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release is finally making full use of SSA analysis knowledge for
code generation, leading to many enhancements over previous releases.&lt;/p&gt;
&lt;p&gt;It also adds support for Python3.4, which has been longer in the making,
due to many rather subtle issues. In fact, even more work will be needed
to fully solve remaining minor issues, but these should affect no real
code.&lt;/p&gt;
&lt;p&gt;And then there is much improved support for using standalone mode
together with virtualenv. This combination was not previously supported,
but should work now.&lt;/p&gt;
&lt;section id="new-features"&gt;
&lt;h2&gt;New Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Added support for Python3.4&lt;/p&gt;
&lt;p&gt;This means support for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;clear&lt;/span&gt;&lt;/code&gt; method of frames to close
generators, dynamic &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;__qualname__&lt;/span&gt;&lt;/code&gt;, affected by &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;global&lt;/span&gt;&lt;/code&gt;
statements, tuples as &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;yield&lt;/span&gt; &lt;span class="pre"&gt;from&lt;/span&gt;&lt;/code&gt; arguments, improved error
messages, additional checks, and many more detail changes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="optimization"&gt;
&lt;h2&gt;Optimization&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Using SSA knowledge, local variable assignments now no longer need to
check if they need to release previous values, they know definitely
for the most cases.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="c1"&gt;# This used to check if old value of &amp;quot;a&amp;quot; needs a release&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using SSA knowledge, local variable references now no longer need to
check for raising exceptions, let alone produce exceptions for cases,
where that cannot be.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;  &lt;span class="c1"&gt;# This used to check if &amp;quot;a&amp;quot; is assigned&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using SSA knowledge, local variable references now are known if they
can raise the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;UnboundLocalError&lt;/span&gt;&lt;/code&gt; exception or not. This allows to
eliminate frame usages for many cases. Including the above example.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using less memory for keeping variable information.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Also using less memory for constant nodes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="bug-fixes"&gt;
&lt;h2&gt;Bug Fixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The standalone freezing code was reading Python source as UTF-8 and
not using the code that handles the Python encoding properly. On some
platforms there are files in standard library that are not encoded
like that.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The fiber implementation for Linux amd64 was not working with glibc
from RHEL 5. Fixed to use now multiple &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;int&lt;/span&gt;&lt;/code&gt; to pass pointers as
necessary. Also use &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;uintptr_t&lt;/span&gt;&lt;/code&gt; instead of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;intprt_t&lt;/span&gt;&lt;/code&gt; to
transport pointers, which may be more optimal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Line numbers for exceptions were corrupted by &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;with&lt;/span&gt;&lt;/code&gt; statements due
to setting line numbers even for statements marked as internal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Partial support for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;win32com&lt;/span&gt;&lt;/code&gt; by adding support for its hidden
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;__path__&lt;/span&gt;&lt;/code&gt; change.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python3: Finally figured out proper chaining of exceptions, given
proper context messages for exception raised during the handling of
exceptions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Corrected C++ memory leak for each closure variable taken, each time
a function object was created.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python3: Raising exceptions with tracebacks already attached, wasn’t
using always them, but producing new ones instead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Some constants could cause errors, as they cannot be handled with the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;marshal&lt;/span&gt;&lt;/code&gt; module as expected, e.g. &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;(int,)&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Standalone: Make sure to propagate &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sys.path&lt;/span&gt;&lt;/code&gt; to the Python
instance used to check for standard library import dependencies. This
is important for virtualenv environments, which need &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;site.py&lt;/span&gt;&lt;/code&gt; to
set the path, which is not executed in that mode.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Windows: Added support for different path layout there, so using
virtualenv should work there too.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The code object flag “optimized” (fast locals as opposed to locals
dictionary) for functions was set wrongly to value for the parent,
but for frames inside it, one with the correct value. This lead to
more code objects than necessary and false &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;co_flags&lt;/span&gt;&lt;/code&gt; values
attached to the function.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Options passed to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nuitka-python&lt;/span&gt;&lt;/code&gt; could get lost.&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;nuitka-python&lt;span class="w"&gt; &lt;/span&gt;program.py&lt;span class="w"&gt; &lt;/span&gt;argument1&lt;span class="w"&gt; &lt;/span&gt;argument2&lt;span class="w"&gt; &lt;/span&gt;...
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The above is supposed to compile program.py, execute it immediately
and pass the arguments to it. But when Nuitka decides to restart
itself, it would forget these options. It does so to e.g. disable
hash randomization as it would affect code generation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Raising tuples exception as exceptions was not compatible (Python2)
or reference leaking (Python3).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="tests"&gt;
&lt;h2&gt;Tests&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Running &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;2to3&lt;/span&gt;&lt;/code&gt; is now avoided for tests that are already running on
both Python2 and Python3.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Made XML based optimization tests work with Python3 too. Previously
these were only working on Python2.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added support for ignoring messages that come from linking against
self compiled Pythons.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added test case for threaded generators that tortures the fiber layer
a bit and exposed issues on RHEL 5.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Made reference count test of compiled functions generic. No more code
duplication, and automatic detection of shared stuff. Also a more
clear interface for disabling test cases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added Python2 specific reference counting tests, so the other cases
can be executed with Python3 directly, making debugging them less
tedious.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="cleanups"&gt;
&lt;h2&gt;Cleanups&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Really important removal of “variable references”. They didn’t solve
any problem anymore, but their complexity was not helpful either.
This allowed to make SSA usable finally, and removed a lot of code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Removed special code generation for parameter variables, and their
dedicated classes, no more needed, as every variable access code is
now optimized like this.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stop using C++ class methods at all. Now only the destructor of local
variables is actually supposed to do anything, and their are no
methods anymore. The unused &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;var_name&lt;/span&gt;&lt;/code&gt; got removed,
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;setVariableValue&lt;/span&gt;&lt;/code&gt; is now done manually.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Moved assertions for the fiber layer to a common place in the header,
so they are executed on all platforms in debug mode.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As usual, also a bunch of cleanups for PyLint were applied.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;locals&lt;/span&gt;&lt;/code&gt; built-in code now uses code generation for accessing
local variable values instead having its own stuff.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="organizational"&gt;
&lt;h2&gt;Organizational&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The Python version 3.4 is now officially supported. There are a few
problems open, that will be addressed in future releases, none of
which will affect normal people though.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Major cleanup of Nuitka options.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Windows specific stuff is now in a dedicated option group. This
includes options for icon, disabling console, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There is now a dedicated group for controlling backend compiler
choices and options.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Also pickup &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;g++44&lt;/span&gt;&lt;/code&gt; automatically, which makes using Nuitka on
CentOS5 more automatic.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="summary"&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;This release represents a very important step ahead. Using SSA for real
stuff will allow us to build the trust necessary to take the next steps.
Using the SSA information, we could start implementing more
optimizations.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</content>
    <link href="https://nuitka.net/posts/nuitka-release-055.html"/>
    <summary>This is to inform you about the new stable release of Nuitka. It is the extremely compatible Python compiler,
“download now”.</summary>
    <category term="Nuitka" label="Nuitka"/>
    <category term="Python" label="Python"/>
    <category term="compiler" label="compiler"/>
    <published>2014-10-05T23:15:00+02:00</published>
  </entry>
  <entry>
    <id>https://nuitka.net/posts/nuitka-shaping-up.html</id>
    <title>Nuitka shaping up</title>
    <updated>2014-10-02T07:08:54+02:00</updated>
    <author>
      <name>Kay Hayen</name>
    </author>
    <content type="html">&lt;section id="nuitka-shaping-up"&gt;

&lt;p&gt;Not much has happened publicly to Nuitka, so it’s time to make a kind of
status post, about the exciting news there is.&lt;/p&gt;
&lt;nav class="contents" id="contents"&gt;
&lt;p class="topic-title"&gt;Contents&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#nuitka-shaping-up" id="id1"&gt;Nuitka shaping up&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#ssa-single-state-assignment-form" id="id2"&gt;SSA (Single State Assignment Form)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#improved-code-generation" id="id3"&gt;Improved Code Generation&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#scalability" id="id4"&gt;Scalability&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#compatibility" id="id5"&gt;Compatibility&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#python2-exec-statements" id="id6"&gt;Python2 exec statements&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#python3-classes" id="id7"&gt;Python3 classes&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#python3-4" id="id8"&gt;Python3.4&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#performance" id="id9"&gt;Performance&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#graphs-and-benchmarks" id="id10"&gt;Graphs and Benchmarks&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#incremental-assignments" id="id11"&gt;Incremental Assignments&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#standalone" id="id12"&gt;Standalone&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#other-stuff" id="id13"&gt;Other Stuff&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#funding" id="id14"&gt;Funding&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#collaborators" id="id15"&gt;Collaborators&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#future" id="id16"&gt;Future&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;section id="ssa-single-state-assignment-form"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id2" role="doc-backlink"&gt;SSA (Single State Assignment Form)&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For a long, long time already, each release of Nuitka has worked towards
enabling &lt;a class="reference external" href="http://en.wikipedia.org/wiki/Static_single_assignment_form"&gt;“SSA”&lt;/a&gt; usage in
Nuitka. There is a component called “constraint collection”, which is
tasked with driving the optimization, and collecting variable traces.&lt;/p&gt;
&lt;p&gt;Based on these traces, optimizations could be made. Having SSA or not,
is (to me) the difference between Nuitka as a compiler, and Nuitka as an
optimizing compiler.&lt;/p&gt;
&lt;p&gt;The news is, SSA is shaping up, and will be used in the next release.
Not yet to drive variable based optimization (reserved for a release
after it), but to aid the code generation to avoid useless checks.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="improved-code-generation"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id3" role="doc-backlink"&gt;Improved Code Generation&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Previously, under the title “C-ish”, Nuitka moved away from C++ based
code generation to less C++ based code generated, and more C-ish code.
This trend continues, and has lead to removing even more code cleanups.&lt;/p&gt;
&lt;p&gt;The more important change is from the SSA derived knowledge. Now Nuitka
knows that a variable must be assigned, cannot be assigned, may be
assigned, based on its SSA traces.&lt;/p&gt;
&lt;p&gt;Lets check out an example:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Nevermind, that &lt;em&gt;obviously&lt;/em&gt; the variable &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;a&lt;/span&gt;&lt;/code&gt; can be removed, and this
could be transformed to statically return &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;1&lt;/span&gt;&lt;/code&gt;. That is the next step
(and easy if SSA is working properly), now we are looking at what
changed now.&lt;/p&gt;
&lt;p&gt;This is code as generated now, with current 0.5.5pre5:&lt;/p&gt;
&lt;div class="highlight-c++ notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;tmp_assign_source_1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;const_int_pos_1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;var_a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;var_a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;INCREASE_REFCOUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tmp_assign_source_1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;tmp_return_value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;var_a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;Py_INCREF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tmp_return_value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;goto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;function_return_exit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;There are some things, wrong with it still. For one, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;var_a&lt;/span&gt;&lt;/code&gt; is still
a C++ object, which we directly access. But the good thing is, we can
assert that it starts out uninitialized, before we overwrite it. The
stable release as of now, 0.5.4, generates code like this:&lt;/p&gt;
&lt;div class="highlight-c++ notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;tmp_assign_source_1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;const_int_pos_1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var_a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;var_a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;INCREASE_REFCOUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tmp_assign_source_1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;PyObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;var_a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;var_a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;INCREASE_REFCOUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tmp_assign_source_1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Py_DECREF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PyFrameObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;cache_frame_function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;MAKE_OR_REUSE_FRAME&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cache_frame_function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;codeobj_4e03e5698a52dd694c5c263550d71551&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;module___main__&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;PyFrameObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;frame_function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cache_frame_function&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Push the new frame as the currently active one.&lt;/span&gt;
&lt;span class="n"&gt;pushFrameStack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;frame_function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Mark the frame object as in use, ref count 1 will be up for reuse.&lt;/span&gt;
&lt;span class="n"&gt;Py_INCREF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;frame_function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Py_REFCNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;frame_function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Frame stack&lt;/span&gt;

&lt;span class="c1"&gt;// Framed code:&lt;/span&gt;
&lt;span class="n"&gt;tmp_return_value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;var_a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tmp_return_value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;exception_type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;INCREASE_REFCOUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PyExc_UnboundLocalError&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;exception_value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;UNSTREAM_STRING&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;constant_bin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;47&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;exception_tb&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;frame_function&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;f_lineno&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;goto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;frame_exception_exit_1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;Py_INCREF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tmp_return_value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;goto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;frame_return_exit_1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;As you can see, the assignment to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;var_a.object&lt;/span&gt;&lt;/code&gt; was checking if it
were &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;NULL&lt;/span&gt;&lt;/code&gt;, and if were not (which we now statically know), would
release the old value. Next up, before returning, the value of
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;var_a.object&lt;/span&gt;&lt;/code&gt; needed to be checked, if it were &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;NULL&lt;/span&gt;&lt;/code&gt;, in which
case, we would need to create a Python exception, and in order to do so,
we need to create a frame object, that even if cached, consumes time,
and code size.&lt;/p&gt;
&lt;p&gt;So, that is the major change to code generation. The SSA information is
now used in it, and doing so, has found a bunch of issues, in how it is
built, in e.g. nested branches, that kind of stuff.&lt;/p&gt;
&lt;p&gt;The removal of local variables as C++ classes, and them managed as
temporary variables, is going to happen in a future release, reducing
code complexity further. Were &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;a&lt;/span&gt;&lt;/code&gt; a temporary variable, already, the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Py_INCREF&lt;/span&gt;&lt;/code&gt; which implies a later &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Py_DECREF&lt;/span&gt;&lt;/code&gt; on the constant &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;1&lt;/span&gt;&lt;/code&gt;
could be totally avoided.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="scalability"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id4" role="doc-backlink"&gt;Scalability&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The scalability of Nuitka hinges much of generated code size. With it
being less stupid, the generated code is now not only faster, but
definitely smaller, and with more optimization, it will only become more
practical.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="compatibility"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id5" role="doc-backlink"&gt;Compatibility&lt;/a&gt;&lt;/h2&gt;
&lt;section id="python2-exec-statements"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id6" role="doc-backlink"&gt;Python2 exec statements&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A recent change in CPython 2.7.8+ which is supposed to become 2.7.9 one
day, highlighted an issue with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;exec&lt;/span&gt;&lt;/code&gt; statements in Nuitka. These were
considered to be fully compatible, but apparently are not totally.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;exec&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;
    &lt;span class="n"&gt;exec&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The above two are supposed to be identical. So far this was rectified at
run time of CPython, but apparently the parser is now tasked with it, so
Nuitka now sees &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;exec&lt;/span&gt; &lt;span class="pre"&gt;a&lt;/span&gt; &lt;span class="pre"&gt;in&lt;/span&gt; &lt;span class="pre"&gt;b,&lt;/span&gt; &lt;span class="pre"&gt;c&lt;/span&gt;&lt;/code&gt; for both lines. Which is good.&lt;/p&gt;
&lt;p&gt;However, as it stands, Nuitka handles &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;exec&lt;/span&gt;&lt;/code&gt; in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;locals()&lt;/span&gt;&lt;/code&gt; the same
as &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;exec&lt;/span&gt;&lt;/code&gt; in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;None&lt;/span&gt;&lt;/code&gt; for plain functions (OK to classes and modules),
which is totally a bug.&lt;/p&gt;
&lt;p&gt;I have been working on an enhanced re-formulation (it needs to be
tracked if the value was &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;None&lt;/span&gt;&lt;/code&gt;, and then the sync back to locals from
the provided dictionary ought to be done. But the change breaks
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;execfile&lt;/span&gt;&lt;/code&gt; in classes, which was implemented piggy-backing on
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;exec&lt;/span&gt;&lt;/code&gt;, and now requires locals to be a dictionary, and immediately
written to.&lt;/p&gt;
&lt;p&gt;Anyway, consider &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;exec&lt;/span&gt;&lt;/code&gt; as well working already. The non-working cases
are really corner cases, obviously nobody came across so far.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="python3-classes"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id7" role="doc-backlink"&gt;Python3 classes&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Incidentally, that &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;execfile&lt;/span&gt;&lt;/code&gt; issue will be solved as soon as a bug is
fixed, that was exposed by new abilities of Python3 metaclasses. They
were first observed in Python3.4 enum classes.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;MyEnum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enum&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;red&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;blue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="n"&gt;red&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;  &lt;span class="c1"&gt;# error&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Currently, Nuitka is delaying the building of the dictionary (absent
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;execfile&lt;/span&gt;&lt;/code&gt; built-in), and that is not allowed, in fact, immediate
writes to the mapping giving by &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;__prepare__&lt;/span&gt;&lt;/code&gt; of the metaclass will be
required, in which case, the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;enum&lt;/span&gt;&lt;/code&gt; class can raise an error for the
second assignment to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;red&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So that area now hinges on code generation to learn different local
variable codes for classes, centered around the notion of using the
locals dictionary immediately.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="python3-4"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id8" role="doc-backlink"&gt;Python3.4&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The next release is no longer warning you if you use Python3.4, as many
of the remaining problems have been sorted out. Many small things were
found, and in some cases these highlighted general Python3 problems.&lt;/p&gt;
&lt;p&gt;Nuitka for Python3 is not yet all that much in the focus in terms of
performance, but correctness will have become much better, with most
prominently, exception context being now correct most often.&lt;/p&gt;
&lt;p&gt;The main focus of Nuitka is Python2, but to Nuitka the incompatibility
of Python3 is largely not all that much an issue. The re-formulations to
lower level operations for just about everything means that for the
largest part there is not much trouble in supporting a mostly only
slightly different version of Python.&lt;/p&gt;
&lt;p&gt;The gain is mostly in that new tests are added in new releases, and
these sometimes find things that affect Nuitka in all versions, or at
least some others. And this could be a mere reference leak.&lt;/p&gt;
&lt;p&gt;Consider this:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ne"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So, that is working with Python2, but comes from a Python3 test. Python2
is supposed to unwrap the tuple and take the first argument and raise
that. It didn’t do that so far. Granted, obscure feature, but still an
incompatibility. For Python3, a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;TypeError&lt;/span&gt;&lt;/code&gt; should be raised
complaining that &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;tuple&lt;/span&gt;&lt;/code&gt; is not derived from &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;BaseException&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Turned out, that also, in that case, a reference leak occurs, in that
the wrong exception was not released, and therefore memory leaked.
Should that happen a lot during a programs live, it will potentially
become an issue, as it keeps frames on the traceback also alive.&lt;/p&gt;
&lt;p&gt;So this lead to a compatibility fix and a reference leak fix. And it was
found by the Python3.4 suite, checking that exception objects are
properly released, and that the proper kind of exception is raised in
the no longer supported case.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="performance"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id9" role="doc-backlink"&gt;Performance&lt;/a&gt;&lt;/h2&gt;
&lt;section id="graphs-and-benchmarks"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id10" role="doc-backlink"&gt;Graphs and Benchmarks&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I had been working on automated performance graphs, and they are
supposed to show up on &lt;a class="reference external" href="https://speedcenter.nuitka.net"&gt;Nuitka Speedcenter&lt;/a&gt; already, but currently it’s broken
and outdated.&lt;/p&gt;
&lt;p&gt;Sad state of affairs. Reasons include that I found it too ugly to
publish unless updated to latest Nikola, for which I didn’t take the
time. I intend to fix it, potentially before the release though.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="incremental-assignments"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id11" role="doc-backlink"&gt;Incremental Assignments&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Consider the following code:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;bbb&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;a&lt;/span&gt;&lt;/code&gt; is a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;str&lt;/span&gt;&lt;/code&gt;, and if (and only if), it’s the only reference
being held, then CPython, reuses the object, instead of creating a new
object and copying &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;a&lt;/span&gt;&lt;/code&gt; over. Well, Nuitka doesn’t do this. This is
despite the problem being known for quite some time.&lt;/p&gt;
&lt;p&gt;With SSA in place, and “C-ish” code generation complete, this will be
solved, but I am not going to solve this before.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="standalone"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id12" role="doc-backlink"&gt;Standalone&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The standalone mode of Nuitka is pretty good, and in the pre-release it
was again improved. For instance, virtualenv and standalone should work
now, and more modules are supported.&lt;/p&gt;
&lt;p&gt;However, there are known issues with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;win32com&lt;/span&gt;&lt;/code&gt; and a few other
packages, which need to be debugged. Mostly these are modules doing
nasty things that make Nuitka not automatically detect imports.&lt;/p&gt;
&lt;p&gt;This has as usual only so much priority from me. I am working on this on
some occasions, as kind of interesting puzzles to solve. Most of the
time, it just works though, with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;wxpython&lt;/span&gt;&lt;/code&gt; being the most notable
exception. I am going to work on that though.&lt;/p&gt;
&lt;p&gt;The standalone compilation exhibits scalability problems of Nuitka the
most, and while it has been getting better, the recent and future
improvements will lead to smaller code, which in turn means not only
smaller executables, but also faster compilation. Again, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;wxpython&lt;/span&gt;&lt;/code&gt; is
a major offender there, due to its many constants, global variables,
etc. in the bindings, while Qt, PySide, and GTK are apparently already
good.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="other-stuff"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id13" role="doc-backlink"&gt;Other Stuff&lt;/a&gt;&lt;/h2&gt;
&lt;section id="funding"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id14" role="doc-backlink"&gt;Funding&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Nuitka doesn’t receive enough &lt;a class="reference external" href="/pages/donations.html"&gt;donations&lt;/a&gt;.
There is no support from organizations like e.g. the PSF, which recently
backed several projects by doubling donations given to them.&lt;/p&gt;
&lt;p&gt;I remember talking to a PSF board member during Europython 2013 about
this, and the reaction was fully in line with the Europython 2012
feedback towards me from the dictator. They wouldn’t help Nuitka in any
way before it is successful.&lt;/p&gt;
&lt;p&gt;I have never officially applied for help with funding though with them.
I am going to choose to take pride in that, I suppose.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="collaborators"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id15" role="doc-backlink"&gt;Collaborators&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;My quest to find collaborators to Nuitka is largely failing. Aside from
the standalone mode, there have been too little contributions. Hope is
that it will change in the future, once the significant speed gains
arrive. And it might be my fault for not asking for help more, and to
arrange myself with that state of things.&lt;/p&gt;
&lt;p&gt;Not being endorsed by the Python establishment is clearly limiting the
visibility of the project.&lt;/p&gt;
&lt;p&gt;Anyway, things are coming along nicely. When I started out, I was fully
aware that the project is something that I can do on my own if
necessary, and that has not changed. Things are going slower than
necessary though, but that’s probably very typical.&lt;/p&gt;
&lt;p&gt;But you can join now, just &lt;a class="reference external" href="/doc/user-manual.html#join-nuitka"&gt;follow this link&lt;/a&gt; or become part of the mailing list
(since closed) and help me there with request I make, e.g. review posts
of mine, test out things, pick up small jobs, answer questions of
newcomers, you know the drill probably.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="future"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id16" role="doc-backlink"&gt;Future&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So, there is multiple things going on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;More “C-ish” code generation&lt;/p&gt;
&lt;p&gt;The next release is going to be more “C-ish” than before, generating
less complex code than before, and removes the previous
optimizations, which were a lot of code, to e.g. detect parameter
variables without &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;del&lt;/span&gt;&lt;/code&gt; statements.&lt;/p&gt;
&lt;p&gt;This prong of action will have to continue, as it unblocks further
changes that lead to more compatibility and correctness.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;More SSA usage&lt;/p&gt;
&lt;p&gt;The next release did and will find bugs in the SSA tracing of Nuitka.
It is on purpose only using it, to add &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;assert&lt;/span&gt;&lt;/code&gt; statements to
things it now no longer does. These will trigger in tests or cause
crashes, which then can be fixed.&lt;/p&gt;
&lt;p&gt;We better know that SSA is flawless in its tracking, before we use it
to make optimizations, which then have no chance to assert anything
at all anymore.&lt;/p&gt;
&lt;p&gt;Once we take it to that next level, Nuitka will be able to speed up
some things by more than the factor it basically has provided for 2
years now, and it’s probably going to happen this year.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;More compatibility&lt;/p&gt;
&lt;p&gt;The new &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;exec&lt;/span&gt;&lt;/code&gt; code makes the dictionary synchronization explicit,
and e.g. now it is optimized away to even check for its need, if we
are in a module or a class, or if it can be known.&lt;/p&gt;
&lt;p&gt;That means faster &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;exec&lt;/span&gt;&lt;/code&gt;, but more importantly, a better understood
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;exec&lt;/span&gt;&lt;/code&gt;, with improved ability to do &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;SSA&lt;/span&gt;&lt;/code&gt; traces for them. Being
able to in-line them, or to know the limit of their impact, as it
will help to know more invariants for that code.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When these 3 things come to term, Nuitka will be a huge, huge step ahead
towards being truly a static optimizing compiler (so far it is mostly
only peep hole optimization, and byte code avoidance). I still think of
this as happening this year.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</content>
    <link href="https://nuitka.net/posts/nuitka-shaping-up.html"/>
    <summary>Not much has happened publicly to Nuitka, so it’s time to make a kind of
status post, about the exciting news there is.</summary>
    <category term="Nuitka" label="Nuitka"/>
    <category term="Python" label="Python"/>
    <category term="compiler" label="compiler"/>
    <published>2014-10-02T07:08:54+02:00</published>
  </entry>
  <entry>
    <id>https://nuitka.net/posts/nuitka-release-054.html</id>
    <title>Nuitka Release 0.5.4</title>
    <updated>2014-08-11T10:29:00+02:00</updated>
    <author>
      <name>Kay Hayen</name>
    </author>
    <content type="html">&lt;section id="nuitka-release-0-5-4"&gt;

&lt;p&gt;This is to inform you about the new stable release of &lt;a class="reference external" href="https://nuitka.net"&gt;Nuitka&lt;/a&gt;. It is the extremely compatible Python compiler,
&lt;a class="reference external" href="/doc/download.html"&gt;“download now”&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release is aiming at preparatory changes to enable optimization
based on SSA analysis, introducing a variable registry, so that
variables no longer trace their references to themselves.&lt;/p&gt;
&lt;p&gt;Otherwise, MinGW64 support has been added, and lots of bug fixes were
made to improve the compatibility.&lt;/p&gt;
&lt;section id="optimization"&gt;
&lt;h2&gt;Optimization&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Using new variable registry, now properly detecting actual need for
sharing variables. Optimization may discover that it is unnecessary
to share a variable, and then it no longer is. This also allows
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--debug&lt;/span&gt;&lt;/code&gt; without it reporting unused variable warnings on Python3.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scons startup has been accelerated, removing scans for unused tools,
and avoiding making more than one gcc version check.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="bug-fixes"&gt;
&lt;h2&gt;Bug Fixes&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Compatibility: In case of unknown encodings, Nuitka was not giving
the name of the problematic encoding in the error message. Fixed in
0.5.3.3 already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Submodules with the same name as built-in modules were wrongly
shadowed. Fixed in 0.5.3.2 already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python3: Added implementations of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;is_package&lt;/span&gt;&lt;/code&gt; to the meta path
based loader.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python3.4: Added &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;find_spec&lt;/span&gt;&lt;/code&gt; implementation to the meta path based
loader for increased compatibility.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python3: Corrections for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--debug&lt;/span&gt;&lt;/code&gt; to work with Python3 and MSVC
compiler more often.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fixed crash with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--show-scons&lt;/span&gt;&lt;/code&gt; when no compiler was found. Fixed
in 0.5.3.5 already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Standalone: Need to blacklist &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;lib2to3&lt;/span&gt;&lt;/code&gt; from standard library as
well. Fixed in 0.5.3.4 already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python3: Adapted to changes in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;SyntaxError&lt;/span&gt;&lt;/code&gt; on newer Python
releases, there is now a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;msg&lt;/span&gt;&lt;/code&gt; that can override &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;reason&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Standalone Windows: Preserve &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sys.executable&lt;/span&gt;&lt;/code&gt; as it might be used
to fork binaries.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Windows: The caching of Scons was not arch specific, and files could
be used again, even if changing the arch from &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;x86&lt;/span&gt;&lt;/code&gt; to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;x86_64&lt;/span&gt;&lt;/code&gt;
or back.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Windows: On 32 bit Python it can happen that with large number of
generators running concurrently (&amp;gt;1500), one cannot be started
anymore. Raising an &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;MemoryError&lt;/span&gt;&lt;/code&gt; now.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="organizational"&gt;
&lt;h2&gt;Organizational&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Added support for MinGW64. Currently needs to be run with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;PATH&lt;/span&gt;&lt;/code&gt;
environment properly set up.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Updated internal version of Scons to 2.3.2, which breaks support for
VS 2008, but adds support for VS 2013 and VS 2012. The VS 2013 is now
the recommended compiler.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added RPM package and repository for RHEL 7.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The output of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--show-scons&lt;/span&gt;&lt;/code&gt; now includes the used compiler,
including the MSVC version.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added option &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--msvc&lt;/span&gt;&lt;/code&gt; to select the MSVC compiler version to use,
which overrides automatic selection of the latest.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added option &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;-python-flag=no_warnings&lt;/span&gt;&lt;/code&gt; to disable user and
deprecation warnings at run time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Repository for Ubuntu Raring was removed, no more supported by
Ubuntu.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="cleanups"&gt;
&lt;h2&gt;Cleanups&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Made technical and logical sharing decisions separate functions and
implement them in a dedicated variable registry.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Scons file has seen a major cleanup.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="summary"&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;This release is mostly a maintenance release. The Scons integrations has
been heavily visited, as has been Python3 and esp. Python3.4
compatibility, and results from the now possible debug test runs.&lt;/p&gt;
&lt;p&gt;Standalone should be even more practical now, and MinGW64 is an option
for those cases, where MSVC is too slow.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</content>
    <link href="https://nuitka.net/posts/nuitka-release-054.html"/>
    <summary>This is to inform you about the new stable release of Nuitka. It is the extremely compatible Python compiler,
“download now”.</summary>
    <category term="Nuitka" label="Nuitka"/>
    <category term="Python" label="Python"/>
    <category term="compiler" label="compiler"/>
    <published>2014-08-11T10:29:00+02:00</published>
  </entry>
  <entry>
    <id>https://nuitka.net/posts/nuitka-release-053.html</id>
    <title>Nuitka Release 0.5.3</title>
    <updated>2014-07-07T23:25:00+02:00</updated>
    <author>
      <name>Kay Hayen</name>
    </author>
    <content type="html">&lt;section id="nuitka-release-0-5-3"&gt;

&lt;p&gt;This is to inform you about the new stable release of &lt;a class="reference external" href="https://nuitka.net"&gt;Nuitka&lt;/a&gt;. It is the extremely compatible Python compiler,
&lt;a class="reference external" href="/doc/download.html"&gt;“download now”&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release is mostly a follow up, resolving points that have become
possible to resolve after completing the C-ish evolution of Nuitka. So
this is more of a service release.&lt;/p&gt;
&lt;section id="new-features"&gt;
&lt;h2&gt;New Features&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Improved mode &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--improved&lt;/span&gt;&lt;/code&gt; now sets error lines more properly than
CPython does in many cases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;-python-flag=-S&lt;/span&gt;&lt;/code&gt; mode now preserves &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;PYTHONPATH&lt;/span&gt;&lt;/code&gt; and
therefore became usable with virtualenv.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="optimization"&gt;
&lt;h2&gt;Optimization&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Line numbers of frames no longer get set unless an exception occurs,
speeding up the normal path of execution.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For standalone mode, using &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--python-flag-S&lt;/span&gt;&lt;/code&gt; is now always possible
and yields less module usage, resulting in smaller binaries and
faster compilation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="bug-fixes"&gt;
&lt;h2&gt;Bug Fixes&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Corrected an issue for frames being optimized away where in fact they
are still necessary. Fixed in 0.5.2.1 already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fixed handling of exception tests as side effects. These could be
remainders of optimization, but didn’t have code generation. Fixed in
0.5.2.1 already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Previously Nuitka only ever used the statement line as the line
number for all the expression, even if it spawned multiple lines.
Usually nothing important, and often even more correct, but sometimes
not. Now the line number is most often the same as CPython in full
compatibility mode, or better, see above.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python3.4: Standalone mode for Windows is working now.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Standalone: Undo changes to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;PYTHONPATH&lt;/span&gt;&lt;/code&gt; or &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;PYTHONHOME&lt;/span&gt;&lt;/code&gt; allowing
potentially forked CPython programs to run properly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Standalone: Fixed import error when using PyQt and Python3.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="new-tests"&gt;
&lt;h2&gt;New Tests&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;For our testing approach, the improved line number handling means we
can undo lots of changes that are no more necessary.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The compile library test has been extended to cover a third potential
location where modules may live, covering the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;matplotlib&lt;/span&gt;&lt;/code&gt; module
as a result.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="cleanups"&gt;
&lt;h2&gt;Cleanups&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In Python2, the list contractions used to be re-formulated to be
function calls that have no frame stack entry of their own right.
This required some special handling, in e.g. closure taking, and
determining variable sharing across functions.&lt;/p&gt;
&lt;p&gt;This now got cleaned up to be properly in-lined in a
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;try&lt;/span&gt;&lt;/code&gt;/&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;finally&lt;/span&gt;&lt;/code&gt; expression.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The line number handling got simplified by pushing it into error
exits only, removing the need to micro manage a line number stack
which got removed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;intptr_t&lt;/span&gt;&lt;/code&gt; over &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;unsigned&lt;/span&gt; &lt;span class="pre"&gt;long&lt;/span&gt;&lt;/code&gt; to store fiber code pointers,
increasing portability.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="organizational"&gt;
&lt;h2&gt;Organizational&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Providing own Debian/Ubuntu repositories for all relevant
distributions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Windows MSI files for Python 3.4 were added.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hosting of the web site was moved to metal server with more RAM and
performance.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="summary"&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;This release brings about structural simplification that is both a
follow-up to C-ish, as well as results from a failed attempt to remove
static “variable references” and be fully SSA based. It incorporates
changes aimed at making this next step in Nuitka evolution smaller.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</content>
    <link href="https://nuitka.net/posts/nuitka-release-053.html"/>
    <summary>This is to inform you about the new stable release of Nuitka. It is the extremely compatible Python compiler,
“download now”.</summary>
    <category term="Nuitka" label="Nuitka"/>
    <category term="Python" label="Python"/>
    <category term="compiler" label="compiler"/>
    <published>2014-07-07T23:25:00+02:00</published>
  </entry>
  <entry>
    <id>https://nuitka.net/posts/nuitka-release-052.html</id>
    <title>Nuitka Release 0.5.2</title>
    <updated>2014-06-23T08:49:00+02:00</updated>
    <author>
      <name>Kay Hayen</name>
    </author>
    <content type="html">&lt;section id="nuitka-release-0-5-2"&gt;

&lt;p&gt;This is to inform you about the new stable release of &lt;a class="reference external" href="https://nuitka.net"&gt;Nuitka&lt;/a&gt;. It is the extremely compatible Python compiler,
&lt;a class="reference external" href="/doc/download.html"&gt;“download now”&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is a major release, with huge changes to code generation that
improve performance in a significant way. It is a the result of a long
development period, and therefore contains a huge jump ahead.&lt;/p&gt;
&lt;section id="new-features"&gt;
&lt;h2&gt;New Features&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Added experimental support for Python 3.4, which is still work in
progress.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added support for virtualenv on macOS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added support for virtualenv on Windows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added support for macOS X standalone mode.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The code generation uses no header files anymore, therefore adding a
module doesn’t invalidate all compiled object files from caches
anymore.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Constants code creation is now distributed, and constants referenced
in a module are declared locally. This means that changing a module
doesn’t affect the validity of other modules object files from caches
anymore.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="optimization"&gt;
&lt;h2&gt;Optimization&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;C-ish code generation uses less C++ classes and generates more C-like
code. Explicit temporary objects are now used for statement temporary
variables.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The constants creation code is no more in a single file, but
distributed across all modules, with only shared values created in a
single file. This means improved scalability. There are remaining bad
modules, but more often, standalone mode is now fast.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exception handling no longer uses C++ exception, therefore has become
much faster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Loops that only break are eliminated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dead code after loops that do not break is now removed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;try&lt;/span&gt;&lt;/code&gt;/&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;finally&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;try&lt;/span&gt;&lt;/code&gt;/&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;except&lt;/span&gt;&lt;/code&gt; constructs are now
eliminated, where that is possible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;try&lt;/span&gt;&lt;/code&gt;/&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;finally&lt;/span&gt;&lt;/code&gt; part of the re-formulation for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;print&lt;/span&gt;&lt;/code&gt;
statements is now only done when printing to a file, avoiding useless
node tree bloat.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tuples and lists are now generated with faster code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Locals and global variables are now access with more direct code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added support for the anonymous &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;code&lt;/span&gt;&lt;/code&gt; type built-in.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added support for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;compile&lt;/span&gt;&lt;/code&gt; built-in.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Generators that statically return immediately, e.g. due to
optimization results, are no longer using frame objects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The complex call helpers use no pseudo frames anymore. Previous code
generation required to have them, but with C-ish code generation that
is no more necessary, speeding up those kind of calls.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modules with only code that cannot raise, need not have a frame
created for them. This avoids useless code size bloat because of
them. Previously the frame stack entry was mandatory.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="bug-fixes"&gt;
&lt;h2&gt;Bug Fixes&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Windows: The resource files were cached by Scons and re-used, even if
the input changed. The could lead to corrupted incremental builds.
Fixed in 0.5.1.1 already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Windows: For functions with too many local variables, the MSVC failed
with an error “C1026: parser stack overflow, program too complex”.
The rewritten code generation doesn’t burden the compiler as much.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compatibility: The timing deletion of nested call arguments was
different from C++. This shortcoming has been addressed in the
rewritten code generation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compatibility: The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;__future__&lt;/span&gt;&lt;/code&gt; flags and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;CO_FREECELL&lt;/span&gt;&lt;/code&gt; were not
present in frame flags. These were then not always properly inherited
to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;eval&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;exec&lt;/span&gt;&lt;/code&gt; in all cases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compatibility: Compiled frames for Python3 had &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;f_restricted&lt;/span&gt;&lt;/code&gt;
attribute, which is Python2 only. Removed it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compatibility: The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;SyntaxError&lt;/span&gt;&lt;/code&gt; of having a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;continue&lt;/span&gt;&lt;/code&gt; in a
finally clause is now properly raised.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python2: The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;exec&lt;/span&gt;&lt;/code&gt; statement with no locals argument provided, was
preventing list contractions to take closure variables.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python2: Having the ASCII encoding declared in a module wasn’t
working.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Standalone: Included the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;idna&lt;/span&gt;&lt;/code&gt; encoding as well.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Standalone: For virtualenv, the file &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;orig-prefix.txt&lt;/span&gt;&lt;/code&gt; needs to be
present, now it’s copied into the “dist” directory as well. Fixed in
0.5.1.1 already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Windows: Handle cases, where Python and user program are installed on
different volumes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compatibility: Can now finally use &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;execfile&lt;/span&gt;&lt;/code&gt; as an expression. One
of our oldest issues, no 5, is finally fixed after all this time
thanks to C-ish code generation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compatibility: The order or call arguments deletion is now finally
compatible. This too is thanks to C-ish code generation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compatibility: Code object flags are now more compatible for Python3.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Standalone: Removing “rpath” settings of shared libraries and
extension modules included. This makes standalone binaries more
robust on Fedora 20.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python2: Wasn’t falsely rejecting &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;unicode&lt;/span&gt;&lt;/code&gt; strings as values for
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;int&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;long&lt;/span&gt;&lt;/code&gt; variants with base argument provided.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Windows: For Python3.2 and 64 bits, global variable accesses could
give false &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;NameError&lt;/span&gt;&lt;/code&gt; exceptions. Fixed in 0.5.1.6 already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compatibility: Many &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;exec&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;eval&lt;/span&gt;&lt;/code&gt; details have become more
correctly, the argument handling is more compatible, and e.g. future
flags are now passed along properly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compatibility: Using &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;open&lt;/span&gt;&lt;/code&gt; with no arguments is now giving the
same error.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="organizational"&gt;
&lt;h2&gt;Organizational&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Replying to email from the issue tracker works now.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added option name alias &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--xml&lt;/span&gt;&lt;/code&gt; for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--dump-xml&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added option name alias &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--python-dbg&lt;/span&gt;&lt;/code&gt; for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--python-debug&lt;/span&gt;&lt;/code&gt;,
which actually might make it a bit more clear that it is about using
the CPython debug run time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove option &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--dump-tree&lt;/span&gt;&lt;/code&gt;, it had been broken for a long time and
unused in favor of XML dumps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New digital art folder with 3D version of Nuitka logo. Thanks to Juan
Carlos for creating it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using “README.rst” instead of “README.txt” to make it look better on
web pages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;More complete whitelisting of missing imports in standard library.
These should give no warnings anymore.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Updated the Nuitka GUI to the latest version, with enhanced features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The builds of releases and update of the &lt;a class="reference external" href="https://nuitka.net/doc/download.html"&gt;downloads page&lt;/a&gt; is now driven by Buildbot.
Page will be automatically updated as updated binaries arrive.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="cleanups"&gt;
&lt;h2&gt;Cleanups&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Temporary keeper variables and the nodes to handle them are now
unified with normal temporary variables, greatly simplifying variable
handling on that level.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Less code is coming from templates, more is actually derived from the
node tree instead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Releasing the references to temporary variables is now always
explicit in the node tree.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The publishing and preservation of exceptions in frames was turned
into explicit nodes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exception handling is now done with a single handle that checks with
branches on the exception. This eliminates exception handler nodes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;dir&lt;/span&gt;&lt;/code&gt; built-in with no arguments is now re-formulated to
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;locals&lt;/span&gt;&lt;/code&gt; or &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;globals&lt;/span&gt;&lt;/code&gt; with their &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;.keys()&lt;/span&gt;&lt;/code&gt; attribute taken.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dramatic amounts of cleanups to code generation specialities, that
got done right for the new C-ish code generation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="new-tests"&gt;
&lt;h2&gt;New Tests&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Warnings from MSVC are now error exits for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--debug&lt;/span&gt;&lt;/code&gt; mode too,
expanding the coverage of these tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The outputs with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;python-dbg&lt;/span&gt;&lt;/code&gt; can now also be compared, allowing to
expand test coverage for reference counts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Many of the basic tests are now executable with Python3 directly.
This allows for easier debug.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The library compilation test is now also executed with Python3.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="summary"&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;This release would deserve more than a minor number increase. The C-ish
code generation, is a huge body of work. In many ways, it lays ground to
taking benefit of SSA results, that previously would not have been
possible. In other ways, it’s incomplete in not yet taking full
advantage yet.&lt;/p&gt;
&lt;p&gt;The release contains so many improvements, that are not yet fully
realized, but as a compiler, it also reflects a stable and improved
state.&lt;/p&gt;
&lt;p&gt;The important changes are about making SSA even more viable. Many of the
problematic cases, e.g. exception handlers, have been stream lined. A
whole class of variables, temporary keepers, has been eliminated. This
is big news in this domain.&lt;/p&gt;
&lt;p&gt;For the standalone users, there are lots of refinements. There is esp. a
lot of work to create code that doesn’t show scalability issues. While
some remain, the most important problems have been dealt with. Others
are still in the pipeline.&lt;/p&gt;
&lt;p&gt;More work will be needed to take full advantage. This has been explained
in a &lt;a class="reference external" href="https://nuitka.net/posts/state-of-nuitka.html"&gt;separate post&lt;/a&gt;
in greater detail.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</content>
    <link href="https://nuitka.net/posts/nuitka-release-052.html"/>
    <summary>This is to inform you about the new stable release of Nuitka. It is the extremely compatible Python compiler,
“download now”.</summary>
    <category term="Nuitka" label="Nuitka"/>
    <category term="Python" label="Python"/>
    <category term="compiler" label="compiler"/>
    <published>2014-06-23T08:49:00+02:00</published>
  </entry>
  <entry>
    <id>https://nuitka.net/posts/yup-another-python-riddle.html</id>
    <title>Yup, another Python Quiz</title>
    <updated>2014-06-18T07:46:50+02:00</updated>
    <author>
      <name>Kay Hayen</name>
    </author>
    <content type="html">&lt;section id="yup-another-python-quiz"&gt;

&lt;p&gt;Using the following source code as a test happily in my &lt;a class="reference external" href="/pages/overview.html"&gt;Python compiler
Nuitka&lt;/a&gt; for some years now.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Testing dict optimization with all constants for compatibility.&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Dictionary entirely from constant args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Guido&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;van&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Rossum&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;invented&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Python&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="quiz-question"&gt;
&lt;h2&gt;Quiz Question&lt;/h2&gt;
&lt;p&gt;Lately, when adding Python 3.4 support, this and other code changed. So
lets do this manually:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;PYTHONHASHSEED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;python3.3
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="mf"&gt;3.3.5&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mar&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt; &lt;span class="mi"&gt;2014&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;53&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;GCC&lt;/span&gt; &lt;span class="mf"&gt;4.8.2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;linux&lt;/span&gt;
&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;help&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;copyright&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;credits&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;license&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;more&lt;/span&gt; &lt;span class="n"&gt;information&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;                &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Guido&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;                &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;van&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;                &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Rossum&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;                &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;invented&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;                &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;                &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;             &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;q&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Guido&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;invented&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;e&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Rossum&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;t&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;van&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;y&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;q&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Guido&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;invented&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;e&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Rossum&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;t&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;van&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;y&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;q&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Guido&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;invented&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;e&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Rossum&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;t&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;van&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;y&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;q&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Guido&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;invented&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;e&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Rossum&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;t&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;van&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;y&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;q&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Guido&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;invented&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;e&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Rossum&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;t&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;van&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;y&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;q&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Guido&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;invented&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;e&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Rossum&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;t&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;van&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;y&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;q&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Guido&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;invented&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;e&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Rossum&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;t&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;van&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;y&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;See, the dictionary is stable, once it gets reordered, due to hash
values, but then it stays fixed. Which is pretty OK, and using a fixed
hash value, it’s deterministic. Random hashing is not good for
comparison testing, so I disable it for tests.&lt;/p&gt;
&lt;p&gt;Now things get interesting, repeat with 3.4:&lt;/p&gt;
&lt;div class="highlight-bash notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;PYTHONHASHSEED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;python3.4
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="mf"&gt;3.4.1&lt;/span&gt;&lt;span class="n"&gt;rc1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;May&lt;/span&gt;  &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="mi"&gt;2014&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;GCC&lt;/span&gt; &lt;span class="mf"&gt;4.8.2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;linux&lt;/span&gt;
&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;help&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;copyright&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;credits&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;license&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;more&lt;/span&gt; &lt;span class="n"&gt;information&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;                &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Guido&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;                &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;van&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;                &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Rossum&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;                &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;invented&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;                &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;                &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;             &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;y&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;q&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Guido&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;invented&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;e&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Rossum&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;t&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;van&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;y&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;q&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Guido&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;invented&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;e&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Rossum&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;t&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;van&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;invented&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;q&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Guido&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;y&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;e&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Rossum&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;t&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;van&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;y&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;q&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Guido&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;invented&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;e&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Rossum&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;t&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;van&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;invented&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;q&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Guido&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;y&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;e&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Rossum&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;t&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;van&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;y&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;q&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Guido&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;invented&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;e&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Rossum&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;t&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;van&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;invented&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;q&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Guido&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;y&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;e&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Rossum&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;t&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;van&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;Nuitka&lt;/span&gt; &lt;span class="n"&gt;builds&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;argument&lt;/span&gt; &lt;span class="n"&gt;dictionary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt;
&lt;span class="n"&gt;passed&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Since&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s all compile time constants, we can do that, right, and&lt;/span&gt;
&lt;span class="n"&gt;we&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="n"&gt;instead&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;So&lt;/span&gt; &lt;span class="n"&gt;see&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Look at how the result of “dict” is not reproducing itself, when used as
a constant. I am only feeding the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;dict&lt;/span&gt;&lt;/code&gt; result to the interpreter,
and it changes.&lt;/p&gt;
&lt;p&gt;So the quizz this time is, why does this happen. What change in
CPython3.4 makes this occur. Obviously it has to do with dictionary
sizes.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="solution"&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;I had a theory, but I couldn’t confirm it looking at all of CPython
sources “ceval.c” and “dictobject.c” differences between the two
versions.&lt;/p&gt;
&lt;p&gt;I am suspecting a difference between presized and non-presized
dictionaries, or that change to dictionary grow. When &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;dict&lt;/span&gt;&lt;/code&gt; is being
called, the amount of keys is know though, as well as when building the
constant. So this ought to not play any role.&lt;/p&gt;
&lt;p&gt;Hm, actually. I don’t know the solution yet. :-)&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</content>
    <link href="https://nuitka.net/posts/yup-another-python-riddle.html"/>
    <summary>Using the following source code as a test happily in my Python compiler
Nuitka for some years now.</summary>
    <category term="Python" label="Python"/>
    <category term="quiz" label="quiz"/>
    <published>2014-06-18T07:46:50+02:00</published>
  </entry>
  <entry>
    <id>https://nuitka.net/posts/state-of-nuitka.html</id>
    <title>State of Nuitka</title>
    <updated>2014-06-17T05:35:48+02:00</updated>
    <author>
      <name>Kay Hayen</name>
    </author>
    <content type="html">&lt;section id="state-of-nuitka"&gt;

&lt;nav class="contents" id="contents"&gt;
&lt;p class="topic-title"&gt;Contents&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#state-of-nuitka" id="id1"&gt;State of Nuitka&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#c-ish-vs-c-ish" id="id2"&gt;C-ish vs. C++-ish&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#rewriting-code-generation" id="id3"&gt;Rewriting Code Generation&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#current-situation" id="id4"&gt;Current Situation&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#open-points" id="id5"&gt;Open Points&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#other-things" id="id6"&gt;Other Things&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#call-for-help" id="id7"&gt;Call for Help&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#final-words" id="id8"&gt;Final Words&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;p&gt;For quite some time, publicly, very little has happened with my Python
compiler Nuitka. But that doesn’t mean, there hasn’t been progress. In
fact it is tremendous. I would like to have a post that kind of
summarizes, what happened.&lt;/p&gt;
&lt;p&gt;The last release, 0.5.1 was more of a maintenance release than making
real changes. It turns out, that the bigger changes got delayed by a
feature that I have described as “C-ish”. Let me outline, what this
means.&lt;/p&gt;
&lt;section id="c-ish-vs-c-ish"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id2" role="doc-backlink"&gt;C-ish vs. C++-ish&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When I started working on Nuitka, the big question was if it is possible
to create a sufficiently compatible compiler. The use of C++11 then,
together with some templates made it easy to cover a wide, wide part of
the language, and to fully integrate with CPython for compatibility.&lt;/p&gt;
&lt;p&gt;The main goal was to get it going to work correctly. As time went on,
execution order demanded to do away with variadic templates, raw strings
were not all that perfect at all, and so C++-03 was good enough at one
point.&lt;/p&gt;
&lt;p&gt;And then, as Nuitka became less and less template based, and shoving
more things into the node tree, and re-formulations, making this where
the knowledge resided. It became more and more obvious that C++ has two
problems. One in the way I used it. One inherent in the language typical
implementations:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;C++ exceptions are god damn slow&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Everything should be a in a single statement.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The later was my choice. Initially it made it easy to pass on references
and put the releasing C++ class around every expression as necessary.
Identifier classes were allowing for code generation to avoid taking
references where necessary, and it was not all that bad. Yet limiting.&lt;/p&gt;
&lt;p&gt;This led to a couple of issues.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The order of call arguments release for e.g. &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;f(g(h()))&lt;/span&gt;&lt;/code&gt; was not
completely compatible, with the way how CPython does it. C++
destructors for objects living in a single statement didn’t give
sufficient control, and make the order and timing of finalization not
compatible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The generated C++ code complexity became large. The compilation of
the generated C++ in some cases was huge. To the point, that e.g.
“code too complex” was giving by compilers like MSVC for some
modules.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cases of in-place assignments were discovered, where CPython
outperforms Nuitka by a large margin. But these don’t fit into that
style of code generation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, at some point, the pain had built up. Code generation was already
lighter than in the beginning. For example, initially &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;with&lt;/span&gt;&lt;/code&gt;
statements had dedicated code templates to them. This, and many other
things, are long gone.&lt;/p&gt;
&lt;p&gt;I took a deep dive, and &lt;strong&gt;rewrote&lt;/strong&gt; the whole code generation, to be
much more “C-ish” than “C++-ish”. A huge undertaking that would take
months.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Where previously, code didn’t have to handle return error codes (a
C++ exception was thrown), now everything needed a return value name,
and error check.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Where classes were previously conviently made sure things happened at
function or scope exit, manual handling needed to be added.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The handling of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;continue&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;break&lt;/span&gt;&lt;/code&gt;, and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;return&lt;/span&gt;&lt;/code&gt; was
previously done with exceptions being thrown, if they were to pass a
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;try&lt;/span&gt;&lt;/code&gt;/&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;finally&lt;/span&gt;&lt;/code&gt; handler. Now these are done with stacks of exit
handlers, where &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;goto&lt;/span&gt;&lt;/code&gt; statements are used to produce the correct
behaviour.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="rewriting-code-generation"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id3" role="doc-backlink"&gt;Rewriting Code Generation&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Redoing code generation, over months, while ultimately, slowly, arriving
at a point where Nuitka would be doing this, it already did before, was
kind of frustrating.&lt;/p&gt;
&lt;p&gt;Of course, the performance benefit would be there, but it would not be
all that much, except for exception raising and handling. There it would
be huge. Ultimately for PyStone, a couple of extra percents were gained.&lt;/p&gt;
&lt;p&gt;This really was a point, where I felt, that Nuitka will make it or
break. And for a long time, I honestly wasn’t so sure, that I pull
through. But I did.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="current-situation"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id4" role="doc-backlink"&gt;Current Situation&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The current pre-release is release quality. You should try it out, it’s
great.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;There are many changes to Standalone mode. Due to changes in how
constants are now created in the modules that uses them, instead of
everything globally, the parallel compilation now works great. What
previously took an hour with MSVC (the problem child, gcc was always
relatively good), now takes minutes only.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The support for virtualenv’s of all kinds seems to work on Windows,
Linux, and macOS, which all seem to have different kinds of codes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The support for macOS is now there. Thanks to a virtual server month
donated to Jarrad Hope, I was able to iron issues out.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The final release will also work with standalone binaries created on
Fedora 20 which got hard code rpaths removed on the factory git
branch.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And yet, I am not yet releasing. In fact, I would like to ask you to
give it a roll, and integrate test feedback.&lt;/p&gt;
&lt;p&gt;Although more tests than ever are executed and pass, (e.g. the Mercurial
test suite is now run each time I make a commit, and fully identically
passes or fails the test suite with the current Mercurial code), there
can never be enough.&lt;/p&gt;
&lt;p&gt;The changes I made are the most intense ever, and definitely have
potential for regressions. I am used to providing very high quality
releases.&lt;/p&gt;
&lt;p&gt;Also, I am working on the Buildbot instances to automate the production
of &lt;a class="reference external" href="https://speedcenter.nuitka.net"&gt;performance graphs&lt;/a&gt;, which get
updated fully automatically. I am working on updating the downloads page
automatically for each release that gets made.&lt;/p&gt;
&lt;p&gt;And generally, I am trying to improve my work flow, to make it easier to
push out releases with less effort. Buildbot should drive the release
process more completely. I am using the git flow to provide hot-fixes,
and this should be even less painful in the future.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="open-points"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id5" role="doc-backlink"&gt;Open Points&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;With this release, presenting great progress, many things remain in an
unfinished state.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The support for Python3.4 is not complete. Most things work, but some
need more work. Specifically the changes to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;__class__&lt;/span&gt;&lt;/code&gt; variable
closure taking, need another major refactoring, this time on variable
handling.&lt;/p&gt;
&lt;p&gt;Currently there are variables, closure variables, temp variables, and
then temp variable references. The way they work is different. One
way they work different, prevents a temp variable closure reference
to carry a name, in that case &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;-_class__&lt;/span&gt;&lt;/code&gt;, which would be needed
for Python3.4, where that is suddenly necessary.&lt;/p&gt;
&lt;p&gt;With this done, the SSA code will be even easier to write, as temp
variables and named variables will finally be fully unified.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The use of C++ classes is largely reduced now. But a few still
remain, namely for local variables, closure variables, and temp
variables that are explicit variables. They still use C++ classes,
although changing that seems quite possible now, because at least for
temporary variables, the class doesn’t do anything in terms of code
anymore.&lt;/p&gt;
&lt;p&gt;Removing these classes may well gain more performance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Now that code generation can more easily make a difference, and SSA
apparently is becoming reliable, it could be used to &lt;em&gt;know&lt;/em&gt; that
values must be value and to optimize checks away.&lt;/p&gt;
&lt;p&gt;Currently every variable access checks for “NULL”, when it’s part of
an assign trace. Some optimizations exist for parameter variables
without &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;del&lt;/span&gt;&lt;/code&gt; on them, that do not use SSA.&lt;/p&gt;
&lt;p&gt;This could be expanded and made general, allowing for much less code
to be generated (specifically avoiding error code, and release code
for variables that cannot give an error).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The SSA has been found unreliable in some instances, due to bugs that
I believe I found. We could attempt and forward propagate variable
assignments to where they are used, eliminating variables, etc.&lt;/p&gt;
&lt;p&gt;This is a place, where a lot of performance can be gained. We really
want to be there. And “C-ish” now makes this ever more attractive,
despite the large delay in time it has caused.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The in-place assignment code for strings, where CPython can be way
faster than current Nuitka, it bears a risk of getting it wrong. It
is therefore pushed to a future release.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="other-things"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id6" role="doc-backlink"&gt;Other Things&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For the website, I am relocating the virtual machine to a dedicated
server rented for an increased price. This will allow to add a few more
dynamic features, as the virtual machine was always too limited in RAM.
It’s more expensive, but I feel a better investment of my time.&lt;/p&gt;
&lt;p&gt;As mentioned before, I am not going to conferences this year. Enjoy
Europython, and consider having a Lightning talk about Nuitka. I will be
there next year again.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="call-for-help"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id7" role="doc-backlink"&gt;Call for Help&lt;/a&gt;&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Please test the latest release of Nuitka.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Please consider &lt;a class="reference external" href="/pages/donations.html"&gt;making a donation&lt;/a&gt; to
support my work on Nuitka. I have continuous monthly costs of it, so
it would be sweet if it’s with all my time spent working on it, at
least not a financial cost to me.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Please join the mailing list (since closed), and offer your help with
tasks. Nuitka can seriously take more people developing, testing,
reviewing, and quality checking it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="final-words"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id8" role="doc-backlink"&gt;Final Words&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So, there is this “C-ish” release 0.5.2 cooking. You are invited to
help. Big, improvements are coming to Nuitka. Even after this next huge
release, very important work is still open, but hope is to have this
complete over the summer.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Yours,&lt;/div&gt;
&lt;div class="line"&gt;Kay&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</content>
    <link href="https://nuitka.net/posts/state-of-nuitka.html"/>
    <summary>State of Nuitka</summary>
    <category term="Nuitka" label="Nuitka"/>
    <category term="Python" label="Python"/>
    <category term="compiler" label="compiler"/>
    <published>2014-06-17T05:35:48+02:00</published>
  </entry>
  <entry>
    <id>https://nuitka.net/posts/try-finally-python-quiz.html</id>
    <title>Try Finally Python Quiz</title>
    <updated>2014-04-24T22:08:56+02:00</updated>
    <author>
      <name>Kay Hayen</name>
    </author>
    <content type="html">&lt;section id="try-finally-python-quiz"&gt;

&lt;p&gt;When working on my Python compiler Nuitka, I often come across
ridiculous language details of the Python language, and turn these into
quizzes, for which I finally added a &lt;a class="reference external" href="/blog/tag/quiz.html"&gt;dedicated quiz tag&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, who can predict, what these will do to you:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Will it return &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;1&lt;/span&gt;&lt;/code&gt; or &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;2&lt;/span&gt;&lt;/code&gt; ?&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Will this raise an &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ZeroDivisionError&lt;/span&gt;&lt;/code&gt; or return &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;2&lt;/span&gt;&lt;/code&gt; ?&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Is this an endless loop or does it return?&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;
        &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;What about that? This one holds an inconsistency.&lt;/p&gt;
&lt;p&gt;No solutions yet this time.&lt;/p&gt;
&lt;/section&gt;
</content>
    <link href="https://nuitka.net/posts/try-finally-python-quiz.html"/>
    <summary>When working on my Python compiler Nuitka, I often come across
ridiculous language details of the Python language, and turn these into
quizzes, for which I finally added a dedicated quiz tag.</summary>
    <category term="Python" label="Python"/>
    <category term="quiz" label="quiz"/>
    <published>2014-04-24T22:08:56+02:00</published>
  </entry>
  <entry>
    <id>https://nuitka.net/posts/nuitka-release-051.html</id>
    <title>Nuitka Release 0.5.1</title>
    <updated>2014-03-08T04:21:00+01:00</updated>
    <author>
      <name>Kay Hayen</name>
    </author>
    <content type="html">&lt;section id="nuitka-release-0-5-1"&gt;

&lt;p&gt;This is to inform you about the new stable release of &lt;a class="reference external" href="https://nuitka.net"&gt;Nuitka&lt;/a&gt;. It is the extremely compatible Python compiler,
&lt;a class="reference external" href="/doc/download.html"&gt;“download now”&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release brings corrections and major improvements to how standalone
mode performs. Much of it was contributed via patches and bug reports.&lt;/p&gt;
&lt;section id="bug-fixes"&gt;
&lt;h2&gt;Bug Fixes&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;There was a crash when using &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;next&lt;/span&gt;&lt;/code&gt; on a non-iterable. Fixed in
0.5.0.1 already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Module names with special characters not allowed in C identifiers
were not fully supported. Fixed in 0.5.0.1 already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Name mangling for classes with leading underscores was not removing
them from resulting attribute names. This broke at &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;__slots__&lt;/span&gt;&lt;/code&gt; with
private attributes for such classes. Fixed in 0.5.0.1 already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Standalone on Windows might need “cp430” encoding. Fixed in 0.5.0.2
already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Standalone mode didn’t work with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;lxml.etree&lt;/span&gt;&lt;/code&gt; due to lack of hard
coded dependencies. When a shared library imports things, Nuitka
cannot detect it easily.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wasn’t working on macOS 64 bits due to using Linux 64 bits specific
code. Fixed in 0.5.0.2 already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On MinGW the constants blob was not properly linked on some
installations, this is now done differently (see below).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="new-features"&gt;
&lt;h2&gt;New Features&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Memory usages are now traced with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--show-progress&lt;/span&gt;&lt;/code&gt; allowing us to
trace where things go wrong.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="optimization"&gt;
&lt;h2&gt;Optimization&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Standalone mode now includes standard library as bytecode by default.
This is workaround scalability issues with many constants from many
modules. Future releases are going to undo it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On Windows the constants blob is now stored as a resource, avoiding
compilation via C code for MSVC as well. MinGW was changed to use the
same code.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="new-tests"&gt;
&lt;h2&gt;New Tests&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Expanded test coverage for “standalone mode” demonstrating usage of
“hex” encoding, PySide, and PyGtk packages.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="summary"&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;This release is mostly an interim maintenance release for standalone.
Major changes that provide optimization beyond that, termed “C-ish code
generation” are delayed for future releases.&lt;/p&gt;
&lt;p&gt;This release makes standalone practical which is an important point.
Instead of hour long compilation, even for small programs, we are down
to less than a minute.&lt;/p&gt;
&lt;p&gt;The solution of the scalability issues with many constants from many
modules will be top priority going forward. Since they are about how
even single use constants are created all in one place, this will be
easy, but as large changes are happening in “C-ish code generation”, we
are waiting for these to complete.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</content>
    <link href="https://nuitka.net/posts/nuitka-release-051.html"/>
    <summary>This is to inform you about the new stable release of Nuitka. It is the extremely compatible Python compiler,
“download now”.</summary>
    <category term="Nuitka" label="Nuitka"/>
    <category term="Python" label="Python"/>
    <category term="compiler" label="compiler"/>
    <published>2014-03-08T04:21:00+01:00</published>
  </entry>
  <entry>
    <id>https://nuitka.net/posts/not-going-to-fosdem-2014.html</id>
    <title>Not going to FOSDEM 2014</title>
    <updated>2014-01-18T20:48:53+01:00</updated>
    <author>
      <name>Kay Hayen</name>
    </author>
    <content type="html">&lt;section id="not-going-to-fosdem-2014"&gt;

&lt;p&gt;So I submitted a talk for FOSDEM “Python has a compiler now”. And it
didn’t get accepted. Quite a surprise to me, but likely mostly logical.
These are the accepted talks (link since became unavailable) and well,
it surely didn’t fit in, right.&lt;/p&gt;
&lt;p&gt;My intent was to introduce &lt;a class="reference external" href="/pages/overview.html"&gt;Nuitka&lt;/a&gt; to the
larger community. Not going to happen now, but maybe next year.&lt;/p&gt;
&lt;p&gt;Clearly triggered by the rejection, I am questioning Europython 2014 in
Berlin as a useful destination too. To me it seems, that code writing is
the best way to create the community at this time anyway.&lt;/p&gt;
&lt;/section&gt;
</content>
    <link href="https://nuitka.net/posts/not-going-to-fosdem-2014.html"/>
    <summary>So I submitted a talk for FOSDEM “Python has a compiler now”. And it
didn’t get accepted. Quite a surprise to me, but likely mostly logical.
These are the accepted talks (link since became unavailable) and well,
it surely didn’t fit in, right.</summary>
    <category term="Nuitka" label="Nuitka"/>
    <category term="Python" label="Python"/>
    <category term="conference" label="conference"/>
    <category term="europython" label="europython"/>
    <published>2014-01-18T20:48:53+01:00</published>
  </entry>
  <entry>
    <id>https://nuitka.net/posts/nuitka-release-050.html</id>
    <title>Nuitka Release 0.5.0</title>
    <updated>2014-01-04T10:05:00+01:00</updated>
    <author>
      <name>Kay Hayen</name>
    </author>
    <content type="html">&lt;section id="nuitka-release-0-5-0"&gt;

&lt;p&gt;This is to inform you about the new stable release of &lt;a class="reference external" href="https://nuitka.net"&gt;Nuitka&lt;/a&gt;. It is the extremely compatible Python compiler,
&lt;a class="reference external" href="/doc/download.html"&gt;“download now”&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release breaks interface compatibility, therefore the major version
number change. Also “standalone mode” has seen significant improvements
on both Windows, and Linux. Should work much better now.&lt;/p&gt;
&lt;p&gt;But consider that this part of Nuitka is still in its infancy. As it is
not the top priority of mine for Nuitka, which primarily is intended as
an super compatible accelerator of Python, it will continue to evolve
nearby.&lt;/p&gt;
&lt;p&gt;There is also many new optimization based on structural improvements in
the direction of actual SSA.&lt;/p&gt;
&lt;section id="bug-fixes"&gt;
&lt;h2&gt;Bug Fixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The “standalone mode” was not working on all Redhat, Fedora, and
openSUSE platforms and gave warnings with older compilers. Fixed in
0.4.7.1 already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The “standalone mode” was not including all useful encodings. Fixed
in 0.4.7.2 already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The “standalone mode” was defaulting to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--python-flag=-S&lt;/span&gt;&lt;/code&gt; which
disables the parsing of “site” module. That unfortunately made it
necessary to reach some modules without modifying &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;PYTHONPATH&lt;/span&gt;&lt;/code&gt;
which conflicts with the “out-of-the-box” experience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The “standalone mode” is now handling packages properly and generally
working on Windows as well.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The syntax error of having an all catching except clause and then a
more specific one wasn’t causing a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;SyntaxError&lt;/span&gt;&lt;/code&gt; with Nuitka.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;something&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;somehandling&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;notallowed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A corruption bug was identified, when re-raising exceptions, the top
entry of the traceback was modified after usage. Depending on
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;malloc&lt;/span&gt;&lt;/code&gt; this was potentially causing an endless loop when using it
for output.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="new-features"&gt;
&lt;h2&gt;New Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Windows: The “standalone” mode now properly detects used DLLs using
&lt;a class="reference external" href="http://www.dependencywalker.com/"&gt;Dependency Walker&lt;/a&gt; which it
offers to download and extra for you.&lt;/p&gt;
&lt;p&gt;It is used as a replacement to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ldd&lt;/span&gt;&lt;/code&gt; on Linux when building the
binary, and as a replacement of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;strace&lt;/span&gt;&lt;/code&gt; on Linux when running the
tests to check that nothing is loaded from the outside.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="optimization"&gt;
&lt;h2&gt;Optimization&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;When iterating over &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;list&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;set&lt;/span&gt;&lt;/code&gt;, this is now automatically
lowered to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;tuples&lt;/span&gt;&lt;/code&gt; avoiding the mutable container types.&lt;/p&gt;
&lt;p&gt;So the following code is now equivalent:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="c1"&gt;# same as&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For constants, this is even more effective, because for mutable
constants, no more is it necessary to make a copy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python2: The iteration of large &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;range&lt;/span&gt;&lt;/code&gt; is now automatically
lowered to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;xrange&lt;/span&gt;&lt;/code&gt; which is faster to loop over, and more memory
efficient.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added support for the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;xrange&lt;/span&gt;&lt;/code&gt; built-in.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The statement only expression optimization got generalized and now is
capable of removing useless parts of operations, not only the whole
thing when it has not side effects.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# same as&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This works for all container types.&lt;/p&gt;
&lt;p&gt;Another example is &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;type&lt;/span&gt;&lt;/code&gt; built-in operation with single argument.
When the result is not used, it need not be called.&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# same as&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And another example &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;is&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;is&lt;/span&gt; &lt;span class="pre"&gt;not&lt;/span&gt;&lt;/code&gt; have no effect of their own
as well, therefore:&lt;/p&gt;
&lt;div class="highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;

&lt;span class="c1"&gt;# same as&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added proper handling of conditional expression branches in SSA based
optimization. So far these branches were ignored, which only
acceptable for temporary variables as created by tree building, but
not other variable types. This is preparatory for introducing SSA for
local variables.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="organizational"&gt;
&lt;h2&gt;Organizational&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The option &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--exe&lt;/span&gt;&lt;/code&gt; is now ignored and creating an executable is the
default behavior of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nuitka&lt;/span&gt;&lt;/code&gt;, a new option &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--module&lt;/span&gt;&lt;/code&gt; allows to
produce extension modules.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The binary &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nuitka-python&lt;/span&gt;&lt;/code&gt; was removed, and is replaced by
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nuitka-run&lt;/span&gt;&lt;/code&gt; with now only implies &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--execute&lt;/span&gt;&lt;/code&gt; on top of what
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nuitka&lt;/span&gt;&lt;/code&gt; is.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using dedicated &lt;a class="reference external" href="http://buildbot.net"&gt;Buildbot&lt;/a&gt; for continuous
integration testing and release creation as well.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;a class="reference external" href="https://nuitka.net/doc/download.html"&gt;Downloads&lt;/a&gt; now offers
MSI files for Win64 as well.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Discontinued the support for cross compilation to Win32. That was too
limited and the design choice is to have a running CPython instance
of matching architecture at Nuitka compile time.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="new-tests"&gt;
&lt;h2&gt;New Tests&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Expanded test coverage for “standalone mode” demonstrating usage of
“hex” encoding, and PySide package.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="summary"&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;The “executable by default” interface change improves on the already
high ease of use. The new optimization do not give all that much in
terms of numbers, but are all signs of structural improvements, and it
is steadily approaching the point, where the really interesting stuff
will happen.&lt;/p&gt;
&lt;p&gt;The progress for standalone mode is of course significant. It is still
not quite there yet, but it is making quick progress now. This will
attract a lot of attention hopefully.&lt;/p&gt;
&lt;p&gt;As for optimization, the focus for it has shifted to making exception
handlers work optimal by default (publish the exception to
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sys.exc_info()&lt;/span&gt;&lt;/code&gt; and create traceback only when necessary) and be
based on standard branches. Removing special handling of exception
handlers, will be the next big step. This release includes some
correctness fixes stemming from that work already.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</content>
    <link href="https://nuitka.net/posts/nuitka-release-050.html"/>
    <summary>This is to inform you about the new stable release of Nuitka. It is the extremely compatible Python compiler,
“download now”.</summary>
    <category term="Nuitka" label="Nuitka"/>
    <category term="Python" label="Python"/>
    <category term="compiler" label="compiler"/>
    <published>2014-01-04T10:05:00+01:00</published>
  </entry>
</feed>
