1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-01 06:24:58 +03:00
inform7/docs-src/structure.inweb
2022-04-04 18:31:44 +01:00

134 lines
7.4 KiB
Plaintext
Executable file

Title: Structure of the Inform 7 compiler
Author: Graham Nelson
@ The core Inform compiler combines natural-language source text, including
natural-language extensions, and precompiled "kits" in order to make the
instructions for making a playable story. Inform is internally divided into
Stages, numbered 1 to 7:[1]
(1) Build management: gathering up what must be compiled and reading it in as
an annotated syntax tree, or "AST".[2]
(2) Queueing and organising work which will be done by stages 3 to 5.
(3) Turning assertion sentences -- "Peter is a man", "The tally is a number
that varies" -- into a world model of variables, kinds, instances and properties.
Values and typechecking are also managed here. Phrases and rules are identified,
but their bodies are ignored for the moment.
(4) The world model, phrases and rules identified by stage (3) are now compiled
to an Intermediate Representation, or "IR", another sort of tree known as Inter.
This is done by calling down to the API provided by...
(5) ... which is more a layer than a stage: it's a comprehensive system for
building Inter code, and could conceivably be used by other compilers too.
(6) A "pipeline" of transformations on the Inter code improves it. A weak form
of linker[3] joins on precompiled Inter code from "kits" such as BasicInformKit
or WorldModelKit.
(7) The finished Inter tree is then code-generated to form our output, which
can be in several different formats, and an Index mini-website about it is made.
For most users of the Inform app, the format will be Inform 6, and further
command-line tools //inform6// and //inblorb// then turn that into a "story
file" and then a Javascript-running web page; but for some command-line users,
the format is C and a compiler like |clang| is then used to make an executable.
[1] These slightly overlap in chronological order, so maybe Level would be a
better name than Stage, but then again they do mostly happen in sequence.
[2] AST normally stands for "abstract syntax tree" but we prefer "annotated",
skirting the issue of exactly how abstract vs concrete it is.
[3] Weak in that the //inter// tool can link any number of kits to a source text,
but not a source text to a source text.
@ These seven stages form a single code base but are packaged up into three
command-line tools, not one:
(*) |inbuild| is Stage 1 as a stand-alone tool: see //this description -> inbuildn//.
(*) |inform7| is Stages 1 to 7 as an all-in-one: see //this description -> inform7n//
of the part unique to it, Stages 2 to 4.
(*) |inter| is Stages 5 to 7 as a stand-alone tool: see //this description -> intern//.
All three tools also use a large library of //services//: everything from
inflecting words to simplifying logical propositions.
@ The flow of data looks like so, with time running downwards on the page:
= (hyperlinked text as BoxArt)
kit sources
(in Inform 6 code)
|
| INTER
\|/
precompiled
Inter trees
. main source text extension source texts
. \ /
. \ / INFORM7 Stage 1 or INBUILD
. \ /
. \|/ \|/
. syntax tree
. |
. | INFORM7 Stages 2 to 4/5
. |
. . . . . . . precompiled \|/
Inter trees Inter tree
\ /
\ / INFORM7 Stage 6 or INTER
\|/ \|/
single linked Inter tree
/ | \
/ | \ INFORM7 Stage 7 or INTER
\|/ \|/ \|/
Inform 6 code C code index mini-website
: :
INFORM6 : : CLANG or GCC
\:/ \:/
story file executable
:
INBLORB :
\:/
playable website
=
@ The code base is subdivided into "modules". There are around 30, from five sources:
(*) A set of //services//, which are libraries of code providing features useful
to programs dealing with natural language.
(*) Those //owned by Inbuild -> inbuildn//.
(*) Those //owned by Inform7 -> inform7n//.
(*) Those //owned by Inter -> intern//.
(*) The //foundation// library for memory-management, string handling and so
on, which is a module held in the //inweb// repository rather than here.
@ The full breakdown of the three compiler tools into modules is as follows.
An |o| means that the tool is the owner of the module in question; a |x| means
that it imports the module from somewhere else.
= (hyperlinked text as BoxArt)
WEB ACTIVE STAGES INWEB SERVICES INBUILD INFORM7 INTER
//inbuild// cli Before - - o - -
//inform7// cli Before - - - o -
//inter// cli Before - - - - o
//supervisor// module Stage 1 - - o x -
//core// module Stage 2 - - - o -
//assertions// module Stage 3 - - - o -
//values// module Stage 3 - - - o -
//knowledge// module Stage 3 - - - o -
//if// module Stage 3 - - - o -
//multimedia// module Stage 3 - - - o -
//imperative// module Stage 4 - - - o -
//runtime// module Stage 4 - - - o -
//bytecode// module Stage 5 - - - x o
//building// module Stage 5 - - - x o
//pipeline// module Stage 6 - - - x o
//final// module Stage 7 - - - x o
//index// module Stage 7 - - - x o
//linguistics// service Throughout - o - x -
//calculus// service Throughout - o - x -
//kinds// service Throughout - o - x -
//lexicon// service Throughout - o - x -
//inflections// service Throughout - o - x -
//problems// service Throughout - o - x -
//syntax// service Throughout - o x x -
//words// service Throughout - o x x x
//arch// service Throughout - o x x x
//html// service Throughout - o x x x
//foundation// library Throughout o - x x x
=
The executables otherwise contain only a few POSIX or Windows-related functions
for file and directory handling, and functions from the standard C library.
There are, therefore, no external dependencies.