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

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

Зачем нужно

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

Где используется

  • Веб-сайты и мобильные приложения
  • Операционные системы
  • Игры
  • Научные расчёты и анализ данных
  • Автоматизация бизнес-процессов
  • Искусственный интеллект и машинное обучение
  • Встраиваемые системы (IoT, робототехника)

Предпосылки

  • Базовая компьютерная грамотность
  • Понимание логики (если-то)
  • Умение разбивать задачу на шаги

Уровни абстракции

Программирование существует на разных уровнях абстракции — от самого близкого к «железу» до максимально удобного для человека.

┌─────────────────────────────────────────────┐
│  Высокий уровень   JavaScript, Python       │
│  ↕ Абстракция       Человекочитаемый код    │
├─────────────────────────────────────────────┤
│  Средний уровень    C, C++, Rust            │
│  ↕ Абстракция       Ближе к системе         │
├─────────────────────────────────────────────┤
│  Низкий уровень     Assembly (ASM)          │
│  ↕ Абстракция       Инструкции процессора   │
├─────────────────────────────────────────────┤
│  Машинный код       0101001110...           │
│                     Двоичные команды CPU     │
└─────────────────────────────────────────────┘

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

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

Компилируемые языки (C, C++, Rust, Go)

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

Исходный код (.c) → Компилятор → Машинный код (.exe) → Выполнение

Плюсы: высокая производительность, ошибки обнаруживаются до запуска. Минусы: медленная компиляция, привязка к платформе.

Интерпретируемые языки (JavaScript, Python, Ruby)

Код выполняется построчно интерпретатором.

Исходный код (.js) → Интерпретатор → Выполнение (строка за строкой)

Плюсы: быстрая разработка, кроссплатформенность. Минусы: ниже производительность (но JIT-компиляция сглаживает разрыв).

JIT-компиляция (JavaScript в V8)

Современные движки используют Just-In-Time компиляцию — гибрид обоих подходов:

Исходный код (.js) → Парсинг → AST → Байткод → [горячие участки] → Машинный код
// Этот код сначала интерпретируется,
// а если вызывается часто — компилируется в машинный код
function add(a, b) {
  return a + b;
}

// V8 замечает, что add вызывается тысячи раз
// и компилирует его в оптимизированный машинный код
for (let i = 0; i < 100000; i++) {
  add(i, i + 1);
}

Как код становится действием

Путь JavaScript-кода от файла до результата:

1. Разработчик пишет .js файл
2. Движок (V8) читает текст → лексический анализ → токены
3. Токены → парсер → AST (абстрактное синтаксическое дерево)
4. AST → байткод (Ignition интерпретатор)
5. Горячий байткод → машинный код (TurboFan компилятор)
6. CPU выполняет инструкции
7. Результат отображается (консоль, DOM, сеть)

Пример: от кода до результата

// 1. Вы пишете:
const name = "Мир";
console.log(`Привет, ${name}!`);

// 2. Парсер создаёт AST:
// Program
// └── VariableDeclaration (const)
//     └── VariableDeclarator
//         ├── Identifier (name)
//         └── Literal ("Мир")
// └── ExpressionStatement
//     └── CallExpression (console.log)
//         └── TemplateLiteral ("Привет, ", name, "!")

// 3. Интерпретатор выполняет байткод
// 4. Результат: "Привет, Мир!" в консоли

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

Парадигма Суть Пример в JS
Императивная Пошаговые инструкции for, if, while
Декларативная Описываем что, не как array.map, SQL, HTML
ООП Объекты с состоянием и поведением class, this, new
Функциональная Чистые функции, иммутабельность map, filter, reduce
// Императивный подход — описываем КАК
const numbers = [1, 2, 3, 4, 5];
const doubled = ;
for (let i = 0; i < numbers.length; i++) {
  doubled.push(numbers[i] * 2);
}

// Декларативный подход — описываем ЧТО
const doubledDecl = numbers.map(n => n * 2);

Частые ошибки

  1. Путать язык и платформу. JavaScript — язык, Node.js — среда выполнения, браузер — другая среда выполнения
  2. Думать, что компьютер «понимает» код. Компьютер выполняет инструкции буквально, не понимая намерений
  3. Пропускать основы ради фреймворков. Без понимания языка фреймворк — чёрный ящик
  4. Бояться ошибок. Ошибки — нормальная часть процесса, через них происходит обучение

Практика

  1. Откройте консоль браузера (F12 → Console) и выполните:
    console.log("Привет, мир!");
    2 + 2;
    typeof "hello";
    
  2. Напишите функцию, которая принимает имя и возвращает приветствие
  3. Попробуйте прочитать сообщение об ошибке — они информативны!

Связанные темы

Ресурсы

  • MDN Web Docs — JavaScript Guide
  • Eloquent JavaScript (Marijn Haverbeke) — бесплатная книга
  • CS50 (Harvard) — вводный курс по Computer Science
  • learn.javascript.ru — полный учебник на русском