Методика статического анализа для поиска дефектов естественной семантики программных объектов и ее программная реализация на базе инфраструктуры компилятора LLVM и фронтенда Clang

Journal of Siberian Federal University. Engineering & Technologies, 2018, 11(7), 801-810

yflK 004.43

Static Analysis Technique for Searching Natural

Semantic Defects of Program Objects

and Software Implementation of This Approach Based

on the LLVM Compiler Infrastructure

and the Clang Frontend

Dmitry S. Victorov, Evgeny N. Zhidkov and Roman E. Zhidkov*

Military Academy of Aero-Space Defense named after the Marshal of Soviet Union G.K. Zhukov 50 Zhigareva Str., Tver, 170022, Russia

Received 04.09.2018, received in revised form 27.09.2018, accepted 12.10.2018

The article proposes a static analysis technique for searching functional software defects. Development is caused by the need to create high quality domestic military automated system software in conditions of temporary and financial constraints. The use of static analysis makes it possible to automate the process of error detection and it allows to localizing defects simply. The priority object of inspections should be special software for newly created automated systems because it is exclusively, scale and logical complexity. An approach based on controlling the implementation of principle of dimensional homogeneity of the physical equations presented in the software. For this purpose, program objects identifiers are assigned an invariable attribute in the form of a physical dimension vector of interpreted value. The set of all vectors forms a semantic domain used in verifying the relationships between program objects by analogy with the analysis of dependencies in the abstract interpretation. The technique uses a program internal representation for calculations of derivate vectors on the basis of operations with initial program objects. The software implementations uses the LLVM compiler and Clang frontend to translate code in C, C++, Objective-C. Clang API internal representation in the form of abstract syntax tree is modified to store data about program objects vectors.

Keywords: automated systems, software, program object, verification, static analysis, functional defects, abstract syntax tree, LLVM, Clang.

Citation: Victorov D.S., Zhidkov E.N., Zhidkov R.E. Static analysis technique for searching natural semantic defects of program objects and software implementation of this approach based on the LLVM compiler infrastructure and the Clang frontend, J. Sib. Fed. Univ. Eng. technol., 2018, 11(7), 801-810. DOI: 10.17516/1999-494X-0095.

© Siberian Federal University. All rights reserved

This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License (CC BY-NC 4.0). Corresponding author E-mail address: r-zhdkv@yandex.ru

Методика статического анализа для поиска дефектов естественной семантики программных объектов и ее программная реализация на базе инфраструктуры компилятора LLVM и фронтенда Clang

Д.С. Викторов, Е.Н. Жидков, Р.Е. Жидков

Военная академия воздушно-космической обороны

им. Маршала Советского Союза Г.К. Жукова Россия, 170022, Тверь, ул. Жигарева, 50

В статье описывается методика статического анализа для поиска функциональных дефектов программ, разработка которой обусловлена необходимостью создания качественного отечественного программного обеспечения автоматизированных систем военного назначения в условиях временных и финансовых ограничений процесса разработки. Использование статического анализа позволит автоматизировать процесс выявления дефектов и упростит их локализацию в рамках мероприятий процесса верификации, при этом приоритетным объектом проверок должно быть специальное программное обеспечение вновь создаваемых автоматизированных систем ввиду своей эксклюзивности, масштабности и логической сложности. Предлагается подход, основанный на контроле выполнения принципа размерной однородности физических уравнений, представленных в программе, для чего идентификаторам программных объектов назначается неизменный признак в виде вектора физической размерности интерпретируемой величины. Совокупность всех векторов образует семантический домен, используемый при проверке соотношений между программными объектами по аналогии с анализом зависимостей при абстрактной интерпретации. Для проверки используется внутреннее представление программы, по которому происходят вычисления производных векторов на основании операций с исходными программными объектами. Программная реализация предлагаемой методики основывается на компиляторе LLVM и фронтенде Clang для трансляции кода на языках C, C++, Objective-C. Получаемое с помощью API Clang абстрактное синтаксическое дерево модифицируется для хранения данных о векторах программных объектов.

Ключевые слова: автоматизированные системы, программное обеспечение, программный объект, верификация, статический анализ, функциональные дефекты, абстрактное синтаксическое дерево, LLVM, Clang.

Ведение

