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

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

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

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

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

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

ТемаЯкорь
Программирование#programmirovanie
Язык программирования#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. Вернитесь к Что такое код для практики с симуляторами и к чек-листу для самопроверки.