Статический анализ кода языка Ruby





Скачать 112.31 Kb.
НазваниеСтатический анализ кода языка Ruby
Дата публикации26.04.2015
Размер112.31 Kb.
ТипКурсовая
100-bal.ru > Информатика > Курсовая


Санкт-Петербургский Государственный Университет

Математико-Механический факультет

Кафедра системного программирования

Статический анализ кода

языка Ruby
Курсовая работа студента 345 группы

Денисона Юрия Борисовича

Научный руководитель Д.С. Ушаков

Санкт-Петербург

2012

Оглавление

1. Введение....................................................................................................................................3

2. Обзор существующих средств.................................................................................................5

3. Описание решения....................................................................................................................6

3.1 Общий алгоритм....................................................................................................................6

3.2 PSI дерево...............................................................................................................................6

3.3 Инспекция..............................................................................................................................7

3.4 Предложение..........................................................................................................................9

4. Список проверок.....................................................................................................................10

5. Заключение..............................................................................................................................13

6. Список источников.................................................................................................................14

1. Введение

Язык Ruby - динамический высокоуровневый язык программирования для быстрого и удобного объектно-ориентированного программирования.

Некоторые возможности Ruby:

  • обладает строгой динамической типизацией

  • имеет лаконичный и простой синтаксис, разработанный под влиянием Ada, Eiffel и Python

  • Позволяет переопределять операторы, которые на самом деле являются методами

  • поддерживает замыкания с полной привязкой переменных

  • поддерживает блоки кода ({...} или do … end)

По состоянию на май 2012 года, Ruby занимает 11 позицию в международном рейтинге Tiobe [1]. Также, интересную статистику представляет рейтинг языков программирования на GitHub [2], в котором Ruby занимает 2 строчку, обгоняя Python. Среди проектов, написанных на Ruby можно выделить известный во всем мире сервис микроблогов Twitter, написанный с использованием популярного фреймворка Ruby on Rails.
RubyMine - IDE от компании Jetbrains для быстрой и удобной разработки на Ruby, написанная на базе платформы IntelliJ, бесплатной программной платформы с открытым исходным кодом, предназначенной для написания удобных и многофункциональных сред разработки. Платформа написана на языке Java, а значит, построенные на ее основе среды разработки могут работать в любой операционной системе, для которой существует среда выполнения виртуальной машины Java. Этот список включает в себя по крайней мере все три основные семейства операционных систем, существующих в настоящее время: Windows, Linux, Mac OS.
Согласно принципу Парето, в работе над проектом лишь 20% времени занимает написание исходного кода, тогда как 80% занимает исправление ошибок, оптимизации и различного рода дополнения кода. Для повышения производительности программиста путем предупреждения типичных ошибок и нахождении участков кода, не соотвествующих принятым стандартам (code smells [3]), используются различные инструменты анализа кода.

Анализ исходного кода может выполняться двумя способами:

  • Во время выполнения программы (runtime)

  • Статический анализ кода

В контексте RubyMine, инструментами для статического анализа исходного кода, являются:

  • Intentions (инспекции кода) - модули, на лету предлагающие изменения в коде, в котором возможны ошибки или не отвечающему принятым стандартам оформления кода.

  • Intentions (предложения) - модули, предлагающие изменения, повышающие читаемость и поддерживаемость кода.


Цель моей курсовой работы - анализ существующих решений для статического анализа кода Ruby, анализ принятых в сообществе разработчиков стандартов оформления исходного кода, на основе собранной информации составление списка необходимых инспекций и предложений и, непосредственно, реализация их в RubyMine.
2. Обзор существующих средств

В данный момент, в качестве стандарта оформления исходного кода Ruby в сообществе принят Ruby style guide [4]. В данном документе собраны рекомендации по следующим разделам:

  • Рекомендации по разметке исходного кода

  • Синтаксические нормы

  • Стандарты именования классов, переменных, методов и тд

  • Нормы оформления комментариев

  • Нормы оформления аннотаций к исходному коду

  • Нормы оформления обработчиков исключений

  • Нормы использования коллекций

  • Нормы работы со строками

  • Нормы работы с регулярными выражениями

  • Нормы работы со специальными символами Ruby


Существует несколько популярных средств для анализа кода Ruby, к которым можно отнести:

  • Reek [5]

  • Roodi [6]

  • Flog

  • Heckle


