Низкоуровневый язык программирования (язык программирования низкого уровня) — язык программирования, близкий к программированию непосредственно в машинных кодах используемого реального или виртуального (например, байт-код, IL) процессора. Для обозначения машинных команд обычно применяется мнемоническое обозначение. Это позволяет запоминать команды не в виде последовательности двоичных нулей и единиц, а в виде осмысленных сокращений слов человеческого языка (обычно английских).
Иногда одно мнемоническое обозначение соответствует целой группе машинных команд, выполняющих одинаковое действие над различными операндами. Кроме машинных команд языки программирования низкого уровня могут предоставлять дополнительные возможности, такие как макроопределения (макросы). При помощи директив есть возможность управлять процессом трансляции машинных кодов, предоставляя возможность заносить константы и литеральные строки, резервировать память под переменные и размещать исполняемый код по определенным адресам. Часто эти языки позволяют работать вместо конкретных ячеек памяти с переменными.
Как правило, низкоуровневые языки используют особенности конкретного семейства процессоров. Общеизвестный пример низкоуровневого языка — язык ассемблера, хотя правильнее говорить о группе языков ассемблера. Более того, для одного и того же процессора может существовать несколько видов языка ассемблера, совпадающих в машинных командах, но различающихся набором дополнительных функций (директив и макросов).
Также к языкам низкого уровня условно можно причислить CIL, применяемый в платформе Microsoft .NET,
Форт