When it comes to making a program for a computer, while there are a plethora of languages and ways to make an application, there's only two types of both applications and languages. This post will cover what those types are.
Programming Language Types
There are two basic types of programming languages: low level and high level.
Low level languages are the "hardware" languages, which are typically defined into two more types:
Machine language, which are literally the binary values being fed into a machine. A programmer can either write out the 0s and 1s or some other representation of numerical values, typically hexadecimal. Machine language consists of primarily two parts:
- An opcode, which maps a number to an operation. e.g., 1 is add, 2 is subtract, 3 is jump somewhere else
- An operand, which tells which datum or data to operate on.
- Assembly language, which gives the opcodes a mnemonic name and allows for operands to have names as well, but otherwise it can map directly to machine language.
Low level languages tend to be architecture specific. Even if two architectures contain the same operations, their opcodes may be different. And even if two architectures use the same assembly language mnemonic, they may handle it differently, especially with the operands. Due to the architecture specific nature, it's rare to write programs by hand using a low level language. It's typically reserved for architecture specific optimizations or if you need to get down into the depths of software baked in to the hardware. But the advantages to using low level languages is that this is the fastest your program will operate since it's directly talking to the hardware.
High level languages attempt to provide a human readable way of representing program code. So instead of writing mov 10, x, you can write x = 10 or x is 10. This typically comes at the speed due to needing to translate what the higher level language is trying to accomplish. Also depending on the language itself, it may bar you from some higher performance features that are handy if used correctly, but disastrous if used incorrectly. One could also argue that some high level languages are more "mid-level" languages, in that they lack enough recent concepts and readily map to assembly language. For example, C is sometimes dubbed as a "mid-level" language because of how bare-bones it is and how easily it compiles into a low level language. This is in contrast to say Python, which comes with many more features and it doesn't readily compile into a low level language.
No matter the language type, all of them except for machine code have to be turned into some form machine readable code. Though machine code may be represented as a text file such as Intel HEX, which has to be read by some loader to be runnable. For those looking for specific terms, if the source code being turned into machine code is assembly language, the program that does this is called an assembler. If the source code is a high level language, there are various types of converting it closer to machine readable code, with the three main types being:
- Ahead-of-Time compiling (AoT): the source code is compiled into an executable for loading and running. This generally allows for the fastest execution. Examples of normally AoT compiled languages are C and C++.
- Just-In-Time compiling (JIT): the source code is compiled into an intermediate form, then when the program is run, this intermediate form is compiled to the machine code as needed. Examples of normally JIT compiled languages are Java and the .NET family (C# and VB.NET)
Computer Language Types
You might be familiar with a lot of things that are "languages" that tell a computer what do, but these break down into various categories based on what their intended role is. The main ones you usually encounter are:
- Programming Language: This describes, obviously enough, computer programs. While this is a broad description, I tend to think of a program as something that runs directly on the hardware. i.e., the instructions represent something the actual hardware is capable of doing.
- Configuration Languages: These are data containers that store well, configurations that programs use to set parameters. A modern example that is popular is the JSON format, due to being human readable and easily turned into binary data.
- Markup Languages: This describes a document and how it should look. The name comes from "marking up" a paper in editing.
For all intents and purposes, you could argue all of these are some sort of "programming" language since you are telling a computer what to do. But if you want to be a snob about languages being "real programming" languages, if a language is Turing Complete, then that means it can execute any program conceivable. Virtually all programming and scripting languages are Turing complete. So what's a non-Turing complete language? Configuration and markup languages, as well as some query based languages like SQL, and some other ways to change the behavior of an action such as regular expressions.
Computer Application Types
Computer applications break down into two main types:
An application program, or just application, provides a service to the user. Examples include web browsers, document editors, and media players. As you might guess, this is where the term "app" comes from. While applications today are typically written in higher level languages, earlier ones had to be written in lower level languages.
A system program provides a service to applications. Examples include firmware, hardware drivers, and to a strong degree, operating systems. They typically do not contain any sort of user facing interface, relying on the user to write into configuration files to change the behavior of the application. If a system program does contain a user interface, it may be the only program running on the system (such as in UEFI/BIOS settings) or it may be decoupled from the core components of the program itself (such as the GUI environment of the OS kernel).