Скачать 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:
По состоянию на май 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]), используются различные инструменты анализа кода. Анализ исходного кода может выполняться двумя способами:
В контексте RubyMine, инструментами для статического анализа исходного кода, являются:
Цель моей курсовой работы - анализ существующих решений для статического анализа кода Ruby, анализ принятых в сообществе разработчиков стандартов оформления исходного кода, на основе собранной информации составление списка необходимых инспекций и предложений и, непосредственно, реализация их в RubyMine. 2. Обзор существующих средств В данный момент, в качестве стандарта оформления исходного кода Ruby в сообществе принят Ruby style guide [4]. В данном документе собраны рекомендации по следующим разделам:
Существует несколько популярных средств для анализа кода Ruby, к которым можно отнести:
Изучив документацию по этим средствам, было решено реализовать в рамках курсовой работы функциональность Reek и Roodi в силу большей популярности этих средств анализа. В качестве типичного примера проверки можно привести Class Variable Check из Reek, предупреждающей об использовании глобальных переменных, приводящему к возможным проблемам, когда одна часть программы непреднамеренно меняет переменную, использующуюся в другой части, или к проблемам с написанием тестов, покрывающих данный участок кода. Стоит отметить преимущество интеграции этих средств в RubyMine, ибо для непосредственного их использования программисту необходимо при каждом изменении кода заново вручную запускать эти программы, тогда как в RubyMine все проверки проходят на лету при изменении кода. 3. Описание решения 3.1 Общий алгоритм анализа исходного кода Общий алгоритм анализа состоит из четырех основных фаз:
Первые два пункта выходят за рамки данной работы, поэтому их рассматривать мы не будем. В 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:
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 и переопределяет следующие методы:
Таким образом, при вызове предложений программистом, для каждого зарегистрированного предложения вызывается isAvailable() и составляется список доступных предложений. Пример работы AllHashRocketToNewStyleIntention можно видеть на следующих рисунках. 4. Список проверок Syntax Inspections
Naming Inspections Инспекции, реагирующие на элементы, имена которых не соответствуют принятому style guide’у. Collections inspections
Strings inspections
Percent literals
5. Заключение
6. Список источников
|
Рабочая программа по дисциплине: в контроль достоверности заявленного кода товара Целью изучения дисциплины является получение специального образования, способствующего развитию у студента знаний и навыков определения... | Изучение информатики в старшей школе направлено на достижение следующих целей В данном проекте рассматривается создание Web страниц с помощью html кода. Он может быть использован для изучения темы "Создание... | ||
Программа по формированию навыков безопасного поведения на дорогах... Статический механизм связи воедино приложений распределенной системы. Достоинства и недостатки. Примеры | Урок русского языка и английского языка по теме «Комплексный анализ текста» Романенко Лариса Владимировна, учитель русского языка и литературы, Лябах Юлия Анатольевна, учитель английского языка моу-сош №28... | ||
Рабочая программа составлена на основе фгос впо и учебного плана... «клиент-сервер» с использованием субд на основе применения языка pl/sql в качестве основного интерфейса составления и отладки программного... | Задание на ргр Спроектировать и реализовать универсальную программную коллекцию для атд «Простой, статический граф» и использовать коллекцию для... | ||
П. Н. Волков Московский физико-технический институт (государственный... Представлена технология покомпонентного unit-тестирования на примере цикловых оптимизаций бинарного компилятора. Проведен структурный... | Так кто же он учитель? Добрый день, уважаемые коллеги. Слайд. Подготовка к презентации портфолио мо учителей начальных классов и русского языка – это анализ.... | ||
Анализ работы мо учителей английского языка за 2012-2013 учебный год Мо учителей иностранного языка работало над научно-методической темой: «Личностно-ориентированный подход в обучении иностранного... | Структурно-семантические и функциональные характеристики английского... | ||
Анализ работы шмо учителей английского языка за 2006-2007 уч год Работа шмо учителей английского языка велась с целью организовать учебный процесс изучения английского языка на всех ступенях в соответствии... | Урок литературы и русского языка в 9 классе по теме: «Анализ стихотворения... Интегрированный урок литературы и русского языка в 9 классе по теме: Анализ стихотворения М. Ю. Лермонтова | ||
Рассмотрено По дисциплине, междисциплинарному курсу (с указанием кода мдк) Наименование дисциплины | Презентация на тему: Комплексный анализ текста Изучение языка писателей должно быть связано с замыслом художественного произведения, его литературными образами. Только тогда можно... | ||
Анализ работы методического объединения учителей предметов гуманитарного... Методическое объединение учителей гуманитарного цикла объединяет учителей русского языка и литературы, иностранного языка, эрзянского... | Анализ работы мо учителей иностранного языка мобу сош №1 с. Бураево за 2012-2013 учебный год Тема деятельности методического объединения учителей иностранного языка на 2012-2013 учебный год: «Профессиональное развитие учителя... |