TMPA-2015: Lexical analysis of dynamically formed string expressionsIosif Itkin
Lexical analysis of dynamically formed string expressions
Marina Polubelova, Semyon Grigorev, Saint Petersburg State University, Saint Petersburg
12 - 14 November 2015
Tools and Methods of Program Analysis in St. Petersburg
TMPA-2015: Expanding the Meta-Generation of Correctness Conditions by Means o...Iosif Itkin
Expanding the Meta-Generation of Correctness Conditions by Means of Semantic Markup
Dmitry Kondratyev, A.P. Ershov Institute of Informatics Systems, Novosibirsk
12 - 14 November 2015
Tools and Methods of Program Analysis in St. Petersburg
Слайды использовались на краткосрочных курсах повышения квалификации учителей информатики, 2 лекции по 1 час 20 минут.
Изложен опорный (предельно ужатый) материал по основами C++.
Версия презентации по основам C++ с летней школы учителей информатики 2016 года.
Презентация расширена слайдами Незнанова А.А., изменён порядок материала, добавлены задачи.
TMPA-2013 Chupilko: Verification of Correct Behaviour of HDL ModelsIosif Itkin
Tools & Methods of Program Analysis (TMPA-2013)
Ivannikov, V.P., Kamkin, A.S., Chupilko, M.M., Institute for System Programming, ISP RAS
Verification of Correct Behaviour of HDL-Models of Digital Equipment Based on the Dynamic Comparison of Tracks
TMPA-2015: Lexical analysis of dynamically formed string expressionsIosif Itkin
Lexical analysis of dynamically formed string expressions
Marina Polubelova, Semyon Grigorev, Saint Petersburg State University, Saint Petersburg
12 - 14 November 2015
Tools and Methods of Program Analysis in St. Petersburg
TMPA-2015: Expanding the Meta-Generation of Correctness Conditions by Means o...Iosif Itkin
Expanding the Meta-Generation of Correctness Conditions by Means of Semantic Markup
Dmitry Kondratyev, A.P. Ershov Institute of Informatics Systems, Novosibirsk
12 - 14 November 2015
Tools and Methods of Program Analysis in St. Petersburg
Слайды использовались на краткосрочных курсах повышения квалификации учителей информатики, 2 лекции по 1 час 20 минут.
Изложен опорный (предельно ужатый) материал по основами C++.
Версия презентации по основам C++ с летней школы учителей информатики 2016 года.
Презентация расширена слайдами Незнанова А.А., изменён порядок материала, добавлены задачи.
TMPA-2013 Chupilko: Verification of Correct Behaviour of HDL ModelsIosif Itkin
Tools & Methods of Program Analysis (TMPA-2013)
Ivannikov, V.P., Kamkin, A.S., Chupilko, M.M., Institute for System Programming, ISP RAS
Verification of Correct Behaviour of HDL-Models of Digital Equipment Based on the Dynamic Comparison of Tracks
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
http://techtalks.nsu.ru
Видеозапись: http://www.youtube.com/watch?v=v7uBLSm6ft8
06 октября 2015. Как приручить дракона: введение в LLVM (Дмитрий Кашицын, HDsoft)
«В этом докладе мы кратко расскажем о таком звере, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.»
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
10 июня 2015. Дмитрий Кашицын (HDsoft) дает обзор LLVM.
http://techtalks.nsu.ru
Видеозапись: https://plus.google.com/events/ctes98f7uhf19t5jlvlbk24dan4
В этом докладе мы кратко расскажем о таком звере, как LLVM, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
"Formal verification of C code" Efremov D.V.
The talk covers the issue of developing correct software applying one of the types of static code analysis. The speaker will also address the matters of using such methods, their weaknesses and limitations, as well as the results they can guarantee.
PHDays VII, PDUG section, Moscow, May 24 2017.
"Формальная верификация кода на языке Си" Ефремов Д.В.
Доклад посвящен разработке корректного программного обеспечения с применением одного из видов статического анализа кода. Будут освещены вопросы применения подобных методов, их слабые стороны и ограничения, а также рассмотрены результаты, которые они могут дать. На конкретных примерах будет продемонстрировано, как выглядят разработка спецификаций для кода на языке Си и доказательство соответствия кода спецификациям.
Доклад представлен на конференции PHDays VII (2017) 24 мая в секции PDUG.
Доклад посвящен разработке корректного программного обеспечения с применением одного из видов статического анализа кода. Будут освещены вопросы применения подобных методов, их слабые стороны и ограничения, а также рассмотрены результаты, которые они могут дать. На конкретных примерах будет продемонстрировано, как выглядят разработка спецификаций для кода на языке Си и доказательство соответствия кода спецификациям.
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
Web-программирование
Лекция #5. Введение в язык программирования Python 3
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
Всё о статическом анализе кода для Java программистаAndrey Karpov
Этот доклад для тех, кто не знаком со статическими анализаторами кода, или знаком, но ещё не внедрил эти инструменты в процесс разработки. Будет описана методология статического анализа и как она используется для выявления ошибок и запахов кода. Будут кратко рассмотрены некоторые популярные инструменты статического анализа для языка Java, а также платформа SonarQube способная объединить и визуализировать отчёты различных анализаторов. Немного заглянем внутрь и поговорим о технологиях, используемых в современных статических анализаторах кода и позволяющих находить разнообразнейшие паттерны ошибок. Затронем вопрос, почему несмотря на уже существующие инструменты наша команда решила сделать ещё один: PVS-Studio for Java :). В конце рассмотрим важный вопрос интеграции инструментов статического анализа в большие старые проекты и почему так важно регулярное использование подобных инструментов.
«Парсим CSS», Роман Дворнов (Avito)
В ходе работы над CSSO мне пришлось погрузиться в процесс парсинга CSS. В результате парсер (тот, что в CSSO) был не раз переписан. Пришло время сделать его отдельным инструментом. Новый быстрый детальный парсер CSS, его AST, области применения и кое-что ещё.
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
http://techtalks.nsu.ru
Видеозапись: http://www.youtube.com/watch?v=v7uBLSm6ft8
06 октября 2015. Как приручить дракона: введение в LLVM (Дмитрий Кашицын, HDsoft)
«В этом докладе мы кратко расскажем о таком звере, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.»
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
10 июня 2015. Дмитрий Кашицын (HDsoft) дает обзор LLVM.
http://techtalks.nsu.ru
Видеозапись: https://plus.google.com/events/ctes98f7uhf19t5jlvlbk24dan4
В этом докладе мы кратко расскажем о таком звере, как LLVM, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
"Formal verification of C code" Efremov D.V.
The talk covers the issue of developing correct software applying one of the types of static code analysis. The speaker will also address the matters of using such methods, their weaknesses and limitations, as well as the results they can guarantee.
PHDays VII, PDUG section, Moscow, May 24 2017.
"Формальная верификация кода на языке Си" Ефремов Д.В.
Доклад посвящен разработке корректного программного обеспечения с применением одного из видов статического анализа кода. Будут освещены вопросы применения подобных методов, их слабые стороны и ограничения, а также рассмотрены результаты, которые они могут дать. На конкретных примерах будет продемонстрировано, как выглядят разработка спецификаций для кода на языке Си и доказательство соответствия кода спецификациям.
Доклад представлен на конференции PHDays VII (2017) 24 мая в секции PDUG.
Доклад посвящен разработке корректного программного обеспечения с применением одного из видов статического анализа кода. Будут освещены вопросы применения подобных методов, их слабые стороны и ограничения, а также рассмотрены результаты, которые они могут дать. На конкретных примерах будет продемонстрировано, как выглядят разработка спецификаций для кода на языке Си и доказательство соответствия кода спецификациям.
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
Web-программирование
Лекция #5. Введение в язык программирования Python 3
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
Всё о статическом анализе кода для Java программистаAndrey Karpov
Этот доклад для тех, кто не знаком со статическими анализаторами кода, или знаком, но ещё не внедрил эти инструменты в процесс разработки. Будет описана методология статического анализа и как она используется для выявления ошибок и запахов кода. Будут кратко рассмотрены некоторые популярные инструменты статического анализа для языка Java, а также платформа SonarQube способная объединить и визуализировать отчёты различных анализаторов. Немного заглянем внутрь и поговорим о технологиях, используемых в современных статических анализаторах кода и позволяющих находить разнообразнейшие паттерны ошибок. Затронем вопрос, почему несмотря на уже существующие инструменты наша команда решила сделать ещё один: PVS-Studio for Java :). В конце рассмотрим важный вопрос интеграции инструментов статического анализа в большие старые проекты и почему так важно регулярное использование подобных инструментов.
«Парсим CSS», Роман Дворнов (Avito)
В ходе работы над CSSO мне пришлось погрузиться в процесс парсинга CSS. В результате парсер (тот, что в CSSO) был не раз переписан. Пришло время сделать его отдельным инструментом. Новый быстрый детальный парсер CSS, его AST, области применения и кое-что ещё.
Специфика разработки и тестирования статического анализатораAndrey Karpov
В докладе я расскажу об особенностях разработки и тестирования такого программного продукта, как статический анализатор. Опишу как стандартные методики тестирования, которые мы используем (обзоры кода, Unit и UI-тесты, нагрузочное тестирование), так и специфические, позволяющие контролировать качество поиска ошибок при внесении доработок в ядро анализатора.
Rambler.iOS #9: Анализируй это! (Сергей Крапивенский).
Доклад посвящён наиболее популярным статическим анализаторам кода для iOS: как ими пользоваться, какие проблемы они решают, как внедрить их в привычный цикл разработки, как писать для них свои правила. Также рассмотрен опыт интеграции статического анализа и CI.
Rambler.iOS - митапы iOS-разработчиков, организуемые компанией RAMBLER&Co.
Законы создания IT команд и следствия законов для IT проектов «на пальцах»
Устойчивая привязка к синтаксическим конструкциям в изменяющемся коде
1. XII международная конференция
CEE-SECR / РАЗРАБОТКА ПО
28 - 29 октября, Москва
Михаил Малеванный
Устойчивая привязка к синтаксическим
конструкциям в изменяющемся коде
Академия Строительства и Архитектуры
Донской Государственный Технический Университет
5. Chris Parnin and Spencer Rugaber. Resumption strategies
for interrupted programming tasks. Software Quality
Journal 19, 1 (March 2011), 5-34.
DOI=http://dx.doi.org/10.1007/s11219-010-9104-9
«Только в 7% случаев перед редактированием
не выполняется навигация по коду»
«Только в 10% случаев активная деятельность начинается
в пределах минуты после возврата к задаче»
5
14. Синтаксическое дерево
Строится легковесным парсером
по исходному коду
Общее для разных языков
Не зависит от среды разработки
A
B2B1
C1 C2 C3
D1 D2
E
14
15. Сохраняемая информация
Имя + заголовок
Тип
Контекст
Родительские узлы
Соседние узлы
Дочерние узлы
A
B2B1
C1 C2 C3
D1 D2
E
15
17. Сохраняемая информация
Имя + заголовок
Тип
Контекст:
Родительские узлы
Соседние узлы *
Подузлы *
A
B2B1
C1 C2 C3
D1 D2
E
17
18. Имя и заголовок (Java)
public Component addChild(Component child)
{
repository.connectComponents(this, child,
EdgeKind.CONTAINS);
return child;
}
private int id;
Заголовок
Имя
18
19. Типы узлов (Java)
public Component addChild(Component child)
{
repository.connectComponents(this, child,
EdgeKind.CONTAINS);
return child;
}
private int id;
Тип: Method
Тип: Field
19
20. Внешний контекст (С#)
• namespace N
• class C1 : IVisitor
• namespace N
• class C2 : IVisitor
namespace N
{
class C1 : IVisitor
{
public void visit(IVisitor v) { }
}
class C2 : IVisitor
{
public void visit(IVisitor v) { }
}
}
20
24. T – исходный узел
Ti – узлы в новом файле
Для всех Ti вычисляем величину «похожести»:
Si = Similarity(T, Ti)
Si ∈ [0, 1]; 0 = ничего общего, 1 = точное совпадение
Величина похожести
24
25. Редакционное расстояние
Минимальное количество правок, необходимых для
преобразования одной строки в другую
Выше Редакционное расстояние – ниже Похожесть
3 версии:
Имена (String)
Заголовки (Lists<String>)
Внешние контексты (List<Headers>)
25
41. Изменено файлов 95 из 2 668
Изменено сущностей 406 из 83 082 (0,5%)
#326
Начало
анализа
#653
Конец
анализа
#1
Initial
commit 9 месяцев
разработки
Ревизии:
41
57. Roslyn
Изменено файлов 2 584 из 4 995
Изменено сущностей 20 534 из 152 271 (13,5%)
Начало
анализа
Конец
анализа
Initial
commit
1 год разработки
10 340 ревизий
57
На прошлогодней конференции была представлена разметка кода и инструмент.
Сейчас я вкратце напомню цели и основные возможности разметки кода, после чего рассмотрим, как достигается устойчивость привязки к коду.
Одна из проблем, с которыми ежедневно сталкиваются разработчики – это сквозная функциональность.
Код, относящийся к решаемой задаче оказывается разбросан по всему проекту, и разработчику требуется держать в голове набор фрагментов, с которыми ему приходится работать. Будем называть его рабочим множеством.
При этом на формирование такого множества тратится время, и при переходе к каждой задаче этот процесс нужно повторять.
Если приходится отвлечься на другую задачу или по другим причинам, то потом приходится это рабочее множество восстанавливать заново.
Исследование показывает, что после возврата к задаче разработчику почти всегда требуется просмотреть несколько мест в проекте, прежде чем он сможет продолжить работу и на это требуется время
Которое может достигать от нескольких минут до часа и более.
Разметка кода позволяет сохранить рабочее множество, сгруппировав фрагменты кода по задачам и подзадачам в произвольном виде.
Разметка кода упрощает навигацию по текущему рабочему множеству.
В больших проектах нужно еще постараться найти, а потом не потерять нужное место. И к нему нужно регулярно переходить.
С использованием разметки жить становится проще. Множество фрагментов кода на виду, оно небольшое, в нем легко найти нужный фрагмент.
И, в отличие от закладок, разметка к фрагменту привязывается более надежно.
Разметка позволяет быстрее переключаться между задачами. Вот мы поработали пару недель над чем-то и нам нужно вернуться к предыдущей задаче, и что-то исправить.
Вот оно, наше рабочее множество, заботливо собрано и сохранено.
В 1С:Предприятии есть навигационные ссылки, это ссылки на документы в базе данных. Их можно отправить, например, по почте другому сотруднику. Это удобно.
Правда, с объектами в базе данных проще, у них есть первичный ключ, по которому его можно найти, даже если он изменился. А с кодом это не так.
Можно экспортировать кусочек разметки, передать другому разработчику или прикрепить к задаче или к баг-репорту где-нибудь в системе управления проектами.
Особенно важно, что привязка – устойчива к изменению, ведь в это время разработчик может редактировать код. Сохраняется не номер строки, который может «поехать», а некоторая другая информация. Ее и рассмотрим.
Мы привязываемся не к номерам строк, а к синтаксическим конструкциям в исходном коде на разных языках
В сохраняемая информация берется из дерева разбора исходного кода. Оно строится легковесными парсерами.
В составе инструмента есть несколько легковесных парсеров для нескольких языков, а при необходимости их не очень сложно дописать самостоятельно.
Привязываться можно к любым узлам этого дерева. Мы не зависим от инфраструктуры конкретных сред разработки, что дает нам возможность встраивать инструмент в разные среды разработки и работать с разными языками, лишь бы для них был парсер.
После этого если нам надо привязаться к некоторому узлу, то мы сохраняем следующий набор данных
Имя и заголовок узла, а также его тип.
Родительские узлы.
Этой информации хватает во многих случаях, но не во всех.
Кроме этого, дополнительно могут храниться соседние узлы и подузлы.
В некоторых языках без этого не обойтись, кроме того это повышает устойчивость привязки.
В заголовок может входить несколько лексем, среди которых отдельно может выделяться одна – это имя. Оно наиболее важно.
Кроме того, хранение типа позволяют ускорить поиск и отсечь ненужные сущности в коде.
Вот типичный пример, когда нужно хранить родительские узлы. У нас есть несколько одинаковых методов, но они входят в разные классы или пространства имен. Методы в классе уникальны, классы – тоже.
Но так бывает не всегда.
Фрагмент из грамматики ANSI C, в нем два раза встречается нетерминал statement.
Хранение соседей позволяет их различить и найти нужный. Ключевое слово ELSE находится слева от одного из них и справа от другого.
А в некоторых случаях узлы дерева могут не иметь собственного имени, как секции объявления переменных в языке Pascal, но различить их можно по вложенным узлам. Хранение даже небольшого подмножества узлов позволяет привязаться к конкретной секции.
Но самое главное – по этой информации найти нужное место в коде, после того как код поменялся.
У нас есть информация о старом узле T, и набор узлов Ti из нового файла.
Вычисляется степень похожести искомого узла и всех узлов в дереве.
При вычислении величины похожести используется вся сохраняемая информация, но с разными весами.
Для этого используется редакционное расстояние или расстояние Левенштейна.
Вычисляется оно для имен, заголовков (список строк) и внешних контекстов (списков имен – списков списков строк), при каждой следующей версии используется предыдущая.
Пример похожести для отдельных лексем. Для похожих лексем она ближе к единице, для разных – близка к нулю.
Если изменился только тип одного параметра – похожесть близка к единице.
Если это два разных метода – то и похожесть будет ближе к нулю.
В алгоритме поиска прослеживается аналогия с помехоустойчивыми кодами и тем, как они восстанавливают переданные сообщения после воздействия на них помех.
Пусть в некотором файле есть несколько сущностей
В некотором смысле, расстояние между ними тем меньше, чем более похожи эти сущности.
Если какой-то узел
изменился несильно, то он по-прежнему будет самым похожим на исходный с большим отрывом от остальных узлов.
И он будет успешно и с высокой уверенностью найден.
Здесь показаны, своего рода, области, в которых изменения безопасны. Они зависят от наличия поблизости других узлов.
Но если изначально есть много других, очень похожих сущностей в коде,
То даже небольшое изменение может привести к потере привязки.
В некоторых случаях изменения могут быть досаточно сильными.
Здесь привязка осуществлялась к методу класса. Класс был переименован и добавлен другой класс с таким же методом. Возникает неоднозначность.
В этом случае выдается список узлов, отсортированных по величине похожести.
В заголовке отображается исходный узел, а чуть ниже видны два метода visit, один из класса expression, другой из класса statement.
Первый имеет более высокую степень похожести за счет того, что исходное имя класса expr больше похоже на Expression, чем на statement.
А теперь рассмотрим, насколько же устойчивой получилась такая привязка.
Берем две ревизии одного проекта и в первой из них привязываемся вообще ко всему, тотально и параноидально. То есть ко всем узлам, к которым в принципе возможна привязка.
А во второй ревизии ищем все сохраненные узлы.
В качестве первого проекта был взят PascalABC.NET
За половину истории проекта в нем изменилось 406 сущностей. Считаются только изменения классов, заголовков методов и т.д., но не кода внутри методов.
406 - это немного, но как раз в процессе работы и нужна разметка, поэтому продолжаем.
Получается не очень красивый результат. Примерно одна треть узлов находится автоматически, для остальных требуется участие разработчика.
Давайте разбираться, почему так.
Часть фрагментов кода была удалена за это время. Были поля и методы, которые уже не использовались, а затем они были подчищены.
Инструмент всегда пытается найти сущность или помочь с ее поиском, даже если она была удалена.
А если она была на самом деле удалена (это может понять разработчик), то он удалит и разметку.
Мы такие случаи не рассматриваем.
Выбрасываем их из рассмотрения.
Уже чуть лучше.
Дальше, среди оставшихся случаев есть…
111 фрагментов кода, перемещенных в другие файлы. Проводился рефакторинг.
Пока в нашем инструменте файл сохраняется как есть, поэтому привязка ищется в исходном файле.
Можно будет доделать и глобальный поиск, но пока есть возможность указать другой файл и поискать в нем.
Что и было сделано.
В результате эти случаи были переанализированы
Часть из них теперь находится полностью автоматически, а часть – по прежнему требует участия разработчика.
Теперь посмотрим повнимательнее на вот эту категорию «выдан список узлов»
Так вот оказывается, что все до единого результаты поиска в этой категории попадают на первую строчку в списке наиболее вероятных узлов.
Просто отрыв от второго места не двукратный.
Это все возникает в случае если есть похожие сущности.
Например, визитор, обрабатывающий иерархию узлов дерева (более 200 узлов), когда у нас изначально в одном классе есть сотни методов, отличающихся только типом одного параметра. Сама иерархия узлов. И тому подобные, достаточно сложные места в коде.
Если немного поправить правило поиска и выдавать первый результат в списке, то получается вот такая картина.
Поэтому такой результат можно считать очень хорошим.
Мы получаем, грубо говоря, 100% точность поиска. С одной оговоркой – среди тех узлов, которые физически остались в коде.
Удаленные узлы, как вы помните, мы исключали из рассмотрения.
Или вот такой проект. Roslyn.
Он побольше и развивается поактивнее.
Для анализа я сразу решил взять интервал в один год разработки…
…и оказалось, что за это время было сделано более 10 тысяч ревизий.
Ну что же, тем интереснее будет посмотреть результаты.
Изменилось за это время 20 с половиной тысяч сущностей, анализировать их вручную слишком долго
Поэтому была взята выборка из 500 случайных узлов. Список был перемешан в случайном порядке (RandomShuffle, и взяты первые 500 элементов списка)
Эту выборку и посмотрим.
Здесь соотношение уже сразу лучше, почти три четверти узлов находятся автоматически.
Смотрим дальше.
Так же, как и в прошлом проекте, часть из не найденных узлов была удалена. Или изменена настолько, что найти этот код не удалось. Можно сказать, что некоторые вещи были полностью переписаны. Все-таки год разработки и 10 тысяч ревизий.
Выбрасываем и их.
И смотрим дальше
Всего 5 сущностей было перемещено в другой файл
Проверяем их
Из них 4 теперь находятся автоматически и одна – нет.
Теперь посмотрим на вот этот сектор (выдан список узлов).
Здесь ситуация чуточку хуже. Почти все узлы оказываются на первом месте в списке, но 4 узла изменились сильнее, но их все же можно быстро найти в списке похожих узлов.
А вот еще в двух случаях инструмент с полной уверенностью выдает неправильный узел.
В итоге получается такое соотношение правильных и неправильных результатов поиска
Тем не менее, в плохих случаях все же можно посмотреть список похожих узлов и быстро найти нужный.
К тому же, сюда я отнес один случай, когда один большой метод был разбит на два и оба они занимали первые две строчки, но большая часть полезных действий была все же во втором методе, а значит скорее всего, разработчику потребуется заглядывать в список результатов. Я его отнес к ошибочным результатам, хотя это спорный момент.
Привести примеры
Успешный и не успешные
Это и так большой период – год.
Образный пример про город спустя 20 лет и старый план города. План это и есть разметка. Но плохая, статическая, не алгоритмическая. (В начало)
А если добавить поддержку среды разработки, то будет 100%. За эти 100% мы и боремся.