Many programming languages use bytecodes, which are based on, and named after, bytes, 8-bit blocks of bits with which many computer users are familiar. Bytecoded languages use bytecodes as an interim form of information representation, an abstraction, between source code and object (machine) code, and use two conversion steps (transformations) when running: 1) source code is interpreted into bytecodes, 2) then bytecodes are run on an interpreter called a virtual machine (VM) which generates object code which is executed.
This strategy gives two main benefits:
1) Compactness: bytecodes are a very compact representation.
2) High portability: source code can be written once and then run on any platform for which a VM exists. This inspired the Java slogan: Write once, run anywhere.
Bytecode programs are usually run on, and executed by, bytecode interpreters, but sometimes they are compiled by bytecode compilers, or by dynamic or JIT (Just In Time) compilers, which are synonyms. These act much like interpreters, but compile (not interpret) source code as they run. They can turn interpreted languages into compiled ones, and can be written for any language.
On this page, languages are arranged in two groups and levels: 1) Top group: languages for which there are more than one instance of a language of this name/type, a language family. 2) Bottom group: specific languages which have their own directory category.