Перейти к основному содержимому

Язык программирования

Разработчику Аналитику Тестировщику Архитектору Инженеру

Язык программирования

Эта статья — карта понятий перед изучением конкретных языков в разделе 5. Здесь даются короткие определения и объяснения; за деталями — ссылки на теоретические главы энциклопедии и на вводные статьи языков.

Языков много, но они все похожи по своей базе. Поэтому важно знать эту базу.

ТемаЯкорь
Программирование#программирование
Язык программирования#yazyk-programmirovaniya
Почему код пишут по-разному#pochemu-kod-pishut-po-raznomu
Язык vs разметка, стили, запросы#yazyk-i-ne-yazyk
Типизация#tipizatsiya
Парадигма#paradigma
Уровень языка#uroven-yazyka
Стратегия выполнения#strategiya-vypolneniya
Управление памятью#upravlenie-pamyatyu
Движок выполнения#dvizhok-vypolneniya
Виртуальная машина#virtualnaya-mashina
Платформа и кроссплатформенность#platforma
Формат разработки#format-razrabotki
Направление разработки#napravlenie-razrabotki
REPL#repl
Параллелизм и асинхронность#parallellizm-i-asinhronnost
Безопасность языка#bezopasnost-yazyka
Все языки раздела 5#yazyki-razdela-5

Что такое программирование?

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

Программирование шире, чем "написать код". Сначала появляется алгоритм — план шагов; затем план переводят в формальную запись по правилам выбранного языка. Один и тот же алгоритм можно выразить на Python, Java или C++, но синтаксис, типы и среда выполнения будут разными.

  • Синтаксис - это правила, устанавливающие, как писать код;
  • Типы данных в каждом языке могут отличаться возможностями, реализациями и условиями;
  • Среда выполнения - это условия, при которых выполняется код.

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

Подробнее о связи алгоритма и кода — в Что такое код и как он работает; о жизненном цикле программы — в Программа — о разделе.


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

Язык программирования — формальная система записи вычислений: набор правил синтаксиса (как писать) и семантики (что произойдёт при выполнении), плюс стандартная библиотека и соглашения сообщества.

Язык задаёт, какие конструкции допустимы:

  • переменные,
  • функции,
  • типы,
  • циклы,
  • модули.

Компилятор или интерпретатор проверяет синтаксис и (в зависимости от языка) типы, после чего код превращается в действия процессора или виртуальной машины.

У каждого языка — свой профиль:

  • типизация,
  • парадигмы,
  • уровень абстракции,
  • способ выполнения,
  • модель памяти,
  • целевые платформы.

Именно этот профиль сравнивают, когда выбирают инструмент под задачу. В разделе 5 у каждого языка вводная статья начинается с краткой сводки этих свойств.

Общая база до языков — в Код — о разделе и Код и разработка.


Почему в разных языках код пишут по-разному?

Одинаковая по смыслу задача выглядит по-разному из-за разных договорённостей о приоритетах.

ФакторКак влияет на вид кода
История и синтаксическое наследиеC-подобные языки ({}, ;) vs отступы Python vs лисп-скобки
ПарадигмаООП на Java — классы и интерфейсы; функциональный стиль — выражения и неизменяемые данные
ТипизацияВ статических языках типы пишут явно; в динамических — чаще выводят из контекста
Уровень абстракцииВ ассемблере — регистры и метки; в SQL — декларация что выбрать, а не как обойти таблицу
Среда выполненияСкрипт "запустил файл — получил результат" vs многоэтапная сборка .exe / .jar

Синтаксис — лишь верхний слой. Глубже лежат модель данных (объекты, указатели, замыкания), правила видимости и контракт с runtime. Поэтому перенос кода "строка в строку" между языками редко работает: переносят идею и структуру, а запись переписывают под правила нового языка.

О синтаксисе и ключевых словах — Ключевые слова и операторы; об уровнях абстракции — Уровни абстракции в разработке ПО.


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

Не каждый формальный язык в IT вычисляет произвольную логику. Часть языков описывает структуру или вид, другая — задаёт вопрос к данным.

КлассНазначениеПримерЧто делает
Язык программированияАлгоритмы, ветвления, циклы, побочные эффектыPython, C#, JavaScriptВыполняет инструкции, меняет состояние
Язык разметкиСтруктура и смысл документаHTML, Markdown, XMLОписывает что это за блок, не как считать
Язык стилейВнешний видCSSЗадаёт оформление уже размеченного
Язык запросовВыборка и изменение данных в хранилищеSQLДекларирует какие строки нужны; план выполняет СУБД

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

