?

Log in

No account? Create an account
К вопросу о Haskell IDE - Дважды мудак [entries|archive|friends|userinfo]
Декларативное рулит

Site Meter

[ website | Мой сайт ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

К вопросу о Haskell IDE [окт. 2, 2017|18:01 pm]
Andy Melnikov
[Tags|, , , ]

Внезапно на stackage есть коде браузер с референс резолюшеном. Может конечно на соплях и регулярках, но тем не менее

https://www.stackage.org/haddock/lts-9.6/attoparsec-0.13.1.0/src/Data.Attoparsec.Combinator.html#try
СсылкаОтветить

Comments:
[User Picture]From: max630
2017-10-03 03:58 am
Это же hasktags делал примерно всегда. И читается это вимом безо всяких плагинов. Вот если бы обратно...

Edited at 2017-10-03 03:59 (UTC)
(Ответить) (Thread)
[User Picture]From: nponeccop
2017-10-03 04:35 am
Cудя по количеству различных генераторов тегов, работают они как и всё в инфраструктуре - не очень.

Hasktags использует парсер даже не на регулярках - собственный NIH loop побуквенный. И работает он соответственно практически никак. А если сравнивать не с опенсурсом который жрет говно и нахваливает, а с тем, что сделали ввиду наличия коммерческого спроса для С++ (про джаву я не говорю) - то печально-печально всё.

Баг я нашел в первые 10 минут (зарепорчен но понятно что непофикшен с 2014), если стоит задача найти десяток багов в парсере с заведомо уебищным подходом - это не проблема же для whitebox тестера.

И hasktags не погнил как раз из-за того что там очень наколенный адхок, со String и байтстрингом местами. Нет функционала - проблема мейнтенанса решена!

Обратно это как? find usages/references?

Edited at 2017-10-03 07:26 (UTC)
(Ответить) (Parent) (Thread)
[User Picture]From: max630
2017-10-03 10:02 am
Странно, я думал, он куски из ghc использует. Я им на самом деле не пользуюсь, я вообще пользуюсь где-то в гугле найденым патчем для ctags. И там, да, NIH даже без регекспов. Зато быстро и устойчиво к изменениям в языке, да.

В принципе меня устраивает, не хуже "коммерческих решений для C++" (я какбы знаю примерно этот state of art).

> Обратно это как? find usages/references?

Ага, он, да
(Ответить) (Parent) (Thread)
[User Picture]From: nponeccop
2017-10-03 03:40 pm
> "коммерческих решений для C++"
> (я какбы знаю примерно этот state of art).

ояебу!

то есть С++ name resolution в дебрях буста в 2006 это то же самое что в 2017 сканировать папочки-которые-укажешь адхок парсером который почти ничего не знает о синтаксисе не говоря уже об оверлоадах и поддерживает только самые простейшие декларации - это одно и то же

Больше вопросов не имею
(Ответить) (Parent) (Thread)
From: (Anonymous)
2017-10-12 08:36 pm
fast-tags плюс-минус стабильно генерирует (самописный лексер и разбор, устойчивый к синтаксическим ошибкам, 80% сущностей должен задетектить судя по test suite) и с баг репортами положительно всё. Милости просим.
(Ответить) (Parent) (Thread)
[User Picture]From: helvegr
2017-10-03 06:13 pm
find usages есть в https://github.com/google/haskell-indexer

http://stuff.codereview.me/lts/9.2 - проиндексированный стекедж
(Ответить) (Parent) (Thread)
From: (Anonymous)
2017-10-03 05:23 pm
Это фича --hyperlink-source haddock'а, то есть на GHC API.

Ещё одна недавняя крутая штука: зайти например на http://hackage.haskell.org/package/lens и нажать 's'.
(Ответить) (Thread)
[User Picture]From: helvegr
2017-10-03 06:28 pm
самое многообещающее в плане IDE это https://github.com/haskell/haskell-ide-engine

поддерживает language server protocol -> комплешн, кроссреф и прочее и в vs.code и в емаксе
(Ответить) (Thread)
[User Picture]From: rdia
2017-10-07 04:40 pm
В археологии очень полезно иметь графопостроитель, который может перейти от уровня кода к уровню модулей и даже пакетов. Грубо говоря, это автоматическое построение майндкарты.

Для C++а это, вроде, Rational делало. Ну или есть такая тулза Understand.

А вот как этим заниматься не в ООП, а для функциональщины - вообще непонятно.
(Ответить) (Thread)
[User Picture]From: nponeccop
2017-10-07 06:46 pm
для х-я есть (позорные как обычно) тулзы

haskell-import-graph строит граф модулей
ghc-pkg dot строит граф пакетов

В дискуссиях про тулзы бесит фрагментированность сообщества.

С одной стороны Understand с 1к за койкоместо, а с другой стороны - "зачем нам reference resolution если есть ctags" или даже "зачем нам ctags если есть grep".

function call graph тоже построить нет проблем концептуальных

Edited at 2017-10-07 18:50 (UTC)
(Ответить) (Parent) (Thread)
[User Picture]From: rdia
2017-10-08 02:12 am
1. Во-первых, построение графов пакетов и прочей хуйни в статике практически "не нужно", судя по моей работе.

Я не знаю, как у вас, а у меня работа при разборе старого говна - это беготня по всяким git grep, OpenGrok, doxygen с построением майндкарт цветными карандашами на больших листах. Периодически при этом обнаруживается "прекрасное" вроде практически одинаково названных классов в одном графе наследования (с циклами, естественно :-).

При этом очень важно иметь возможность менять уровень детализации - строить разные срезы reference graph'а (по классам, по модулям, по функциям), идти по нужной ветке на ходу варьируя глубину прорисовки.

Т.е. если у нас есть

let a = ...
let b = ...a...
let c = ...b...a...
let c' = ....
let d = ...c...c'...

и я просматриваю reference graph функции d, мне нужно иметь возможность как получить картинку, показывающую только один уровень (функции c и c'), так и два, и три.

2. Сама задача очень плохо поставлена - мне не очень чётко понятно, какие же свойства языка важны, где неочевидности и т.д. Т.е. в Хаскеле, например, не нужно париться по-поводу взаимного влияния функций (аля глобальные переменные в C), но вот все эти импорты и т.д. - это же чёрт ногу сломит, не понять сразу, откуда какой оператор @#*(*%!!! пришёл (движок hlint'а, кстати, это обрабатывать не умеет).

Тем не менее, понятно, что это должна быть GUI программа или, на худой конец, Web. Интерактивная, позволяющая делать закладки, выделять под и надсистемы (возможно дальше вообще строить 9-ти экранку из ТРИЗ по истории из git'а).

Плюс, у неё должен быть язык запросов - см. графовые базы данных. В общем, более-менее понятно, что это должен быть:

а) Парсер.
б) Граф. база данных.
в) GUI программа сверху.