Изучив документацию по этим средствам, было решено реализовать в рамках курсовой работы функциональность Reek и Roodi в силу большей популярности этих средств анализа.
В качестве типичного примера проверки можно привести Class Variable Check из Reek, предупреждающей об использовании глобальных переменных, приводящему к возможным проблемам, когда одна часть программы непреднамеренно меняет переменную, использующуюся в другой части, или к проблемам с написанием тестов, покрывающих данный участок кода.
Стоит отметить преимущество интеграции этих средств в RubyMine, ибо для непосредственного их использования программисту необходимо при каждом изменении кода заново вручную запускать эти программы, тогда как в RubyMine все проверки проходят на лету при изменении кода.

3. Описание решения
3.1 Общий алгоритм анализа исходного кода

Общий алгоритм анализа состоит из четырех основных фаз:

  1. лексический и синтаксический разбор исходного кода

  2. семантический разбор

  3. построение промежуточного представления исходного кода

  4. выявление конкретных проблем на основе промежуточного представления


Первые два пункта выходят за рамки данной работы, поэтому их рассматривать мы не будем. В RubyMine существует собственное представление кода в виде дерева синтаксического разбора, которое называется PSI-tree, которое и будет использоваться в качестве промежуточного представления.

3.2 PSI-дерево

PSI-tree является базовым понятием в платформе IntelliJ. PSI расшифровывается как Program Structure Interface (интерфейс программных структур). Его построением занимается парсер. Обычно минимальной единицей построения PSI-дерева является файл. Например, для файла с одним классом будет построено дерево с корнем «файл» с одним дочерним узлом «класс». У «класса» дочерними узлами будут поля, методы, конструкторы, инициализаторы. При этом PSI-дерево «знает» о семантике языка. У соответствующих узлов дерева (ASTNode) присутствуют методы для доступа и обработки специфичных для языка конструкций. Например, у класса есть методы для получения всех полей, списка имплементированных интерфейсов, поиска метода по имени, сигнатуре и т. д. У всех узлов, являющихся выражениями, есть метод для получения типа.
3.3 Инспекция (Inspection)

При каждом вносимом в редакторе изменении, перестраивается PSI-дерево и по нему запускаются все зарегистрированные инспекции, которые регистрируют найденные ошибки, которые после этого подсвечиваются в редакторе.
Класс каждой инспекции наследуется от LocalInspectionTool, в котором переопределяются методы, описывающие саму инспекцию (название, имя группы инспекций, описание самой проверки и уровень подстветки проблемы (Highlighting Level)), а также метод buildVisitor, который возвращает обходчик дерева, ищущий эту проблему.
Highlighting Level:

  • Error, например, когда количество передаваемых методу параметров не соответствует его сигнатуре (RubyArgCountInspection)

  • Warning, например, когда код не соответствует style guide’у.

  • Weak Warning, например, когда в названии переменной допущена грамматическая ошибка (SpellChecker plugin)


3.3.1 Ruby Element Visitor

Класс, содержащий методы для посещения конкретных PsiElement’ов в PSI-tree, по умолчанию, ничего не делающих. Для каждой инспекции реализуется свой Visitor, который переопределяет только нужные методы, в соответствии с целью инспекции.
Например, для посещения узла дерева, соответствующему конструкции if, нужно переопределить метод void visitRIfStatement(RIfStatement ifStatement). Для каждой конструкции языка есть соответствующий метод класса Visitor.
При нахождении ошибки, она может регистрироваться с предложением изменений для ее устранения, или же без него, если инспекция только информирует программиста о найденной проблеме. Например, RubyIfCanBeCaseInspection предлагает, если это возможно, заменить if блок на case блок (аналог switch в Ruby), а RubyArgCountInspection только информирует о несоответствии количесва передаваемых параметров сигнатуре метода.

3.3.2 Ruby Fix

Класс, перестраивающий соответствующих узлов PSI-дерева для устранения проблемы, выявленной инспекцией.

Пример работы RubyInstanceVariableNamingInspection можно видеть на следующих рисунках.



3.4 Предложение (Intention)

Каждое предложение наследуется от класса IntentionAction и переопределяет следующие методы:

  • имя и имя группы предложения

  • boolean isAvailable() - метод, определяющий, допустимо ли данное предложение для элемента, соответствующему текущему положению каретки

  • void invoke() - метод, вызываемый когда пользователь соглашается на предложение. в нем производятся необходимые изменения в PSI-дереве


Таким образом, при вызове предложений программистом, для каждого зарегистрированного предложения вызывается isAvailable() и составляется список доступных предложений.

Пример работы AllHashRocketToNewStyleIntention можно видеть на следующих рисунках.



4. Список проверок

