Semantic — как анализировать код на 10+ языках с помощью Haskell
Это архивный репозиторий и может быть устаревшим.
Знакомы с ситуацией, когда нужно:
- Сравнить две версии кода и понять, что изменилось?
- Проанализировать структуру чужого проекта?
- Построить дерево синтаксического разбора для незнакомого языка?
Именно такие задачи решает semantic — инструмент от GitHub, написанный на Haskell. Хотя проект больше не поддерживается официально (разработчики рекомендуют форкать репозиторий), его 9k звёзд и поддержка множества языков делают его стоящим внимания.
Что умеет semantic?
По сути, это Swiss Army Knife для работы с исходным кодом:
-
Парсинг 10+ языков (Ruby, JS, Python, Go и другие) с выводом в разных форматах:
semantic parse --sexpression file.js # Дерево в виде s-выражений semantic parse --json-symbols file.py # Символы в JSON -
Сравнение кода с продвинутыми алгоритмами:
- Myers' algorithm (известный по diff)
- RWS-Diff для иерархических данных
-
Извлечение символов для навигации по коду (эта фича даже powership-лена в GitHub.com)
Под капотом
Архитектура впечатляет:
- Генерация Haskell-типов из tree-sitter грамматик
- Алгебраические эффекты через «data types à la carte»
- Абстрактные интерпретаторы для анализа
Особенно интересно, как проект использует Open Unions — техника, позволяющая работать с разными языками в единой type-safe системе.
Кому это пригодится?
- Разработчикам инструментов: если вы пишете linter'ы, анализаторы кода или IDE
- Исследователям: для экспериментов с анализом исходников
- Любопытным Haskell-разработчикам: отличный пример реального применения продвинутых техник
Как начать?
Хотя semantic требует GHC 8.10+, начать можно быстро:
git clone git@github.com:github/semantic.git
cd semantic
script/bootstrap
cabal v2-build all
Есть и Docker-образы для тех, кто не хочет возиться с Haskell-стеком.
Semantic — это как мощный микроскоп для вашего кода. Хотя проект заброшен, его:
- 10k строк Haskell-кода
- Поддержка множества языков
- Интересные алгоритмы
делают его отличной кодовой базой для изучения или форка. Для анализа кода в 2025 есть и более современные альтернативы, но как пример «how it's made» — semantic всё ещё на высоте.
P.S. Любителям Haskell: здесь вы найдёте отличные примеры использования type-level programming на практике!
