Machine Language, Assembly Language, and High-Level Language
Programming languages can be categorized into three levels based on their abstraction from the hardware:
Abstraction from hardware means how far a programming language is from the actual machine (hardware) operations.
1. Machine Language (Low-Level Language)
Definition:
Machine language consists of binary code (0s and 1s) that the CPU directly understands and executes without any translation.
Characteristics:
- Directly executed by the CPU.
- Extremely fast but difficult for humans to understand.
- Hardware-dependent (each processor has its own machine language).
- Difficult to debug and modify.
- Debugging means finding and fixing errors (bugs) in a program to make it work correctly.
Example (Binary Code for moving a value into a register in x86 CPU):
10110000 01100001
10110000
→ This is the opcode for the MOV
instruction. It tells the CPU to move a value into a register.
01100001
→ This is the value (61h
or 97
in decimal) being moved.
Advantages:
✔ Fast execution (since no translation is needed).
✔ Fully optimized for specific hardware.
“fully optimized for specific hardware” means:
✅ The binary instructions (0s and 1s) are directly understood by the CPU without needing any conversion or interpretation.
✅ Each processor (CPU) has its own machine language, meaning the instructions are specifically designed for that hardware.
✅ Since there’s no extra processing (like translation or interpretation), the execution is fast and efficient on that particular CPU.
Example:
- The instruction
10110000 01100001
works for an x86 CPU, but it won’t work on an ARM processor because ARM has a different machine language.
Machine language is “fully optimized for specific hardware” because it is written in the exact binary format that a CPU can process instantly, without any extra steps.
Disadvantages:
✘ Extremely difficult to program and understand.
✘ Not portable across different computer architectures.
Portable means able to run on different hardware or operating systems without modification.
Machine language is not portable because it is hardware-dependent, meaning:
❌ Each CPU architecture (e.g., x86, ARM, RISC-V) has its own unique machine language.
❌ A program written in x86 machine code won’t run on an ARM processor without modification.
❌ You must rewrite or recompile the code for different hardware.
Example:
- The binary instruction
10110000 01100001
works on an x86 CPU. - The same instruction won’t work on an ARM-based CPU because ARM has a different instruction set.
Machine language is not portable because it is written specifically for one type of CPU and cannot be used on different hardware without changes.