A compatibility layer is a software interface that allows applications written and compiled for one operating system or hardware architecture to run on a different host system. It receives API calls and other system functions designed for one environment and translates them into calls that the host system can understand.
Compatibility layers can serve a similar function as emulation and virtualization by allowing software written for one environment (for example, Windows on an x86 processor) to run in either a different operating system on similar hardware (Linux on an x86 processor) or a similar operating system on a different hardware architecture (Windows on an ARM processor). They do this by intercepting every system API call the program tries to make to its original environment and converting them into the equivalent calls to the new host environment.
Running software in a compatibility layer often uses fewer system resources than emulating another environment or running a virtual machine. However, some software may experience errors or require additional configuration to work properly when using a compatibility layer.
Comparison to Emulation and Virtualization
Emulators, virtualization, and compatibility layers are all often used to run another environment's software. Each method accomplishes that task differently.
An emulator uses software to recreate both a device's hardware and its software to emulate the entire environment. Since emulating hardware devices in software requires significant system resources, a host system needs to be significantly faster than the hardware it's emulating to achieve similar performance. A compatibility layer meant to translate between two hardware platforms will include a hardware emulator, using it only as needed instead of constantly emulating the entire environment.
A virtual machine simulates an entire computer on the host machine's hardware. It runs a copy of an operating system and uses a software layer to translate virtualized hardware calls to the host machine's hardware. A compatibility layer only translates the calls it needs to, doing so without simulating hardware or software calls that it does not need to.