A tool to measure Fortran source code metrics using syntax analysis
The rapid development of software quality measurement methods, the need in efficient and versatile reengineering automatization tools becomes increasingly bigger. This becomes even more apparent when the programming language and respective coding practices slowly develop alongside each other for a l...
Збережено в:
Дата: | 2021 |
---|---|
Автор: | |
Формат: | Стаття |
Мова: | Ukrainian |
Опубліковано: |
Інститут програмних систем НАН України
2021
|
Теми: | |
Онлайн доступ: | https://pp.isofts.kiev.ua/index.php/ojs1/article/view/449 |
Теги: |
Додати тег
Немає тегів, Будьте першим, хто поставить тег для цього запису!
|
Назва журналу: | Problems in programming |
Завантажити файл: |
Репозитарії
Problems in programmingid |
pp_isofts_kiev_ua-article-449 |
---|---|
record_format |
ojs |
resource_txt_mv |
ppisoftskievua/62/9be72c5ec70720a39a3e36507346a562.pdf |
spelling |
pp_isofts_kiev_ua-article-4492024-04-26T22:25:02Z A tool to measure Fortran source code metrics using syntax analysis Засіб вимірювання метрик вихідного коду FORTRAN за допомогою синтаксичного аналізу Pokrovskyi, A.M. source code metric; software quality; refactoring UDC 004.4'22 метрика вихідного коду; якість програмного забезпечення; рефакторінг УДК 004.4'22 The rapid development of software quality measurement methods, the need in efficient and versatile reengineering automatization tools becomes increasingly bigger. This becomes even more apparent when the programming language and respective coding practices slowly develop alongside each other for a long period of time, while the legacy code base grows bigger and remains highly relevant. In this paper, a source code metrics measurement tool for Fortran program quality evaluation is developed. It is implemented as a code module for Photran integrated development environment and based on a set of syntax tree walking algorithms. The module utilizes the built-in Photran syntax analysis engine and the tree data structure which it builds from the source code. The developed tool is also compared to existing source code analysis instruments. The results show that the developed tool is most effective when used in combination with Photran’s built-in refactoring system, and that Photran’s application programming interface facilitates easy scaling of the existing infrastructure by introducing other code analysis methods.Prombles in programming 2021; 1: 26-35 В умовах стрімкого розвитку методик забезпечення якості програмного коду, все більшою стає потреба в інструментах, що можуть автоматизувати процес оновлення та реструктуризації текстів програм. Розроблено програмний засіб для вимірювання програмних метрик, що дозволяє провести оцінювання якості вихідного коду програм мовою Fortran. Для цього розроблено алгоритми обходу синтаксичного дерева програми та на їх основі реалізовано модуль для інтегрованого середовища програмування Photran. Модуль використовує синтаксичний аналізатор програмного коду та побудоване Photran на його основі структурне дерево. Проведено порівняння розробленого засобу з наявними інструментами аналізу вихідного коду. Результати показують, що розроблений засіб особливо ефективний у поєднанні з вбудованою в Photran системою рефакторінгу, а програмний інтерфейс самого Photran дозволяє легко масштабувати існуючу інфраструктуру, додаючи підтримку інших видів аналізу. Prombles in programming 2021; 1: 26-35 Інститут програмних систем НАН України 2021-04-23 Article Article application/pdf https://pp.isofts.kiev.ua/index.php/ojs1/article/view/449 10.15407/pp2021.01.026 PROBLEMS IN PROGRAMMING; No 1 (2021); 26-35 ПРОБЛЕМЫ ПРОГРАММИРОВАНИЯ; No 1 (2021); 26-35 ПРОБЛЕМИ ПРОГРАМУВАННЯ; No 1 (2021); 26-35 1727-4907 10.15407/pp2021.01 uk https://pp.isofts.kiev.ua/index.php/ojs1/article/view/449/453 Copyright (c) 2021 PROBLEMS IN PROGRAMMING |
institution |
Problems in programming |
baseUrl_str |
https://pp.isofts.kiev.ua/index.php/ojs1/oai |
datestamp_date |
2024-04-26T22:25:02Z |
collection |
OJS |
language |
Ukrainian |
topic |
source code metric software quality refactoring UDC 004.4'22 |
spellingShingle |
source code metric software quality refactoring UDC 004.4'22 Pokrovskyi, A.M. A tool to measure Fortran source code metrics using syntax analysis |
topic_facet |
source code metric software quality refactoring UDC 004.4'22 метрика вихідного коду якість програмного забезпечення рефакторінг УДК 004.4'22 |
format |
Article |
author |
Pokrovskyi, A.M. |
author_facet |
Pokrovskyi, A.M. |
author_sort |
Pokrovskyi, A.M. |
title |
A tool to measure Fortran source code metrics using syntax analysis |
title_short |
A tool to measure Fortran source code metrics using syntax analysis |
title_full |
A tool to measure Fortran source code metrics using syntax analysis |
title_fullStr |
A tool to measure Fortran source code metrics using syntax analysis |
title_full_unstemmed |
A tool to measure Fortran source code metrics using syntax analysis |
title_sort |
tool to measure fortran source code metrics using syntax analysis |
title_alt |
Засіб вимірювання метрик вихідного коду FORTRAN за допомогою синтаксичного аналізу |
description |
The rapid development of software quality measurement methods, the need in efficient and versatile reengineering automatization tools becomes increasingly bigger. This becomes even more apparent when the programming language and respective coding practices slowly develop alongside each other for a long period of time, while the legacy code base grows bigger and remains highly relevant. In this paper, a source code metrics measurement tool for Fortran program quality evaluation is developed. It is implemented as a code module for Photran integrated development environment and based on a set of syntax tree walking algorithms. The module utilizes the built-in Photran syntax analysis engine and the tree data structure which it builds from the source code. The developed tool is also compared to existing source code analysis instruments. The results show that the developed tool is most effective when used in combination with Photran’s built-in refactoring system, and that Photran’s application programming interface facilitates easy scaling of the existing infrastructure by introducing other code analysis methods.Prombles in programming 2021; 1: 26-35 |
publisher |
Інститут програмних систем НАН України |
publishDate |
2021 |
url |
https://pp.isofts.kiev.ua/index.php/ojs1/article/view/449 |
work_keys_str_mv |
AT pokrovskyiam atooltomeasurefortransourcecodemetricsusingsyntaxanalysis AT pokrovskyiam zasíbvimírûvannâmetrikvihídnogokodufortranzadopomogoûsintaksičnogoanalízu AT pokrovskyiam tooltomeasurefortransourcecodemetricsusingsyntaxanalysis |
first_indexed |
2024-12-16T04:04:44Z |
last_indexed |
2024-12-16T04:04:44Z |
_version_ |
1818568304619421696 |
fulltext |
Теоретичні та методологічні основи програмування
© А.М. Покровський, 2021
26 ISSN 1727-4907. Проблеми програмування. 2021. № 1
УДК 004.4'22 https://doi.org/10.15407/pp2021.01.026
А.М. Покровський
ЗАСІБ ВИМІРЮВАННЯ МЕТРИК ВИХІДНОГО КОДУ
FORTRAN ЗА ДОПОМОГОЮ СИНТАКСИЧНОГО АНАЛІЗУ
За умов стрімкого розвитку методик забезпечення якості програмного коду, все більшою стає потреба в
інструментах, що можуть автоматизувати процес оновлення та реструктуризації текстів програм. Роз-
роблено програмний засіб для вимірювання програмних метрик, що дозволяє провести оцінювання
якості вихідного коду програм мовою Fortran. Для цього розроблено алгоритми обходу синтаксичного
дерева програми та на їх основі реалізовано модуль для інтегрованого середовища програмування
Photran. Модуль використовує синтаксичний аналізатор програмного коду та побудоване Photran на йо-
го основі структурне дерево. Проведено порівняння розробленого засобу з наявними інструментами
аналізу вихідного коду.
Ключові слова: метрика вихідного коду, якість програмного забезпечення, рефакторинг.
Вступ
Забезпечення якості вихідного коду –
це важлива проблема, що стоїть перед роз-
робниками програмного забезпечення.
Протягом життєвого циклу програмного
продукту вимоги до нього видозмінюють-
ся, що призводить до необхідності редагу-
вання та реструктуризації коду. У деяких
випадках, життєвий цикл програми (від
початку проектування до виходу із вжит-
ку) може складати десятки років. За такий
час міняються не тільки функціональні
вимоги, а й версії мови програмування, що
використовується, стилістичні підходи при
написанні текстів програм тощо.
Прикладом такого середовища є
екосистема мови Fortran. Як перша високо-
рівнева мова програмування, що активно
використовується й нині, Fortran за час сво-
го існування зазнала значних змін як у син-
таксисі, так і у вимогах якості до вихідного
коду [1]. Водночас, велика кількість про-
грамних засобів та компонент вимагає під-
тримки та оновлення, оскільки задачі, що
вирішуються за допомогою цих програм, не
втрачають своєї актуальності. Для забезпе-
чення підтримуваності та для спрощення
задачі проектування Fortran – систем була
створена значна кількість підручних засобів
автоматизації розробки (Computer-Aided
Software Engineering, CASE-інструментів).
Процес підвищення якості програмного
забезпечення (ПЗ) (реінжиніринг) полягає у
виявленні та усуненні потенційних вад (те-
хнічних або стилістичних), що можуть
ускладнити роботу над програмним проду-
ктом. Для цього CASE-інструменти нада-
ють дві групи автоматизованих операцій –
вимірювання програмних метрик, що до-
зволяють дати оцінку якості вихідного ко-
ду, та здійснення рефакторингів, тобто вне-
сення у цей код комплексних змін, що при-
зведуть до підвищення його якості. Існує
багато інтегрованих середовищ програму-
вання, які надають подібні можливості при
роботі з Fortran, наприклад, Forсheck, fpt,
плагіни для Visual Studio та CLion.
В даній роботі за основу програм-
ного засобу було взято Photran – плагін для
Eclipse IDE з відкритим вихідним кодом,
що містить вбудований програмний інтер-
фейс для взаємодії та аналізу вихідного
коду Fortran-програм. На його основі ство-
рено засіб для оцінювання якості вихідно-
го коду за допомогою вимірювання про-
грамних метрик. Також наведено порів-
няння різних інструментів, що надають
подібний функціонал.
Матеріал даної роботи організовано
наступним чином. В першому розділі опи-
сані програмні метрики, вимірювання яких
було реалізовано у розробленому засобі. В
другому розділі описано плагін Photran та
реалізація інтерфейсу програмного засобу.
В третьому розділі описано розроблені
алгоритми вимірювання метрик з викорис-
танням синтаксичного дерева програми. В
останньому розділі наведено порівняння
розробленого програмного засобу зі схо-
жими інструментами, що надають інші
середовища програмування.
Теоретичні та методологічні основи програмування
27
1. Програмні метрики
Метрики програмного забезпечення
– множина алгоритмів, за допомогою яких
можна отримати з вихідного коду програ-
ми числове значення, яке має свідчити про
рівень складності, взаємозалежності та
ефективності алгоритму. Більшість метрик
фокусуються на вимірюванні таких показ-
ників, як розмір програми, складність
логічного графу програми (структурні
елементи та залежності між ними – класи,
модулі, файли, функції тощо) або склад-
ність графу керування програми (послідо-
вність виконання інструкцій, викликів під-
програм).
Різні класи метрик вимагають для їх
обчислення взаємодії з різними форматами
представлення програми. Для максимально
повної демонстрації можливостей програ-
много інтерфейсу засобу доцільно вибира-
ти метрики, які покривають більшість та-
ких форматів.
В роботі реалізовано вимірювання
трьох метрик, що представляють три класи
взаємодій з програмним інтерфейсом.
Кількість рядків коду (Source
Lines Of Code, SLOC) – примітивна метри-
ка, що вимірює обсяг та зусилля, необхідні
для написання програми рядками вихідно-
го коду. Ця метрика складається з трьох
різних значень:
- кількість фізичних рядків коду
(LOC) – кількість рядків програми, що
безпосередньо перетворюються компіля-
тором/транслятором на машинний код;
- кількість рядків коментарів
(comment LOC, CLOC) – кількість рядків
коментарів, тобто тверджень, що ігнору-
ються компілятором;
- кількість пустих рядків (blank
LOC, BLOC) – кількість рядків, що не міс-
тять тексту та використовуються для візу-
ального розбиття програми на блоки.
Вид взаємодії з програмним інтер-
фейсом – для вимірювання цієї метрики
необхідно мати змогу отримати доступ до
вихідного коду програми.
Обсяг зусиль по Холстеду
(Halstead Effort) – метрика, що була введе-
на в 1977 році Морісом Холстедом в числі
групи метрик складності (Halstead
Complexity Measures) як спосіб виміряти
складність та обсяг вихідного коду про-
грами. Ця метрика фокусується на оціню-
ванні зусиль, що будуть витрачені програ-
містом на написання або підтримку коду
та розглядає текст програми як набір лек-
сичних одиниць та зв’язків між ними [2].
Для обчислення обсягу зусиль за
Холстедом необхідно виміряти такі почат-
кові значення:
𝑛1 – кількість унікальних
операторів,
𝑛2 – кількість унікальних операндів,
𝑁1 – загальна кількість операторів,
𝑁2 – загальна кількість операндів.
Ці значення характеризують розмір
та різноманітність програмного лексикону,
що був використаний при написанні вихі-
дного коду, а відношення між загальною
кількістю та кількістю унікальних елемен-
тів показує ступінь зв’язаності тексту (бі-
льша кількість використань символу – бі-
льша зв’язаність). На основі цих значень
здійснюється обчислення похідних метрик:
- словник програми (𝑛):
1 2n n n . (1)
- розмір програми (𝑁):
1 2N N N . (2)
- обсяг (об’єм) програми (𝑉):
2logV N n . (3)
- складність програми (𝐷):
1 2
22
n N
D
n
. (4)
- обсяг зусиль для написання
програми (𝐸):
E D V . (5)
Вимірювання цієї метрики на відмі-
ну від LOC вимагає аналізу вихідного коду
та визначення залежностей між лексични-
ми одиницями мови програмування. Вид
взаємодії з програмним інтерфейсом – збір
інформації про синтаксичні елементи ви-
Теоретичні та методологічні основи програмування
28
хідного коду, їх тип та зв’язки між визна-
ченням та використанням ідентифікаторів.
Цикломатична складність за Ма-
ккейбом – структурна метрика складності
алгоритму, введена Томасом Маккейбом в
1976 році. Практичною проблемою, що
призвела до створення цієї метрики, була
необхідність вирахування кількості тестів
за допомогою яких можна повністю пок-
рити комп’ютерну програму. Цикломатич-
на складність визначається як кількість
лінійно незалежних шляхів через алгоритм
[3]. Найпростіша програма, що не містить
операторів умовного переходу, буде мати
цикломатичну складність 1, бо існує лише
один шлях проходу через неї. Один умов-
ний перехід збільшить кількість маршрутів
удвічі – один у випадку коли значення
умови переходу є істинним, другий у ви-
падку коли воно є хибним.
З математичної точки зору цикло-
матична складність вираховується за до-
помогою представлення програми у вигля-
ді орієнтованого графа, де вузлами є групи
нероздільних інструкцій, а ребрами – пе-
реходи потоку керування між цими група-
ми. Позначимо:
E – кількість ребер у графі,
𝑁 – кількість вузлів у графі,
𝑃 – кількість компонентів зв’язності
графа (для підпрограми дорівнює 1).
Тоді цикломатичну складність 𝑀
можна обчислити за формулою:
2M E N P .
Для вимірювання цієї метрики не-
обхідно побудувати та обійти структурний
граф програми та визначити, як впливають
на цикломатичну складність різні мовні
конструкції. Вид взаємодії з програмним
інтерфейсом – збір інформації про потік
керування та послідовність виконання ін-
струкцій програми.
2. Середовище Photran
Photran – потужне інтегроване сере-
довище програмування (IDE) для Fortran
побудоване на базі Eclipse. В набір функ-
цій Photran входять редагування вихідного
коду, система пошуку та навігації, компі-
ляція, виконання та налагодження про-
грам. Для побудови проектів використову-
ється make, що в сукупності з відкритим
вихідним кодом та можливістю запускати
Eclipse з усіх популярних ОС, робить
Photran зручним та гнучким засобом, який
можна швидко налаштувати під конкретні
потреби.
Представлення Fortran-програми у
Photran здійснюється за допомогою двох
структур даних – абстрактного синтакси-
чного дерева (Abstract Syntax Tree, AST)
та віртуальнного програмного графа
(Virtual Program Graph, VPG). AST пред-
ставляє собою структурне дерево програ-
ми, гілки якого закінчуються листками, які
відповідають за синтаксичні елементи мови
програмування (оператори, літерали, іден-
тифікатори тощо). VPG служить інтерфей-
сом між програмістом та AST, дозволяє
отримувати та вивільнювати його екземп-
ляри, проводити лексичний аналіз коду,
отримувати інформацію про зв’язки між
програмними структурами та їх ідентифіка-
торами [4].
Модуль вимірювання метрик необ-
хідно пов’язати з інтерфейсом Eclipse для
можливості взаємодії з вікном огляду про-
екту (для вибору файлів, з яких необхідно
зібрати дані). Для цього у роботі було ви-
користано вбудовану у Photran механіку
рефакторингів. Вона дозволяє за допомо-
гою так званого «ресурсного рефакторин-
гу» зареєструвати певну операцію, що має
відповідний підпункт на навігаційній па-
нелі та передає на вхід операції файли, що
були виділені користувачем у вікні огляду
проекту.
Для реєстрації рефакторингу необ-
хідно виконати ряд дій:
- створити клас, що реалізує ін-
терфейс IResourceRefactoring. Цей інтер-
фейс містить методи для отримання назви
операції, перевірки початкових умов (ко-
ректності програмного коду та файлової
структури проекту) та внесення змін у код.
Оскільки операція вимірювання метрик є
пасивною, то останній метод не викорис-
товується.
- Зареєструвати нові рядки, що
міститимуть назву операції та її класу,
додати значення цих рядків до конфігура-
ційного файлу.
Теоретичні та методологічні основи програмування
29
- Зареєструвати саму операцію у
файлі plugin.xml пакета org.eclipse.photran.
ui.vpg.
Далі наведено приклад текста файла
маніфеста для реєстрації рефакторингу:
<group>
<submenu name="Code Analysis"><!--
Refactorings to perform code analysis -->
<resourceRefactoring
class="org.eclipse.photran.internal.
corerefactoring.MeasureCodeMetrics-
Refactoring"/>
</submenu>
</group>
3. Реалізація модуля вимірювання
метрик для Photran
Для отримання доступу до структу-
ри програми та вимірювання метрик вико-
ристовується об’єкт AST. Програмні конс-
трукції, що необхідно враховувати при
цьому, у синтаксичному дереві представ-
лені вузлами які, у свою чергу, представ-
лені в програмному інтерфейсі Photran
об’єктами класів, що реалізують базовий
інтерфейс IASTNode. Обхід дерева здійс-
нюється за допомогою патерна «відвіду-
вач», для чого необхідно реалізувати інте-
рфейс IASTVisitor. Цей інтерфейс містить
методи, в тілі яких має здійснюватися об-
робка «відвіданого» структурного вузла.
Кожен вузол у свою чергу містить метод
accept(IASTVisitor), який є реалізацією
патерну та надає переданому об’єкту дос-
туп до внутрішніх конструкцій та дочірніх
вузлів. Наприклад, клас ASTIfConstru-
ctNode відповідає за конструкцію умовно-
го переходу, та в реалізації методу accept
дозволяє «відвідувачу» обійти тіло конс-
трукції (код, куди здійснюється умовний
перехід), конструкцію else if та конструк-
цію else.
Тривіальним прикладом структур
дерева та відвідувача буде програма, що
містить визначення певних даних (змінної,
масиву тощо) та виклик підпрограми. Під-
програма, в свою чергу, міститиме конст-
рукцію умовного переходу (if-elseif). Клас-
відвідувач для обходу такого дерева має
реалізувати ряд методів, по одному для
кожного типу структури. Спрощену діаг-
раму класів для такого випадку показано
на рис. 1.
Алгоритми вимірювання метрик:
SLOC та BLOC – найпростіші мож-
ливі метрики, для вимірювання яких до-
статньо отримати текст програми за допо-
могою методу IASTNode.toString(), розби-
ти його на рядки та порахувати їх загаль-
ну кількість та кількість порожніх рядків.
Для вирахування метрик LOC,
CLOC, що залежать від вмісту рядка, було
використано метод IFortranAST.
findFirstTokenOnLine(). У випадку наяв-
ності «токена» (програмного виразу) ря-
док є рядком коду, інакше – рядком з
коментарем.
Рис. 1. Спрощена діаграма класів для патерна «відвідувач» у Photran
Теоретичні та методологічні основи програмування
30
Для вимірювання зусиль за Холс-
тедом необхідно отримати чотири базові
значення – загальну та унікальну кількості
операндів та операторів (𝑁1, 𝑁2, 𝑛1, 𝑛2).
Кожному операнду та оператору в синтак-
сичному дереві відповідає певний об’єкт
класу Token. У кожного токена, у свою
чергу, є тип (представлений об’єктом кла-
су Terminal), що унікально ідентифікує
синтаксичні одиниці мови.
Операнди у Fortran діляться на два
типи: «ідентифікатори» (змінні та імена
функцій або підпрограм), що отримують
тип токена T_IDENT та літерали або конс-
танти, що отримують тип у залежності від
типу константи (T_ICON для цілочисель-
ного літерала, T_SCON для строкового
літерала тощо). Літерали, навіть однакові
за значенням, завжди вважаються унікаль-
ними, тому їх кількість просто сумується і
додається до 𝑁2 та 𝑛2. До 𝑁2 також дода-
ється сумарна кількість ідентифікаторів,
але оскільки одного визначення (однієї
змінної) можуть стосуватися багато токе-
нів, то для підрахунку кількості унікаль-
них ідентифікаторів необхідно відслідку-
вати ці визначення. Для цього VPG надає
метод Token.resolveBinding() що вертає
унікальний об’єкт визначення (класу
Definition), що стосується даного ідентифі-
катора. Загальна кількість цих об’єктів
після обходу всіх токенів додається до 𝑛2.
Всі токени, що не є ідентифікатора-
ми або константами, вважаються операто-
рами. Їх загальна кількість записується в
𝑁1, а кількість унікальних – в 𝑛1. Після
цього здійснюються обчислення, описані в
розділі 1.
Збір інформації для вирахування
цикломатичної складності вимагає повно-
го обходу синтаксичного дерева та зміни
значення метрики в залежності від типу кон-
струкції. Конструкції, що вимагають обходу
«відвідувачем» при обчисленні цикломатич-
ної складності, наведені в табл. 1.
Таблиця 1
Дії при виявленні мовних конструкцій
Назва конструкції Приклад конструкції Дія при виявленні
if statement if () ! action - збільшення значення метрики на 1
if construct if () then
! body
end if
- збільшення значення метрики на 1
- обхід тіла конструкції
else if construct else if () then
! body
end if
- збільшення значення метрики на 1
- обхід тіла конструкції
else construct else
! body
end if
- обхід тіла конструкції
loop construct do [label] [while ()]
! body
[label | end do]
- збільшення значення метрики на 1
- обхід тіла конструкції
assigned/computed
goto statement
goto (label[, label]),
value
- збільшення значення метрики на кіль-
кість аргументів label
case construct select case ()
! body
end select
- обхід тіла конструкції
case statement case () - збільшення значення метрики на 1
forall statement forall () ! action - збільшення значення метрики на 1
forall construct forall () then
! body
end forall
- збільшення значення метрики на 1
- обхід тіла конструкції
Теоретичні та методологічні основи програмування
31
Особлива ситуація виникає з конст-
рукцією where. Ця конструкція призначена
для скороченого запису фільтрації масивів
за певною умовою. В найпростішому ви-
падку (один «рівень» фільтрації) препро-
цесор перетворить твердження where на
один цикл do з одним набором умовних
переходів всередині. При додаванні додат-
кового рівня фільтрації, препроцесор ви-
мушений виконати «розгортання» конс-
трукції для того щоб другий рівень фільт-
рації виконувався після звершення першо-
го (на оновлених даних) [5]. Приклад та-
ких конструкцій наведено в табл. 2.
З цієї причини, звичайний обхід
конструкцій where не дасть виміряти коре-
ктного значення метрики. Цикломатична
складність вузла в цьому випадку залежить
не тільки від типу, але й від рівня фільтра-
ції на якому перебуває вузол, загальної
вкладеності рівнів фільтрації та їх кількос-
ті всередині вузла. Оскільки конструкції
where можуть містити в собі тільки інші
конструкції where, то зручно розглядати
where найвищого рівня як окреме дерево.
Позначимо:
𝑛 – кількість рівнів фільтрації,
𝑚𝑖 – кількість вузлів на 𝑖-ому рівні,
𝑖 = 1, 𝑛̅̅ ̅̅ ̅,
𝑤𝑖𝑗 – 𝑗-ий вузол -го рівня, 𝑖 = 1, 𝑛̅̅ ̅̅ ̅,
𝑗 = 1,𝑚𝑖
̅̅ ̅̅ ̅̅ ,
𝑠𝑖𝑗 – кількість дочірніх вузлів 𝑤𝑖𝑗,
𝑖 = 1, 𝑛̅̅ ̅̅ ̅, 𝑗 = 1,𝑚𝑖
̅̅ ̅̅ ̅̅ ,
𝑐𝑖𝑗𝑘 – 𝑘-ий дочірній вузол 𝑤𝑖𝑗, 𝑖 =
1, 𝑛̅̅ ̅̅ ̅, 𝑗 = 1,𝑚𝑖
̅̅ ̅̅ ̅̅ ,
𝐿(𝑥) – кількість викликів вузла x.
Таблиця 2
Перетворення конструкцій where препроцесором
К-сть шарів
фільтрації
Вихідний код Фактичний код Значення
метрики
1
where (condition1)
! body1
elsewhere (condition2)
! body2
elsewhere
! body3
end where
do
if (condition1) then
! body1
else if (condition2) then
! body2
else
! body3
end if
end do
4
2
where (condition1)
where (condition3)
! body3
end where
! body1
elsewhere (condition2)
! body2
end where
do
if (condition1) then
! body1
else if (condition2) then
! body2
end if
end do
do
if (condition1) then
if (condition3) then
! body3
end if
end if
end do
7
Теоретичні та методологічні основи програмування
32
Проаналізувавши приклади, наве-
дені в табл. 1, видно що вузол 𝑤𝑖𝑗 буде
задіяно один раз для -го рівня і по одному
разу для кожного рівня, в якому лежать
його нащадки. З цього виходить, що кіль-
кість викликів вузла 𝐿(𝑥) на одиницю бі-
льша за його висоту у дереві і її можна
обчислити за рекурсивною формулою:
1){ } 1( ) ( ijs
k
ij kijkL cmw ax L . (6)
За допомогою формули (6) можна
порахувати кількість конструкцій if, які
буде створено препроцесором для певної
конструкції where. Водночас, оскільки для
кожного рівня необхідно окремо обійти
масив, кількість циклів, що буде створено,
дорівнює висоті дерева. Тому загальну
цикломатичну складність такої конструкції
можна обчислити як:
1
1
1
1
1
{ }( ) ( )
i
m
j
mn
ij j
i j
j
L Lx wmaw
. (7)
Для демонстрації вимірювання мет-
рик використано проект-приклад, заванта-
жений з інтернету. Приклад виводу про-
грами показано на рис. 2.
Рис. 2. Приклад виводу програми
При багаторазовому запуску про-
грами середня швидкість оброблення вихі-
дного коду складає ~1000 строк/сек. Вимі-
рювання проводилися з використанням
комп’ютера оснащеного процесором Intel
Core i7-9750H 2.6GHz з обсягом оператив-
ної пам’яті 16GB.
4. Порівняння розробленого засобу
з аналогами
На початку тисячоліття хороший
інструмент для рефакторингу має містити
швидкий статичний аналізатор синтаксису,
потужний модуль пошуку та заміни. На
сьогоднішній день цей список буде надто
коротким щоб задовольнити всі потреби
розробника. При порівнянні сучасних ін-
струментів рефакторингу мова йдеться про
їх інфраструктуру, про можливість інтег-
рації з сучасними інтегрованими середо-
вищами розробки, про перевірений та зру-
чний інтерфейс користувача, гарну масш-
табованість для можливості підтримки
різних розмірів проекту, компіляторів та
середовищ виконання, часті оновлення,
хорошу документованість, інструменти
для роботи з командою, тобто мова йдеться
вже про екосистему мови програмування.
За час існування Fortran створена
велика кількість засобів для автоматизації
навігації та аналізу програмного коду
(CASE-інструментів). Вони здебільшого
діляться на чотири категорії:
технічні аналізатори вихідного
коду. Це програмні засоби, призначені для
перегляду тексту програми та пошуку за-
старілого або «метрвого» коду та синтак-
сичних помилок [6];
стилістичні аналізатори вихідного
коду. Вказують на заплутаність тексту
програми, недостатню кількість комента-
рів та шкідливі стилістичні або архітекту-
рні практики [7];
засоби навігації вихідним кодом.
Дозволяють здійснювати переміщення
графом потоку даних (між змінними та їх
визначеннями) та потоку керування (дере-
вом викликів підпрограм), а також здійс-
нювати пошук за ключовими словами, ти-
пами даних тощо [8];
засоби рефакторингу вихідного
коду. Надають інструментарій для автома-
тичної реорганізації тексту програми з ме-
тою покращення структури, швидкодії,
полегшення внесення змін та подальшої
підтримки продукту.
Теоретичні та методологічні основи програмування
33
Засоби для вимірювання програм-
них метрик належать до першої категорії,
але оскільки сучасна парадигма інтегрова-
ного середовища програмування передба-
чає об’єднання більшості необхідних роз-
робникам інструментів в один продукт, ці
засоби зазвичай містять функціонал з ін-
ших категорій. Найбільш розвинуті CASE-
інструменти для Fortran (крім Photran) на-
ведені у табл. 3.
В порівнянні з перерахованими за-
собами, Photran має ряд переваг. Eclipse
IDE в його основі робить його однаково
простим та гнучким у налаштуванні на
Windows, Linux та MacOS. Відкритий ви-
хідний код та ліцензування за Eclipse
Public License означає що будь-хто може
переглядати, змінювати та використову-
вати готові компоненти для реалізації но-
вого функціоналу. Можливість прямої
взаємодії з AST означає порівняну лег-
кість реалізації на його основі систем пе-
реписувальних правил [9] або графічних
візуалізацій [10]. В сукупності з навігаці-
єю вихідним кодом Fortran, здійсненням
рефакторингів та вимірюванням метрик,
Photran є потужним та доступним засобом
автоматизації підвищення якості програ-
много забезпечення в галузях, які найбі-
льше цього потребують.
Таблиця 3
Порівняння CASE-інструментів для Fortran
Назва
Стан
підтримки
Загальний опис
Збір програмних
метрик
Understand В активній
розробці
Інтегроване середовище, що містить
функціонал для навігації вихідним
кодом та сфокусоване на створенні
візуальних звітів по структурі прое-
кту.
Збирає метрики LOC
та інші кількісні мет-
рики (кількість файлів,
підпрограм, викликів
функцій тощо).
SCSE В активній
розробці
Потужний інструмент для навігації
вихідним кодом, основним функціо-
налом є виконання пошукових запи-
тів на великих об’ємах даних.
Збирає метрики LOC,
цикломатичну склад-
ність та зусилля за Хо-
лстедом.
FPT Остання ак-
тивність
07.2020
Технічний аналізатор вихідного ко-
ду з фокусом на міграціях програм
між різними середовищами вико-
нання та операційними системами.
Збирає метрики LOC
та цикломатичну скла-
дність.
Forcheck В активній
розробці
Технічний аналізатор вихідного ко-
ду, що підтримується вже більше 30
років [11], з фокусом на пошуку не-
явних помилок у тексті програм.
Збирає метрики LOC
та цикломатичну скла-
дність.
Fortran
Analyzer
Остання ак-
тивність
09.2019
Стилістичний аналізатор вихідного
коду з фокусом на альтернативних
метриках, що вказують на «чистоту»
коду, таких як глибина вкладених
циклів, документованість програм-
них елементів (файлів, підпрограм,
модулів).
Збирає метрику SLOC
та інші кількісні мет-
рики (кількість підпро-
грам, викликів функ-
цій,).
Теоретичні та методологічні основи програмування
34
Висновки
В роботі розроблені алгоритми для
обходу синтаксичного дерева, на основі
яких реалізовано додаток до плагіну
Photran для оцінювання якості вихідного
коду мови Fortran за допомогою вимірю-
вання програмних метрик. Використання
розробленого засобу є більш дієвим у по-
єднанні з іншими функціями Photran для
визначення, усунення та відслідковування
динаміки росту програми. Проведено порі-
вняння поточного стану та перспектив ро-
звитку інфраструктури середовища Photran
з іншими CASE-інструментами. До пода-
льших напрямків розробки належать ство-
рення інструментів для візуалізації струк-
тури вихідного коду, рефакторингів для
оптимізації паралельних обчислень, засо-
бів для стилістичного аналізу програм.
Література
1. Overbey J.L., Negara S., Johnson R.E.
Refactoring and the evolution of Fortran.
Workshop on Software Engineering for
Computational Science and Engineering,
Vancouver, BC. 2009. P. 28–34.
2. Hariprasad T., Vidhyagaran G., Seenu K.,
Thirumalai C. Software complexity analysis
using halstead metrics. International
Conference on Trends in Electronics and
Informatics (ICEI), Tirunelveli. 2017.
P. 1109 –1113.
3. McCabe T.J. A Complexity Measure. IEEE
Transactions on Software Engineering. 1976.
N 4. P. 308–320.
4. Photran Developer's Guide [Електронний
ресурс]. Режим доступу до ресурсу:
https://git.eclipse.org/c/ptp/org.eclipse.photra
n.git/plain/org.eclipse.photran-dev-docs/dev-
guide/dev-guide-specialized.pdf.
5. Metcalf M., Reid J.K. Fortran 90/95
explained. USA: Oxford University Press,
Inc. 1999. 341 p. (2).
6. fpt – Tools for Fortran Engineering [Елект-
ронний ресурс]. Режим доступу до ре-
сурсу: http://www.simconglobal.com/fpt_
summary.html.
7. García-Rodríguez M., Añel J., Foujols M.,
Rodeiro J. FortranAnalyser: A software tool
to assess Fortran code quality [Електронний
ресурс]. 2016. Режим доступу до ресурсу:
http://fortrananalyser.ephyslab.uvigo.es/docs/
access.pdf.
8. Source Code Search Engine [Електронний
ресурс]. Режим доступу до ресурсу:
http://www.semanticdesigns.com/Products/Se
archEngine/?site=SoftwareRecommendations.
9. Дорошенко А.Ю., Жереб K.А., Туліка Є.М.
Розпаралелювання програм на фортрані з
використанням техніки переписувальних
правил. Проблеми програмування. 2012.
№ 2-3. С. 388–397.
10. Fortran 77 Flowcharting Utility [Електрон-
ний ресурс]. Режим доступу до ресурсу:
http://www.deater.net/weave/vmwprod/f77_di
agram/.
11. Lawden M.D. FORCHECK. A Fortran
Verifier and Programming Aid. Lawden.
Starlink User Note. 1990. N 73. P. 1–3. Top
10 Digital Transformation Trends For 2019
[Електронний ресурс]. Режим доступу до
ресурсу: https://www.forbes.com/sites/
danielnewman/2018/09/11/top-10-digital-
transformation-trends-for-
2019/#17d55d1e3c30.
References
1. Overbey J.L., Negara S., Johnson R.E.
Refactoring and the evolution of Fortran.
Workshop on Software Engineering for
Computational Science and Engineering,
Vancouver, BC. 2009. P. 28–34.
2. Hariprasad T., Vidhyagaran G., Seenu K.,
Thirumalai C. Software complexity analysis
using halstead metrics. International
Conference on Trends in Electronics and
Informatics (ICEI), Tirunelveli. 2017.
P. 1109–1113.
3. McCabe T.J. A Complexity Measure. IEEE
Transactions on Software Engineering. 1976.
N 4. P. 308–320.
4. Photran Developer's Guide [online] Available
at: <https://git.eclipse.org/c/ptp/org.eclipse.
photran.git/plain/org.eclipse.photran-dev-
docs/dev-guide/dev-guide-specialized.pdf>
[Accessed 12 February 2021].
5. Metcalf M., Reid J.K. Fortran 90/95
explained. USA: Oxford University Press,
Inc. 1999. 341 p. (2).
6. fpt – Tools for Fortran Engineering [online]
Available at: <http://www.simconglobal.com/
fpt_summary.html> [Accessed 12 February
2021].
7. García-Rodríguez M., Añel J., Foujols M.,
Rodeiro J. FortranAnalyser: A software tool
to assess Fortran code quality [online]
Теоретичні та методологічні основи програмування
35
Fortrananalyser.ephyslab.uvigo.es. Available
at: <http://fortrananalyser.ephyslab.uvigo.es/
docs/access.pdf> [Accessed 12 February
2021].
8. Semanticdesigns.com. n.d. Source Code
Search Engine. [online] Available at:
<http://www.semanticdesigns.com/Products/S
earchEngine/?site=SoftwareRecommendation
s> [Accessed 12 February 2021].
9. Doroshenko A., Zhereb K. and Tulika Y.
Parallelization of Fortran programs using
rewriting rules. Problems of programming.
2012. Vol. 2-3. P. 388–397.
10. Deater.net. n.d. 10. Fortran 77 Flowcharting
Utility. [online] Available at:
<http://www.deater.net/weave/vmwprod/f77_
diagram/> [Accessed 12 February 2021].
11. Lawden M., 1990. FORCHECK – A Fortran
Verifier and Programming Aid. Starlink User
Note, 73(1). P. 1–3.
Одержано 13.02.2021
Про автора:
Покровський Андрій Максимович,
студент 2 курсу магістратури в
НТУУ “КПІ імені Ігоря Сікорського”
Місце роботи автора:
Національний технічний університет
України "КПІ імені Ігоря Сікорського",
кафедра автоматики і управління в техніч-
них системах.
проспект Перемоги 37.
E-mail: a.m.pokrovskyi@gmail.com
|