Устройство современных ЭВМ основано на принципах двоичной арифметики, т.е. для представления любой информации в компьютере используются всего две цифры – 0 и 1. Командами для управления ЭВМ служат те же битовые последовательности. Поэтому наиболее естественным способом управления ЭВМ является кодирование информации в виде всё тех же битовых последовательностей – машинных команд. Именно такие программы составлялись для первых ЭВМ на заре развития вычислительной техники. Очевидно, что программирование в машинных кодах малоэффективно, очень трудоемко, требует досконального знания системы команд машины и большого внимания.
Первая попытка оптимизации программирования в двоичных кодах заключалась в разработке специальной системы кодирования двоичных машинных команд многобуквенными мнемоническими сокращениями. Т.е. каждой машинной команде сопоставлялось буквенное обозначение (MOV, XOR и т.д.) Программирование в мнемонических командах удобнее для программиста, поскольку их легче запоминать и использовать, чем числовые коды. Кроме того, одна мнемоническая команда может объединять несколько машинных команд, что существенно облегчает программирование. Но при этом возникает проблема перевода мнемонических команд, которые процессор не может выполнить, в машинные коды.
Для этого используются специальные программы-трансляторы – ассемблеры. Они преобразуют мнемонический код в готовую к выполнению двоичную программу. Т.к. ассемблеры тесно связаны с машинными командами, а у процессоров различной архитектуры (x86, x86_64, SPARC, IA-64, …) наборы команд различаются, то данные языки являются машинно-зависимыми языками программирования низкого уровня. Несмотря на преимущества ассемблеров перед машинными кодами, их использование является трудоемким занятием и требует специальной квалификации. Сейчас они, в основном, применяются при написании программ, для которых жизненно важны скорость работы и объем задействованной памяти: драйверы; ПО для микроконтроллеров; вирусы; трансляторы; отдельные участки ОС и программ, скорость работы которых нужно оптимизировать.
Дальнейшим развитием стали языки программирования высокого уровня, такие, как ФОРТРАН, БЕЙСИК, ПАСКАЛЬ, СИ и др. В них сделана попытка сориентировать задачу программирования на людей, а не на машину. В языках высокого уровня программа состоит из операторов – инструкций, схожих с выражениями на английском языке. Такие языки позволяют программисту независимо от устройства конкретной вычислительной машины описывать условия и циклы, структуры данных и массивы, строить сложные выражения с использованием привычных символов математических и логических операций. Как и в случае ассемблеров, программы на языках высокого уровня не могут быть выполнены непосредственно, сначала их требуется преобразовать в эквивалентную последовательность команд машинного кода с помощью транслятора и компоновщика.