Ruby — довольно популярный в наше время язык программирования. Динамическая типизация придаёт языку гибкость и позволяет писать выразительный и ёмкий код. Он также позволяет определять поведение и реализацию программ во время исполнения, что явилось причиной порождения множества фреймворков, ускоряющих решение ряда задач. Один из таких фреймворков — Ruby on Rails. Он заметно упрощает и ускоряет создание web-приложений. Однако в наше время приложение не может долгое время оставаться без изменений, оно постоянно подвергается рефакторингу и в него добавляется новая функциональность. В больших приложениях, написанных на языках с динамической типизацией такие мелкие изменения ведут к усложнению кода в совокупности, а также к усложнению отладки и поиска ошибок.
Первыми на помощь пришли языки аннотаций, такие как RDoc [10] и YARD [19]. Они позволяют не только задокументировать возвращаемые и принимаемые типы методов, но даже декларировать создание динамических методов [21]. Полное документирование программ решает проблему, однако противоречит сущности языка — краткости и выразительности. Поэтому необходимо каким-то образом статически анализировать исходный код, чтобы получить информацию о типах аргументов и о возвращаемых типах методов.
Статический анализ тоже не позволяет разрешить все ситуации в силу специфики языка Ruby [12]. Поэтому было решено анализировать не исходный код программы, а фактические типы аргументов в процессе исполнения программы. Проанализировав большой набор таких данных, можно сделать некоторые выводы о типизированной сигнатуре методов. Например, составить неявные типовые аннотации для широко используемых библиотек. Это открывает широкие возможности, как для поиска ошибок в программах, так и для предложения подсказок их авторам при написании.
В ходе данной работы получены следующие результаты.
1. Разработана архитектура.
2. На языке Ruby/C реализовано окружение для запуска программ, собирающее данные о типах.
3. На языке Java разработан модуль для вывода контрактов, описывающих сигнатуру метода.
4. Создано облачное хранилище для сгенерированных контрактов.
5. Реализован плагин для IDE, встраивающий контракты в систему статического анализа.
6. Модуль протестирован и проведено нагрузочное тестирование.
В дальнейшем планируется активно использовать разработанный модуль в IDE RubyMine и поддерживать базу аннотаций для популярных библиотек.