Можно ли использовать концепцию энтропии для анализа исходного кода полезным способом?


19

Мне кажется логичным, что можно определить контекст для статического анализа исходного кода, который включает в себя правила для получения относительного значения сложности. Я знаю, что это не похоже на физический смысл, потому что в исходном коде нет «Энергии», но я держу пари, что были предприняты попытки, хотя бы академические, провести параллель. Кто-нибудь знает об этом, и если да, то с какой целью он принес полезные результаты?


У меня нет никаких конкретных знаний по этому вопросу. Но как инженер, я верю, что вы можете применить эту концепцию ко всему, что хотите во вселенной. «Все» - это энергия. Ваш код может быть смоделирован как объект, обладающий энергией.
wleao

3
Уже есть показатели сложности кода - цикломатическая сложность, длина класса (LOC), длина метода (LOC), количество полей, количество параметров метода, сложность n-path, вход / выход вентилятора, анализ потока данных (DU / DD цепи). Была проделана работа, чтобы соотнести их с плотностью дефектов, усилиями по обслуживанию и простотой понимания. Как то, что вы ищете по сравнению с этим?
Томас Оуэнс

@ Томас Оуэнс: Я думаю, что это именно то, о чем просил ОП, пожалуйста, опубликуйте это как ответ!
blubb

@ Симон, хорошо, если ты так думаешь. Я не уверен на 100%.
Томас Оуэнс

1
Для довольно нетрадиционного подхода вы можете либо напрямую вычислить степень сжатия данных для исходного кода, либо вычислить степень сжатия данных после некоторой нормализации. (например, c2.com/doc/SignatureSurvey ) - я не знаю, насколько значимым или полезным это будет, но это может дать некоторое представление, когда оно сочетается с более традиционными показателями.
Уильям Пейн

Ответы:


22

Уже существует ряд показателей сложности кода:

  • Цикломатическая сложность
  • Длина класса
  • Длина метода
  • Количество полей
  • Количество параметров метода
  • Сложность N-пути
  • Разветвление и разветвление
  • Анализ потока данных (цепочки DU / DD)

Была проделана работа, чтобы соотнести их с плотностью дефектов, усилиями по обслуживанию и простотой понимания. Некоторые из них более значимы, чем другие, в зависимости от того, что вы пытаетесь извлечь из анализа. Я не настолько знаком с понятием энтропии в физических науках, но мне интересно, будет ли отслеживание измерений и метрик, подобных тем, которые я назвал со временем, и привязка их к дефектам со временем, похоже на то, что вы ищете.

Возможно, вас также заинтересует определение энтропии программного обеспечения и программного гниения Ивара Якобсона . Общая идея этих тем заключается в том, что со временем, по мере изменения кода и среды выполнения, система программного обеспечения начинает деградировать. Рефакторинг рассматривается как метод минимизации энтропии или гниения, и, по крайней мере в моем опыте, метрики и измерения, которые я упоминал выше, были бы индикаторами того, что рефакторинг может быть необходим в системе или подсистеме.


13

Я думаю, вы пытаетесь провести параллель между термодинамической энтропией и «сложностью». Дело в том, что энтропия - это мера беспорядка, а не сложности . Я не верю, что они эквивалентны и взаимозаменяемы.

Ближайшим аналогом термодинамической энтропии является энтропия Шеннона, которая измеряет количество беспорядка в случайной переменной. Это понятие прежде всего касается количества «информации» в сообщении.

В этом отношении фрагмент кода может содержать много информации (высокая энтропия), но очень низкую сложность. Подумайте о программе, которая просто печатает очень длинную строку произвольных символов. В нем много информации, но низкая сложность.


1
Энтропия для исходного кода не будет рассчитываться по той же модели, что и для неструктурированного текста. С моделью, подходящей для исходного кода , должно иметь смысл вычислять энтропию, которая не будет широко варьироваться для произвольных ситуаций, таких как длинная строка символов, которые вы описываете.
Мэтью Родат

Так как бы вы оценили энтропию и сложность данной программы? Я бы сказал, что он содержит много информации независимо от того, какую модель вы используете. Хотя определение сложности гораздо менее понятно.
tskuzzy

1
Точно так же, как не имеет смысла вычислять термодинамическую энтропию для текста на естественном языке, не имеет смысла использовать энтропию Шеннона для компьютерного исходного кода, поскольку смысл программы структурирован в рамках другого набора правил и шаблонов (т.е. синтаксис). Естественный язык имеет свой синтаксис. Модель должна соответствовать синтаксису домена. Термодинамическая энтропия измеряется в джоулях на кельвин. Энтропия Шеннона измеряется в битах. Энтропия исходного кода будет измеряться в ... разных измерениях полностью. Я попытался понять, как будет выглядеть модель в моем ответе.
Мэтью Родат