Что характерно, без пункта (в) оно не взлетит - если не ошибаюсь zoggy@github делал для Ocaml'а тулзу под названием Oug (графовая база у него самопальная - odb). Она отлично анализировала 3.12'й код и строила полный граф, и давала любой срез в формате dot'а. Но так работать невозможно.
(Ответить) (Parent) (Thread)
[User Picture]From: nponeccop
2017-10-09 05:13 pm
Ну, тут важно, что

а) графвиз пока не умеет графы рисовать. Лучше, чем ничего, но руками растаскивать лейаут надо. Соответственно как минимум нужен редактор с импортом из дота.
б) "майндкарты" всеми называются "моделями", отсюда понятно, что книжек Вы не открывали. UML ща нет смысла смотреть, но можно посмотреть ArchiMate (стандарт и тулзу), чтобы знать стандартную терминологию и в целом положение дел, его мне нахваливали.
в) суть модели в том что она учитывает только существенные аспекты. То есть картинки надо ещё и прореживать. Иначе получаются "домики и колодцы" (почти полные двудольные подграфы) из модулей-утилит и их клиентов, отвлекающие от общей картины.

По запросу C++ Reverse Engineering нашелся ещё imagix.com, по фичам повторяющий Understand. Такого добра навалом, видимо.

Основная проблема, имхо - это поддержание моделей и диаграмм в актуальном состоянии. Надо смотреть, сделано ли такое у SQL ER-диаграммщиков, для эволюции SQL-схем эта задача проще решается по идее.

Тема большая, надо посты писать. Начать можно хотя бы с описания существующих фич для других языков.


Edited at 2017-10-09 17:19 (UTC)
(Ответить) (Parent) (Thread)
[User Picture]From: rdia
2017-10-10 02:11 am
> "майндкарты" всеми называются "моделями", отсюда понятно, что книжек Вы не открывали.

Смело, практически гадание по аватарке.
(Ответить) (Parent) (Thread)
[User Picture]From: nponeccop
2017-10-10 02:44 am
Так а вы открывали?? По статистике ко мне больше практики, академиев не кончавшие, заходят. Я их сразу крестиком в ментальном журнале помечаю. Эвристически по ключевым словам. Разумеется, эвристика не идеальна.

Вы получается, ложноположительный?
(Ответить) (Parent) (Thread)