Языки программирования делят сразу по нескольким признакам, и у каждого языка своя комбинация. Главные признаки: уровень абстракции, способ исполнения, типизация и парадигма, к ним добавляют назначение и поколение. Python, например, высокоуровневый, исполняется через байт-код, типизация у него динамическая и строгая, а парадигм он поддерживает несколько.
Ниже каждый признак разобран на коротких примерах кода с настоящим выводом, а в конце есть сводная таблица на 12 языков. Если вы выбираете первый язык для работы, а не готовитесь к уроку информатики, загляните ещё в разбор какой язык программирования выбрать: там языки разложены по специализациям.
Что такое язык программирования

Самое короткое определение даёт ГОСТ 28397-89 «Языки программирования. Термины и определения»: это «язык, предназначенный для представления программ». Если простыми словами, язык программирования это набор правил, по которым человек записывает команды так, чтобы машина поняла их однозначно.
У любого языка есть две стороны:
- синтаксис отвечает на вопрос «как писать»: ключевые слова, скобки, отступы, знаки операций;
- семантика отвечает на вопрос «что это значит»: какое действие выполнит компьютер.
Процессор понимает только машинный код, то есть последовательности нулей и единиц. Всё остальное переводят в машинный код программы-трансляторы: компилятор или интерпретатор.
Насколько далеко язык стоит от машинного кода и как именно идёт перевод, определяет первые два признака классификации. С них и начнём.
Признаки классификации в одной таблице
Сначала общая карта, подробности по каждой строке ниже.
| Признак | Какие бывают | Примеры |
|---|---|---|
| Уровень абстракции | низкоуровневые, высокоуровневые (иногда выделяют средний уровень) | ассемблер, C, Python |
| Способ исполнения | компилируемые, интерпретируемые, с байт-кодом и виртуальной машиной | C, Bash, Java |
| Типизация: когда проверяются типы | статическая, динамическая | Java, Python |
| Типизация: насколько строго | сильная (строгая), слабая | Python, JavaScript |
| Парадигма | императивные (процедурные, объектно-ориентированные), декларативные (функциональные, логические) | C, Java, Haskell, Prolog |
| Назначение | универсальные, предметно-ориентированные | Python, SQL |
| Поколение | от первого (1GL) до пятого (5GL) | машинный код, Fortran, Prolog |
Признаки не исключают друг друга. Классификация языков программирования устроена как набор осей, и на каждой оси язык занимает своё место. Если сказать «Java компилируемый» и на этом остановиться, из шести признаков языка вы назовёте один.
Канал основателя Checkroi Вани Буявца3 700 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединитьсяПо уровню абстракции: низкоуровневые и высокоуровневые языки
Уровень показывает, насколько язык близок к устройству процессора. Чем ниже уровень, тем больше программист думает о регистрах и ячейках памяти. Чем выше, тем больше он думает о самой задаче.
Низкоуровневые языки
Это машинный код и ассемблер. В ассемблере каждая строка почти один в один соответствует команде процессора. Поэтому программа, написанная под процессоры ARM, не запустится на x86 без переписывания.
Вот функция сложения двух чисел на C:
int add(int a, int b) {
return a + b;
}
А вот во что её превращает компилятор clang 17 на Mac с процессором Apple (архитектура arm64), команда clang -O2 -S add.c, служебные строки убраны:
_add:
add w0, w1, w0
ret
Две команды процессора: сложить регистры w1 и w0, положить результат в w0 и вернуться. Так выглядит язык низкого уровня: переменных с именами нет, есть регистры и инструкции конкретного процессора.
Высокоуровневые языки
Python, Java, JavaScript, C#, Go, PHP. В них есть переменные, функции, списки и классы, а регистрами и памятью занимается транслятор. Одна и та же программа на Python запускается на Windows, macOS и Linux без правок, поэтому курсы по Python часто советуют как первый шаг в программирование.
Fortran был одним из первых языков высокого уровня. В истории IBM записано, что его коммерческий выпуск состоялся в 1957 году, главным автором языка был Джон Бэкус, а его команда написала первый оптимизирующий компилятор.
Где в этой схеме C
C часто называют языком среднего уровня. По форме он высокоуровневый: в нём есть функции, циклы и типы. Но он даёт работать с адресами памяти напрямую через указатели, поэтому на C пишут ядра операционных систем, драйверы и прошивки.
Как выглядит первая программа на нём и как её собрать, разобрано в статье язык C для начинающих.
По способу исполнения: компилируемые и интерпретируемые

