mirror of
https://github.com/ganelson/inform.git
synced 2024-07-16 22:14:23 +03:00
165 lines
13 KiB
HTML
165 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="../index.html">home</a></li>
|
|
</ul><h2>Compiler</h2><ul>
|
|
<li><a href="../structure.html">structure</a></li>
|
|
<li><a href="../inbuildn.html">inbuild</a></li>
|
|
<li><a href="../inform7n.html">inform7</a></li>
|
|
<li><a href="../intern.html">inter</a></li>
|
|
<li><a href="../services.html">services</a></li>
|
|
<li><a href="../secrets.html">secrets</a></li>
|
|
</ul><h2>Other Tools</h2><ul>
|
|
<li><a href="../inblorbn.html">inblorb</a></li>
|
|
<li><a href="../indocn.html">indoc</a></li>
|
|
<li><a href="../inform6.html">inform6</a></li>
|
|
<li><a href="../inpolicyn.html">inpolicy</a></li>
|
|
<li><a href="../inrtpsn.html">inrtps</a></li>
|
|
</ul><h2>Resources</h2><ul>
|
|
<li><a href="../extensions.html">extensions</a></li>
|
|
<li><a href="../kits.html">kits</a></li>
|
|
</ul><h2>Repository</h2><ul>
|
|
<li><a href="https://github.com/ganelson/inform"><img src="../docs-assets/github.png" height=18> github</a></li>
|
|
</ul><h2>Related Projects</h2><ul>
|
|
<li><a href="../../../inweb/index.html">inweb</a></li>
|
|
<li><a href="../../../intest/index.html">intest</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="../services.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">§1. Prerequisites</a></li><li><a href="P-wtmd.html#SP2">§2. Architecture versus VM</a></li><li><a href="P-wtmd.html#SP4">§4. Compatibility</a></li><li><a href="P-wtmd.html#SP5">§5. Features</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§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/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/index.html" class="internal">inweb</a> literate
|
|
programming tool, making it a dialect of C called InC. See <a href="../../../inweb/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 compiler (see <a href="../structure.html" class="internal">structure</a>), and also
|
|
uses a module of utility functions called <a href="../../../inweb/foundation-module/index.html" class="internal">foundation</a>.
|
|
For more, see <a href="../../../inweb/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>§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>§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"> -----------> </span><span class="element-syntax">Inter</span><span class="plain-syntax"> </span><span class="element-syntax">code</span><span class="plain-syntax"> ----------------> </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"> ----------------> </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#SP12" 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>§4. Compatibility. </b>Not all software in the Inform stack — source text from the user, extensions,
|
|
kits of Inter code — 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>
|
|
|
|
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. Features. </b>The last service provided by this module is to manage which named features of
|
|
the compiler are switched on or off: see <a href="3-fm.html" class="internal">Feature Manager</a>. At one time
|
|
this functionality was part of the core Inform compiler, but having it here
|
|
means that all of the compiler tools can make use of it.
|
|
</p>
|
|
|
|
<nav role="progress"><div class="progresscontainer">
|
|
<ul class="progressbar"><li class="progressprevoff">❮</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="progresschapter"><a href="3-fm.html">3</a></li><li class="progressnext"><a href="P-htitm.html">❯</a></li></ul></div>
|
|
</nav><!--End of weave-->
|
|
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|