Языки программирования: виды, характеристики и как выбрать первый

Языки программирования: виды, характеристики и как выбрать первый Полезное

Язык программирования — это формальная система правил, по которым человек записывает инструкции для компьютера, а тот их выполняет. У языка есть алфавит (набор допустимых символов), синтаксис (правила записи конструкций) и семантика (что именно эти конструкции означают при выполнении).

Языков много, и их удобно раскладывать по нескольким независимым осям: как код превращается в машинные команды, насколько язык близок к железу, какой стиль программирования поддерживает и как проверяет типы данных. Ниже разберем эти оси по очереди, сведем языки в таблицы по задачам и покажем, как новичку выбрать первый язык.

Низкоуровневые и высокоуровневые языки

Первая ось — близость к архитектуре процессора.

Низкоуровневые языки работают близко к железу и учитывают устройство конкретного процессора. К ним относят машинный код (двоичные команды) и язык ассемблера, где каждая инструкция почти напрямую соответствует команде процессора. Плюс — точный контроль над памятью и скоростью; минус — код сложно писать и читать, и он привязан к архитектуре.

Высокоуровневые языки ближе к человеческому языку и математической записи. Программист думает о задаче, а не о регистрах процессора. Первым широко использованным высокоуровневым языком стал Fortran (коммерческий выпуск в 1957 году). Сегодня подавляющее большинство прикладных языков — высокоуровневые: Python, Java, C#, JavaScript.

Граница здесь не строгая: C часто называют языком среднего уровня — он дает контроль над памятью, как низкоуровневые, но переносим между платформами, как высокоуровневые.

Компилируемые и интерпретируемые языки

Вторая ось — как исходный код превращается в то, что исполняет машина.

Признак Компилируемые Интерпретируемые
Когда код переводится в машинный заранее и целиком, до запуска построчно, во время выполнения
Что получается на выходе готовый исполняемый файл результат считает интерпретатор
Скорость выполнения обычно выше обычно ниже
Переносимость нужна пересборка под платформу работает везде, где есть интерпретатор
Примеры C, C++, Rust Python, JavaScript, PHP

Деление удобное, но упрощенное — на практике границы размыты. Java сначала компилируется в промежуточный байт-код, а его уже исполняет виртуальная машина JVM, дополнительно ускоряя горячие места JIT-компиляцией (перевод в машинный код прямо во время работы). Python тоже компилирует исходник в байт-код перед выполнением. Поэтому корректнее говорить не «язык компилируемый», а «такая-то реализация языка компилирует/интерпретирует».

Если хочется разобраться, что именно делает компилятор и какими они бывают, смежная тема — Компиляторы: назначение и виды.

Парадигмы программирования

Парадигма — это стиль, способ организовать программу. Это не свойство «намертво зашитое» в язык: большинство современных языков поддерживают несколько парадигм сразу.

Парадигма Основная идея Где встречается
Процедурная программа — последовательность процедур и функций, меняющих состояние (значения переменных) C, Pascal
Объектно-ориентированная (ООП) программа — взаимодействие объектов, у которых есть данные и методы Java, C#, C++
Функциональная вычисление через функции без изменяемого состояния и побочных эффектов Haskell, Erlang; элементы — в Python, JavaScript
Логическая (разновидность декларативной) описываются факты и правила, а вывод делает сама система Prolog

Процедурный стиль ведет программу по шагам: сделай это, потом то. ООП группирует данные и действия над ними в объекты — это помогает структурировать крупные проекты; ключевые принципы — инкапсуляция, наследование и полиморфизм (подробнее — в статье Класс: что это и как использовать). Функциональный стиль описывает вычисление как применение функций и избегает изменяемого состояния, что упрощает параллельность и тестирование.

Отдельно стоит декларативный подход: в нем описывают, какой результат нужен, а не как его получить пошагово. Яркий пример — язык запросов SQL: вы пишете, какие данные достать, а как выполнить запрос, решает СУБД. Логическое программирование (Prolog, созданный в 1972 году Аленом Колмероэ) — частный случай декларативного: оно строит вывод из фактов и правил и применяется, например, в задачах искусственного интеллекта.

Типизация: две независимые оси

С типами данных путаница возникает чаще всего, потому что здесь две разные оси, и их смешивают.

Ось Варианты Что определяет Примеры
Когда проверяются типы статическая / динамическая статическая — на этапе компиляции, динамическая — во время выполнения C++, Java (стат.); Python, JavaScript (динам.)
Насколько строго сильная / слабая допускает ли язык неявные преобразования разных типов Python (сильная); JavaScript, C (слабая)

