Reedit:
Чтобы изложить мое предложение по определению идентичных функций, можно предложить следующий поток:
Уровень 1: Удалить все пробелы, которые не являются частьюстрокового литерала;вставьте новые строки после каждого {
, ;
и }
и сравните.Если равно;функции идентичны, если нет:
Уровень 2: Переместить все объявления и назначения переменных, которые не зависят от состояния других переменных, определенных в той же области, в начало области, в которой они объявлены (или если не хотите фактически анализировать JS; начало скобок);и упорядочить их по длине строки;обработка всех имен переменных длиной 4 символа и возврат к алфавитному порядку, игнорируя имена переменных в случае связанных длин.Переупорядочьте все коллекции в алфавитном порядке и переименуйте все переменные vSNN
, где v буквально, S - число вложенных фигурных скобок, а NN - порядок, в котором встречалась переменная.
Сравнить;если они равны, функции идентичны, если нет:
Уровень 3: Заменить все строковые литералы на "sNN"
, где "
и s
- литералы, а NN
- порядок, в которомСтрока была обнаружена.Сравните;если они равны, функции идентичны, если нет:
Уровень 4: нормализуйте имена любых функций, о которых известно, что они совпадают, используя имя функции с наивысшим приоритетом в соответствии с алфавитным порядком (в примерениже любые вызовы p_strlen()
будут заменены на c_strlen()
. При необходимости повторите повторное упорядочение в соответствии с уровнем 1. Сравните, если равно, функции идентичны, если нет, функции почти наверняка не идентичны.
Оригинальный ответ:
Я думаю, вы обнаружите, что вы имеете в виду «идентично», а не «то же самое».
Разница,как вы обнаружите, очень важно:
Две функции идентичны , если, следуя некоторому способу нормализации, (удаление не буквального пробела, переименование и изменение порядка переменных в нормализованном порядке, заменастроковые литералы с заполнителями,…) они сравниваются с буквально равными.
Две функции одинаковы , если при вызове для любого заданного входного значения они даютто же самое возвращаемое значение.Рассмотрим, в общем случае, язык программирования, который насчитал строки с нулевым символом в конце (гибридные строки Pascal / C, если хотите).Функция p_strlen(str)
может посмотреть количество символов в строке и вернуть его.Функция c_strlen(str)
может подсчитывать количество символов в строке и возвращать их.
Хотя эти функции, безусловно, не будут идентичны, они будут одинаковыми: для любого заданного (действительного) входного значения они будутдать одно и то же значение.
Моя точка зрения:
Определение, являются ли две функции идентичными (то, чего вы, кажется, хотите достичь), является (в меру) тривиальной проблемой, выполненной, как выописать.
Определение, являются ли две функции действительно одинаковыми (то, что вы на самом деле хотите достичь), нетривиально;на самом деле, это просто трудно, вероятно, связано с проблемой остановки , а не то, что можно сделать с помощью статического анализа.
Редактировать: Конечноидентичные функции также одинаковы;но весьма специфичным и редко полезным способом для полного анализа.