SlideShare a Scribd company logo
1 of 37
Intelligent
или
сделай мне красиво
Свойства intelligent IDE
● подсветка синтаксиса
● автодополнение
● поиск определений
● проверка корректности
● refactoring assistant
Подсветка синтаксиса
● Основана на регулярных выражениях
● Пример для определения литералов puppet
"(/(?:[^n/]|.)*/)"
Поиск определений ctags
● Основан на поиске определений в файле TAGS
● Генерация TAGS файла происходит внешней программой
● При изменении исходного кода необходимо
перегенерировать TAGS файл
● Чуть менее глупый grep
Пример генерации TAGS файла
$ ctags -a -e -f TAGS --tag-relative -R . 
$(python -c "import sys; print('n'.join(sys.path)))
$ cat TAGS
__call__ service.py /^ def __call__(self, arg):$/
__init__ basehttp.py /^ def __init__(self, service, host,$/
validate service.py /^ def validate(self, request):$/
validate_id validation.py /^def validate_id(request):$/
validate_method validation.py /^def validate_method(request):$/
validate_params validation.py /^def validate_params(request):$/
GNU Global
● Бинарный индекс для быстрого поиска
● Поиск с помощью внешней программы
● Может работать с большой кодовой базой
Недостатки данных решений
● Не учитывают контекст
● Неудобны в использовании
● Проблема пространства имён
Проверка корректности flake8
$ flake8 examples/calc.py
examples/calc.py:3:1: E302 expected 2 blank lines, found 1
examples/calc.py:7:1: E302 expected 2 blank lines, found 1
examples/calc.py:13:1: E128 continuation line under-indented for visual indent
examples/calc.py:13:27: E901 SyntaxError: invalid syntax
examples/calc.py:14:5: E128 continuation line under-indented for visual indent
examples/calc.py:15:1: E901 TokenError: EOF in multi-line statement
Old school refactoring assistant
$ diff examples/calc.py <(autopep8 examples/calc.py)
18c17
< if __name__=='__main__':
---
> if __name__ == '__main__':
Виды анализаторов кода
● Статические
● Динамические
Статические анализаторы
● Работают на уровне AST программы
● Выводят тип конкретного выражения для определения
свойств узла
● Хорошо подходят для языков со статической типизацией
● Примеры
– libclang
– jedi
– tern
– merlin
Основные свойства
Pros
● Безопасные
● Единственное решение при
компиляции в native
● Хорошо решают проблемы
подсветки кода, рефакторинга
и проверки корректности
Cons
● Сложны в реализации
● Плохо интегрируются в
runtime
● Грамматика языка должна
быть контекстно-независимой
● Остро стоит проблема
кэширования
●Вывод типов в языках с динамической
типизацией
● Основан на предположениях
● Type hinting
– python annotations
def haul(item: Haulable, *vargs: PackAnimal) -> Distance:
– sphinx docs
:type options: list of str
:arg options: options for "rash daemon" command
Динамические анализаторы
● Обычно работают внутри запущенного процесса
● Часто интегрируются с REPL
● Анализируют исполняемый код вместо текста программ
● Примеры
– Slime
– IPython
– Pry
Основные свойства
Pros
● Легко реализовать для языков
с интроспекцией
● Нет проблемы
неопределённости типов
Cons
● Небезопасные в силу
исполнения кода
● В языках без интроспекции
необходимо декомпилировать
объект анализа
● При изменении кода
необходимо перезагружать
модули
● Плохо подходят для проверки
корректности и рефакторинга
Проблема синтаксических ошибок
Статические анализаторы могут решить проблему
использованием парсера, игнорирующего ошибки программы
при поиске кандидатов для дополнения, но учитывающего их
при проверки корректности
autocompletion you want
become the jedi you must
>>> import jedi
>>> source = '''
... import datetime
... datetime.da'''
>>> script = jedi.Script(source, 3, 11, 'example.py')
>>> script.completions()
[<Completion: date>, <Completion: datetime>, ...]
Предположения
● Небольшое количество побочных эффектов
● Отсутствие использования магии
– metaclasses
– setattr()
– __import__
– write to object.__dict__
Архитектура Jedi
● Parser
● Code evaluation engine
● api (пример выше)
Parser
● Предоставляет tree-like объект для работы с кодом
● Игнорирует синтаксические ошибки
● Пропускает большую часть операторов
● Дополнительно обрабатывает Array и Call
Вычисление python кода
● Алгоритм основан на ленивых вычислениях
● eval_statement – точка входа в статический анализатор
● Анализ кода происходит в обратном направлении от
„курсора“
Пример кода
import datetime
datetime.date.toda# <-- cursor here
Что происходит
● Evaluator.eval_statement пропускается, так как нет
присваивания
● Evaluator.eval_element ищет полный путь доступа через
атрибуты
● Evaluator.find_types ищет в AST определение datatime в
наиболее удалённой области видимости, находит в
глобальной области видимости import
● Используя логику import ищется модуль datetime
● find_types вызывается повторно в eval_element для поиска
внутри найденного модуля
Правила игры
● find_type вызывается для каждого обращения к атрибуту
● eval_statement вызывается для каждого
– обращения по индексу
– присваивания в области видимости
– вызова callable
● Вычисляются только необходимые операторы для поиска
дополнений
Дополнительные оптимизации
● Анализ операторов ограничивается поиском классов
● Дополнительно обрабатываются следующие методы
– __call__
– __bool__
– __mro__
– __getattribute__
● if работает только в случае isinstance
Дополнительные оптимизации
● Весь модуль сканируется на list append/insert
● Учитываются вызовы функций
def foo(bar):
bar. # completion here
foo(1)
● Предопределены результаты для стандартных
скомпилированных модулей
● Отдельная подсистема для дополнения импортов
Дополнительные оптимизации
● Parser cache основанный на pickle
● Счётчик рекурсии останавливает анализ на приемлемой
глубине
● Для упрощения эти модули потоконебезопасны
# This is never executed, but tricks static analyzers (PyDev, PyCharm,
# pylint, etc.) into knowing the types of these symbols, and what
# they contain.
STATICA_HACK = True
globals()['kcah_acitats'[::-1].upper()] = False
if STATICA_HACK: # pragma: no cover
from celery.app import shared_task # noqa
anaconda-mode
Полезные ссылки
● http://jedi.jedidjah.ch
● http://ternjs.net/
● http://www.gnu.org/software/global/
● https://common-lisp.net/project/slime/
● http://ipython.org/
● http://ctags.sourceforge.net/
</talk>
@proofit404

More Related Content

What's hot

Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)Alexander Gornik
 
Релиз PHP7 - что нас ждет в октябре 2015
Релиз PHP7 - что нас ждет в октябре 2015Релиз PHP7 - что нас ждет в октябре 2015
Релиз PHP7 - что нас ждет в октябре 2015Andrey Tokarchuk
 
Грязная автоматизация
Грязная автоматизацияГрязная автоматизация
Грязная автоматизацияSQALab
 
Беглый обзор "внутренностей" Python
Беглый обзор "внутренностей" PythonБеглый обзор "внутренностей" Python
Беглый обзор "внутренностей" PythonMaxim Kulsha
 
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...corehard_by
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
 
Учим автотесты человеческому языку с помощью Allure и PyTest
Учим автотесты человеческому языку с помощью Allure и PyTestУчим автотесты человеческому языку с помощью Allure и PyTest
Учим автотесты человеческому языку с помощью Allure и PyTestRina Uzhevko
 
Php spl and design patterns
Php spl and design patternsPhp spl and design patterns
Php spl and design patternsPavel Usachev
 
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo
 
Автоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кодаАвтоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кодаVladimir Kochetkov
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...corehard_by
 
Визуализация покрытия автоматизированными UI тестами
Визуализация покрытия автоматизированными UI тестамиВизуализация покрытия автоматизированными UI тестами
Визуализация покрытия автоматизированными UI тестамиSQALab
 
C++ Базовый. Занятие 01.
C++ Базовый. Занятие 01.C++ Базовый. Занятие 01.
C++ Базовый. Занятие 01.Igor Shkulipa
 
Вещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не зналиВещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не зналиZheka Kozlov
 
Леонид Динерштейн - Разработка программ через тестирование поведения средства...
Леонид Динерштейн - Разработка программ через тестирование поведения средства...Леонид Динерштейн - Разработка программ через тестирование поведения средства...
Леонид Динерштейн - Разработка программ через тестирование поведения средства...SQALab
 
Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Nikita Lipsky
 
Practical Language for Extracting Data from Source Codes and Preparing Them f...
Practical Language for Extracting Data from Source Codes and Preparing Them f...Practical Language for Extracting Data from Source Codes and Preparing Them f...
Practical Language for Extracting Data from Source Codes and Preparing Them f...Denis Efremov
 

What's hot (19)

Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
Релиз PHP7 - что нас ждет в октябре 2015
Релиз PHP7 - что нас ждет в октябре 2015Релиз PHP7 - что нас ждет в октябре 2015
Релиз PHP7 - что нас ждет в октябре 2015
 
Грязная автоматизация
Грязная автоматизацияГрязная автоматизация
Грязная автоматизация
 
Беглый обзор "внутренностей" Python
Беглый обзор "внутренностей" PythonБеглый обзор "внутренностей" Python
Беглый обзор "внутренностей" Python
 
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциям
 
Javascript 1
Javascript 1Javascript 1
Javascript 1
 
Учим автотесты человеческому языку с помощью Allure и PyTest
Учим автотесты человеческому языку с помощью Allure и PyTestУчим автотесты человеческому языку с помощью Allure и PyTest
Учим автотесты человеческому языку с помощью Allure и PyTest
 
Php spl and design patterns
Php spl and design patternsPhp spl and design patterns
Php spl and design patterns
 
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
 
Автоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кодаАвтоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кода
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
 
Визуализация покрытия автоматизированными UI тестами
Визуализация покрытия автоматизированными UI тестамиВизуализация покрытия автоматизированными UI тестами
Визуализация покрытия автоматизированными UI тестами
 
C++ Базовый. Занятие 01.
C++ Базовый. Занятие 01.C++ Базовый. Занятие 01.
C++ Базовый. Занятие 01.
 
Вещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не зналиВещи в Java, о которых вы (возможно) не знали
Вещи в Java, о которых вы (возможно) не знали
 
Леонид Динерштейн - Разработка программ через тестирование поведения средства...
Леонид Динерштейн - Разработка программ через тестирование поведения средства...Леонид Динерштейн - Разработка программ через тестирование поведения средства...
Леонид Динерштейн - Разработка программ через тестирование поведения средства...
 
Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET
 
Practical Language for Extracting Data from Source Codes and Preparing Them f...
Practical Language for Extracting Data from Source Codes and Preparing Them f...Practical Language for Extracting Data from Source Codes and Preparing Them f...
Practical Language for Extracting Data from Source Codes and Preparing Them f...
 

Similar to Intelligent или сделай мне красиво

08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серыйVladislav Morgun
 
Универсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHPУниверсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHPИван Кочуркин
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...Mail.ru Group
 
20111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture320111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture3Computer Science Club
 
Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Levon Avakyan
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python Meetup
 
Инструменты профайлинга С++ кода
Инструменты профайлинга С++ кодаИнструменты профайлинга С++ кода
Инструменты профайлинга С++ кодаcorehard_by
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...Mail.ru Group
 
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптах
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптахПриемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптах
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптахrevisium
 
Grail - CodeFest'2015
Grail - CodeFest'2015Grail - CodeFest'2015
Grail - CodeFest'2015Igor Khrol
 
Grail: шаги для ваших Python-тестов
Grail: шаги для ваших Python-тестовGrail: шаги для ваших Python-тестов
Grail: шаги для ваших Python-тестовCodeFest
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1m2rus
 
Romanova techforum bash
Romanova techforum bashRomanova techforum bash
Romanova techforum bashkuchinskaya
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальBadoo Development
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20DefconRussia
 

Similar to Intelligent или сделай мне красиво (20)

08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
 
Why Ruby?
Why Ruby?Why Ruby?
Why Ruby?
 
Универсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHPУниверсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHP
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
 
20111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture320111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture3
 
Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей.
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
 
Инструменты профайлинга С++ кода
Инструменты профайлинга С++ кодаИнструменты профайлинга С++ кода
Инструменты профайлинга С++ кода
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
 
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптах
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптахПриемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптах
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптах
 
Grail - CodeFest'2015
Grail - CodeFest'2015Grail - CodeFest'2015
Grail - CodeFest'2015
 
Grail: шаги для ваших Python-тестов
Grail: шаги для ваших Python-тестовGrail: шаги для ваших Python-тестов
Grail: шаги для ваших Python-тестов
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
 
Romanova techforum bash
Romanova techforum bashRomanova techforum bash
Romanova techforum bash
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон Довгаль
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20
 

Intelligent или сделай мне красиво

  • 2. Свойства intelligent IDE ● подсветка синтаксиса ● автодополнение ● поиск определений ● проверка корректности ● refactoring assistant
  • 3.
  • 4.
  • 5. Подсветка синтаксиса ● Основана на регулярных выражениях ● Пример для определения литералов puppet "(/(?:[^n/]|.)*/)"
  • 6. Поиск определений ctags ● Основан на поиске определений в файле TAGS ● Генерация TAGS файла происходит внешней программой ● При изменении исходного кода необходимо перегенерировать TAGS файл ● Чуть менее глупый grep
  • 7. Пример генерации TAGS файла $ ctags -a -e -f TAGS --tag-relative -R . $(python -c "import sys; print('n'.join(sys.path)))
  • 8. $ cat TAGS __call__ service.py /^ def __call__(self, arg):$/ __init__ basehttp.py /^ def __init__(self, service, host,$/ validate service.py /^ def validate(self, request):$/ validate_id validation.py /^def validate_id(request):$/ validate_method validation.py /^def validate_method(request):$/ validate_params validation.py /^def validate_params(request):$/
  • 9. GNU Global ● Бинарный индекс для быстрого поиска ● Поиск с помощью внешней программы ● Может работать с большой кодовой базой
  • 10. Недостатки данных решений ● Не учитывают контекст ● Неудобны в использовании ● Проблема пространства имён
  • 11. Проверка корректности flake8 $ flake8 examples/calc.py examples/calc.py:3:1: E302 expected 2 blank lines, found 1 examples/calc.py:7:1: E302 expected 2 blank lines, found 1 examples/calc.py:13:1: E128 continuation line under-indented for visual indent examples/calc.py:13:27: E901 SyntaxError: invalid syntax examples/calc.py:14:5: E128 continuation line under-indented for visual indent examples/calc.py:15:1: E901 TokenError: EOF in multi-line statement
  • 12. Old school refactoring assistant $ diff examples/calc.py <(autopep8 examples/calc.py) 18c17 < if __name__=='__main__': --- > if __name__ == '__main__':
  • 13. Виды анализаторов кода ● Статические ● Динамические
  • 14. Статические анализаторы ● Работают на уровне AST программы ● Выводят тип конкретного выражения для определения свойств узла ● Хорошо подходят для языков со статической типизацией ● Примеры – libclang – jedi – tern – merlin
  • 15. Основные свойства Pros ● Безопасные ● Единственное решение при компиляции в native ● Хорошо решают проблемы подсветки кода, рефакторинга и проверки корректности Cons ● Сложны в реализации ● Плохо интегрируются в runtime ● Грамматика языка должна быть контекстно-независимой ● Остро стоит проблема кэширования
  • 16. ●Вывод типов в языках с динамической типизацией ● Основан на предположениях ● Type hinting – python annotations def haul(item: Haulable, *vargs: PackAnimal) -> Distance: – sphinx docs :type options: list of str :arg options: options for "rash daemon" command
  • 17. Динамические анализаторы ● Обычно работают внутри запущенного процесса ● Часто интегрируются с REPL ● Анализируют исполняемый код вместо текста программ ● Примеры – Slime – IPython – Pry
  • 18.
  • 19.
  • 20. Основные свойства Pros ● Легко реализовать для языков с интроспекцией ● Нет проблемы неопределённости типов Cons ● Небезопасные в силу исполнения кода ● В языках без интроспекции необходимо декомпилировать объект анализа ● При изменении кода необходимо перезагружать модули ● Плохо подходят для проверки корректности и рефакторинга
  • 21. Проблема синтаксических ошибок Статические анализаторы могут решить проблему использованием парсера, игнорирующего ошибки программы при поиске кандидатов для дополнения, но учитывающего их при проверки корректности
  • 22. autocompletion you want become the jedi you must
  • 23. >>> import jedi >>> source = ''' ... import datetime ... datetime.da''' >>> script = jedi.Script(source, 3, 11, 'example.py') >>> script.completions() [<Completion: date>, <Completion: datetime>, ...]
  • 24. Предположения ● Небольшое количество побочных эффектов ● Отсутствие использования магии – metaclasses – setattr() – __import__ – write to object.__dict__
  • 25. Архитектура Jedi ● Parser ● Code evaluation engine ● api (пример выше)
  • 26. Parser ● Предоставляет tree-like объект для работы с кодом ● Игнорирует синтаксические ошибки ● Пропускает большую часть операторов ● Дополнительно обрабатывает Array и Call
  • 27. Вычисление python кода ● Алгоритм основан на ленивых вычислениях ● eval_statement – точка входа в статический анализатор ● Анализ кода происходит в обратном направлении от „курсора“
  • 29. Что происходит ● Evaluator.eval_statement пропускается, так как нет присваивания ● Evaluator.eval_element ищет полный путь доступа через атрибуты ● Evaluator.find_types ищет в AST определение datatime в наиболее удалённой области видимости, находит в глобальной области видимости import ● Используя логику import ищется модуль datetime ● find_types вызывается повторно в eval_element для поиска внутри найденного модуля
  • 30. Правила игры ● find_type вызывается для каждого обращения к атрибуту ● eval_statement вызывается для каждого – обращения по индексу – присваивания в области видимости – вызова callable ● Вычисляются только необходимые операторы для поиска дополнений
  • 31. Дополнительные оптимизации ● Анализ операторов ограничивается поиском классов ● Дополнительно обрабатываются следующие методы – __call__ – __bool__ – __mro__ – __getattribute__ ● if работает только в случае isinstance
  • 32. Дополнительные оптимизации ● Весь модуль сканируется на list append/insert ● Учитываются вызовы функций def foo(bar): bar. # completion here foo(1) ● Предопределены результаты для стандартных скомпилированных модулей ● Отдельная подсистема для дополнения импортов
  • 33. Дополнительные оптимизации ● Parser cache основанный на pickle ● Счётчик рекурсии останавливает анализ на приемлемой глубине ● Для упрощения эти модули потоконебезопасны
  • 34. # This is never executed, but tricks static analyzers (PyDev, PyCharm, # pylint, etc.) into knowing the types of these symbols, and what # they contain. STATICA_HACK = True globals()['kcah_acitats'[::-1].upper()] = False if STATICA_HACK: # pragma: no cover from celery.app import shared_task # noqa
  • 36. Полезные ссылки ● http://jedi.jedidjah.ch ● http://ternjs.net/ ● http://www.gnu.org/software/global/ ● https://common-lisp.net/project/slime/ ● http://ipython.org/ ● http://ctags.sourceforge.net/