Overview

Different languages have different purposes, so it makes sense to talk about different kinds, or types, of languages. Some types are:
  • Machine languages — interpreted directly in hardware
  • Assembly languages — thin wrappers over a corresponding machine language
  • High-level languages — anything machine-independent
  • System languages — designed for writing low-level tasks, like memory and process management
  • Scripting languages — generally extremely high-level and powerful
  • Domain-specific languages — used in highly special-purpose areas only
  • Visual languages — non-text based
  • Esoteric languages — not really intended to be used 
These types are not mutually exclusive: Perl is both high-level and scripting; C is considered both high-level and system.
Other types people have identified: Toy, Educational, Very High-Level, Compiled, Interpreted, Free-Form, Curly Brace, Applicative, Von Neumann, Expression-Oriented, Persistent, Concurrent, Glue, Intermediate, Quantum, Hybrid.

Machine Code

Most computers work by executing stored programs in a fetch-execute cycle. Machine code generally features
  • Registers to store values and intermediate results
  • Very low-level machine instructions (add, sub, div, sqrt)
  • Labels and conditional jumps to express control flow
  • A lack of memory management support — programmers do that themselves 

Assembly Language

An assembly language is basically just a simplistic encoding of machine code into something more readable. It does add labeled storage locations and jump targets and subroutine starting addresses, but not much more.

High-Level Languages

A high-level language gets away from all the constraints of a particular machine. HLLs have features such as:
  • Names for almost everything: variables, types, subroutines, constants, modules
  • Complex expressions (e.g. 2 * (y^5) >= 88 && sqrt(4.8) / 2 % 3 == 9)
  • Control structures (conditionals, switches, loops)
  • Composite types (arrays, structs)
  • Type declarations
  • Type checking
  • Easy ways to manage global, local and heap storage
  • Subroutines with their own private scope
  • Abstract data types, modules, packages, classes
  • Exceptions 

System Languages

System programming languages differ from application programming languages in that they are more concerned with managing a computer system rather than solving general problems in health care, game playing, or finance. System languages deal with:
  • Memory management
  • Process management
  • Data transfer
  • Caches
  • Device drivers
  • Operating systems

Scripting Languages

Scripting languages are used for wiring together systems and applications at a very high level. They are almost always extremely expressive (they do a lot with very little code) and usually dynamic (the compiler does little, the run-time system does almost everything).

Esoteric Languages

An esoteric language is one not intended to be taken seriously. They can be jokes, near-minimalistic, or despotic (purposely obfuscated or non-deterministic).