Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
- | <P STYLE="margin-bottom: 0cm">Оптимизация компиляторов 14.11.06</P>
| + | == From Ebaums Inc to MurkLoar. == |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | We at EbaumsWorld consider you as disgrace of human race. |
- | </P>
| + | Your faggotry level exceeded any imaginable levels, and therefore we have to inform you that your pitiful resourse should be annihilated. |
- | <P STYLE="margin-bottom: 0cm">Сегодня будет некоторое представление
| + | Dig yourself a grave - you will need it. |
- | программы, которое удобно для анализа и оптимизации:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">SSA-representation.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Static Single assignment –
| + | |
- | статическое однократное присваивание.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Основная идея: каждая переменная может
| + | |
- | присваиваться тоько один раз. Но так как языки процедурные, имеют
| + | |
- | циклы.. то возникают некоторые интересные эффекты.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">По результату анализа достигающих
| + | |
- | определений мы можем построить du- и ud-цепочки.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Если у нас далее в тексте программы
| + | |
- | бужет использована переменная х, то для этой же самой переменной мы
| + | |
- | будем строить ссылки на те же самые точки. Что у нас получается: у
| + | |
- | нас некрая переменная n раз исп и m раз опред, то ссылко будет
| + | |
- | максимум N*M. Представление, в котором исп du-цепочки, неэффективно
| + | |
- | по памяти. Хотелось бы её снизить или преодолеть.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">value numbering:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">a <- x+y</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">b <- a-1</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">a <- y+b</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">b <- x*4</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">a <- a+b</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Три раза присв а, два раза b.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Введём поняте поколения перменных.
| + | |
- | Каждое присваивание порождает новое поколение переменных.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">a1 <- x+y</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">b1 <- a-1</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">a2 <- y+b</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">b2 <- x*4</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">a3 <- a2+b2</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Поскольку мы работаем в пределах
| + | |
- | одноого базового блока проблем не возникает.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Пример:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">b <- M[x]</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">a <- 0</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">if b<4</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> | \</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">V _|</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">a<-b c<-a+b</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">фи-функция:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">a<SUB>k</SUB> = fi(a<SUB>i1</SUB>, ...
| + | |
- | a<SUB>ij</SUB>)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Выбирает то поколение, по которому пути
| + | |
- | мы пришли в потоке управления.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">С учётом этого программа будет
| + | |
- | выглядеть след образом:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">b1 <- M[x]</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">a1 <- 0</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">if b1 < 4</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> | \</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">V _|</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">a2 <- b1 a3 <- fi(a2, a1)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">c1 <- a2 + b1</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Фи-функция для нек перем – все
| + | |
- | переменные, когда мы рассм анализ достиг определений, то там были
| + | |
- | пары... (...), которые могут быть в этом месте</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Такое представление, в котором есть
| + | |
- | поколения переменных, каждое поколение может присв один раз,
| + | |
- | называется SSA-r.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Фи функцию мы можем рассм, которая
| + | |
- | транформирует входные аргументы в выходные.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Поскольку мы знаем, что каждая перем
| + | |
- | присв один раз, то многие оптимизации становятся проще, и можно
| + | |
- | многие оптимизации применять.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Вопросы:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Если мы будем ставить фи функции везде,
| + | |
- | где неск перем сливаются в одну, то выигрыша мы не получим. Вопрос –
| + | |
- | </P>
| + | |
- | <OL>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">как расставить минимальное
| + | |
- | количество фи-функций?</P>
| + | |
- | </OL>
| + | |
- | <P STYLE="margin-bottom: 0cm">Если мы рассмотрим этот фрагмент, то
| + | |
- | очевидно, что для перем b никая функция не используется.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Рассмотрим:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><картинка></P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">value numbering</P>
| + | |
- | <OL>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">существует х</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">существует у</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">существует Рxz x волнистая стрелка
| + | |
- | z</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">существует Рyz y волнистая стрелка
| + | |
- | z</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Pxz пересечение Pyz = {z}</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">после отбрасывания посл верш z у
| + | |
- | Pxz и Pyz не должно быть общих вершин</P>
| + | |
- | </OL>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Критерии слияния путей</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Проверять этот критерий очень сложно.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Нужен более простой критерий. Его можно
| + | |
- | найти, используя</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Граница доминирования (domination
| + | |
- | frontier)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Пусть есть граф потока управления b. ГД
| + | |
- | DF(b) – множество {x | существует y принадлежит pred(x), b dom
| + | |
- | y, b !dom x}</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">(рисуется граф потока управления)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Рассмотрим 4. Блок 4 находится в
| + | |
- | границе доминир для 5, то же самое 13, 12.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Соответственно, предположим, что пусть
| + | |
- | некоторый блок х содержит определение а. Тогда фи-функции для а будут
| + | |
- | добовляться во все блоки на границе доминир блока х.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В 13и 12 фи-функция от 3 арг, в 4 –
| + | |
- | от 2. Но, как показано ранее, фи-функции тоже явл присваиванием.
| + | |
- | Поэтому нужно рассмотреть эти новые присваивания и добавить
| + | |
- | фи-функции на граници доминир тех блоков, в которые мы добавили
| + | |
- | фи-функции. Соотв, нам потребуется не простая, а итерир граница
| + | |
- | доминирования, под которой мы понимаем транзитивное замыкание.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Алгоритм построения SSA:</P>
| + | |
- | <OL>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Найти итерир гр доминирования</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Найдя опред, расставить фи-функции</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">При первонач установке фи-функций
| + | |
- | поколения не устанавливаются, поэтому мы должны назначить поколения</P>
| + | |
- | </OL>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Вычисление границы доминирования</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Мы предполагаем, что у нас уже есть
| + | |
- | дерево доминирования, соответственно, как мы её можем вычислять.
| + | |
- | Введём две вспомогательных переменных, n – номер базового
| + | |
- | блока. DF<SUB>loc</SUB>(n) – множество последователей блока n,
| + | |
- | которые не доминируются базовым блоком n = succ(n) \ {x: n dom x}.
| + | |
- | Требуется вспомог функция DF<SUB>up</SUB>(n) – все вершины
| + | |
- | граници доминирования n, которые не доминируются непосредственным
| + | |
- | доминатором n.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Тогда границу доминир для n можно
| + | |
- | определить след образом:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">DF(n) = DF<SUB>loc</SUB>(n) объединение
| + | |
- | (объединение по всем c принадлежит children(n) DF<SUB>up</SUB>(c))
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Как мы будем вычислять границы
| + | |
- | доминирования:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">compute DF(n)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> s <- {}</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> foreach y принадлежит succ(n)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> if idom(y) != n</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> S объединить равно {y}</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> foreach c принадлежит children(n)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> compute DF(c)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> foreach w принадлежит DF(c)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> if !(n dom w)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> s принадлежит равно {w}</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">DF(n) = s</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Втоорой шаг</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">insert Phi</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> foreach n</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> foreach a принадлежит Aorig(n)
| + | |
- | //Aorig – множество перем, поред в данном базовом блоке
| + | |
- | изначально</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> defsites(а) объединить равно {n}</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">foreach a</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> w = defsites(a)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> while (w != пусто)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> n = get(w)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> foreach y приндлежит DF(n)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> if y != Afi(a)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> a = fi(a..a) by</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> Afi(a) объединить равно {y}
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">С помощью такого алгоритма мы будем
| + | |
- | добавлять функции в базовые блоки.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Последнее: проставить номера поколений.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Алгоритм занимает листочек, поэтому мы
| + | |
- | этого делать не будем</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Оптимизация в Ssa-представлении:</P>
| + | |
- | <OL>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">устранение мёртвого кода
| + | |
- | (dead-code elimination)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Мёртвым кодом миы будем считать код не
| + | |
- | дающий побочных эффектов, результаты которого нигде не исп. В
| + | |
- | результате удаления может появиться мёртвый код, и так далее, пока
| + | |
- | не удалим весь.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">a<SUB>k</SUB> <- F(v<SUB>1</SUB>
| + | |
- | ... v<SUB>m</SUB>)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Код мёртвый, если ak нигде не
| + | |
- | используется, то мы её вычёркиваем, обновляем переменные, вход в
| + | |
- | левую часть</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Продвижение констант</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Если есть присваивание вида a <-
| + | |
- | const, и если мы знаем, что значение перем не меняется, то мы можем
| + | |
- | заменить в этом месте перем за константу. Можно заменить фи-функцию,
| + | |
- | у которой все аргументы – одинаковые константы, её можно
| + | |
- | заменить на константу. Как только мы поставили константы, может
| + | |
- | потребоваться вычисление выражения, если там одни константы.</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Продвижение копий</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">y<SUB>i</SUB> <- x<SUB>i</SUB></P>
| + | |
- | <P STYLE="margin-bottom: 0cm">v<SUB>k</SUB> <- fi(x<SUB>i</SUB>,
| + | |
- | x<SUB>i</SUB>, ..., x<SUB>i</SUB>)</P>
| + | |
- | </OL>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Задача обратного преобразования:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Надо избавиться от фи-функций.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">амый тривиальный способ – вводить
| + | |
- | дополнительный код но очевидно, что это никому неинтересно.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">По опред, фи функции находятся в точках
| + | |
- | слияния путеё.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">xi = fi(x1, x2, x3)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Простейший способ – перенести
| + | |
- | присваивание вверх:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">x1 <-x1 xi <- x2
| + | |
- | xi <- x3</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> \ |
| + | |
- | /</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> _| V
| + | |
- | |_</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">edge splitting</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Для начала добавим пустой базовый блок.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Алгоритм неправильный, так делать
| + | |
- | нельзя.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Пример:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">x0 <- 1</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> |</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> V /____</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">x1 <- fi(x0, x2) \ |</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">y <- x1 |</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">x2 <- 2 __|</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> |</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> V</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">return y</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Сделаем copy propagation:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">x0 <- 1</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> |</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> V /____</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">x1 <- fi(x0, x2) \ |</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">x2 <- 2 __|</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> |</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> V</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">return x1</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Расщепляем фи-функцию:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">x0 <- 1</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">x1 <- x0</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> |</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> V /____</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">x1 <- x2 \ x1 <- x2</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> | ____________|</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> |</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> V</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">return x1</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Пример плохой. Придумать пример самим.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Другой пример:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">x0 <- 1</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">y0 <- 2</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> |</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> V /____</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">x1 <- fi(x0, x2) \ |</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">y1 <- fi(y0, y2) |</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">y2 <- x1 |</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">x2 <- 3 __|</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> |</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> V</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">x0 <- 1</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">y0 <- 2</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> |</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> V /____</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">x1 <- fi(x0, x2) \ |</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">y1 <- fi(y0, y2) |</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">x2 <- 3 __|</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> |</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> V</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">x0 <- 1</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">y0 <- 2</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">x1 <- x0</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">y1 <- y0</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> |</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> V /____</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">x2 <- 3 \ x1 <-
| + | |
- | x2</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> | _______________y1 <- x1</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> |</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> V</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | | + | |
- | | + | |
- | {{Введение в теорию построения оптимизирующих компиляторов}}
| + | |
- | {{Lection-stub}}
| + | |