Программу на языке высокого уровня всё равно нужно перевести в команды процессора. Сделать это можно заранее или прямо во время работы, и тут есть три схемы.
- Компиляция. Компилятор один раз переводит весь исходный код в исполняемый файл, дальше программа работает без компилятора. Так устроены C, C++, Go и Rust. Какой компилятор C поставить на свою систему, разобрано отдельно.
- Интерпретация. Интерпретатор читает программу и выполняет её по ходу, исходник нужен при каждом запуске. Классический пример: скрипты командной оболочки Bash.
- Байт-код и виртуальная машина. Исходник компилируется в промежуточный код, а его исполняет виртуальная машина. Так работают Java (байт-код для JVM), C# (промежуточный язык для .NET) и Python.
Чем схемы отличаются для того, кто пишет и запускает программу:
| Компилируемые | Интерпретируемые | |
|---|---|---|
| Что нужно для запуска | только готовый исполняемый файл | установленный интерпретатор |
| Перенос на другую систему | пересобрать под эту платформу | тот же исходник, нужен интерпретатор для неё |
| Скорость | обычно выше | обычно ниже |
| Цикл «поправил и проверил» | после каждой правки сборка | запуск сразу |
Почему Python не совсем интерпретируемый
В учебниках Python стоит в графе «интерпретируемые», и это упрощение. Стандартная реализация CPython сначала компилирует код в байт-код и только потом его исполняет. Байт-код можно увидеть модулем dis:
import dis
def add(a, b):
return a + b
dis.dis(add)
Вывод в Python 3.14 (если интерпретатора ещё нет, вот как скачать и установить Python):
3 RESUME 0
4 LOAD_FAST_BORROW_LOAD_FAST_BORROW 1 (a, b)
BINARY_OP 0 (+)
RETURN_VALUE
В другой версии Python команды будут называться иначе. Документация модуля dis называет байт-код деталью реализации интерпретатора CPython и не гарантирует, что он не изменится между версиями.
Компилируется язык или интерпретируется, решает его реализация. У Python есть CPython с байт-кодом и PyPy с JIT-компиляцией на лету. Современные движки JavaScript в браузерах тоже компилируют код во время работы. Поэтому на вопрос «Python компилируемый или интерпретируемый?» точный ответ такой: смотря чем вы его запускаете.
По типизации: статическая и динамическая, сильная и слабая
Типизация описывает, как язык обращается с типами данных: числами, строками, логическими значениями. Здесь две разные оси, и их постоянно путают.
Статическая и динамическая типизация
При статической типизации тип каждой переменной известен до запуска, и компилятор проверяет, что типы сходятся. В спецификации Java это сказано прямо: «every variable and every expression has a type that is known at compile time», то есть тип каждой переменной и каждого выражения известен на этапе компиляции.
Попробуем положить строку в целочисленную переменную на C:
int main(void) {
int x = "hello";
return 0;
}
Компилятор clang 17 останавливает сборку, программа даже не появляется:
typed.c:2:9: error: incompatible pointer to integer conversion initializing 'int' with an expression of type 'char[6]' [-Wint-conversion]
При динамической типизации тип принадлежит значению, а не переменной, и проверяется во время работы. Одной и той же переменной в Python можно присвоить сначала число, потом строку:
x = 5
print(type(x))
x = "пять"
print(type(x))
<class 'int'>
<class 'str'>
Аннотации типов в Python этого не меняют. В PEP 484, который их ввёл, сказано, что во время выполнения типы не проверяются и Python останется динамически типизированным языком. Проверим:
def double(n: int) -> int:
return n * 2
print(double("ха"))
хаха
Функция ждала число, получила строку и удвоила её. Ошибку здесь найдёт только внешний проверяльщик типов вроде mypy, сам интерпретатор её не выдаст. Mypy обычно подключают прямо в редакторе, как это сделать, показано в инструкции как настроить VS Code для Python.
Сильная и слабая типизация
Вторая ось отвечает на вопрос, разрешает ли язык смешивать типы без явного указания. Сильная, или строгая, типизация запрещает складывать строку с числом. Слабая сама приводит одно к другому.
Одно и то же выражение на Python:
print("1" + 1)
TypeError: can only concatenate str (not "int") to str
И на JavaScript в Node.js 26:
console.log("1" + 1)
console.log("5" - 2)
11
3
Python отказался складывать. JavaScript при сложении превратил число в строку и склеил их, а при вычитании, наоборот, превратил строку в число. В справочнике MDN JavaScript назван слабо типизированным языком, который при несовпадении типов делает неявное преобразование вместо ошибки.
Четыре сочетания
Оси независимы, поэтому получается таблица два на два:
| Сильная | Слабая | |
|---|---|---|
| Статическая | Java, Go, Rust, Haskell | C, C++ |
| Динамическая | Python, Ruby | JavaScript, PHP |
Граница между сильной и слабой типизацией размыта сильнее, чем между статической и динамической. C относят к слабым: строку в число он не пустит, но дробное число в целую переменную превратит, отбросив дробную часть:
#include <stdio.h>
int main(void) {
int x = 3.9;
printf("%d\n", x);
return 0;
}
3
Компилятор только предупреждает (-Wliteral-conversion), а программа собирается и печатает 3. Как C приводит типы в арифметике, показано в разборе операторов и выражений в C.
Особняком стоит TypeScript. На официальном сайте он описан как «JavaScript with syntax for types», то есть JavaScript со статическими типами, и код на нём превращается в обычный JavaScript. Подробнее в разборе что такое TypeScript.
По парадигме: императивные и декларативные языки

