SSA как с\с++ компилирует

Тема в разделе "LANGS.C", создана пользователем _evil, 6 май 2018.

  1. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    64
    компиляторы С++ используют SSA формат для генерации кода. А как он в этом формате обрабатывает ссылки и указатели?
    (если их не учитывать, то взяв адрес с переменной и преобразуется следующее выражение(оно будет в новой переменной) то адрес будет уже неправильным).
    Заранее благодарен.
     
  2. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    64
    промежуточное представление
    а куда результат записывается?
    что ты этим хотел сказать ? может скажешь как с ссылками дело обстоит ?
    https://courses.cs.washington.edu/courses/cse501/04wi/slides/slides.slides.ps.pdf
    есть пример но я его не догоняю
     
  3. CurryHowardIsomorphism

    CurryHowardIsomorphism Member

    Публикаций:
    0
    Регистрация:
    13 май 2017
    Сообщения:
    97
    Там предлагается
    LLVM так и поступает. SSA только для регистров, а для памяти там не используется SSA-представление.
    Этим в тьюториале предлагают пользоваться для упрощения кодогенерации
    https://llvm.org/docs/tutorial/LangImpl07.html#memory-in-llvm
     
    Последнее редактирование: 7 май 2018
    _evil нравится это.
  4. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    64
    дак это тока для динамической памяти и вобще если прочитать дальше то они вводят i функцию
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Так учитывайте. Кто вам не даёт?
    Взятие адреса это числовое преобразование, а в данном случае речь идёт о символьных. А во вторых основа адреса сохраняется так что всегда есть возможность восстановить адрес.
     
  6. CurryHowardIsomorphism

    CurryHowardIsomorphism Member

    Публикаций:
    0
    Регистрация:
    13 май 2017
    Сообщения:
    97
    Да. Я просто остановился на том, о применении чего мне точно известно.
    Применяют ли GCC или MSVC i-функцию вместо не-SSA памяти я не знаю.
     
  7. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    64
    возник ещё такой вопрос:
    SSA строится в компиляторах над произвольном выражением типа оп1:=оп2+оп3 , или уже из машинно специфичных выражениях оп2:=оп2+оп3?
    всем спасибо!
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    зависит от SSA вероятно... LLVM IR строго типизирован, то есть оп1 = add i32 оп2 оп3, то есть сложение двух 32-битных интов в третий 32-битный инт... у GCC представление GIMPLE тож вроде строго типизированное, если мне не изменяет память... только там вроде не пишется типизация в операции, но все регистры объявляются в начале функции с указанием типа, аля старая сишечка... у GCC еще есть RTL представление, более низкоуровневое, но это уже почти как ассемблер, но в виде LISP-синтаксисе...
     
    _evil нравится это.
  9. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    64
    не совсем то (то что строго типизировано это понятно иначе бы не скомпилировалось)
    при помощи mov можно записать только в первый источник - приходится коректировать код
    как я понял современные компиляторы сначало переводят в SSA а потом при генерации кода переводят в бинарные (двух операторные) команды
    а почему так ? не подскажите - вроде можно и наоборот ...
     
  10. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    64
    немного подумавши стал догонять - в SSA каждое новое присваивание в новую переменную то есть для машинных команд не подходит
    а когда переводят SSA в машинные команды наверное учитывают специфику машинных команд во время распределения регистров
    где-нибудь это описано ? чтото эта тема плохо освещена... в книжках и интернете ... наверное сложная
     
  11. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    что значит плохо освящена? в драконьей книге вроде была отдельная глава про распределение регистров, у стенфорда в видео курсе по компиляторам тож отдельная глава про это...
     
    _evil нравится это.
  12. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    64
    одни иностранные источники...
     
  13. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    64
    возник такой вопрос:" как я понял при обработке С++ выражений в промежуточный код получается очень много промежуточных переменных - компилятор скорее всего оптимизирует(переставляет мат операции местами) чтобы понадобилось меньше регистров/переменных для выполнения". Какими методами он это делает? Или перебором переставляет выражения а потом откидывает те которые используют не появившиеся переменные?
     
  14. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    64
    Что-то я не догоняю с парсингом ... Везде перед какими либо манипуляциями исходный текст вместе с выражениями парсят к примеру через LL в дерево. Но ведь по стандарту строго регламентировано в какой последовательности должно всё вычисляться в выражениях и удобнее воспроизвести вроде без дерева когда всё обычным текстом.
    Ответе пожалуйста что вы думаете по поводу этого вопроса.
     
  15. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Код (Text):
    1.  
    2. void main()
    3. {
    4.     int i = 5;
    5.     i = ++i + ++i;
    6.     printf("i = %d\n", i);
    7. }
    8.  
    Думаю, вы поняли, где ошиблись.
     
  16. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    По стандарту строго регламентировано что должно вычисляться в определенной последовательности, а что - на усмотрение компилятора. Например параметры функции могут быть вычислены в любой последовательности. a(b(), c()). Функции b() и с() могут быть вызваны в любом порядке.
     
  17. VaVa

    VaVa Member

    Публикаций:
    0
    Регистрация:
    21 авг 2018
    Сообщения:
    34
    слева на право
    --- Сообщение объединено, 12 фев 2019 ---
    к примеру часто встречается такая проверка
    if(obj!=0&&obj->n==1)
    если наоборот то возможно будет чтение из ненужного куска памяти
     
  18. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    ни разу не так... даже на одном компиляторе в зависимости от настроек оптимизации может быть разный порядок вычисления...
     
  19. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    VaVa, в приведенном тобой примере происходит вычисление параметров оператора &&, а не параметров функции. Порядок вычисления параметров оператора && действительно происходит слева направо, и так как в твоем примере - делать можно. За исключением ситуации, когда оператор && определен пользователем - тогда на него действую те же правила, что и на функцию: порядок вычисления остается на усмотрение компилятора, и все параметры будут вычислены, прежде чем вернуть результат. В отличие от встроенного оператора, который не будет вычислять параметры, если их значения уже не повлияют на результат: например if(false && foo()) { ... }
     
    superakira нравится это.
  20. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    64
    наверное не самый удачный пример а вот
    i = i + ++ i + i

    если правильно
    x1=++i (и i=i+1)
    x2=i+x1
    x3=x2+i
    строим дерево
    Код (Text):
    1.    =
    2. i      +
    3.     ++    +
    4.      i   i i
    если обходить левой рекурсией как обычно
    i=x1
    x1=x2+x3
    x2=++i (не вызвалось i=i+1 вовремя а не изменённая i посчиталась)
    x3=i+i
    --- Сообщение объединено, 16 фев 2019 ---
    никто не подскажет как ещё можно хранить выражения (кроме как мучатся с деревом) чтобы всё по порядку учитывать и без промежуточных переменных?