Syntax Inspections

  • Инспекция, реагирующая на отсутствие скобок вокруг аргументов def. Предлагает исправление.

  • Инспекция, реагирующая, когда for можно заменить на foreach.
    Предлагает исправление.


  • Инспекция, реагирующая на необязательный then в многострочных if/unless блоках.
    Предлагает исправление.


  • Инспекция, реагирующая, когда if//unless блок можно заменить тернарным оператором.
    Предлагает исправление.


  • Инспекция, реагирующая на вложеннные тернарные операторы. Такие конструкции могут приводить к сложновыявляемым ошибкам.

  • Инспекция, реагирующая на устаревший синтаксис. При переходе на новые версии ruby могут возникать ошибки при использовании такого кода.
    Предлагает исправление.


  • Инспекция, реагирующая на однострочные if/unless блоки. Их удобнее записывать в виде 'do_someting if some_condition'.
    Предлагает исправление.


  • Инспекция, реагирующая на использование if в отрицательных условиях.
    Предлагает исправление: if !smth end -> unless smth end


  • Инспекция, реагирующая на использование else в unless блоках.
    Предлагает исправление на if.


  • Инспекция, реагирующая на использование do...end в однострочных блоках.
    Предлагает исправление на {...}


  • Инспекция, реагирующая на использование необязательного оператора return.
    Предлагает исправление.


  • Инспекция, реагирующая на отсутствие пробелов при определении параметров методов по умолчанию.
    Предлагает исправление.


  • Инспекция, реагирующая на несоответствие комментариев style-guide’у.

  • Инспекция, реагирующая на case блок без подблока else. Такие конструкции могут приводить к ошибкам.
    Предлагает исправление.


  • Инспекция, реагирующая на boolean выражения, которые могут быть упрощены.
    Предлагает оптимизацию.


  • Инспекция, реагирующая на вызов super метода, если суперкласс явно не определен.
    Предлагает исправление.


  • Инспекция, реагирующая на использование глобальных переменных.

  • Инспекция, реагирующая на пустые rescue блоки (аналоги catch для java)
    Предлагает исправление.


  • Инспекция, реагирующая на присвоение в условиях. В большинстве случаев вместо ‘=’ должно быть ‘==’.
    Предлагает исправление.


  • Инспекция, реагирующая на слишком большой класс.
    Включает проверки количества используемых переменных, методов, параметров методов и строк кода.


  • Инспекция, реагирующая на скобки вокруг условий в if/unless/while блоках.
    Предлагает исправление.


  • Инспекция, реагирующая на несоответствие количества передаваемых методу параметров его сигнатуре.

  • Инспекция, реагирующая на небезопасное использование переменных и параметров.

  • Инспекция, реагирующая на недостижимые блоки.

  • Инспекция, реагирующая на неиспользующиеся локальные переменные

  • Инспекция, реагирующая на некорректный синтаксис хешей.
    Предлагает исправление.


  • Инспекция, реагирующая на некорректное использование YARD тегов.


Naming Inspections

Инспекции, реагирующие на элементы, имена которых не соответствуют принятому style guide’у.
Collections inspections

  • Инспекция, реагирующая на массивы строк, которые могут быть записаны через специальный синтаксис %w.
    Предлагает исправление.


  • Инспекции, реагирующие на неправильный синтаксис хешей.

    • Использование строк вместо символов в качестве ключей

    • Корректность массивов хешей

    • Дубликация ключей в массиве. По умолчанию будет использоваться последний найденный ключ с этим именем, предыдущие будут игнорироваться. Такое поведение может привезти к труднонаходимым ошибкам.


Strings inspections

  • Инспекция, реагирующая на сложени строк и предлагающая объединение с использованием вставок #{}.

  • Инспекция, реагирующая на использование “...” строк вместо ‘...’.
    Предлагает исправление.



Percent literals

  • Инспекция, проверяющая корректроность регулярных выражений.

  • Инспекция, реагирующая на использование %r в регулярных выражениях, в которых более одного знака ‘/’.

  • Инспекция, реагирующая на использование %q, %Q, %x, %s, и %W. Рекомендуется избегать их использование.


5. Заключение

  • Был составлен список [7] необходимых инспекций и предложений на основе ruby-style-guide, roodi, reek и заявок пользователей на багтрекере rubymine [8]

  • Были реализованы 32 инспекции из списка. 6 существующих предложений переписаны с ruby на java для повышения производительности, добавлены 2 новых предложения

  • В блоге RubyMine была опубликована статья [9] про новые инспекции.

  • На настоящий момент вся реализованная функциональность доступна в стабильной версии RubyMine 4.0.3 [10]