При разработке современных автоматизированных систем (АС) происходит процесс непрерывного расширения функциональных возможностей, осуществляемый в основном за счет усложнения логики и увеличения размера используемого специального программного обеспечения (СПО), ввиду чего огромное внимание уделяется вопросам повышения его качества, которое в значительной степени зависит от возможного содержания программных дефектов. Серьезность сложившейся в программной инженерии ситуации подтверждается фактом увеличения доли затрат на выявление и устранение дефектов до 80 % от общей стоимости программного обеспечения (ПО) [1].

Статический анализ (СА), применяемый в рамках верификации программного обеспечения, зарекомендовал себя высокоэффективным методом, позволяющим снижать суммарные трудозатраты на поиск и локализацию дефектов ПО и, как следствие, уменьшать стоимость разработки за счет значительной степени автоматизации процедуры его проведения при наличии достаточных вычислительных ресурсов [2, 3]. Кроме того, возможность применения СА во время кодирования позволяет сокращать до пяти раз стоимость исправления дефектов ПО в сравнении с этапом тестирования, что дополнительно актуализирует необходимость использования анализаторов [1].

Выигрыш в снижении трудозатрат на верификацию ПО может быть увеличен за счет расширения характерного для СА множества обнаруживаемых дефектов, которое в основном образовано нефункциональными дефектами (НФД) [4]. Примерами НФД для наиболее востребованных языков программирования С и С++, используемых при создании ПО автоматизированных систем (АС) военного назначения (ВН), являются: использование неинициализированного (освобожденного) указателя или указателя на NULL, утечка ресурсов, выход за границы статических и динамических объектов и др.

В настоящее время основным методом обнаружения функциональных дефектов (ФД), которые являются следствием нарушений спецификации функциональных возможностей программной системы, признано тестирование [5]. Данный подход в общем случае не может быть автоматизирован, а с ростом размера и сложности программ, при выполнении требования о полном тестовом покрытии, становится высоко трудоемким, кроме того, требующим тратить дополнительные силы на локализацию причин невыполнения теста [2]. Следовательно, актуальна задача поиска альтернативных решений для выявления ФД с использованием менее трудоемких способов, например методик СА.

Нарушение требований функциональности ПО АС ВН зачастую связано с искажением алгоритмов СПО, реализующих информационно-расчетные задачи (ИРЗ), что выражается не только в нарушении порядка вычислений (дефекты в уловных и циклических конструкциях), но и в ошибочной записи вычисляющих выражений в операторах программы (подмена истинных значений операций и операндов). Для ряда АС ВН, СПО которых оперирует данными с ясным физическим смыслом, проверку программ на отсутствие дефектов первого и второго видов возможно организовать по принципу размерной однородности физических уравнений ИРЗ.

Обнаруживаемые вышеуказанным способом дефекты предлагается называть дефектами естественной семантики (ДЕС) программных объектов (переменных, функций, полях и методах классов) с целью акцентировать внимание на их различную природу с семантическими дефектами, вызываемыми нарушением требований спецификации языка программирования.

Применение СА в качестве инструмента для поиска ФД возможно реализовать по аналогии с анализом зависимостей между программными объектами при абстрактной интерпретации, где для описания состояния программы используется подмножество логических утверждений, описывающих состояние объектов программы в текущий момент времени. Возможные предикаты разбиваются на утверждения о значениях объектов и утверждения о зависимостях между ними. Домен возможных значений программных объектов выбирается в соответствии с решаемой задачей [6].

DmitryS. Victorov, EvgenyN.Zhidkov.. .Static AnalasisTethnique fvt Searching Natural Semantic Defects of Program...

Под размерностью физической величины понимается выражение, показывающее ее связь составными теличитамивдйраннойпистемы 0>иепческихвеличин )7 ]. В Международной еистеас неиичен ПСИТвкачесечеосиотиок чыЧувоведлиичуЧТмасса (M), время (T), элек-тримсичий qoic t/), термоданамиитекач темпертоеурв (<9), 1соличчство пещества (N) и сила света (J). Авдачестае допойниеетьных - двеТтзразмерныевеоитиныеплоствй (а) и телесный угол (Q). Таким образом, размерность произвольной физической величины (A) возможно записать в виде произведения степеней сомнооенхелей, соответствующих семи основным физическим величинам и двум дополнительным, в которых опущены численные коэффициенты: dim(A) = L1 M4 Te Iе4 N6 Je ae Qe, где ej - степень j-го сомножителя формулы размерности физической величины. Если зафиксировать порядок сомножителей в указанной выше фтриэле?т0ипяеуисанияра змерности будет достаточно вектора, состоящего только из степе-еейооихеоешожитилей.

