Forth
http://fforum.winglion.ru/

Автоматизация статического анализа исходных текстов на Форте
http://fforum.winglion.ru/viewtopic.php?f=2&t=3038
Страница 1 из 2

Автор:  Hishnik [ Пн мар 09, 2015 17:47 ]
Заголовок сообщения:  Автоматизация статического анализа исходных текстов на Форте

Статический анализ текстов может выглядеть ненужной рутиной, особенно для маленьких проектов. Конечно, это не самоцель. Однако если посмотреть на этот вопрос с точки зрения "насколько просто это сделать", то можно обеспечить заготовки для такого анализа, а потом уже при необходимости развивать идею.
Что есть статический анализ? Ну например, если мы по исходным текстам попробуем определить такие параметры, как процент строк с комментариями, количество вложенных управляющих конструкций, наличие дублирующихся идентификаторов и пр., то это может помочь поддерживать проект в сопровождаемом состоянии. В качестве примера можно рассмотреть MISRA-C. Это не диалект Си, а набор правил, которых стоит придерживаться при разработке программ.
Как это можно сделать? С одной стороны, можно на Форт наслоить еще один парсер, продублировав, фактически, всю работу интерпретатора. Однако интерпретатор уже такое делает - мы знаем, в какие моменты формируются структуры управления, когда обрабатываются комментарии и т.д. Знаем хотя бы потому, что в эти моменты исполняются соответствующие слова. Поэтому можно встроить соответствующие инструменты непосредственно в ядро. Проще всего это сделать в виде векторных слов.

Допустим, мы хотим определить максимальную глубину вложенности управляющих структур. Тогда при выполнении : надо обнулить счетчик, далее каждое из слов IF BEGIN DO будет его увеличивать, а UNTIL REPEAT THE LOOP - уменьшать. При этом максимально достигнутое значение счетчика будет запомнено. Все это можно получить и из анализа глубины Control Flow Stack, но с отдельной переменной можно делать разные фокусы - например, считать именно вложенные IF. При завершении компиляции ; может отправить полученную переменную в отчет, в специальный массив, или просто прикрепить к слову каким-то образом (можно ведь вводить и свои поля).

В данном предложении важно то, что для его реализации требуется внести несущественные изменения в ядро. Вызов дополнительных векторных слов окажет исчезающе малое влияние на скорость компиляции, но позволит сделать много интересного с кодом.

Автор:  gudleifr [ Пн мар 09, 2015 18:12 ]
Заголовок сообщения:  Re: Автоматизация статического анализа исходных текстов на Ф

Hishnik писал(а):
...
Еще Холстед жаловался, что применение его метрик к FORTH бессмысленно. И не странно - ведь, FORTH позволяет писать как угодно, со своими управляющими структурами... Применять к нему метрики - как к обычной литературе. Только поржать.
А заставлять всех писать "правильно"? Мы видели чем это кончается: C-образными FORTH-программами и просьбами добавить в него "объекты" и "библиотеки".

Автор:  Hishnik [ Пн мар 09, 2015 18:22 ]
Заголовок сообщения:  Re: Автоматизация статического анализа исходных текстов на Ф

gudleifr писал(а):
Еще Холстед жаловался, что применение его метрик к FORTH бессмысленно. И не странно - ведь, FORTH позволяет писать как угодно, со своими управляющими структурами...

Именно поэтому я и отметил, что надо не писать внешний анализатор, а встраивать метрики непосредственно в слова. Тогда новые управляющие структуры сами про себя все соберут.
gudleifr писал(а):
Применять к нему метрики - как к обычной литературе. Только поржать.

В обычной литературе, к сожалению, ржать чаще приходится над неграмотностью. Чем программирование лучше?
gudleifr писал(а):
А заставлять всех писать "правильно"? Мы видели чем это кончается: C-образными FORTH-программами и просьбами добавить в него "объекты" и "библиотеки".

Форт - это Форт, а не "не Си". От того, что что-то совпало по стилю или решаемым задачам с программой на Си, сам язык хуже не стал. Требования объектов и библиотек имеют совершенно не техническую причину негативного влияния. Они не ухудшают язык, они просто откладывают на неопределенное время начало практической работы. Программист может долго ходить вокруг, все время предъявляя требования - то библиотек не хватает, то объектов, то IDE. "А так бы я конечно!". Но в этом плане как раз и нужно предлагать хоть какие-то практические решения, чтобы прятаться было уже не за что.

