(x86) Оптимизация ассемблера - PullRequest
2 голосов
/ 24 марта 2010

Я строю компилятор / ассемблер / компоновщик в Java для процессора x86-32 (IA32), ориентированного на Windows.

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

Моя проблема в следующем;если у меня есть код более высокого уровня (X и Y), переведенный в код более низкого уровня (x, y, U и V), то пример такого перевода впсевдокод:

x + U(f) // generated by X
+
V(f) + y // generated by Y

(простой пример), где V является противоположностью U (сравните с push в стеке как U и всплывающим как V).Это должно быть «оптимизировано» так:

x + y

(по сути, удаление «бесполезного» кода)

Моя идея заключалась в использовании регулярных выражений.Для приведенного выше случая это будет регулярное выражение, похожее на это: x:(U(x)+V(x)):null, означающее для всех x find U(x), за которым следует V(x) и замена на null.Представьте себе более сложные регулярные выражения для более сложных оптимизаций.Это должно работать на всех уровнях.

Что вы предлагаете?Какой будет хороший подход для оптимизации и быстрой сборки x86?

Ответы [ 2 ]

8 голосов
/ 24 марта 2010

На самом деле вам нужно построить Абстрактное синтаксическое дерево (AST) .

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

Этот код, представленный в виде дерева, будет выглядеть примерно так:

(+
    (+
        x
        (U f))
    (+
        (V f)
        y))

Затем вы можете попытаться сделать некоторые преобразования: сумма сумм - это сумма всех слагаемых:

(+
    x
    (U f)
    (V f)
    y)

Тогда вы можете сканировать дерево и иметь следующие правила:

  • (+ (U x) (V x)) = 0, для всех x
  • (+ 0 x1 x2 ...) = x, для всех x1, x2, ...

Тогда вы получите то, что ищете:

(+ x y)

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

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

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

С вашим языком может быть то же самое: если он не регулярный, вам следует избегать множества головных болей и не пытаться его анализировать (и особенно "преобразовывать") с помощью регулярных выражений.

5 голосов
/ 24 марта 2010

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

Определенно возможно оптимизировать объектный код путем переписывания терминов. Вам, вероятно, также будет полезно узнать что-то о оптимизации глазка ; Хорошее место, чтобы начать, потому что он очень силен по основам, это статья Дэвидсона и Фрейзера о ретаргетируемом глазковом оптимизаторе . Есть также превосходная поздняя работа Бенитеса и Дэвидсона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...