Границы не всегда жёсткие — SQL содержит процедурные расширения, CSS — вычисляемые функции, а шаблонизаторы смешивают разметку с кодом. Но при выборе инструмента полезно спросить — нужно описать документ, оформить его, запросить данные или написать программу?

Подробнее — HTML — основы, CSS — о разделе, SQL — принципы движка.


Что такое типизация языка?

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

Тип отвечает на вопрос что можно хранить в переменной, какие операции допустимы и когда компилятор или runtime остановит программу.

Отдельно говорят о сильной и слабой типизации (насколько свободно смешиваются несовместимые типы) и о выводе типов (компилятор сам выводит тип из выражения).

Типизация влияет на скорость разработки, читаемость кода и класс ошибок: статика ловит многие ошибки до запуска; динамика даёт гибкость, но переносит часть проверок в runtime. В контексте структур данных и сигнатур функций типы разбираются и в Структурах данных.

Углубление: Типизация, Типы данных.


Что такое парадигма?

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

Парадигма — способ структурировать решение. Один язык часто поддерживает несколько парадигм, например Python сочетает императивный код, ООП и функциональные приёмы, а JavaScript — процедурный стиль, прототипное ООП и функции первого класса.

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

Подробнее: Программные парадигмы, ООП — о разделе.


Что такое уровень языка?

Уровень языка — степень удалённости записи программы от деталей процессора и операционной системы: от машинных инструкций до выражений, близких к предметной области.

Низкоуровневые языки (ассемблер, C, Zig) дают контроль над памятью, адресами и производительностью. Высокоуровневые (Python, Ruby, Kotlin) скрывают железо за выразительными конструкциями и runtime. "Низкий" не значит "хуже" — это про близость к машине, а не про качество языка.

Выбор уровня — это компромисс, например ядро ОС и драйверы пишут ближе к железу, а веб-сервис и скрипт автоматизации — выше, где важнее скорость разработки. Один проект может сочетать слои, допустим, критичный модуль на Rust, а оркестрация на Python.

Подробнее: Уровни абстракции в разработке ПО, Ассемблер — вводная.


Что такое стратегия выполнения?

Стратегия выполнения — способ довести исходный код до работающей программы:

  • компиляция заранее (AOT),
  • интерпретация по ходу, JIT "на лету",
  • транспиляция в другой язык,
  • гибрид (исходник → байт-код → VM).
СтратегияСутьПримеры
AOT-компиляцияВесь код анализируется до запуска, получается исполняемый файлC, C++, Go, Rust
ИнтерпретацияСреда читает и выполняет код без отдельной сборкиклассический Python, Ruby
Байт-код + VMКомпилятор → промежуточный код → виртуальная машинаJava, C#, CPython
JITГорячие участки компилируются во время работыJavaScript в V8, JVM, CLR
ТранспиляцияПеревод из одного языка в другой перед запускомTypeScript → JavaScript

Стратегия влияет на скорость старта, пиковую производительность, переносимость и то, когда видны ошибки — на этапе сборки или при выполнении конкретной строки.

Подробнее: Компиляция и интерпретация, Сборка, компиляция и публикация.


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

Управление памятью — правила выделения и освобождения памяти под данные программы: вручную программистом, автоматически сборщиком мусора (GC) или через систему владения (ownership).

МодельКто освобождает памятьТипичные языки
РучнаяПрограммист (malloc/free, new/delete)C, C++ (классически), Zig
Сборщик мусораRuntime по достижимости объектовJava, C#, Python, Go
Владение (ownership)Компилятор проверяет владельца и время жизниRust
Подсчёт ссылок + GCКомбинация механизмовCPython

Различия объясняют разный "характер" языков: в C ошибка указателя — неопределённое поведение; в Java утечка чаще связана с удержанием ссылок, а не с забытым free; в Rust компилятор отклоняет код с конфликтом владения ещё до запуска.

Подробнее: Автоматическое управление памятью, Расположение данных в памяти, Ручное управление памятью.


Что такое движок выполнения?

Движок выполнения (runtime, среда выполнения) — программа и библиотеки, которые исполняют код — парсят или загружают байт-код, выделяют память, вызывают системные API, планируют потоки и применяют оптимизации.

Примеры движков:

  • V8 и SpiderMonkey для JavaScript,
  • CPython для Python,
  • JVM для Java,
  • CLR для .NET,
  • Lua VM для Lua.

Движок — полноценная подсистема, в нём живут GC, JIT, загрузчик модулей и взаимодействие с ОС.