Парадигмой называют стиль, в котором язык предлагает описывать решение. Крупных групп две. В школьных учебниках информатики ту же пару называют процедурными и непроцедурными языками.
- Императивная. Программа состоит из последовательности команд «сделай это, потом то». Сюда входят процедурное программирование (C, Pascal) и объектно-ориентированное (Java, C#).
- Декларативная. Программа описывает, какой нужен результат, а как его получить, решает система. Сюда входят функциональные языки (Haskell, Lisp), логические (Prolog) и языки запросов вроде SQL.
Одна задача в трёх стилях
Задача: сложить суммы заказов дороже 500 рублей. Императивно на Python мы сами заводим счётчик и проходим по списку:
prices = [1200, 800, 450, 3000]
total = 0
for p in prices:
if p > 500:
total += p
print(total)
5000
В функциональном стиле изменяемой переменной нет, есть фильтр и сумма:
prices = [1200, 800, 450, 3000]
print(sum(filter(lambda p: p > 500, prices)))
5000
На SQL мы только говорим, что хотим получить, а порядок действий выбирает база данных:
SELECT SUM(price) FROM orders WHERE price > 500;
5000
Результат одинаковый. Разница в том, кто отвечает за порядок шагов: в императивном стиле программист, в декларативном система.
ООП, функциональное и логическое программирование
- Объектно-ориентированное программирование строит программу из объектов, у которых есть данные и методы. С чего начать, показано в статье ООП простыми словами, а четыре принципа разобраны в материале принципы ООП.
- Функциональное программирование собирает программу из функций без побочных эффектов: функция получает данные и возвращает результат, ничего вокруг не меняя.
- Логическое программирование описывает факты и правила, а ответ ищет сама система. Как это выглядит на практике, видно в разборе языков Prolog и Lisp.
Большинство современных языков мультипарадигменные: в Python есть и классы, и lambda, в JavaScript тоже. Поэтому язык обычно относят к той парадигме, под которую его задумывали: Java к объектно-ориентированным, Haskell к функциональным, Prolog к логическим.
По назначению: универсальные и предметно-ориентированные
На универсальном языке можно написать программу любого рода: Python, Java, C#, Go. Предметно-ориентированный язык (его ещё называют DSL) создан для одной области:
- SQL для запросов к базам данных, например команда SELECT в MySQL;
- R и MATLAB для статистики и инженерных расчётов;
- VBA для автоматизации офисных программ, на нём пишут макросы в Excel;
- GLSL и HLSL для программ, которые выполняет видеокарта.
Визуальные языки
В визуальных языках программу собирают из блоков мышкой, а не пишут текстом. Самый известный пример называется Scratch. По данным Scratch Foundation, его разработали в MIT Media Lab в 2007 году под руководством профессора Митчела Резника, а сам фонд называет Scratch крупнейшим в мире творческим сообществом для детей.
Блок «повторить 10 раз» в Scratch работает как цикл for в Python, блок «если … то» как if. По классификации Scratch высокоуровневый, императивный и учебный: взрослые программы на нём не пишут, зато логику алгоритмов он показывает наглядно.
Можно ли считать HTML и CSS языками программирования
Нет. HTML относится к языкам разметки: он сообщает браузеру, где на странице заголовок, абзац и картинка, но не умеет считать и проверять условия. Спецификация WHATWG так его и называет: «the World Wide Web’s core markup language», основной язык разметки веба.
CSS описывает стили: цвета, шрифты и расположение блоков. Программ в привычном смысле на них не пишут, потому что в них нет переменных, условий и циклов.
Но без HTML и CSS не обходится ни один веб-разработчик, а JavaScript на странице работает как раз с HTML-разметкой. Базовый набор собран в статье основные теги HTML.
По поколениям: от 1GL до 5GL
Эту классификацию чаще всего спрашивают на уроках информатики. Она историческая и условная: в разных учебниках границы поколений проводят по-разному.
| Поколение | Что это | Примеры |
|---|---|---|
| 1GL | машинный код: команды процессора в двоичном виде | коды конкретного процессора |
| 2GL | ассемблер: мнемоники вместо двоичных кодов, привязка к процессору | ассемблер x86, ARM |
| 3GL | универсальные языки высокого уровня | Fortran, C, Pascal, BASIC, Java, Python |
| 4GL | предметно-ориентированные языки, ближе к естественному | SQL, языки генераторов отчётов |
| 5GL | описание задачи и ограничений вместо алгоритма | Prolog |
На практике почти всё, на чём пишут сегодня, относится к третьему поколению. Языки школьной программы тоже оттуда: Паскаль и BASIC.
Сводная таблица: 12 языков по всем признакам
Таблица пригодится для доклада или шпаргалки. Колонку «исполнение» мы заполняли по стандартной, самой распространённой реализации языка.
| Язык | Уровень | Исполнение | Типизация | Основная парадигма |
|---|---|---|---|---|
| Ассемблер | низкий | переводится в машинный код | типов нет | императивная |
| C | высокий, близко к железу | компиляция | статическая, слабая | процедурная |
| C++ | высокий | компиляция | статическая, слабая | мультипарадигменная, ООП |
| Java | высокий | байт-код для JVM | статическая, сильная | ООП |
| C# | высокий | промежуточный код для .NET | статическая, сильная | ООП |
| Go | высокий | компиляция | статическая, сильная | императивная |
| Python | высокий | байт-код CPython | динамическая, сильная | мультипарадигменная |
| JavaScript | высокий | компиляция на лету в движке | динамическая, слабая | мультипарадигменная |
| PHP | высокий | интерпретация | динамическая, слабая | мультипарадигменная |
| Haskell | высокий | компиляция | статическая, сильная | функциональная |
| SQL | высокий, предметный | запрос выполняет СУБД | типы задаёт схема таблиц | декларативная |
| Prolog | высокий | интерпретация | динамическая | логическая |
Пометка «мультипарадигменная» стоит у Python, JavaScript и C++ потому, что они с самого начала поддерживают несколько стилей. Спорить, объектный Python или функциональный, бесполезно: на нём пишут и так, и так.
Как самому определить место языка в классификации
Если язык незнакомый, хватит пяти вопросов:
- Нужна ли сборка перед запуском? Если есть отдельный шаг компиляции и готовый файл, язык компилируемый. Если код запускается сразу из исходника, он интерпретируемый или с байт-кодом.
- Проверяет ли типы компилятор до запуска? Если да, типизация статическая, если нет, динамическая.
- Что будет при
"1" + 1? Ошибка означает сильную типизацию, какой-то результат означает слабую. - Вы пишете шаги или описываете результат? Шаги пишут в императивной парадигме, результат описывают в декларативной.
- Можно ли написать на нём любую программу? Если да, он универсальный, если нет, предметно-ориентированный.
Проверим на Ruby. Сборки нет, файл запускается командой ruby script.rb. Тип переменной не объявляется. Сложение строки с числом даёт ошибку:
ruby -e 'puts "1" + 1'
-e:1:in `+': no implicit conversion of Integer into String (TypeError)
Код пишется шагами, всё в языке устроено как объекты, писать на нём можно что угодно. Итог: высокоуровневый, интерпретируемый, с динамической сильной типизацией, объектно-ориентированный, универсальный.
Где ошибаются, когда рассказывают о видах языков
- Путают статическую типизацию со строгой. Это разные оси: C статический, но слабый, Python динамический, но сильный.
- Называют HTML языком программирования. Это язык разметки, условий и вычислений в нём нет.
- Пишут «Java интерпретируемый» или «Java компилируемый» без оговорок. Java компилируется в байт-код, а байт-код исполняет виртуальная машина JVM. Как начать писать на Java, показано в статье про Eclipse IDE.
- Считают, что аннотации делают Python статическим. Интерпретатор аннотации не проверяет, пример с
double("ха")выше это показывает. - Кладут язык в одну клетку. Признаков минимум четыре, и для полного описания нужен каждый.
Где изучать программирование системно
Классификация помогает понять, чем языки отличаются, но писать код она не учит. Дальше нужен один язык и много практики. С чего начинают новички, разобрано в подборке языков программирования для начинающих, а план самостоятельной учёбы есть в статье как учить языки программирования самостоятельно.
Если удобнее учиться с наставником и домашними заданиями, в каталоге собраны курсы по программированию с ценами, длительностью и отзывами учеников:
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| Нейросети для рабочих задач Перейти на сайт курса | 31 290 ₽ | - | 1 месяц | Обзор курса | |
| Нейросети. Практический курс Перейти на сайт курса | 74 900 ₽ | - | 3 месяца | Обзор курса | |
| Frontend-разработчик с нуля Перейти на сайт курса | 107 100 ₽ | 5385 ₽/мес. | 10 месяцев | Обзор курса | |
| Fullstack-разработчик на Python Перейти на сайт курса | 137 000 ₽ | 7125 ₽/мес. | 21 месяц | Обзор курса | |
| Профессия «Python-разработчик» Перейти на сайт курса | 157 335 ₽ | 5987 ₽/мес. | 10 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по программированию и IT




