Track progress, take quizzes and save notes on this lesson.

Free forever · no card needed

Start free
Intermediate

Programming Languages and Translators

3.4.4 Classification of programming languages and translators

Aligned to the AQA 8525 specification

Level
Intermediate
Reading time
9 min
Published
9 June 2026
Updated
1 July 2026
On this page
  1. 1.Levels of Programming Language
  2. 2.Machine Code
  3. 3.Assembly Language
  4. 4.High-Level Languages
  5. 5.Translators: Compiler, Interpreter and Assembler
  6. 6.Choosing a Translator
  7. 7.Common Exam Mistakes

Key takeaways

  • Low-level languages are close to the hardware and run fast but are processor-specific and hard to read, while high-level languages are readable, portable, and must be translated before execution.
  • Machine code is binary that the CPU executes directly without translation, but it is specific to a processor family, so code for one CPU will not run on a different one.
  • Assembly language uses human-readable mnemonics with a 1:1 correspondence to machine code, where each assembly instruction maps to exactly one machine code instruction.
  • A compiler translates an entire program into a standalone machine code file before execution, while an interpreter translates and executes one statement at a time and produces no machine code file.
  • An assembler translates assembly language into machine code; compilers and interpreters translate high-level languages, and an interpreter calls machine code routines rather than producing machine code itself.

Levels of Programming Language

Programs can be written at different levels of abstraction. Low-level languages are close to the hardware — they reflect the actual instructions a processor understands. High-level languages are closer to human language — they are more readable and portable.

Low-level languageHigh-level language
Closeness to hardwareVery close — mirrors processor instructionsAbstract — hides hardware detail
ReadabilityDifficult for humans to read and writeCloser to English — much easier to read
PortabilityTied to a specific processor or familyGenerally runs on many different machines
ExecutionRuns very fast — little or no translation neededRequires translation before execution
ExamplesMachine code, assembly languagePython, Java, C#, VB.NET

Most programs — including all software you use daily — are written in high-level languages. Low-level languages are used when precise hardware control or maximum execution speed is required.

"Level" refers to how close the language is to the hardware (low) or to human language (high). A lower level means fewer abstractions between the code and the physical machine.

Machine Code

Machine code is the lowest level of programming language. It consists entirely of binary — sequences of 0s and 1s that the processor can execute directly.

Key properties of machine code:

  • Written and stored in binary
  • The CPU executes machine code directly without any translation
  • Every processor type has its own specific set of machine code instructions — code written for one processor family will not run on a different processor family
  • Extremely fast to execute because no translation step is needed
  • Very difficult for humans to write or read — a single instruction may be 10110000 01100001 in binary

Example — a conceptual machine code instruction in binary:

10110000 01100001

This is meaningless to a human reader without knowing the specific processor's instruction set. Writing entire programs in machine code is impractical — a simple task requires many such instructions.

All programs written in higher-level languages must ultimately be translated into machine code before the CPU can execute them.

Assembly Language

Assembly language is a low-level language that uses short, human-readable codes called mnemonics to represent machine code instructions. Each assembly instruction corresponds to exactly one machine code instruction — this is called a 1:1 correspondence.

Example assembly-like instructions:

Assembly mnemonicMeaning
MOV A, 5Move the value 5 into register A
ADD A, BAdd the value in register B to register A
CMP A, 10Compare the value in register A to 10
JMP loopJump to the instruction labelled loop

Assembly language is still low-level — each line maps directly to a single processor instruction — but it is significantly easier for humans to read and write than raw binary.

When assembly language is used:

  • Programming embedded systems where the hardware has very limited resources (e.g. a microcontroller in a washing machine)
  • Writing code that directly controls specific hardware components (e.g. device drivers)
  • Situations where every CPU instruction must be controlled precisely for maximum performance

Assembly language is processor-specific — code written for one architecture (e.g. ARM) will not run on a different architecture (e.g. x86) without being rewritten.

High-Level Languages

High-level languages are designed to be written and understood by humans. They use English-like syntax and hide the underlying hardware entirely from the programmer.

Properties:

  • Code is readable and closer to human language: if score >= 40: print("Pass") is understandable without knowing anything about the hardware
  • Portable — the same source code can run on different processors and operating systems, because a translator handles the hardware-specific details
  • A single high-level statement may compile into many machine code instructions
  • Most computer programs — from mobile apps to web servers — are written in high-level languages

Advantages over low-level languages:

AdvantageExplanation
Easier to writeCloser to natural language — programmers can focus on logic, not hardware
Easier to maintainCode can be read and modified by any programmer familiar with the language
PortableRuns on different hardware without rewriting the code
Faster to developHigh productivity — one line of high-level code replaces many machine code instructions

Disadvantage: High-level code cannot run directly on hardware — it must first be translated. This translation step takes time, and the resulting machine code may be slightly less optimal than hand-written low-level code.

How much of this have you taken in?

Quiz yourself on this section, free, no card needed.

Test myself

Translators: Compiler, Interpreter and Assembler

Because CPUs only execute machine code, any program written in a high-level or assembly language must be translated before it can run. There are three types of translator:

