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



Скачать 112.31 Kb.
Дата16.09.2014
Размер112.31 Kb.
ТипКурсовая


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

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

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



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

языка 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/



Похожие:

Курсовая работа студента 345 группы iconКурсовая работа студента 345 группы
И первое неизгладимое впечатление от игры создает, конечно же, ее графическая составляющая. Выбор графических технологий и инструментов...
Курсовая работа студента 345 группы iconКурсовая работа студента 345 группы
Именно код является основой такого подхода. Но не стоит забывать о том, что альтернативой этому подходу, часто с повышением эффективности...
Курсовая работа студента 345 группы iconКурсовая работа студента 345 группы Иванова Всеволода Юрьевича Научные руководители Ю. В. Литвинов Т. А. Брыксин Санкт-Петербург
Тем не менее, для создания достаточно крупных продуктов, такие системы должны иметь возможность коллективной работы. Поэтому у них...
Курсовая работа студента 345 группы iconКурсовая работа студента группы кн-302 Смажилюка Игоря Павловича

Курсовая работа студента 345 группы iconКурсовая работа студентки 345 группы
Программы могут однозначно сопоставить похожие последовательности ДНК в геномах разных видов; часто такие последовательности несут...
Курсовая работа студента 345 группы iconКурсовая работа студента 445 группы
Создать для существующей платформы DocsVision автогенератор классов-моделей. Требования к генератору
Курсовая работа студента 345 группы iconКурсовая работа по аналитической химии студента 213 группы Ляхова Антона Борисовича
Моделирование процессов разряда-ионизации серебра на поверхности твердого электрода
Курсовая работа студента 345 группы iconКурсовая работа студента 445 группы
Чтобы упростить написание таких приложений, удобно использовать различные библиотеки и фреймворки, например Ubiq Mobile
Курсовая работа студента 345 группы iconКурсовая работа студента 441 группы Минина Ивана Сергеевича
В последнее время задача Comrpressed Sensing(CS) активно изучается. Это связано с хорошими практическими и теоретическими результатами...
Курсовая работа студента 345 группы iconКурсовая работа студента 445 группы
Как правило, такой процесс требует больших трудовых и временных затрат используются для получения данных их различных источников,...
Разместите кнопку на своём сайте:
ru.convdocs.org


База данных защищена авторским правом ©ru.convdocs.org 2016
обратиться к администрации
ru.convdocs.org