|
Automated type contracts generation in Ruby
[Автоматизированная генерация типовых контрактов для языка Ruby]
N. Y. Viuginovab, V. S. Fondaratovb a St. Petersburg State University
b JetBrains
Аннотация:
Элегантный синтаксис языка Ruby заметно усложняет поиск ошибок в больших кодовых базах. Статический анализ усложняется специфическими возможностями языка, такими как динамическое создание методов и исполнение строковых выражений. Даже в языках с динамической типизацией информация о типах важна, так как она позволяет улучшить типобезопасность и производить более надёжные статические проверки того, определён ли метод для объекта и передан ли метода корректный набор аргументов. Одним из путей решения проблемы является использование YARD нотаций. Они позволяют задокументировать входные и выходный типы методов или даже декларировать методы, добавляемые динамически. Такие аннотации позволяют улучшить анализ кода и автодополнение. В статье описывается новый подход к генерации типовых аннотаций. Мы отслеживаем непосредственные вызовы метода во время исполнения программы и сохраняем типы аргументов и выходной тип. На основе собранной информации для каждого метода строится неявная типовая аннотация. Каждому автомату сопоставляется конечный автомат, составленный из различных типовых сигнатур метода. К автомату применяется эффективный алгоритм минимизации с целью снизить затраты на хранение и позволяет привести автомат к виду, который может быть легко представлен в виде регулярного выражения. В сгенерированном автомате учитывается только та функциональность метода, которая была покрыта программой, которую исполнил пользователь. Поэтому в подходе предусмотрено объединение автоматов, полученных у разных пользователей с целью увеличения репрезентативности и покрытия функциональности метода.
Ключевые слова:
Ruby, динамически типизированные языки, Ruby VM, YARV, сигнатура метода, наследование типов, статический анализ кода.
Образец цитирования:
N. Y. Viuginov, V. S. Fondaratov, “Automated type contracts generation in Ruby”, Труды ИСП РАН, 29:4 (2017), 7–20
Образцы ссылок на эту страницу:
https://www.mathnet.ru/rus/tisp232 https://www.mathnet.ru/rus/tisp/v29/i4/p7
|
|