Применительно к рассматриваемой задаче программным объектам ставится в соответ-ыствие размерность интерпретируемой в них физической величины, такие утверждения относительно с ойств программных объектов имеют т характер и представляются в виде веиойраеооевтветшо йопмтечики(ВЕС): vobj = ох х е2 х к х о9, e е Q, где e - степень сомножителя формулы размерности физической величины, интерпретируемой в программном объекте; Q -множестворациональных чисел.

Совокупность возможных ВЕС образует пространство (V), которое используется в качестве семантического домена. Формирование домена происходит из внешних источников на оеиыеаиии данных о трограммных объексах. В данном пространстве естественным образом тадхны операции поэоеапдтно сложения и умножения на скаляр, исходя из операций со степенями сомножителей:

" + " — (igjj + £21 ,£[2 + ^22 ,•••,eig + ^29,), ",Г £ S ,

Ал^/Ц,^,...,^0,), АeQ,s eS.

Паедставленныеепервцниудовлетеоряют основнымаксиомем плнейногн пространства, чтопезволяетговорить о лринедкожиеетияроссматриваемому проста нству Е>Е С, я вляющих-ся результатомвыполнениязаданных операций.

ртяии мен^ программными объектами осуществляется через значения их ВЕС (vc4j) и имтет интдичеый хартктни:

алиЛметические рееиеимоаеи: with (v^ , vfJ, 8), vfJ): vfJ = vfJ  vf, где  е {+, -} - арифметическая операцияс ВЕС;