От выбора движка зависят производительность, доступные API и способ упаковки приложения. Один и тот же синтаксис JavaScript в браузере и в Node.js опирается на разные наборы встроенных API, хотя ядро языка общее.

Подробнее: Process VM и среда выполнения, Архитектура выполнения программ.


Что такое виртуальная машина для выполнения кода?

Виртуальная машина процесса (Process VM) — слой между байт-кодом или промежуточным представлением и реальным процессором — интерпретирует инструкции, верифицирует безопасность, применяет JIT и даёт переносимость "написал один раз — запустил на любой ОС с этой VM".

Не путать с гипервизором (VirtualBox, VMware): тот эмулирует целый компьютер, а языковая VM обслуживает один процесс с байт-кодом. JVM, CLR, CPython VM и WebAssembly runtime — Process VM.

Байт-код компактнее исходника и не привязан к конкретному CPU; ценой служит зависимость от установленной VM и накладные расходы интерпретации или JIT.

Подробнее: Исполнение байт-кода виртуальными машинами, Байт-код в статье о коде.


Что такое платформа, кроссплатформенность и нативность?

Платформа — совокупность ОС, runtime, API и соглашений, под которые рассчитана программа.

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

Нативность — использование родных для ОС UI, бинарников и API без промежуточного слоя вроде браузера или VM (в зависимости от контекста).

ТерминСмысл
ПлатформаНапример: ".NET на Linux", "Android + ART", "браузер + Web APIs"
Кроссплатформенный языкИсходник или байт-код переносят между ОС при наличии runtime (Java, Python, Go)
Нативная сборкаМашинный код под конкретную архитектуру (x86-64, ARM)
Нативное приложениеUI и поведение соответствуют гайдлайнам ОС (Swift/UIKit, Kotlin/Jetpack)

"Кроссплатформенный" и "нативный" не противопоставляются жёстко: Flutter компилирует в нативный ARM-код, но рисует собственным движком; Java кроссплатформенна через JVM, но требует установленной JRE.

Подробнее: Платформа .NET, Сборка и кроссплатформенная публикация, Фронтенд и бэкенд.


Что такое формат разработки?

Формат разработки — типичный рабочий цикл на языке:

  • скрипт "один файл — сразу запуск",
  • многофайловый проект с менеджером зависимостей,
  • решение из нескольких проектов,
  • сборка в исполняемый артефакт.
ПонятиеКратко
Скриптовый языкИсходник запускают без отдельной фазы сборки (Python, Bash, JS в Node)
Серверный языкКод выполняется на сервере: PHP, Java, C#, Go, Python (Django/FastAPI)
ФронтендКод в браузере или в оболочке: JavaScript, TypeScript
БэкендЛогика, БД, API на сервере — часто те же языки, другой runtime и стек
ПроектОдин модуль с исходниками, зависимостями и правилами сборки
РешениеНабор связанных проектов (типично в Visual Studio, .NET)
СборкаПреобразование исходников в .exe, .jar, .dll, пакет для деплоя

Один язык может быть и скриптовым, и "проектным": Python начинают с hello.py, а для сервиса используют venv, pyproject.toml и CI-сборку.

Подробнее — Проект программного обеспечения, Сборка и публикация, Библиотека.


Что такое направление разработки (сфера применения)?

Направление разработки — типичная область, для которой язык изначально удобен или где он закрепился экосистемой — веб, мобильные приложения, системное программирование, Data Science, игры, автоматизация, корпоративные ERP.

Направление не запрещает другие сценарии: JavaScript родился в браузере, но с Node.js стал серверным; Python силён в аналитике, но на нём пишут и веб-бэкенды. Смотрят на библиотеки, инструменты, найм и зрелость стека, а не только на "назначение в паспорте языка".

В вводных статьях раздела 5 у каждого языка в сводке есть пункт "Направление" — отправная точка перед выбором стека.

Подробнее: 5. Языки — о разделе, Основные языки — о разделе.


Что такое REPL?

REPL (Read–Eval–Print Loop) — интерактивный цикл "ввёл выражение → среда вычислила → напечатала результат", без полного цикла "отредактировал файл — собрал — запустил".

REPL ускоряет эксперименты — проверить тип, вызвать функцию, посмотреть API. В Python — команда python, в Node — node, в C# — dotnet fsi, в Elixir — iex. Не у каждого языка есть классический REPL в терминале (у Go и Zig чаще run одного файла), но идея интерактивной сессии живёт в Jupyter, консоли браузера и отладчике IDE.