Оси независимы, комбинации бывают любые. Python — динамически типизированный и при этом с сильной типизацией: тип переменной определяется во время выполнения, но сложить число со строкой без явного преобразования нельзя — будет ошибка. JavaScript — тоже динамический, но со слабой типизацией: он молча приведет типы, и "5" + 1 даст строку "51". Статическая типизация ловит часть ошибок до запуска, динамическая дает больше гибкости и короткий код.

Динамическую типизацию видно на простом примере на Python — одна и та же переменная спокойно меняет тип:

x = 5
print(type(x))   # <class 'int'>
x = "текст"
print(type(x))   # <class 'str'>

Вывод в консоли:

<class 'int'>
<class 'str'>

В статически типизированном языке вроде C++ или Java тип переменной задается при объявлении и так просто не меняется — несоответствие типов поймает компилятор еще до запуска.

Обзор языков по задачам

«Лучшего языка вообще» не существует — есть язык, удобный под конкретную задачу. Ниже — ориентир, с чего смотреть под типовые направления, а не полный каталог.

Задача С чего начать Когда стоит посмотреть иначе
Веб-бэкенд (серверная логика) Python, PHP высокая нагрузка — Go, Java
Веб-фронтенд (браузер) JavaScript —
Анализ данных и машинное обучение Python тяжелые вычисления выносят в C++
Мобильные приложения Kotlin (Android), Swift (iOS) кроссплатформенно — Dart с Flutter
Системное ПО, движки, игры C++, C безопасность памяти — Rust
Автоматизация и скрипты Python —
Запросы к базам данных SQL —

Несколько ориентиров по распространенным языкам: Python (1991) — универсальный, читаемый, силен в анализе данных и как первый язык; Java (1995) — корпоративные системы и Android; JavaScript (1995) — основной язык, который исполняется прямо в браузере; PHP (1995) — серверная часть сайтов; C++ (1985) — производительное и системное ПО; C (1972) — основа операционных систем и встраиваемых устройств; SQL (стандарт вырос из языка SEQUEL, созданного в IBM в 1974 году) — работа с реляционными базами данных.

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

Порядок выбора проще, чем кажется, если идти от цели, а не от рейтингов.

  1. Определите направление. Веб, анализ данных, мобильные приложения, игры — у каждого свой типовой набор языков (см. таблицу выше).
  2. Если направление еще не выбрано, берите универсальный язык с низким порогом входа. Для старта часто рекомендуют Python: простой синтаксис, много учебных материалов, применим в вебе, анализе данных и автоматизации.
  3. Оцените экосистему: есть ли документация на русском, библиотеки под вашу задачу, живое сообщество и вакансии в вашем городе или удаленно.
  4. Не распыляйтесь. На старте один язык, доведенный до реальных проектов, полезнее, чем поверхностное знакомство с пятью. Базовые понятия — переменные, условия, циклы, функции — переносятся между языками, и второй язык дается заметно легче.

Пошаговый разбор пути от нуля до первых программ — в статье Как написать программу с нуля и стать программистом.

Выводы

  • Язык программирования — это набор правил (алфавит, синтаксис, семантика), по которым человек пишет инструкции, а компьютер их исполняет.
  • Языки классифицируют по нескольким независимым осям: уровень (низко- или высокоуровневый), способ выполнения (компиляция или интерпретация), парадигма (процедурная, ООП, функциональная, декларативная) и типизация.
  • Деления часто не абсолютны: C — среднего уровня, Java и Python сочетают компиляцию в байт-код с виртуальной машиной, а большинство языков поддерживают несколько парадигм.
  • Типизация раскладывается на две разные оси: когда проверяются типы (статическая или динамическая) и насколько строго (сильная или слабая).
  • Первый язык выбирают под цель; при отсутствии четкого направления Python — разумный универсальный старт с низким порогом входа.

Где применять на практике

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

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

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

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

Посмотреть, как разбирают такие темы вживую, и задать вопросы можно на открытых вебинарах Otus — они бесплатные и проходят регулярно.

Смежные темы: Компиляторы: назначение и виды, Класс: что это и как использовать, Как написать программу с нуля и стать программистом.

FAQ

Чем язык программирования отличается от языка разметки? Язык разметки (например, HTML, созданный в начале 1990-х) описывает структуру и оформление документа, но не задает вычислений и логики. Полноценный язык программирования умеет ветвления, циклы и вычисления. Поэтому HTML сам по себе языком программирования не считают.

Сколько всего языков программирования существует? Точного числа нет: их тысячи, если считать вместе с узкими и экспериментальными, но в реальной индустрии широко используются несколько десятков. Гнаться за количеством не нужно — важнее глубоко освоить язык под свою задачу.

Нужна ли математика, чтобы учить язык программирования? Для веб-разработки и автоматизации достаточно школьного уровня и логики. Серьезная математика нужна в отдельных областях — машинном обучении, компьютерной графике, криптографии, — но начать программировать можно и без нее.

OTUS Журнал