100 likes | 308 Vues
Санкт-Петебургский Государственный университет математико-механический факультет. Поиск ошибок в программах на языке Ruby с использованием вывода типов. Выполнил: Шпынов Олег, 545 гр. Научный руководитель: Ломов Д.С. Рецензент: Булычев ( ? ). Санкт-Петербург, 2008г.
E N D
Санкт-Петебургский Государственный университет математико-механический факультет Поиск ошибок в программах на языке Ruby с использованием вывода типов Выполнил: Шпынов Олег, 545 гр.Научный руководитель: Ломов Д.С. Рецензент: Булычев (?) Санкт-Петербург, 2008г.
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, Jong-hoon (David), Jeffrey S. Foster, Michael Hicks. University of Maryland, College Park.» типизируется только некое надмножество языка Ruby • Типизация программ: • Схожие работы - вся программа единовременно • Наша реализация - анализ на лету • Ни одна из работ не подразумевает интеграцию в среду разработки
Заключение • Успешно реализован алгоритм решения прямой задачи потока данных • На основе полученного решения возможно проводить типизацию программ на языке Ruby • Различные типовые анализы • Автодополнение кода • Всё вышеперечисленное успешно реализовано в рамках open source проекта Ruby plugin для среды разработки программного обеспечения IntelliJ IDEA