Автор:  KPG [ Пн мар 09, 2015 18:26 ]
Заголовок сообщения:  Re: Автоматизация статического анализа исходных текстов на Ф

Какие значимые "утилизационные" результаты и форму их отображения можно получить после статического анализа текста?

P.S. Например в IDE Win32Forth есть возможность навигации по кросс ссылкам слов используемых в проекте слов (собирается такая статистика)
Интересен вариант построения "клаcтерного" графа кодовой базы Форт проекта и по нему навигацию.
Для Форт, наверное, можно попробовать использовать программы статческого анализа текста.
При беглом поиске одна из программ Khcoder

Автор:  Hishnik [ Пн мар 09, 2015 19:28 ]
Заголовок сообщения:  Re: Автоматизация статического анализа исходных текстов на Ф

KPG писал(а):
Какие значимые "утилизационные" результаты и форму их отображения можно получить после статического анализа текста?

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

Автор:  KPG [ Пн мар 09, 2015 19:32 ]
Заголовок сообщения:  Re: Автоматизация статического анализа исходных текстов на Ф

Hishnik писал(а):
KPG писал(а):
Какие значимые "утилизационные" результаты и форму их отображения можно получить после статического анализа текста?

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


А как визуализировать логическую составляющую в динамике для выявления "логических" ошибок.
Работа программиста и есть выявление этих рассогласований от начального замысла и насколько это можно формализовать?

Автор:  Hishnik [ Пн мар 09, 2015 20:19 ]
Заголовок сообщения:  Re: Автоматизация статического анализа исходных текстов на Ф

KPG писал(а):
А как визуализировать логическую составляющую в динамике для выявления "логических" ошибок.
Работа программиста и есть выявление этих рассогласований от начального замысла и насколько это можно формализовать?

Да специально-то никак и не надо. Вопрос ведь не в том, каким именно волшебным образом ликвидировать ошибки. Просто программист не робот, и не может не делать ошибок совсем. Процесс поиска "ошибок вообще" не формализуется, для этого надо создать условия - от вкусного кофе и отпуска в удобное время до инструментов автоматизации. Кто же может заранее знать, что именно поможет? Метрики сами по себе не помогают, и даже способствуют забюрокрачиванию процесса, просто потому, что появляется что-то измеримое для контроля. Но если метрик нет, то в противовес забюрокрачиванию может возникнуть синдром "зелен виноград!". "Нам не надо метрик!", (вполголоса: "потому что мы не умеем ими пользоваться"). В данном случае я не предлагаю срочно бросить все и делать метрики. Идея идет с другой стороны - что еще можно модифицировать в ядре, чтобы от этого была польза.

Автор:  gudleifr [ Пн мар 09, 2015 20:32 ]
Заголовок сообщения:  Re: Автоматизация статического анализа исходных текстов на Ф

Hishnik писал(а):
Идея идет с другой стороны - что еще можно модифицировать в ядре, чтобы от этого была польза.
Давно уже объяснил. Ядро пишется каждый раз под новую задачу заново.

Написание ядра заранее - это:
Hishnik писал(а):
Они не ухудшают язык, они просто откладывают на неопределенное время начало практической работы.

Автор:  Hishnik [ Пн мар 09, 2015 20:42 ]
Заголовок сообщения:  Re: Автоматизация статического анализа исходных текстов на Ф

gudleifr писал(а):
Давно уже объяснил. Ядро пишется каждый раз под новую задачу заново.

К "Давно уже объяснил" надо дописать "... свою позицию". Я ее знаю. Это вдруг стало непререкаемой истиной? :)
gudleifr писал(а):
Написание ядра заранее - это:

Это разработка инструмента для серии конкретных программ. Если в кварке ~10 тыс. строк, я не буду его каждый раз переписывать. Транслятор для того и пишется, чтобы решать на нем определенные задачи. Понятно, что кварк с его 3D-экраном и Win-only не годится для каких-то программ. Но параллельно надо и пробовать технологии, чтобы не изобретать каждый раз целый набор... и не откладывать на неопределенное время начало практической работы.

Автор:  gudleifr [ Пн мар 09, 2015 20:46 ]
Заголовок сообщения:  Re: Автоматизация статического анализа исходных текстов на Ф

Hishnik писал(а):
Это вдруг стало непререкаемой истиной?
Пока, как бы никто опровергнуть ее не смог.

Автор:  Hishnik [ Пн мар 09, 2015 20:55 ]
Заголовок сообщения:  Re: Автоматизация статического анализа исходных текстов на Ф

gudleifr писал(а):
Пока, как бы никто опровергнуть ее не смог.

