## 2.22 Binary compatibility

SWI-Prolog first of all attempts to maintain source code compatibility between versions. Data and programs can often be represented in binary form. This touches a number of interfaces with varying degrees of compatibility. The relevant version numbers and signatures are made available by PL_version(), the --abi-version and the Prolog flag abi_version.

Foreign extensions
  Dynamically loadable foreign extensions have the usual dependencies on the architecture, ABI model of the (C) compiler, dynamic link library format, etc. They also depend on the backward compatibility of the PL_* API functions provided lib `libswipl`.

  A compatible API allows distribution of foreign extensions in binary form, notably for platforms on which compilation is complicated (e.g., Windows). This compatibility is therefore high on the priority list, but must infrequently be compromised.

  PL_version(): `PL_VERSION_FLI`, abi_version key: `foreign_interface`

Binary terms
  Terms may be represented in binary format using PL_record_external() and fast_write/2. As these formats are used for storing binary terms in databases or communicate terms between Prolog processes in binary form, great care is taken to maintain compatibility.

  PL_version(): `PL_VERSION_REC`, abi_version key: `record`

QLF files
  QLF files (see qcompile/1) are binary representation of Prolog file or module. They represent clauses as sequences of virtual machine (VM) instructions. Their compatibility relies on the QLF file format and the ABI of the VM. Some care is taken to maintain compatibility.

  PL_version(): `PL_VERSION_QLF`, `PL_VERSION_QLF_LOAD` and `PL_VERSION_VM`, abi_version key: `qlf`, `qlf_min_load`, `vmi`

Saved states
  Saved states (see -c and qsave_program/2) is a zip file that contains the entire Prolog database using the same representation as QLF files. A saved state may contain additional resources, such as foreign extensions, data files, etc. In addition to the dependency concerns of QLF files, built-in and core library predicates may call internal foreign predicates. The interface between the public built-ins and internal foreign predicates changes frequently. Patch level releases in the stable branch will as much as possible maintain compatibility.

  The relevant ABI version keys are the same as for QLF files with one addition: PL_version(): `PL_VERSION_BUILT_IN`, abi_version key: `built_in`