Semantic — как анализировать код на 10+ языках с помощью Haskell

01 Apr, 2025

Это архивный репозиторий и может быть устаревшим.

9,041
🔱 458
👥 94

Знакомы с ситуацией, когда нужно:

  • Сравнить две версии кода и понять, что изменилось?
  • Проанализировать структуру чужого проекта?
  • Построить дерево синтаксического разбора для незнакомого языка?

Именно такие задачи решает semantic — инструмент от GitHub, написанный на Haskell. Хотя проект больше не поддерживается официально (разработчики рекомендуют форкать репозиторий), его 9k звёзд и поддержка множества языков делают его стоящим внимания.

Что умеет semantic?

По сути, это Swiss Army Knife для работы с исходным кодом:

  1. Парсинг 10+ языков (Ruby, JS, Python, Go и другие) с выводом в разных форматах:

    semantic parse --sexpression file.js  # Дерево в виде s-выражений
    semantic parse --json-symbols file.py # Символы в JSON
    
  2. Сравнение кода с продвинутыми алгоритмами:

    Реклама
    • Myers' algorithm (известный по diff)
    • RWS-Diff для иерархических данных
  3. Извлечение символов для навигации по коду (эта фича даже powership-лена в GitHub.com)

Под капотом

Архитектура впечатляет:

  1. Генерация Haskell-типов из tree-sitter грамматик
  2. Алгебраические эффекты через «data types à la carte»
  3. Абстрактные интерпретаторы для анализа

Особенно интересно, как проект использует 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 на практике!

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.