プログラミング言語(programming language)は、コンピューターに特定のタスクを実行させるために使用できる人工言語です。一般的なプログラミング言語とみなされるためには、計算機的に完全であること、つまりチューリング完全であることが必要です。ただし、データベースクエリー言語やドメイン固有言語など、計算完全でない言語もプログラミング言語とみなすのが一般的です。
低水準プログラミング言語( ''low-level programming language'' )は、非常に基本的で機械語( ''machine's native language'' )に近い言語です。低水準プログラミング言語は、ソフトウェアの構成言語( ''building block language'' )と考えることができます。アセンブリコードは最も一般的な低レベル言語であり、機械語に組立てるための翻訳はほとんど必要ありません(バイナリを構成する1と0のこと）。
高水準プログラミング言語( ''high-level programming language'' )は、人間のコミュニケーションレベルに近いものです。この方式では、プログラマーに代わってコンパイラがより多くの作業を行います。言語が私たちの日常会話に近ければ近いほど、より複雑な問題を心配するのは容易になります。しかし、これは行き過ぎると大変なことになります。言語があまりにも英語（あるいは他の自然言語）に似ていると、複雑なプログラムを作るのが難しくなることがあるのです。なぜなら、冗長な言語は読むのに時間がかかるため、理解するのに多くの時間がかかってしまうからです。
機械語( ''machine code'' )は、コンピューターが直接理解できる言語です。機械語は2進数の列で構成されています。直接プログラムすることはほとんどありませんが、普通のコンピューターで実行するものは、まず機械語に翻訳する必要があります。機械語は、コンピューターのアーキテクチャーによって異なる場合があります。
アセンブリ言語( ''Assembly language'' )は、機械語をより人間に読みやすいように表現したもので、マシン命令を2進数ではなくニーモニックで表現しています。アセンブリ言語は、プログラムが自己修正しない限り、機械語と1対1の関係にあります。アセンブリプログラムをコンピューターで実行する前に、機械語に変換する必要があります。この変換を行うプログラムをアセンブラといいます。コンピューターの初期にはアセンブリ言語が広く使われていたが、現在では主にプログラムの非常に時間のかかる部分、オペレーティングシステムの中核部分、スマートカードのチップのような非常に小さなコンピューターに使われています。
機械語は第1世代、アセンブリ言語は第2世代のプログラミング言語と呼ばれています。算術式、ループ、関数など、プログラマーが機械語命令を直接扱わずに済むような構造を持つプログラミング言語を第3世代プログラミング言語といいます。
以前は、高水準・領域特化型プログラミング言語を第4世代言語、エキスパートシステムを第5世代言語と呼ぶことが多くありました。その後、Common Lispなど、非常に高度な汎用プログラミング言語が多数登場し、この区別は曖昧になっています。現在では、エキスパート・システムはほとんど使われていません。
コンピューターでプログラムを実行するには、まず機械語に翻訳( ''translate'' )し、翻訳された機械語を実行するか、インタープリタと呼ばれる別のプログラムによってシミュレーションする必要があります。
コンパイラは、ソースプログラミング言語( ''source programming language'' )と呼ばれるプログラミング言語を、デスティネーション言語( ''destination language'' )と呼ばれる別のプログラミング言語に翻訳するプログラムです。通常、ソースプログラミング言語は高級言語であり、デスティネーション言語は機械語です。インタープリターは、ソースプログラミング言語をバイトコード( ''byte code'' )と呼ばれる中間形式にコンパイルしてから解釈することを要求する場合があります。これは、より低レベルの言語であり、インタープリターを書くのが容易です。Javaでは、コンパイルは別工程で行われますが、インタプリタと一体で行われる場合もあります。PerlやPythonがその例です。CommonLispは例外的にインタプリタとコンパイルの両方を行います。
型システム( ''type systems'' )には2つの軸があります。動的か静的か、強いか弱いかです。
強い型付け言語では、オブジェクトの型が一致しない場合、そのオブジェクトに対する操作を許さしません。CommonLisp、Q-base、Pythonなどがその例です。
一方、弱い型付け言語では、そのような操作は可能です。CやC++がその例です。
動的型付け言語は型と値を結びつけます。静的型付け言語では型は変数に束縛されます。