А оно надо? :) Начнем с того, что доказываются положительные утверждения, а не "опровергните меня". Далее, что значит "ядро пишется каждый раз под новую задачу заново"? Это можно выразить через квантор общности, да? Ну пробуем: "для каждой новой задачи (упс - что такое новая?) существует единственный и уникальный вариант ядра, которое должно быть использовано для ее решения". Сразу приходит ассоциация с потолстевшим мужем Анджелины Джоли :) Или будем утверждать, что существует биекция между множеством задач и множеством ядер Форта? Эти псевдонаучные игры - без меня.

Автор:  Victor__v [ Вс дек 25, 2016 11:40 ]
Заголовок сообщения:  Re: Автоматизация статического анализа исходных текстов на Ф

Ам, я как-то не понял зачем встраивать в ядро, ежели можно обойтись служебной библиотекой?
Там переопределим нужные слова для анализа и скормим библиотеке тексты исходников.
Сделал недавно подобное.
Самому надоели ошибки от правки текста. Чего в СПФ только стоят лишние ; поставить. Последнее опр.слово ломается.
А упр.структуры? Помню, полчаса ломал голову откуда на стеке два непонятных значения. Потом нашёл ошибку.

Автор:  gudleifr [ Вс дек 25, 2016 12:09 ]
Заголовок сообщения:  Re: Автоматизация статического анализа исходных текстов на Ф

Victor__v писал(а):
Самому надоели ошибки от правки текста.
Все ваши проблемы от "форт-компилятора". При этом теряются все преимущества метода. Из системы удаляется "умный пользователь" и остается только "тупой программист".
P.S. Метрики - это совсем не то, что Вы думаете.

Автор:  KPG [ Вс дек 25, 2016 12:20 ]
Заголовок сообщения:  Re: Автоматизация статического анализа исходных текстов на Ф

В этой теме может быть и интересна возможность преобразования AST дерева Forth в классические представления
что то подобное shift-forth, но в обратную сторону.
Код:
function add42 (a) {             // : add42 42 + exit ;
  return a + 42;
}

function square (x) {            // : square 0 pick * exit ;
    return x * x;
}

function sub (a, b) {            // : sub
  return a - b;                  //     - exit
}                                // ;

                                 // variable g0
function mul_global (a) {        // : mul_global
  return a * g0;                 //     g0 @ * exit
}                                // ;

function add3_fast (a, b, c) {   // : add3_fast
  return b + c + a;              //     + + exit
}                                // ;

function add_var (a, b) {        // : add_var
  var x;
  x = a + b;                     //     +
  return x;                      //     exit
}                                // ;

function cmplx_re (a, b, c, d) { // : cmplx_re
  var re;                        //     3 pick 2 pick *
  re = a * c - b * d;            //     3 pick 2 pick * -
  return re;                     //     nip nip nip nip exit
}                                // ;

function cmplx_im (a, b, c, d) { // : cmplx_im
  var im;                        //     3 pick *
  im = a * d + b * c;            //     2 pick 2 pick * +
  return im;                     //     nip nip nip exit
}                                // ;

function foo (x0, y0) {          // : foo
  if (x0 < 100) {                //     over 100 < if
    do {                         //         begin
      x1 = ф(x0, x2);            //
      y1 = ф(y0, y2);            //
      x2 = x1 + 1;               //             swap 1 +
      y2 = y1 + x2;              //             swap over +
    } while (x2 < 100);          //         over 100 >= until
  }                              //     then
  x3 = ф(x0, x2);
  y3 = ф(y0, y2);
  return [x3, y3];               //     exit
}       

Но это, скорее всего, хорошо иметь в Forth IDE по функциональности сравнимой со средами от JetBrains (IntelliJ IDEA и др.)
продолжив "пилить", например, Win32Forth IDE.

Автор:  Victor__v [ Вс дек 25, 2016 12:31 ]
Заголовок сообщения:  Re: Автоматизация статического анализа исходных текстов на Ф

Цитата:
P.S. Метрики - это совсем не то, что Вы думаете.

Дельное замечание.
Но лишнее ( отсутствующее) слово такой же недостаток, как и цикл в цикле или множество условных переходов.
Знаю, это не метрика, это не статистика. Но базируется-то на этом.
На статистике. на сборе данных.
С вероятность 98% если кол-во if then или : ; не совпадают, то это ошибка. И на неё надо реагировать.
Да сопровождение исходников комментариями тоже полезно.

Страница 1 из 2 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/