Мне нравится ваш ответ - я думал, например, когда вводится «плохой» код, энтропия всей среды, в которой он существует, увеличивается, то есть включая кодеров, которые должны работать усерднее - таким образом, возможно, есть практический, если не научная связь с термодинамикой?
Аарон Анодид

2

Энтропия - это «мера беспорядка [или] непредсказуемости». Более широкий диапазон уникальных паттернов в информации (т.е. примерно «большее значение») указывает на более высокую степень энтропии.

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

Как только модель спроектирована и затем заполнена исходным кодом программного приложения (то есть частот для узлов / ребер), энтропия может быть вычислена.

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


2

Один из способов думать об энтропии - это «средняя информация, которую нужно получить», поэтому я думаю, что лучше вернуться к моделированию информации. Я знаю два основных подхода к математическому моделированию информации. (Простите, что дали ссылки на Википедию, но ИМХО они не плохие.)

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

  • Соломонова (или Колмогорова ) информация. Вот еще одно объяснение. В этой формулировке информационное содержание символа или события представлено длиной самой короткой программы, которая могла бы его вычислить. Здесь, опять же, это относится не к вероятности назначения наблюдателя, а к универсальной машине, которая может выполнить программу. Поскольку каждая универсальная машина может моделироваться универсальной машиной Тьюринга, это означает, что в некотором смысле информационное содержание символа или события не является относительным, но является абсолютным.

Если я позволю себе сказать, что, по моему мнению, это означает в повседневных терминах, о которых я написал книгу , это просто означает, что сложность программы - это ее длина, когда такие вещи, как функциональная спецификация и язык поддерживаются постоянными, с соответствующими допуски для таких вещей, как комментарии и длина имени. Но с этим есть проблема - «APL tarpit», где краткость равна непонятности.

Гораздо лучше учесть (как я это делал при изучении ИИ), что функциональная спецификация программы состоит из ментальной модели, которая не только реальна, но и кодируется эффективно, то есть с достаточно маленькой избыточностью, которая меняет представление о требованиях. может быть сделано без особой опасности сделать его внутренне несовместимым - то есть иметь «ошибку». Затем процесс программирования представляет собой информационный канал, который принимает в качестве входных данных ментальную модель, а его выходом является рабочий исходный код. Затем, когда в ментальной модели вносятся изменения, эта дельта должна передаваться в процессе программирования и превращаться в соответствующую дельту в исходном коде. Эта дельта легко измеряется. Различать источник между до применения этой дельты и после ее применения (полностью, со всеми исправленными ошибками), и подсчитайте количество вставленных, удаленных и замененных кодовых блоков. Чем меньше значение, тем лучше язык исходного кода представляет язык, на котором представлена ​​ментальная модель (в терминах существительных, глаголов и структуры). Если эта мера как-то усреднена по пространству вероятных функциональных изменений, это понятие энтропии исходного языка, и чем меньше, тем лучше. Есть термин для этого -Домен-специфический язык (DSL)

Извините, если ссылки слабые / личные, но я думаю, что этот общий вопрос является очень важным.


+1 для Шеннона и Колмогорова, оба из которых имеют отношение ...
Алекс Фейнман

@ Алекс: Я думаю, что Шеннон применим во время выполнения. Так, например, вы можете понять производительность алгоритмов с точки зрения энтропии точек принятия решений, и вы можете понять нормализацию структуры данных с точки зрения минимального кода. Алгоритмическая информация кажется гораздо более лингвистической, поскольку она подходит для соответствия языка его выразительной цели, а алгоритм, который вы пытаетесь сделать эффективным, является таинственным, который выкручивается в вашей голове при программировании.
Майк Данлавей

2

У Джона Джаггера и Олве Модала немного другое представление об энтропии кода, что можно увидеть на их сессии Accu на конференции 2011 года « Энтропия кода и физика программного обеспечения» .

Они говорят о стабильности кода, связанной с тем, могут ли будущие разработчики / сопровождающие изменить этот код.

Чтобы продемонстрировать это, они провели опрос с несколькими фрагментами кода, и результаты оказались весьма интересными.

  • Казалось, был сильный уклон против стиля с одной верной скобкой .
  • Но сильный уклон для принятия одного заявления, если это.
  • Был сильный уклон против использования временных переменных.
  • Был сильный уклон для добавления скобок, чтобы сделать приоритет оператора очевидным.

