These words have precise accepted definitions:
- Preprocess: Perform lexical macro substitution on a source code file to produce a translation unit
- Compile: Translate a translation unit in a high-level language to a low-level language, usually assembly language
- Assemble: Translate a translation unit in assembly language to an object code file
- Link: Resolve references from one object code file to another and produce a larger object code file
- Source code: "The preferred form of a work for making modifications to it" (GPLv2; GPLv3)
In order to target multiple object code formats, many compilers produce assembly language as their output instead of object code directly. These compilers ship with a "driver program" that calls the preprocessor, compiler, assembler, and linker in turn. For example, GCC includes gcc
which calls cpp
(the preprocessor), cc1
(the compiler proper), as
(the assembler), and ld
(the linker), and cc65 includes cl65
that does analogous things. But because the compiler uses the most CPU cycles of the bunch, people started to refer to the whole toolchain as the "compiler":
- Compile (colloquial): source code goes in, object code comes out.
This process also happens to cover what an assembler does. Is there a better verb than "compile" to refer to translating a program whose source code is in either C or assembly language to object code?