вевиситтсти срсентнит: comp^r ,©,ЕЬ) , vfJ vfJ, где © е {=, - операция сравнения ВЕС.

Выбор промежуточного представления ИК программы

СА развился из теории компиляторов и потому тесно связан с принципами их работы, где для генерации кода на целевом языке могут использоваться различные промежуточные представления программы: дерево разбора (ДР), абстрактное синтаксическое дерево (АСД), граф потокауправления(ГПУ)идр.[8].

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

Результатом грамматического анализа является ДР (иногда конкретное синтаксическое дерево), применительно к решаемой задаче оно имеет избыточную структуру, показывающую последовательность применяемых при разборе кода синтаксических правил, которые не отражают семантику исследуемой программы.

АСД представляет собой конечное помеченное дерево, в котором внутренние вершины обозначеныоператорами языкапрограммирования, к листья - соответствующими операндами. Эта структура данных сохраняет семантику исходной программы, не перегружена особенностями применения синтаксических правил и может формироваться уже на второй стадии трансляции - синтаксическом анализе. При этом обход дерева позволяет производить вычис-лениавефгженчйв еермриехисходнойррогра—мы (иде-риИч-аовры прегртммлых о бъектов). Вышесказанноен атеокнпиоетч предопределяетпспатезованонАТМ акачентвепромежуточ-ного представления программы при поиске ДЕС.

Для организации работы с ВЕС требуется в АСД (NS) хранить дополнительную информа-циюзпроорамм-з1хр°гектаЛы днзчегтр^згныаытоярввифициргааннап стррыиуга узла (n), пы>еылыавлгыщаянзснбншнтрерку:

где mn е LS - метка узла; vn е VS - ВЕС программного объекта; pn е NS - ссылка на «родительский» узел; an - счетчик количества заходов в узел при обходе АСД; fn - признак наличия дефекта в узле; (Cn,-р) - упорядоченное множества «потомков» узла, представленного непосредственно самим множеством Cn ç NS, а также отношением порядка < на Cn. Далее по тексту упорядоченное множество «потомков» (Cn, — для упрощения будем обозначать Cn.

Реализация механизма поиска ДЕС на базе СА представлена в виде набора функций, использующих исходный код (ИК) программы и данные о ВЕС программных объектов, для получения и манипулирования АСД. Структурная схема методики изображена на рис. 1.

Входными данными для методики является Ик программы в виде последовательности символов s е S, по которому происходит формирование АСД на стадиях лексического и синтаксического анализа. Принципы исполнения данных стадий зависят от типа выбранного компилятора (статического анализатора); абстрагируясь от особенностей реализации, представим их работу в виде функций.

Работа лексического анализатора может быть описана многократным применением функции lexical: S^L. В результате для входной последовательности символов (s е S) формируется подмножество лексем (LS ç L), представляющее собой LS =Is^jCs^jOs^jKs^jDs , где IS ç I -идентификаторы; CS ç C - константы; OS ç O - знаки операций; KS ç K - ключевые слова; DS ç D - разделители.

Методика СА для поиска ДЕС

РисЛ.СтруктурнаясхемаметодикиСАдля поискаДЕС

Fig.l. ^roctaa^chemeanhestatic anafyeistechoiqisefornatural semantic defects detection

Синтаксический анализатор, которыйвозможно изобразит функцией туиЗасиз\Ь—ВЫ, на основе выделенных лексем строит внутреннее представление программы в виде АСД

(ИясПЗ).

Прогртммные оа1.ткты, призналемпкоторыт являются Е>Е^С., в ИК программы представ-леныидентпфпкатооамиТ.Их вотявление из полученных летгем Га проозвооотся с помощью многократного применения функции geticl: Ь—>1. Реализация функции следующая:

getid (С ) =

I, если I ч1 ; 0, иначе.

ДляхраненияВЕСнсОи в рхаифицированной ^-^е^^в^т^ур^ уила АСД предусмотрено поле, заполнение которого производисст путем отображения множтстваидентификадсровпхо -гр дммеыо обиахоои/СсУна BEC:seCwsv:/—>V.

Оыполнееив и контроль нороектности операций н ВЕС производиаия вн сремя оИхтдомо-дифищфованногнВСД, который начилнатсявкорнеаоно узлн.рля почунеиия корня АСД при-меняетссфункцоя getroot. А/—а, в оетуньтатнаазвращающныузвн, ноторыа ри имеет «родите-

getroot (n ) =

если pn = s

[0, иначе.

Функция для обхода tour: N^N принимает значение корневого элемента дерева n е N. Затем для узла n, полученного в качестве параметра, проверяется условие существования «потомков», которые не были посещены ac = 0, и функция tour вызывает сама себя с непосещенным узлом cn в качестве параметра, при этом счетчик посещения узла an увеличивается на единицу (спуск вниз). В случае обхода всех «потомков» ac > 0 узла n или если рассматриваемый узел является листом Cn = 0, функция tour вызывает себя с параметром узла «родителя» pn, счет- 806 -

n

чикузла нувеличиваетсянаединицу, выполняетсярасчетза:ачения ]ВЕС узла «родителя» рп с помощью функции са1с (п, рп), осуществляется контроль условия корректности операций с ВЕСфункциейЯпД(/),^еи)(подъемвверх). При получениифункциеЕ обхода корневого узла, у котороуо аае «<потомки» ужо бе>1ли доза би1 рат проедены, рлнурсианый вызяа прекуащастдя в ЛудууиаВ Хкла олааращнутсс зхучепаа полученнопт (Рла. РекураЕткаяфуннция Ноуеимеет слпнитущую неализацтю

tour (n) =

tour (c >(m ,v , p ,(a +1), f,C )), если Бе e C : a = 0;

\ n ^c'c'-Tc'Vc /'^c'c/i' n n c '

II r \ i \ r \ W если С >0

t0ur (Pn > (mp , ca/c (n, Pn ) Pp , (p + ^ test (n, Pn ), Cp) ), W ^ П

^ > /j-vj-/ 'гц или Vc e C : a > 0;

n n c '

n > (m ,v , p ,(a +1), f ,C ), иначе.

\ и? и ' .tn ' \ и / '«/ и' и/'

Получение производных значений ВЕС в «родительских» узлах АСД вычисляются функцией са1с: N х N ^ которая возвращает значение ВЕС в зависимости от метки узла тр. Реализация функции са1с основана на формулах преобразования ВЕС программных объектов для опдкавороЕ явыдлаВиН>а-+:

calc (n, pn) =

vP=vP+vv если Cmp e{V =}: ap > i;

vp=vp~vv если CmPe{J =}:ap >i;

если Cmp e {=, +, + =, -, - =, == ! =, < <=, >, >=}

v =v ,

p n >

v =v ,

p p'

или Cmp e {*,*=,/, / =, %, % =} : ap < 1;

иначе.

Функция формирования признака наличия ДЕС test: N х N ^ F вызывается при возвращении в «родительские» узлы. Множеством возможных значений функции является F = {0,1}, где ноль соответствует отсутствию ДЕС, а единица - наличию. Функция реализуется исходя из особенностей условий корректности операцийс ВЕС программных объектов следующим оИуазом:

test (п, pn) =

1, если Ужр е {+,-, =, + =,- =, ==,! =,<,>,<=,>=}: ap > 2,vn Ф1

или

Vmp е {%,* =,/ =, % =} : ap > 2,vn Ф 0;

0, иначе.

Форми^влнис мтожест1за ОЦсС ¿Ис^осуществинехоя Оускцией geOdef: N ^ N, применяемой к казвдому иомисцаеиому дзд АСД. Данная функция»рализдетсяоиедующим образом:

getdef (n ) =

n,, если fn ф 0; 0, иначе.

Правильность программы в целом на предмет отсутствия ДЕС производится функцией getsold D W, где получение элецента множеттва С п {В,0}, равногогдинице,говорит о нали-чдиДЕСвпрогдамме, нолд - об их отдутсттта:

, . fl, если DS Ф 0; geteol

4 [0, инач е.

В итоге на выходе предлагаемой методики получается признак ws е W, характеризующий правильность программы, на основании множеыэва иыявленных в процесса анализа ДЕС

Программная реализация методики СА для поиска ДЕС

Программная реализация описанного способа поиска ФД осуществлена на основе инфраструктуры компи лятора ¿¿И^ифронтендаС/аяд уляпзыков программирования C, C++, Objective-C. Архитектура компилятора LLVMсходны с дригими современными компиляторами и представлена на рис. 2.

Осуществление поиска ДЕС возможно производить до этапов оптимизации и кодогенера-ции, что позволяет в работе ограничиться фронтендом фреймворка LLVM - Clang. Основным преимуществом Clang является его ориентация на максимальное сохранение информации о ходещюцесса инмпиляоид и кдде программы, что гарантирует его точное воспроизведение в АСД.

Фронтенд дает возможностьдоступак АСД черезмеханизмку рсоров (узлов), а также удобный интскиментарийдио его тбирраи мтнипултиования. Стандартной итрурру ры, опиззвающей ткрсорлС/ypg (СХСигтов), недосиаточно, поетому про кишенир задачи на ее отнове бызстздтн ее модифицированный вартант (рис. 3), соответствующий выражению (1).

Clang LLVM proper

г-'-1 г-'-1

Рис. 2.Архитектуракошшлятора LLVM Fig. 2. LLVM compiler architecture

typedef struct {

CXCursor cursor; //исходный курсор, содержащий метку узла АСД

int nsv[ ] = { , , , , , , , , ); //массив, представляющий ВЕС программных объектов int. parent = ; //ссылка на родительский элемент - номер элемента в векторе int counter = 0; //счетчик количества заходов в узел при обходе bool defect = ; //признак наличия дефекта в узле J ExtendedCXCursor; //расширенная структура курсора АСД

Рис.З.Структурамодифицированного узла АСД Fig.3.Structure ofa modifiedabstractsyntaxtree node

Рис. 4.Графикзатисимости интеисивностиокнтружения дефектов от соотношенин НФД и ФДв протдмме для Clang analyzer т NSDdetector

Fig.4.Spheduleofdependencedefects detection ratafrom the; ratiobetween NF D and FD in software for Clang analyzer and NSDdetectcr

Для кпмпилируомого кода ТДядб создаот единицу трансляции (CXTranslaticnUnit), со-держас^о данныеоитоцессеууобора,алякотсройвоаможняпояуоитткорень АСД (clang_ getTranslationUnitCurscrQ) и начать его обход (clang_eisitChildren()). Проверяя тип курсора (clang_getCurscrKind()) при каждом шаге обхода, можем организовать вычисление значений ВЕС программных объектов по выражению (5) и проверку корректности операций с ВЕС со-нласна(6).Тиуои швдтсд дпет возможлдстп гоппкущуму я1риотп деяокттрювать ДЕС с точно-отьюдо садиид додап Тайлекподициио (дяпраторе.

^^j^jeoniei^iciv вфЛмдтмомпстд аронркммктт рляликациидбедмагаемой методики восполь-зирмсяпюкаиатитем в тицпиндснситнооуиобнапуже ниядпфедтов^о есть количеством выяв-

N

лппмых дефедтов в t^^^^i^Lh дяпмпии: ЭА = —, где - количество обнаруживаемых деТА

фектов; ТА -времяанализа. Логичнополагать,чточемвышеинтенсивностьобнаружения, тем эффективнееработаетанализатор.

Опыт проводился при одинаковых вычислительных ресурсах на ИК размером 1000 строк исходным Clang analyzer и созданным на его основе программным средством (NSDdetectcr). Варьируя соотношением ФД (в данном случае ДЕС) и НФД при неизменном общем их количестве, зафиксировали значения времени анализа и количества обнаруженных дефектов. Результаты опыта представлены на рис. 4.

Анализ полученных результатов показал, что применение NSDdetectcr согласно выбранному критерию является оправданным на начальном этапе создания ПО, когда в Ик широко представлены как НФД, так и ФД. При снижении представительства ФД в коде ниже соотношения 7/3 целесообразно применять исходный Clang analyzer.

Заключение

Полученная методика разработана как альтернатива традиционным способам поиска ФД и позволяет автоматизировать процесс их поиска, что положительно сказывается на времени и объективности проверок. Программная реализация подхода может использоваться как разработчиками ПО АС ВН для раннего обнаружения дефектов, так и орга-

низациями, осуществляющими испытания ПО АС ВН, в качестве диверсной методики испытаний.

Список литературы

[1] Лобанова Н.М., Дубровин Д.А. Оценка затрат на качество программного обеспечения. Вестник университета, 2016, 6, 87-91 [Lobanova N.M., Dubrovin D.A. Evaluation of software quality costs. University herald, 2016, 6, 87-91 (in Russian)]

[2] Кулямин В.В. Методы верификации программного обеспечения. М.: Институт системного программирования РАН, 2008. 117 с. [Kuljamin V.V. Methods of software verification. Moscow, Institut sistemnogo programmirovanija RAN, 2008, 117 p. (in Russian)]

[3] Ицыксон В.М., Моисеев М.Ю., Цесько В.А., Захаров А.В., Ахин М.Х. Алгоритм интервального анализа для обнаружения дефектов в исходном коде программ. Информационно-управляющие системы, 2009, 2, 34-41 [Itsykson V.M., Moiseev M.Ju., Tsesko V.A., Zakharov A.V., Akhin M.H. Interval analysis algorithm for detecting defects in the software source code. Information-control systems, 2009, 2, 34-41 (in Russian)]

[4] Егоров В.В., Томилова Н.И., Амиров А.Ж., Касылкасова К.Н. Методы верификации программного обеспечения. Молодой ученый, 2016, 21, 138-141. [Egorov V.V., Tomilova N.I., Amirov A.Zh., Kasylkasova K.N. Software verification methods. Young scientist, 2016, 21, 138-141 (in Russian)]

[5] Андреев Г.И., Созинов П.А., Тихомиров В.А. Управленческие решения при проектировании радиотехнических систем. М.: Радиотехника, 2018. 560 с. [Andreev G.I., Sozinov P.A., Tikhomirov V.A. Managerial decisions in the design of radio engineering systems. Moscow, Radiotehnika, 2018, 560 p. (in Russian)]

[6] Глухих М.И., Ицыксон В.М., Цесько В.А. Использование зависимостей для повышения точности статического анализа программ. Моделирование и анализ информационных систем, 2011, 4(1), 68-79 [Glukhikh M.I., Itsykson V.M., Tsesko V.A. The use of dependencies for improving the precision of program static analysis. Modeling and analysis of information systems, 2011, 4(1), 6879 (in Russian)]

[7] Бриджмен П. Анализ размерностей. Ижевск.: НИЦ «Регулярная и хаотическая динамика», 2001. 128 с. [Bridzhmen P. Dimensional analysys. Izhevs, NITS "Regulyarnaya i khaoticheskaya dinamika", 2001, 128 p. (in Russian)]

[8] Ахо А., Сети Р., Ульман Дж. Компиляторы: принципы, технологии и инструменты. М.: Издательский дом «Вильямс», 2003. 768 с. [Aho A., Seti R., Ul'man Dzh. Compilers: principles, technologies, tools. Moscow, Izdatel'skij dom "Vil'yams", 2003, 768 p. (in Russian)]