Assembler — translates assembly language into machine code. Each assembly instruction becomes exactly one machine code instruction (1:1 correspondence). Used specifically for assembly language programs.

Compiler — translates an entire high-level language program into machine code before execution, producing a standalone executable file. The original source code is not needed to run the compiled program.

Compiler
TranslatesEntire program before execution
OutputA machine code file that runs directly
Speed during developmentSlower — errors are only reported after the full compilation
Execution speedFast — the translation has already been done
Source code needed at runtimeNo

Interpreter — translates and executes a high-level program one statement at a time. It does not produce a separate machine code file. Instead, it calls appropriate machine code routines within its own code to carry out each statement as it is reached.

Interpreter
TranslatesOne statement at a time, during execution
OutputNo separate machine code file
Speed during developmentFaster feedback — stops and reports an error at the exact line where it occurs
Execution speedSlower — translation happens every time the program runs
Source code needed at runtimeYes

Comparison:

PropertyCompilerInterpreterAssembler
Language translatedHigh-levelHigh-levelAssembly
Translation timingBefore executionDuring executionBefore execution
Machine code file producedYesNoYes
Error reportingAfter full compilationAt the failing lineAfter full assembly
Execution speedFastSlowerFast

Choosing a Translator

Use an assembler when writing assembly language programs — there is no choice.

Use a compiler when:

  • The program will be distributed and run by end users who should not have access to the source code
  • Execution speed is critical (compiled code runs faster)
  • The program is complete and no longer being actively debugged

Use an interpreter when:

  • Developing and testing code — errors are reported immediately at the failing line, making debugging faster
  • Writing scripts that run in environments where an interpreter is already installed (e.g. Python scripts)
  • The same source code needs to run on multiple different platforms without recompiling

In practice, many modern languages use a combination: source code is compiled to an intermediate bytecode, which is then interpreted by a virtual machine. Python compiles to bytecode (.pyc files), which the Python interpreter then executes. AQA 8525 does not require knowledge of this — just the three translator types above.

Common Exam Mistakes

1. Stating that interpreters produce machine code

An interpreter does not produce machine code directly. It calls machine code subroutines within its own code to execute each statement. A compiler produces a machine code file; an interpreter does not.

2. Claiming machine code is portable

Machine code is entirely specific to a processor or processor family. Code compiled for one CPU cannot run on a different CPU with a different instruction set. High-level languages with a compiler or interpreter achieve portability; machine code does not.

3. Confusing assembly with machine code

Assembly language uses human-readable mnemonics (MOV, ADD, JMP). Machine code is binary. They have a 1:1 correspondence — every assembly instruction maps to one machine code instruction — but they are not the same thing. An assembler translates between them.

4. Saying interpreters are always better for debugging

Interpreters are better for finding errors quickly — they stop at the exact failing line. But compiled programs run faster and do not require the source code to be present at runtime. Neither is universally better; the choice depends on the situation.

5. Forgetting that machine code is specific to a processor family

Machine code is not universal. Code compiled for one type of processor (e.g. Intel x86) will not run on a different type (e.g. ARM). This is why high-level languages with translators are preferred for software that needs to run on multiple devices.

Key terms

Low-level language
A language close to the hardware that runs fast but is processor-specific and hard for humans to read, such as machine code or assembly.
High-level language
A readable, portable language closer to human language that must be translated before execution, such as Python or Java.
Machine code
The lowest-level language, consisting of binary the CPU executes directly without translation.
Assembly language
A low-level language using human-readable mnemonics with a 1:1 correspondence to machine code.
Mnemonic
A short human-readable code, such as MOV or ADD, representing a single machine code instruction.
1:1 correspondence
The relationship where each assembly instruction maps to exactly one machine code instruction.
Compiler
A translator that converts an entire high-level program into a standalone machine code file before execution.
Interpreter
A translator that translates and executes a high-level program one statement at a time, producing no machine code file.
Assembler
A translator that converts assembly language into machine code.

Frequently asked questions

A compiler translates an entire high-level program into a standalone machine code file before execution, so it runs fast and needs no source code at runtime. An interpreter translates and executes one statement at a time during execution, produces no machine code file, and needs the source code each run.

Machine code is binary that the CPU executes directly. Assembly language uses short human-readable mnemonics such as MOV, ADD, and JMP. They have a 1:1 correspondence, with each assembly instruction mapping to one machine code instruction, but they are not the same thing; an assembler translates between them.

Machine code is entirely specific to a processor or processor family, so code compiled for one CPU such as x86 cannot run on a different CPU such as ARM. High-level languages achieve portability because a compiler or interpreter handles the hardware-specific details, but the machine code itself is not portable.

Generate revision on any topic you study

Type any topic you're studying and Aicademy generates a complete lesson, quiz, and flashcard set, personalised to your level.

Lessons on anything

Structured, level-matched lessons on any topic you study

Practice quizzes

Find out what you actually know before the exam does

Flashcard sets

Lock in key concepts with instant revision cards

Ask Aica

Stuck on something? Get a clear explanation, any time

Prev

Boolean Logic: Gates and Truth Tables

Next

The Fetch-Decode-Execute Cycle

Related lessons

Top students don’t revise more. They revise what counts.

Start revising free

Free to start. No card needed.