Поиск ошибок в программах на языке Ruby с использованием вывода типов

advertisement
Санкт-Петебургский Государственный университет
математико-механический факультет
Поиск ошибок в программах на языке 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
Download