For the sake of my brain, let’s start with some technical definitions.
For most of you, the “compiler” is the “deific thing” that turns your “words” into “magic computer stuff”. Come on, admit it. I’m about to explain and change all of that with a few short definitions.
Hex Edit: v. To change the nature of a stretch of binary code by altering its values, typically through the usage of hexadecimal numbers. Total neck pain to do.
Assembly Language: n. The first step away from hex editing of machine code, typically (but not always!) with a one-to-one correspondence between command and processor instruction.
Low-Level Language: n. An assembly language or direct machine code; basically what a processor understands or something very close to it.
High-Level Language: n. An abstraction from assembly language to something more human-directed; such as C, Pascal, Java, Python, and most of what you are familiar with.
Build Tool Types
Translator: n. A program capable of representing the semantic of one language in another. (Frequently used.)
Source Program: n. The program being input into a translator.
Object Program: n. The program output by a translator.
High-Level Translator: n. A translator which translates between representations in one high-level language, and another high-level language. As an example, Java to C.
Assembler: n. Translator with a source language of assembly and a target language of the machine code for a specific processor type, like x86, amd64, PPC, or SPARC.
Disassembler: n. Translator with a source language of machine code, and a target language of assembly.
Compiler: n. (Important!) Translator the converts a high-level language into a low-level language. Most typically (but not always) the high-level language is converted into an assembly code, possibly through a multi-stage process; the assembly is then converted into machine code with an assembler.
Code Generator: n. The late phase of a translator which generates code in the target language.
Implementation Language: n. The language in which the compiler itself is built.
Cross-Compiler: n. A compiler which produces machine code for one architecture, but is implemented and run on another.
Host Machine: n. The machine that a translator is run on.
Target Machine: n. The machine that a compiler’s object code is to be run on.
Bootstrap: v. To implement a translator in the translator’s target language.
Full Bootstrap: v. To compile a new edition of a compiler through nothing but its previous version, beginning with an initial version that is a subset of the language, no larger than is necessary to compile. (People actually do this. It’s pretty amazing.)
Half Bootstrap: v. To compile an edition of a compiler for a separate target platform from the implementation platform, requiring a two-phase process of compiling the translator with an altered target machine implementation language, and then recompiling the original source code through the new edition; generating an implementation of the compiler that runs on the target platform, for the target platform. (Actually even more awesome. Similar methods are used with full bootstrapping to improve the quality of the compiler’s object program.)
Interpreter: n. A program that accepts any program (the source program), expressed in a specific language (the source language), and runs that program immediately, without outputting any translation of it. (This does not mean that no translator is implemented internally!)
Just-In-Time Compiler: n. A compiler designed to translate a source program into an object program just as it is loaded into memory, skipping around the usual penalties for interpretive compilers. (Earliest usage in Java was arguably 1993; but its earliest identifiable use was actually in Lisp in 1960.)
Emulator: n. An interpreter designed to run machine code with one target implementation, on another.
Abstract Machine: n. A theoretical model of a machine that exists, on the current platform, only as an emulator.Virtual Machine: n. The software interpreter that provides the functionality of an abstract machine. (Technically.)
Real Machine: n. A concrete and tangible machine. Well, not literally concrete, but I’m sure you get the idea.
Portability: n. The percentage of code that does not need to change when the underlying architecture changes.
Code: n. An instance of meaning expressed in a specific language
Token: n. A distinct chunk of text, which generally carries meaning.
Expression: n. rule for computing values, specified in code
Data Type: n. Class of program-manipulable data
Control Structure: n. Code which depends on the status of a memory address to determine the actions to perform
Declaration: n. Code which produces an identifier for specific values
Abstraction: n. Mental tool for separating notions of “what” from notions of “how”
Encapsulation: n. Grouping of related declarations, and selective hiding of them.
Data Abstraction: See “Encapsulation”
Syntax: Literal format of a language. Specifically, which tokens are used, and how phrases are composed from tokens and subphrases.
Phrase: n. Command, expression, declaration, or complete program
Contextual Constraint: n. Bound on the nature of a well-formed expression.
Static Semantic: See “Contextual Constraint”
Scope Rule: n. Boundary on the influence of a declaration
Type Rule: n. Boundary allowing for the inference of the type of provided data
Semantics: n. Notion of the meaning of a program
Denotational Semantic: n. Mathematical mapping of a program’s inputs to its outputs
Operational Semantics: n. Behavior of a program as it is run on a machine
Formal Specification: n. Precise notation on the structure of a language. Often specialized.
Informal Specification: n. Imprecise, but more commonly readable, notation on the structure of a language. More often misinterpreted than Formal Specification.
Backus-Naur Form (BNF): n. Specific format for declaring the valid syntax order for a language, explained in detail here.