Software is divided into two main categories: system software and application software.
System software manages and controls the computer hardware, and provides a platform for application software to run. It runs in the background and is not directly used by the end user for productive tasks.
Application software is designed to perform specific tasks directly for the user. Examples include word processors (Microsoft Word), spreadsheets (Excel), web browsers (Chrome), and games.
Machine code is the only language a CPU can directly execute. It consists entirely of binary (1s and 0s). Machine code is processor-specific — a program written for one CPU architecture will not run on another. It is very fast but extremely difficult for humans to read or write.
Assembly language uses mnemonics (short readable codes) to represent machine code instructions. E.g. ADD, MOV, LDA. Each mnemonic corresponds to one machine code instruction. A program called an assembler converts assembly language into machine code. Still processor-specific and difficult, but more readable than raw binary.
High-level languages (Python, Java, C++, Visual Basic) use English-like syntax and are designed to be human-readable. They are processor-independent — the same code can run on different hardware. They must be translated into machine code before the CPU can execute them.
| Feature | Compiler | Interpreter |
|---|---|---|
| How it works | Translates the entire source code into machine code in one go, producing an executable file | Translates and executes one line at a time; no separate output file |
| Speed of execution | Faster — executable runs directly | Slower — translation happens at runtime |
| Error reporting | All errors reported at end of compilation | Stops at first error; easier to debug line by line |
| Portability | Compiled file is platform-specific | Source code runs on any system with the interpreter |
| Examples | C, C++, Java (bytecode) | Python, JavaScript (in browser) |
| Feature | High-level | Low-level (Assembly/Machine code) |
|---|---|---|
| Readability | Easy to read and write | Difficult — uses mnemonics or binary |
| Portability | Portable across hardware | Processor-specific |
| Execution speed | Slower (after translation) | Faster (closer to hardware) |
| Memory control | Limited | Direct — used in embedded/real-time systems |
| Use case | Most programs, apps, websites | Device drivers, operating systems, embedded systems |
Simulation software creates a model of a real-world system so it can be tested or studied without the cost, danger, or time involved in real-life trials.
An assembler converts assembly language programs (written with mnemonics) into machine code. Assembly language sits between high-level languages and raw machine code.
| Advantages of assembly language | Disadvantages of assembly language |
|---|---|
| Direct control over hardware and memory registers | Difficult to read and write compared to high-level languages |
| Very fast execution — close to machine code speed | Processor-specific — not portable across different CPU architectures |
| Useful where hardware resources are very limited (e.g. embedded systems) | Time-consuming to develop and maintain |
| Can optimise critical sections of code for specific hardware | Errors are harder to debug than in high-level code |