Санкт-Петебургский Государственный университет математико-механический факультет Поиск ошибок в программах на языке Ruby с использованием вывода типов Выполнил: Научный руководитель: Рецензент: Санкт-Петербург, 2008г. Шпынов Олег, 545 гр. Ломов Д.С. Булычев (?) Ruby — динамический язык! + Динамически типизируемый, интерпретируемый. Функциональный. Программы легко читаемы. Удобен для прототипирования, написания небольших программ. - Популярный Web фрэймворк Ruby On Rails, собственная система распространения библиотек на Ruby (gem packaging system), огромное коммьюнити Отсутствие статической типизации! Сложно писать объёмные программы безопасные с точки зрения системы типов. Сложно изменять и преобразовывать код. Постановка задачи Создать инструмент анализа программы на Ruby: Синтаксические Типовые Все языковые анализы - внешние по отношению к программе на Ruby: Не меняем язык! Не вводим никаких типовых аннотаций! Анализировать код на лету. Помогать разработчику при написании кода: автодополнение, переход к определению метода/класса. Реализовать всё вышеперечисленное в рамках плагина для среды разработки IntelliJ IDEA Программа с ошибками Не видно ошибок! Результат анализа Оределяем функцию foo с параметрами a, b cо значением по умолчанию «yes» и оставшимися в массиве rest Ошибка: b — предположительно тип не шире чем у значения по умолчанию. Нет метода bzzzz Ошибка: у *rest тип соответсвующий классу Array. Нет метода fooo. Ошибка: у а уже известен тип Array! Нет метода no()! Ошибка: у 0 нет метода boo(), необходимый для корректной работы метода foo Ошибка: у «no» действительно нет метода bzzzz. Ошибка: неизвестный метод Ошибка: у у нет метода yahooo Ошибка: у выражения нет метода capitaliz Вывод типов У id тип для любого α. α -> α 5: у a тип Unknown, у b тип String, у rest тип Array 6: у a тип Unknown & .boo() 7: у b тип String & .bzzzz() 9: у rest тип Array & .fooo() 11: у a тип Fixnum 12: у a тип Fixnum & .no!() 17: У y тип (Fixnum & .boo()) | (Fixnum & .no()) 20: У y тип (Fixnum & .boo()) | (Fixnum & .no()) & .yahooo() 24: у выражения (...) тип String, нет capitaliz Реализация Разработана система типов с полиморфизмом и intersection types. Вычисляются типы методов, полей, локальных переменных итд. Вычисляются типы встроенных классов, методов . Вычисляются необходимые условия на типы параметров методов. Строится граф потока управления. Для вывода типов решается прямая задача потока данных. Анализируются вызовы методов (наличие метода, наличие необходимого кол-ва аргументов). Анализируются аргументы в вызовах методов на предмет соответствия требованиям к параметрам. Схожие работы Static Type Inference for Ruby. Michael Furr, Jong-hoon (David), Jeffrey S. Foster, Michael Hicks. University of Maryland, College Park. Simon Marlow and Philip Wadler. A practical subtyping system for erlang. In ICFP, pages 136–149, 1997. Peter Thiemann. Towards a type system for analyzing javascript programs. In ESOP, pages 408–422, 2005. Davide Ancona, Massimo Ancona, Antonio Cuni, and Nicholas Matsakis. Rpython: Reconciling dynamically and statically typed oo languages. In DLS, 2007. Kristian Kristensen. Ecstatic – Type Inference for Ruby Using the Cartesian Product Algorithm. Master’s thesis, Aalborg University, 2007. Jason Morrison. Type Inference in Ruby. Google Summer of Code Project, 2006. Сравнение В работе «Static Type Inference for Ruby. Michael Furr, Jonghoon (David), Jeffrey S. Foster, Michael Hicks. University of Maryland, College Park.» типизируется только некое надмножество языка Ruby Типизация программ: Схожие работы - вся программа единовременно Наша реализация - анализ на лету Ни одна из работ не подразумевает интеграцию в среду разработки Заключение Успешно реализован алгоритм решения прямой задачи потока данных На основе полученного решения возможно проводить типизацию программ на языке Ruby Различные типовые анализы Автодополнение кода Всё вышеперечисленное успешно реализовано в рамках open source проекта Ruby plugin для среды разработки программного обеспечения IntelliJ IDEA