Классификация языков программирования: 6 признаков и таблица на 12 языков

Языки программирования делят по уровню, способу исполнения, типизации, парадигме, назначению и поколениям, и у каждого языка своя комбинация.

Разбираем каждый признак на коротких примерах кода с выводом: ассемблер из C, байт-код Python, «"1" + 1» в Python и JavaScript, одна задача в трёх парадигмах. В конце сводная таблица на 12 языков.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 3090 статей автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3744 экспертных мнения Подписаться на Телеграм-канал
Обложка: Классификация языков программирования: 6 признаков и таблица на 12 языков

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

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

CheckroiCheckroiПодборка курсов программирования и IT1562 курса • 72 школыСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Что такое язык программирования

Рой раскладывает карточки с названиями языков программирования по группам

Самое короткое определение даёт ГОСТ 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 компилируемый или интерпретируемый?» точный ответ такой: смотря чем вы его запускаете.

CheckroiCheckroiПодборка курсов по Python568 курсов • 51 школаСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

По типизации: статическая и динамическая, сильная и слабая

Типизация описывает, как язык обращается с типами данных: числами, строками, логическими значениями. Здесь две разные оси, и их постоянно путают.

Статическая и динамическая типизация

При статической типизации тип каждой переменной известен до запуска, и компилятор проверяет, что типы сходятся. В спецификации 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 к логическим.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 700 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

По назначению: универсальные и предметно-ориентированные

На универсальном языке можно написать программу любого рода: 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.

CheckroiCheckroiПодборка курсов по HTML207 курсов • 42 школыСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

По поколениям: от 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. Нужна ли сборка перед запуском? Если есть отдельный шаг компиляции и готовый файл, язык компилируемый. Если код запускается сразу из исходника, он интерпретируемый или с байт-кодом.
  2. Проверяет ли типы компилятор до запуска? Если да, типизация статическая, если нет, динамическая.
  3. Что будет при "1" + 1? Ошибка означает сильную типизацию, какой-то результат означает слабую.
  4. Вы пишете шаги или описываете результат? Шаги пишут в императивной парадигме, результат описывают в декларативной.
  5. Можно ли написать на нём любую программу? Если да, он универсальный, если нет, предметно-ориентированный.

Проверим на 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
Нейросети для рабочих задач
Перейти на сайт курса
SkillboxSkillbox31 290 ₽ - 1 месяцОбзор курса
Нейросети. Практический курс
Перейти на сайт курса
SkillboxSkillbox74 900 ₽ - 3 месяцаОбзор курса
Frontend-разработчик с нуля
Перейти на сайт курса
НетологияНетология107 100 ₽5385 ₽/мес.10 месяцевОбзор курса
Fullstack-разработчик на Python
Перейти на сайт курса
НетологияНетология137 000 ₽7125 ₽/мес.21 месяцОбзор курса
Профессия «Python-разработчик»
Перейти на сайт курса
SkillboxSkillbox157 335 ₽5987 ₽/мес.10 месяцевОбзор курса

Больше программ — в полном каталоге курсов по программированию и IT

Часто задаваемые вопросы

Какие бывают языки программирования?

Языки делят по нескольким признакам сразу: по уровню (низкоуровневые и высокоуровневые), по способу исполнения (компилируемые, интерпретируемые, с байт-кодом), по типизации (статическая или динамическая, сильная или слабая), по парадигме (императивные и декларативные), по назначению (универсальные и предметно-ориентированные) и по поколениям от 1GL до 5GL. У каждого языка своя комбинация признаков.

Чем отличаются языки программирования высокого и низкого уровня?

Язык низкого уровня, то есть машинный код или ассемблер, работает с регистрами и командами конкретного процессора, и программа привязана к его архитектуре. В языке высокого уровня, например Python или Java, есть переменные, функции и классы, а перевод в команды процессора берёт на себя компилятор или интерпретатор.

Python компилируемый или интерпретируемый язык?

Стандартная реализация CPython сначала компилирует код в байт-код, а потом исполняет его интерпретатором, поэтому чисто интерпретируемым Python назвать нельзя. Есть и реализация PyPy с компиляцией на лету. Способ исполнения зависит от реализации, а не от самого языка.

HTML считается языком программирования?

Нет, HTML относится к языкам разметки: он описывает, где на странице заголовок, абзац и картинка, но не умеет считать и проверять условия. CSS тоже не язык программирования, а язык стилей. Логику страницы пишут на JavaScript.

Чем статическая типизация отличается от строгой?

Это две разные оси. Статическая типизация означает, что типы проверяются до запуска, при компиляции, как в Java или C. Строгая (сильная) означает, что язык не смешивает типы сам: в Python «"1" + 1» даёт ошибку TypeError, а в слабо типизированном JavaScript получится строка «11». Python динамический и строгий, C статический и слабый.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!