Здравствуйте!
Я, как и многие люди, которые только научились чему-то новому, но не довели свой навык до совершенства спешу поделиться этим со всем миром!
Представляю начальную бета-версию статического анализатора кода (в перспективе) для 1С, написанной на чистом Си (не C++).
Имеется так же tutorial в папке с одноименным названием в корне этого проекта (обучающий материал, инструкция, которая по шагам описывает процесс и рассказывает, как достичь конкретного результата), который поможет новичкам влиться в разработку.
tutorial продублирован ниже.
Я считаю, что это несправедливо, что для 1С написано так мало статических анализаторов, почти все на Java (насколько я хорошо анализировал интернет) и 1 на C++ (не для групповой разработки).
Изначально планировал сделать автоматический отлов разыменования ссылок, на чем пока и остановился. На этой стадии разработки сделал копию всего проекта в папку tutorial. Пришла идея сделать копию, чтобы будущие поколения, заинтересованные этим проектом, смогли посмотреть, как все было изначально в первой версии и могли поэкспериментировать с этим кодом. В папке tutorial, я все файлы на Си прокомментировал построчно, чтобы люди, только начавшие изучения языка легко могли понять всю работу кода. При комментировании я увидел несколько недочетов, которые указал в подсказках к tutorial, и не стал их исправлять там (исправил только в самом проекте).
При изучении темы компиляторов я увидел, что современные ЯП такие как Go имеют те же инструменты для создания компиляторов/трансляторов/анализаторов, а именно генераторы кода. В приведенном списке литературы и документации, при прочтении можно увидеть, что генератор кода re2c, который я использую работает и для Go, а генератор синтаксических анализаторов bison отсутствует, но есть специально сделанный для Go goyacc. Поэтому будет здорово, если кто-то будет изучать Go и сделает статический анализатор для 1С в качестве своего пет-проекта.
Более подробная информация на GitHub (ссылка приведена в начале статьи).
Если, считаешь, что не зря потратил время и проект интересный - ставьте звезду на GitHub!
TUTORIAL
Содержит первую версию статического анализатора кода 1С с 1 проверкой на разыменование поля, полученного из выборки.
Все написано на чистом C, в файлах идет построчное комментирование кода, для тех, кто только начинает изучать Си. Я решил, что лучшее, что может быть для вступления в проект - это увидеть первоначальную версию с полным и подробнейшим ее описанием.Необходимая литература
- Брайан Керниган, Д.Ритчи "Язык программирования Си (читать все)
- Alfred V. Aho "Компиляторы" (читать до 5 главы включительно)
- Генератор лексических анализаторов re2c (читать все)
- Генератор синтаксических анализаторов bison (читать все)
Содержимое файлов
- lex.l - содержит описание правил формирования лексического анализатора re2c (формат называется Lex)
- syn.y - содержит описание правил формирования синтаксического анализатора bison(формат называется YACC)
- main.h - заголовочный файл, используемый везде, в нем описаны общие функции и глобальные переменные
- main.c - основной файл, в котором реализованы функции по работе с хэш-таблицами, проверки кода, в общем там все что делается вручную.
С чего начать
Если вы не знаете языка Си, то нужно прочитать первую книгу обязательно, прежде чем что-либо дальше читать.
Далее, чтобы понять содержимое файлов lex.l и syn.y - вам нужно прочитать 2 документации по генераторам кода (лексического и синтаксического).
Если вы не знаете, что такое представляют эти генераторы кода в теории, то вам нужно прочитать до 5-й главы включительно книгу по компиляторам. Там примеры кода на Java, но все там относится к механизмам для Си (Lex и YACC).
т.к. Lex и YACC уже устарели, но принципы остались прежними, их заменили re2c и bison(есть и другие, но я использовал эти)Платформа
Я писал код в Linux Ubuntu и тестировал тоже в ней.
Для windows адаптации не делал(не умею и нет пока времени). Все необходимые тесты и проверки запускают с помощью команды make.
Это программа, которая считывает содержимое файла Makefile и на основании параметров запуска делает те или иные действия.
Это традиционная команда сборки программ на Си, тем более что она максимально простая(информации в интернете полно)
Можно запускать make прямо из каталога tutorial и будет происходить сборка проекта. Удаление генерируемых файлов осуществляется командой make clean(это можно увидеть в самом Makefile)
Проверки на качество кода и утечки памяти запускаются программами, которые доступны в Linux Ubuntu(как их установить и запустить написано на главной странице проекта в файле README.md)Подсказки
При построчном описании tutorial, я увидел 4 ошибки:
- При вызове destroy_lex не все глобальные переменные сбрасываются на значения по умолчанию
- Отсутствует грамматика в файле syn.y, которая бы анализировала конструкции вида:
Переменная1 = Неопределено;
Я намеренно не стал исправлять ошибки, чтобы при прочтении tutorial можно было практиковаться.- Отсутствует грамматика для массивов
- Отсутствует грамматика остатка от деления **'%' **
Удобно запустать тесты в лог файл, например так:
make >log 2>log
>log обозначает, что обычные сообщения отправлять в файл с именем log(если его нет, то он создастся)
2>log обозначает, что сообщения об ошибках отправлять в файл с именем log(если его нет, то он создастся)