1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-03 07:24:58 +03:00
inform7/docs/arch-module/P-wtmd.html

173 lines
13 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>What This Module Does</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-assets/Inform.png" height=72">
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</a></li>
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul><h2>Compiler Webs</h2><ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul><h2>Inbuild Modules</h2><ul>
<li><a href="../supervisor-module/index.html">supervisor</a></li>
</ul><h2>Inform7 Modules</h2><ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../assertions-module/index.html">assertions</a></li>
<li><a href="../values-module/index.html">values</a></li>
<li><a href="../knowledge-module/index.html">knowledge</a></li>
<li><a href="../imperative-module/index.html">imperative</a></li>
<li><a href="../runtime-module/index.html">runtime</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul><h2>Inter Modules</h2><ul>
<li><a href="../bytecode-module/index.html">bytecode</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../pipeline-module/index.html">pipeline</a></li>
<li><a href="../final-module/index.html">final</a></li>
</ul><h2>Services</h2><ul>
<li><a href="index.html"><span class="selectedlink">arch</span></a></li>
<li><a href="../calculus-module/index.html">calculus</a></li>
<li><a href="../html-module/index.html">html</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'What This Module Does' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Services</a></li><li><a href="index.html">arch</a></li><li><a href="index.html#P">Preliminaries</a></li><li><b>What This Module Does</b></li></ul></div>
<p class="purpose">An overview of the arch module's role and abilities.</p>
<ul class="toc"><li><a href="P-wtmd.html#SP1">&#167;1. Prerequisites</a></li><li><a href="P-wtmd.html#SP2">&#167;2. Architecture versus VM</a></li><li><a href="P-wtmd.html#SP4">&#167;4. Compatibility</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Prerequisites. </b>The arch module is a part of the Inform compiler toolset. It is
presented as a literate program or "web". Before diving in:
</p>
<ul class="items"><li>(a) It helps to have some experience of reading webs: see <a href="../../../inweb/docs/index.html" class="internal">inweb</a> for more.
</li><li>(b) The module is written in C, in fact ANSI C99, but this is disguised by the
fact that it uses some extension syntaxes provided by the <a href="../../../inweb/docs/index.html" class="internal">inweb</a> literate
programming tool, making it a dialect of C called InC. See <a href="../../../inweb/docs/index.html" class="internal">inweb</a> for
full details, but essentially: it's C without predeclarations or header files,
and where functions have names like <span class="extract"><span class="extract-syntax">Tags::add_by_name</span></span> rather than <span class="extract"><span class="extract-syntax">add_by_name</span></span>.
</li><li>(c) This module uses other modules drawn from the <a href="../compiler.html" class="internal">compiler</a>, and also
uses a module of utility functions called <a href="../../../inweb/docs/foundation-module/index.html" class="internal">foundation</a>.
For more, see <a href="../../../inweb/docs/foundation-module/P-abgtf.html" class="internal">A Brief Guide to Foundation (in foundation)</a>.
</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. Architecture versus VM. </b>The Inform 7 build process works in two stages: first it generates abstract
Inter code, then it further generates "final code" from that.
</p>
<p class="commentary">It's an appealing notion that this first stage might be universal: that
is, that <a href="../inform7/index.html" class="internal">inform7</a> could generate the same Inter code regardless of the
eventual build product needed, and that only the second stage would vary
according to this.
</p>
<p class="commentary">Which is very nearly true, but not quite. Here's why not:
</p>
<ul class="items"><li>(a) <a href="../inform7/index.html" class="internal">inform7</a> has to generate different code if integers are 16 rather
than 32 bits wide, and
</li><li>(b) kits of Inter code normally used in compilation make certain other
architectural assumptions based on the integer size (for example, the
assembly-language syntax and semantics are different in these cases);
</li><li>(c) it also generates different code with debugging enabled than without.
</li></ul>
<p class="commentary">Reason (c) could be avoided, at some cost in complexity, but reasons (a) and (b)
are something we cannot sensibly avoid without making Inter a much higher-level
form of bytecode. Instead, we have "architectures" for Inter: for example,
32-bit with debugging enabled is the <span class="extract"><span class="extract-syntax">32d</span></span> architecture. See <a href="2-arc.html" class="internal">Architectures</a>;
if ever we introduce a 64-bit VM, that will need new architectures, and
this is where they would go.
</p>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>A <a href="2-tvm.html#SP2" class="internal">target_vm</a> object, on the other hand, expresses the choices made at
the second stage too. The term "VM" is traditional here, and stands for
"virtual machine", because until 2021, Inform could only generate code which
would ultimately run on virtual machines called Glulx and the Z-machine. But it
can now, for example, also generate C.
</p>
<p class="commentary">As a result, "VM" now has a more general meaning, and really means "form of
final code generation". The Glulx format used to be specified by supplying the
command-line option <span class="extract"><span class="extract-syntax">-format=ulx</span></span> to <a href="../inform7/index.html" class="internal">inform7</a> or <a href="../inter/index.html" class="internal">inter</a>: that still works,
though it is deprecated, and <span class="extract"><span class="extract-syntax">-format=Inform6/32d</span></span> is better. But equally
possible now would be <span class="extract"><span class="extract-syntax">-format=C/32d</span></span>. Here the target is a native executable
to be compiled with a C compiler.
</p>
<p class="commentary">As these new-style <span class="extract"><span class="extract-syntax">-format</span></span> options suggest, the compilation process thus
involves a combination of both architecture and target:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="element-syntax">depends</span><span class="plain-syntax"> </span><span class="element-syntax">on</span><span class="plain-syntax"> </span><span class="element-syntax">architecture</span><span class="plain-syntax">: </span><span class="element-syntax">depends</span><span class="plain-syntax"> </span><span class="element-syntax">on</span><span class="plain-syntax"> </span><span class="element-syntax">target</span><span class="plain-syntax">:</span>
<span class="plain-syntax"> </span><span class="element-syntax">Source</span><span class="plain-syntax"> </span><span class="element-syntax">text</span><span class="plain-syntax"> -----------&gt; </span><span class="element-syntax">Inter</span><span class="plain-syntax"> </span><span class="element-syntax">code</span><span class="plain-syntax"> ----------------&gt; </span><span class="element-syntax">Bytecode</span><span class="plain-syntax"> </span><span class="element-syntax">for</span>
<span class="plain-syntax"> </span><span class="function-syntax">INFORM7</span><span class="plain-syntax"> </span><span class="element-syntax">via</span><span class="plain-syntax"> </span><span class="function-syntax">INFORM6</span><span class="plain-syntax"> </span><span class="element-syntax">target</span><span class="plain-syntax"> </span><span class="element-syntax">virtual</span><span class="plain-syntax"> </span><span class="element-syntax">machine</span>
<span class="plain-syntax"> ----------------&gt; </span><span class="element-syntax">Executable</span>
<span class="plain-syntax"> </span><span class="element-syntax">via</span><span class="plain-syntax"> </span><span class="function-syntax">CLANG</span><span class="plain-syntax">/</span><span class="function-syntax">GCC</span>
<span class="plain-syntax"> ...</span>
</pre>
<p class="commentary">Note that a single <a href="2-tvm.html#SP2" class="internal">target_vm</a> object can be used with just one architecture:
use the function <a href="2-tvm.html#SP11" class="internal">TargetVMs::get_architecture</a> to obtain this. If a target supports
multiple architectures, then there will be multiple <a href="2-tvm.html#SP2" class="internal">target_vm</a> objects for it,
one for each architecture it supports. For example, the Glulx VM can be reached
by <span class="extract"><span class="extract-syntax">Inform6/32</span></span> or <span class="extract"><span class="extract-syntax">Inform6/32d</span></span>. There can also be multiple versions: for example,
<span class="extract"><span class="extract-syntax">Inform6/16/v8</span></span> is a valid target. The function <a href="2-tvm.html#SP6" class="internal">TargetVMs::find</a> finds the
<a href="2-tvm.html#SP2" class="internal">target_vm</a> object associated with a given textual form like <span class="extract"><span class="extract-syntax">"C/32d"</span></span>, if
the toolchain supports this.
</p>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. Compatibility. </b>Not all software in the Inform stack &mdash; source text from the user, extensions,
kits of Inter code &mdash; will be compatible with every architecture, or with
every VM. We represent that by giving something a <a href="2-cmp.html#SP1" class="internal">compatibility_specification</a>
object to say what it can work with: the function <a href="2-cmp.html#SP11" class="internal">Compatibility::test</a>
determines whether any given VM is allowed with this specification.
</p>
<p class="commentary">A specification can be converted to or from text: see <a href="2-cmp.html#SP5" class="internal">Compatibility::write</a>
and <a href="2-cmp.html#SP6" class="internal">Compatibility::from_text</a>. Typically, such text might read "for 32d only".
</p>
<p class="commentary">Lastly, <a href="2-cmp.html#SP2" class="internal">Compatibility::all</a> returns a specification meaning "works with
anything". This should be the default; <a href="2-cmp.html#SP11" class="internal">Compatibility::test_universal</a> tests
whether a specification is equivalent to this.
</p>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprevoff">&#10094;</li><li class="progresscurrentchapter">P</li><li class="progresscurrent">wtmd</li><li class="progresssection"><a href="P-htitm.html">htitm</a></li><li class="progresschapter"><a href="1-am.html">1</a></li><li class="progresschapter"><a href="2-arc.html">2</a></li><li class="progressnext"><a href="P-htitm.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>