6. Список источников

  1. Рейтинг языков программирования Tiobe http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

  2. Рейтинг языков программирования на GitHub https://github.com/languages

  3. Презентация “Fighting code smells in RubyMine” с конференции RuPy2011 http://www.slideshare.net/olegshpynov/fighting-ruby-code-smell

  4. Ruby Style Guide https://github.com/bbatsov/ruby-style-guide

  5. Reek https://github.com/kevinrutherford/reek/wiki/code-smells

  6. Roodi https://github.com/martinjandrews/roodi#readme

  7. Список инспекций в Rubymine http://confluence.jetbrains.net/display/RUBYDEV/RubyMine+Inspections

  8. Багтрекер RubuMine http://youtrack.jetbrains.com/issues?q=RubyMine

  9. Статья про инспекции в блоге RubyMine http://blog.jetbrains.com/ruby/2011/11/whats-mining-new-ruby-inspections-for-better-code/

  10. Официальная страница RubyMine http://www.jetbrains.com/ruby/



Добавить документ в свой блог или на сайт

Похожие:

Статический анализ кода языка Ruby iconРабочая программа по дисциплине: в контроль достоверности заявленного кода товара
Целью изучения дисциплины является получение специального образования, способствующего развитию у студента знаний и навыков определения...
Статический анализ кода языка Ruby iconИзучение информатики в старшей школе направлено на достижение следующих целей
В данном проекте рассматривается создание Web страниц с помощью html кода. Он может быть использован для изучения темы "Создание...
Статический анализ кода языка Ruby iconПрограмма по формированию навыков безопасного поведения на дорогах...
Статический механизм связи воедино приложений распределенной системы. Достоинства и недостатки. Примеры
Статический анализ кода языка Ruby iconУрок русского языка и английского языка по теме «Комплексный анализ текста»
Романенко Лариса Владимировна, учитель русского языка и литературы, Лябах Юлия Анатольевна, учитель английского языка моу-сош №28...
Статический анализ кода языка Ruby iconРабочая программа составлена на основе фгос впо и учебного плана...
«клиент-сервер» с использованием субд на основе применения языка pl/sql в качестве основного интерфейса составления и отладки программного...
Статический анализ кода языка Ruby iconЗадание на ргр
Спроектировать и реализовать универсальную программную коллекцию для атд «Простой, статический граф» и использовать коллекцию для...
Статический анализ кода языка Ruby iconП. Н. Волков Московский физико-технический институт (государственный...
Представлена технология покомпонентного unit-тестирования на примере цикловых оптимизаций бинарного компилятора. Проведен структурный...
Статический анализ кода языка Ruby iconТак кто же он учитель?
Добрый день, уважаемые коллеги. Слайд. Подготовка к презентации портфолио мо учителей начальных классов и русского языка – это анализ....
Статический анализ кода языка Ruby iconАнализ работы мо учителей английского языка за 2012-2013 учебный год
Мо учителей иностранного языка работало над научно-методической темой: «Личностно-ориентированный подход в обучении иностранного...
Статический анализ кода языка Ruby iconСтруктурно-семантические и функциональные характеристики английского...

Статический анализ кода языка Ruby iconАнализ работы шмо учителей английского языка за 2006-2007 уч год
Работа шмо учителей английского языка велась с целью организовать учебный процесс изучения английского языка на всех ступенях в соответствии...
Статический анализ кода языка Ruby iconУрок литературы и русского языка в 9 классе по теме: «Анализ стихотворения...
Интегрированный урок литературы и русского языка в 9 классе по теме: Анализ стихотворения М. Ю. Лермонтова
Статический анализ кода языка Ruby iconРассмотрено
По дисциплине, междисциплинарному курсу (с указанием кода мдк) Наименование дисциплины
Статический анализ кода языка Ruby iconПрезентация на тему: Комплексный анализ текста
Изучение языка писателей должно быть связано с замыслом художественного произведения, его литературными образами. Только тогда можно...
Статический анализ кода языка Ruby iconАнализ работы методического объединения учителей предметов гуманитарного...
Методическое объединение учителей гуманитарного цикла объединяет учителей русского языка и литературы, иностранного языка, эрзянского...
Статический анализ кода языка Ruby iconАнализ работы мо учителей иностранного языка мобу сош №1 с. Бураево за 2012-2013 учебный год
Тема деятельности методического объединения учителей иностранного языка на 2012-2013 учебный год: «Профессиональное развитие учителя...


Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
100-bal.ru
Поиск