Сопоставьте C, JavaScript, Rust и Haskell по следующим критериям: система типов (статическая/динамическая, сильная/слабая), управление памятью (ручное, сборщик мусора, владение/заём), модель конкурентности и типичные источники ошибок (UB, race conditions, lazy evaluation pitfalls)
C - Система типов: статическая, относительно слабая (много неявных преобразований, Т‑система не предотвращает многие ошибки). - Управление памятью: ручное (stack + heap via `malloc`/`free`). - Модель конкурентности: нет встроенной — потоки/процессы через ОС/`pthreads`; с C11 — атомарные операции и модель памяти. - Типичные источники ошибок: undefined behavior (out‑of‑bounds, use‑after‑free, dangling pointers, UB от знаковых переполнений), data races при отсутствии синхронизации, трудности с управлением ресурсами. JavaScript - Система типов: динамическая, слабо/любообразно типизированная (много автоматических приводов типов). - Управление памятью: сборщик мусора (GC). - Модель конкурентности: одна потоковая модель с событийным циклом (event loop) + асинхронность (callbacks/promises/async‑await); параллелизм через Web Workers / Worker Threads; SharedArrayBuffer+Atomics для общих данных. - Типичные источники ошибок: ошибки из‑за неявных приводов типов, асинхронные ошибки (некорректная обработка промисов, race при взаимодействии с воркерами/общей памятью), утечки через замыкания, невыполненные промисы (unhandled rejections). Rust - Система типов: статическая, сильная (строгая проверка типов), с выводом типов; разграничение safe/unsafe. - Управление памятью: владение/заём (ownership/borrowing) + RAII, без GC; возможен `unsafe` для ручной работы. - Модель конкурентности: нативные потоки, async/await (futures) для нечётких задач; типовая система и трейты (`Send`/`Sync`) предотвращают data races в safe‑коде. - Типичные источники ошибок: компилятор ловит многие ошибки на этапе компиляции (борровка); UB возможен в `unsafe` блоках, логические гонки/deadlock в неправильном использовании атомиков/`unsafe`, ошибки при FFI. Haskell - Система типов: статическая, сильная, выраженная через систему типов Hindley–Milner с выводом; чисто функциональная. - Управление памятью: сборщик мусора (GC). - Модель конкурентности: лёгкие (green) потоки в рантайме GHC, STM (software transactional memory), async, параллелизм через многопоточность рантайма. - Типичные источники ошибок: подводные камни ленивости (space leaks, неожиданное накопление thunks), lazy I/O pitfalls, runtime exceptions в IO, возможные race/deadlock при работе с mutable state/IO/STM, непредвиденная задержка исполнения из‑за ленивости.
- Система типов: статическая, относительно слабая (много неявных преобразований, Т‑система не предотвращает многие ошибки).
- Управление памятью: ручное (stack + heap via `malloc`/`free`).
- Модель конкурентности: нет встроенной — потоки/процессы через ОС/`pthreads`; с C11 — атомарные операции и модель памяти.
- Типичные источники ошибок: undefined behavior (out‑of‑bounds, use‑after‑free, dangling pointers, UB от знаковых переполнений), data races при отсутствии синхронизации, трудности с управлением ресурсами.
JavaScript
- Система типов: динамическая, слабо/любообразно типизированная (много автоматических приводов типов).
- Управление памятью: сборщик мусора (GC).
- Модель конкурентности: одна потоковая модель с событийным циклом (event loop) + асинхронность (callbacks/promises/async‑await); параллелизм через Web Workers / Worker Threads; SharedArrayBuffer+Atomics для общих данных.
- Типичные источники ошибок: ошибки из‑за неявных приводов типов, асинхронные ошибки (некорректная обработка промисов, race при взаимодействии с воркерами/общей памятью), утечки через замыкания, невыполненные промисы (unhandled rejections).
Rust
- Система типов: статическая, сильная (строгая проверка типов), с выводом типов; разграничение safe/unsafe.
- Управление памятью: владение/заём (ownership/borrowing) + RAII, без GC; возможен `unsafe` для ручной работы.
- Модель конкурентности: нативные потоки, async/await (futures) для нечётких задач; типовая система и трейты (`Send`/`Sync`) предотвращают data races в safe‑коде.
- Типичные источники ошибок: компилятор ловит многие ошибки на этапе компиляции (борровка); UB возможен в `unsafe` блоках, логические гонки/deadlock в неправильном использовании атомиков/`unsafe`, ошибки при FFI.
Haskell
- Система типов: статическая, сильная, выраженная через систему типов Hindley–Milner с выводом; чисто функциональная.
- Управление памятью: сборщик мусора (GC).
- Модель конкурентности: лёгкие (green) потоки в рантайме GHC, STM (software transactional memory), async, параллелизм через многопоточность рантайма.
- Типичные источники ошибок: подводные камни ленивости (space leaks, неожиданное накопление thunks), lazy I/O pitfalls, runtime exceptions в IO, возможные race/deadlock при работе с mutable state/IO/STM, непредвиденная задержка исполнения из‑за ленивости.