Компиляция — преобразование исходного кода в машинный код или промежуточное представление до выполнения программы. Интерпретация — выполнение исходного кода построчно с помощью интерпретатора без генерации отдельного бинарника. Go — компилируемый язык, Python — интерпретируемый.
Go компилируется напрямую в статический бинарник без виртуальной машины и линковки с внешними runtime-библиотеками. Компиляция очень быстрая за счёт простого синтаксиса и отсутствия сложных оптимизаций. В Java компиляция идёт в байткод JVM, а C++ генерирует машинный код, но с более долгим временем сборки.
Статическая — тип переменной известен и проверяется на этапе компиляции (Go, C++). Динамическая — тип определяется во время выполнения (Python, JavaScript). Статическая типизация уменьшает количество ошибок на ранних этапах, динамическая — более гибкая.
Сильная типизация не позволяет неявно преобразовывать типы (Go, Java). Слабая типизация допускает автоматические преобразования (JavaScript, PHP). Пример: в Go нельзя сложить int и string напрямую, а в JS “2” + 2 даст строку “22”.
Стек — область памяти для локальных переменных и вызовов функций, работает по принципу LIFO, быстрый доступ. Куча — область динамической памяти для объектов, живущих дольше вызова функции; управляется вручную (C++) или сборщиком мусора (Go, Java).
Процесс — отдельная программа с собственной памятью и ресурсами. Поток — «лёгкий» поток выполнения внутри процесса, использующий общую память. Между процессами требуется IPC (межпроцессное взаимодействие), а потоки общаются напрямую.
Конкурентность — способность программы управлять несколькими задачами (goroutines в Go), даже если они выполняются на одном ядре. Параллелизм — одновременное выполнение на разных ядрах процессора. Конкурентность ≠ параллельность, но они могут сочетаться.
Многопоточность использует несколько потоков ОС, может выполняться параллельно. Асинхронность — неблокирующая модель выполнения, где один поток обслуживает несколько задач (через события, колбэки или корутины). Go объединяет оба подхода через goroutines и планировщик.
Состояние гонки возникает, когда несколько потоков/горутин одновременно обращаются к разделяемым данным, и результат зависит от порядка выполнения. В Go такие ошибки можно отлавливать с помощью go run -race.
Deadlock — ситуация, когда несколько потоков или горутин навсегда ждут друг друга (например, два мьютекса захвачены в разном порядке). Предотвращают — соблюдая единый порядок захвата ресурсов, используя таймауты, проверяя проектирование синхронизации.
Mutex (mutual exclusion) — примитив синхронизации, который гарантирует, что только один поток/горутина имеет доступ к ресурсу в момент времени. Используется для защиты разделяемых данных.
Основные: модель потоков (shared memory, mutexes), модель акторов (сообщения), модель CSP (communicating sequential processes — каналы и процессы, как в Go), событийная модель (event loop, async/await).
В CSP (Go) горутины общаются через каналы («не делись памятью, а общайся»). В потоковой модели потоки делят память и синхронизируются примитивами (мьютексы, атомики). CSP упрощает проектирование, так как синхронизация встроена в модель.
Компилятор переводит исходный код в объектные файлы (машинный код). Линковщик связывает эти файлы, подключает библиотеки и формирует финальный бинарник. В Go весь процесс автоматизирован командой go build.
API (Application Programming Interface) — интерфейс вызова функций и структур на уровне исходного кода. ABI (Application Binary Interface) — правила взаимодействия на уровне бинарников: соглашения о вызовах, расположение данных в памяти, формат библиотек.
Способность новой версии библиотеки работать с уже скомпилированными программами без пересборки. Нарушение ABI (изменение структуры памяти, сигнатур функций) ломает бинарную совместимость.
GC (garbage collector) автоматически освобождает память, на которую больше нет ссылок. Он упрощает разработку (не нужно вручную освобождать память), но может влиять на производительность.
Go использует триколорный, инкрементальный GC с малыми паузами (ориентирован на низкую задержку). Java традиционно имела stop-the-world GC (медленнее, но более предсказуемо для throughput), хотя в новых версиях появились low-latency алгоритмы (G1, ZGC).
Основные: стек (локальные переменные), куча (динамическая память), статическая область (глобальные переменные, константы), память кода (инструкции). Также есть кэш-память процессора (L1/L2/L3).
Кэш — быстрая память между CPU и RAM. Хранит недавно используемые данные, чтобы ускорить доступ. Важно при оптимизации: последовательные чтения эффективнее из-за работы кэша.
Транзакция — группа операций с БД, выполняемых как единое целое: либо все успешно, либо откат. Гарантирует целостность данных.
Atomicity — атомарность (всё или ничего). Consistency — согласованность (данные остаются валидными). Isolation — изоляция (транзакции не мешают друг другу). Durability — долговечность (результат сохраняется даже при сбоях).
SQL — реляционные БД с фиксированной схемой и языком SQL (PostgreSQL, MySQL). NoSQL — нереляционные (документы, ключ-значение, графы, колоночные), более гибкие по схеме (MongoDB, Redis).
B-деревья (наиболее распространённые), хэш-индексы, полнотекстовые индексы, GiST/SP-GiST, R-деревья (для геоданных), bitmap-индексы.