плюс 16 других.

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

Они также рассматривают некоторые изменения, внесенные в большую кодовую базу за последние годы.

Хотя слайды сами по себе страдают от того, что они не являются расшифровкой стенограммы сессии, в ней все же есть некоторые интересные моменты.


1

Я учился у профессора , который использовал энтропию как меру сложности программ (наш учебник был старше издание этого один , некоторые из его пабов здесь ). В ФАУ было несколько диссертаций, где это было одной из основных мер, но сайт школы изменился с тех пор, как я в последний раз смотрел, и я не могу определить, где сейчас находятся диссертации / диссертации студентов.

Одной из таких диссертаций является теория информации и измерения программного обеспечения .


0

Если вам нужно определение «математическое» в смысле энтропии, вы можете посмотреть на сложность Колмогорова, которая измеряет сложность по минимальному объему кода, в котором можно что-то сделать. Однако это не сложность кода, но о том, что вы пытаетесь сделать с кодом. Но вы можете подумать, что это уместно, потому что теоретически вы можете сравнить конкретный фрагмент кода с минимальным. Тем не менее, в настоящее время это не полезный метод для измерения сложности кода реального мира.


0

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

Можно подумать, тогда я могу вычислить что-то вроде Entropy / CodeLines, используя коэффициент сжатия в качестве коэффициента, для измерения качества кода, однако при этом возникает проблема, заключающаяся в том, что общий случайный ввод будет выглядеть как лучший код в мире, который, очевидно, таковым не является.

Действительно, степень сжатия является хорошим индикатором для измерения энтропии кода, однако оба показателя не являются хорошими показателями качества кода.


0

Что ж, термин энтропия появляется не только в термодинамике и теории информации, но и в реальном мире сжатия данных. В этом контексте энтропия, которую видит компрессор, равна числу битов, которые он производит. (Обратите внимание, что я сказал «энтропия, которую видит компрессор », потому что то, что считается энтропией, зависит от модели, которую компрессор использует для описания входных данных. Это причина того, почему разные компрессоры создают файлы разного размера: что такое энтропия для одна является эксплуатируемой структурой для другой.)

В принципе, это может быть красиво применено к сложности исходного кода: «Просто» напишите компрессор, который работает только с полностью стандартным совместимым исходным кодом и который сжимает его, фактически анализируя его, как это делает компилятор, создавая соответствующее синтаксическое дерево. Затем он может пройтись по этому синтаксическому дереву и решить на каждом узле, какие узлы были бы возможны в каждой точке, кодируя этот узел с этим знанием.

Так, например, если язык допускает либо существующий идентификатор, либо что-то, заключенное в скобки, либо продукт в определенной точке, компрессор будет подсчитывать возможные существующие идентификаторы, принимая во внимание информацию о типе (скажем, у вас есть 3 таких идентификатора). ), и добавьте 2 для двух возможных подвыражений, давая 5 возможностей. Таким образом, узел будет закодирован lb 5 = 2.32битами. В случае двух возможных подвыражений потребуется больше битов для кодирования их содержимого.

Это действительно даст очень точную оценку сложности кода, как он есть. Однако эта мера все еще бесполезна! Это бесполезно по той же причине, по которой все измерения сложности кода бесполезны: они не позволяют установить связь между измеренной сложностью кода (какой бы она ни была) и сложностью проблемы, которую код решает. Вы всегда можете найти смехотворно сложные решения ваших программных проблем, чтобы произвести впечатление на вашего работодателя подсчетом LOC, но никакая мера сложности кода не скажет вам, что задача могла быть решена с небольшой долей усилий.


-2

Код имеет столько же энтропии, сколько число π.

Ведение и изменение кода может привести к энтропии (поскольку возможно изменение состояния).

Но код это просто большое число. С двоичным представлением.


думая так, разве вы не могли сказать, что весь код имеет одинаковую энтропию, когда gzip'd?
Аарон Анодид

@ Габриэль: Это другое дело. Эта энтропия - это количество шума среди битов при просмотре этого числа как последовательности битов. Не просматривается как один, статический номер. Исходный код представляет собой одно статическое число, например, 42. Только с гораздо большим количеством битов.
S.Lott

просто любопытно, что в этом представлении десятичная 42 и двоичная 42 имеют одинаковую энтропию, или этот комментарий говорит, что числа не имеют энтропии, и в этом смысл?
Аарон Анодид

«числа не имеют энтропии». Они просто есть. Представление, рассматриваемое как поток символов, может иметь энтропию, но число в целом является просто числом.
S.Lott
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.