Язык программирования
Язык программирования
Эта статья — карта понятий перед изучением конкретных языков в разделе 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. Колонка «Сводка» ведёт на вводный блок с характеристиками (типизация, парадигма, выполнение и т.д.) в соответствующей статье.
Веб, бэкенд и универсальные
Платформа .NET
| Язык / платформа | Сводка свойств | Раздел |
|---|---|---|
| Платформа .NET | Что такое .NET | 5.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)
Как пользоваться этой статьей
- Прочитайте определения по якорям в оглавлении выше.
- Перейдите по ссылкам «Подробнее» в нужные главы энциклопедии.
- Выберите язык в таблице раздела 5 и откройте сводку свойств в его вводной статье.
- Вернитесь к Что такое код для практики с симуляторами и к чек-листу для самопроверки.