My Simpler Dead-Code Remover - PullRequest
       10

My Simpler Dead-Code Remover

2 голосов
/ 27 августа 2011

Я делаю стимуляцию удаления мертвого кода очень простым способом.

Для этого моя идея состоит в том, чтобы

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

Сомнение: мой подход правильный?Если это так, как минимизировать обход связанного списка каждый раз.

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

Шаг 3: Будет выполнен поиск для каждой записи в таблице переменных, и переменные будут заменены на ее значения того временизначение (как оно есть).(Например,

i=0;
if(i==3) will be replaced by if(0==3).

Но в такой ситуации, как ..

get(a);
i=a;
if(i){} 

здесь, 'i' не будет заменено, поскольку оно зависит от другой переменной.'a' не будет заменено, так как это зависит от ввода пользователя.

Сомнение: если ввод пользователя, если (5 * 5 + 6) {print hello;}, это, безусловно, будет ненужной проверкой,Как я могу решить это выражение, чтобы упростить код как {print hello;}

Шаг 4: Будут искать строки if (0), while (0) и т. Д., И используя стек, блок действия удаляется.if (0) {// это будет удалено * /}

Шаг 5: (Например) функция foo () {/ ** /} ... if (0) foo();..., После того, как все мертвые коды удалены, запись foo () в таблице функций проверяется, чтобы получить no.times, на которые она ссылается в коде.Если оно равно 0, эту функцию необходимо удалить с помощью того же метода стека.

Шаг 6: В остальных функциях строки под операторами возврата (если они есть) удаляются, кроме'}'.Это удаление выполняется до конца функции.Конец функции определяется с помощью стека.

Шаг 7: И я буду считать, что мой код без мертвых точек уже готов.Сохраните связанный список или массив в выходном файле.

Мои вопросы .. 1.Что будет иметь смысл моя идея?или это будет осуществимо?Как я могу улучшить этот алгоритм?

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

1 Ответ

7 голосов
/ 27 августа 2011

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

Что вам нужно сделать, это написать правильный синтаксический анализатор. Об этом много литературы. Узнайте, какой учебник использует ваша школа для курса по компиляции, и проработайте его - или просто пройдите курс! Только когда у вас отключен синтаксический анализатор, вы даже можете начать рассматривать семантику. Затем сделайте свою работу над абстрактными синтаксическими деревьями вместо строк. Кроме того, найдите уже написанный и протестированный синтаксический анализатор для C, который вы можете использовать повторно (но вам все равно придется немного поучиться, чтобы интегрировать его с собственной обработкой).

Если вы в конечном итоге пишете синтаксический анализатор самостоятельно, и это только для вашего собственного назидания, рассмотрите возможность использования более простого языка, чем C, в качестве вашего предмета. Несмотря на то, что ядро ​​C at является довольно компактным с точки зрения языков, получить все детали правильного синтаксиса объявления на удивление сложно, и, вероятно, отвлечет вас от того, что вам действительно интересно. А наличие препроцессора само по себе является проблемой что может очень затруднить разработку значимых преобразований источник-источник.

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

...