Подробнее: Отладка и интерактивные сессии, Разработка и отладка — о разделе.


Что такое параллелизм и асинхронность?

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

ПараллелизмАсинхронность
ЦельУскорить вычисления на многоядерном CPUНе простаивать в ожидании I/O
Примерыmultiprocessing, потоки, горутины на разных ядрахasync/await, Promise, event loop
РискиГонки данных, дедлокиСложность отладки, неявный порядок выполнения

Один поток может быть асинхронным, но не параллельным: JavaScript в браузере обычно однопоточен, но обрабатывает сеть через очередь задач. Python с GIL ограничивает CPU-параллелизм в потоках, но asyncio решает задачи I/O.

Подробнее — Процессы и потоки, Асинхронность — о разделе, Параллельные вычисления.


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

Безопасность языка — насколько среда и правила типов предотвращают классы ошибок — выход за границы памяти, неопределённое поведение, неявные приведения типов, инъекции через eval, гонки потоков.

Условная шкала в сводках языков энциклопедии:

ОценкаТипичные риски
Относительно безопасныйСильная типизация, GC, исключения вместо UB (Java, C#, Kotlin, Go)
Умеренно опасныйLegacy-конструкции, ручная память в отдельных модулях (старый Fortran, C с дисциплиной)
ОпасныйУказатели, слабая типизация, eval, глобальное состояние (C, C++, PHP, Bash)

Memory safety (защита от use-after-free и переполнений) — отдельная ось: Rust и Go дают сильные гарантии; C и C++ — нет, если программист не соблюдает дисциплину. Type safety — другая ось: TypeScript и Java ловят несовместимость типов; JavaScript и PHP по умолчанию слабее.

Безопасность языка не заменяет безопасность приложения: SQL-инъекции, XSS и утечки секретов возможны на любом стеке при ошибках проектирования.

Подробнее: Типизация, Основы информационной безопасности — о разделе.


Языки программирования в энциклопедии (раздел 5)

Ниже — единая таблица навигации по языкам раздела 5. Колонка "Сводка" ведёт на вводный блок с характеристиками (типизация, парадигма, выполнение и т.д.) в соответствующей статье.

Веб, бэкенд и универсальные

ЯзыкСводка свойствРаздел
JavaScriptО языке5.01 JavaScript
PythonО языке5.02 Python
JavaО языке5.03 Java
PHPО языке5.07 PHP
GoО языке5.10 Go
TypeScriptО языке5.10 TypeScript
RubyО языке5.11 Ruby
GroovyО языке5.12 Groovy

Платформа .NET

Язык / платформаСводка свойствРаздел
Платформа .NETЧто такое .NET5.04 .NET
C#О языке5.05 C#
F#Что такое F#F# в .NET

Мобильные и клиентские

ЯзыкСводка свойствРаздел
KotlinО языке5.09 Kotlin
SwiftО языке5.14 Swift
DartО языке5.22 Dart

Системные и производительность

ЯзыкСводка свойствРаздел
C++О языке5.06 C++
RustО языке5.13 Rust
ZigО языке5.20 Zig
NimО языке5.21 Nim

Скрипты, автоматизация и встраивание

ЯзыкСводка свойствРаздел
Lua и LuauО языке5.15 Lua
BashО языке5.25 Bash
PowerShellО языке5.26 PowerShell

Функциональные и альтернативы JVM/BEAM

ЯзыкСводка свойствРаздел
SmalltalkО языке5.08 Smalltalk
HaskellО языке5.17 Haskell
ScalaО языке5.18 Scala
ElixirО языке5.19 Elixir

Data Science и аналитика

ЯзыкСводка свойствРаздел
RО языке5.23 R
JuliaО языке5.24 Julia

Корпоративные и нишевые

ЯзыкСводка свойствРаздел
1С:ПредприятиеО языке5.27 1С

Исторические языки (подраздел 5.16)

ЯзыкСводка свойствРаздел
Обзор legacyСтарые языки5.16 Старые языки
АссемблерО языкеАссемблер
CО языкеC
COBOLО языкеCOBOL
FortranО языкеFortran
LispО языкеLisp
PascalО языкеPascal
visual-basicО языкеvisual-basic

Как пользоваться этой статьей

  1. Прочитайте определения по якорям в оглавлении выше.
  2. Перейдите по ссылкам "Подробнее" в нужные главы энциклопедии.
  3. Выберите язык в таблице раздела 5 и откройте сводку свойств в его вводной статье.
  4. Вернитесь к Что такое код для практики с симуляторами и к чек-листу для самопроверки.