Составители:
Рубрика:
Структурные конструкции удобны тем, что имеют ровно один вход и
ровно один выход. Этот факт в сочетании с тем, что они вкладываются
друг в друга, позволяет использовать для их порождения рекурсивные ал-
горитмы. В данном разделе мы предложим как раз рекурсивный вариант
генерации структурных конструкций.
5.3.1. Генерация кода для логических выражений
Логические выражения отличаются от рассмотренных ранее в этой
главе арифметических выражений тем, что могут вычисляться не полно-
стью. Например, в выражении
(a = 10) and (sin(x) = 0.5)
второе равенство имеет смысл вычислять, только если первое равенство
истинно (то есть если значение переменной a равно 10).
Это означает, что в коде, вычисляющем логические выражения,
должны активно использоваться условные переходы.
Динамическая генерация кода
175
В таблице 5.3 приведен список некоторых образцов и замен, которые
можно использовать для peephole-оптимизации CIL-кода.
5.3. Генерация развилок
Генерация кода, содержащего инструкции переходов, представляет
некоторую сложность по сравнению с генерацией линейного кода. Дело в
том, что появляются переходы вперед по коду, то есть переходы на инст-
рукции, которые еще не были сгенерированы. Общий метод решения этой
проблемы заключается в том, что такие инструкции переходов генериру-
ются частично, то есть сначала вместо них в код вставляются заглушки, в
которых не прописаны адреса переходов, а затем, когда адрес становится
известен, заглушки заменяются на настоящие инструкции переходов.
Интересен факт, что генерация развилок существенно упрощается,
если в процессе генерации придерживаться определенных требований
структурированной парадигмы в программировании. Эти требования за-
ключаются в том, что в генерируемой программе используются только
пять структурных конструкций, а именно: последовательность (рис. 5.2a),
выбор (рис. 5.2b), множественный выбор (рис. 5.2c), цикл с предусловием
(рис. 5.2d) и цикл с постусловием (рис. 5.2e). При этом конструкции могут
быть вложены друг в друга.
174
CIL и системное программирование в Microsoft .NET
dup
stloc.0
stloc.1
ldloc.0
dup
dup
stloc.0
stloc.1
Рис. 5.1. Peephole-оптимизация
Образец Замена
stloc(starg) x dup
ldloc(ldarg) x stloc(starg) x
ldloc (ldarg) x ldloc (ldarg) x
ldloc (ldarg) x dup
ckfinite ckfinite
ckfinite
not(neg) pop
pop
add(sub,mul,div,...) pop
pop pop
ldc.i4.0 –
add(sub)
ldloca(ldarga) x ldc.i4.0
initobj int32 stloc(starg) x
stloc(starg) x dup
ldloc(ldarg) y stloc(starg) x
ldloc(ldarg) x ldloc(ldarg) y
add (или любая коммутативная add (или любая коммутативная
бинарная операция) бинарная операция)
Таблица 5.3. Некоторые образцы и замены для peephole-оптимизации
CIL-кода
174 CIL и системное программирование в Microsoft .NET Динамическая генерация кода 175
Таблица 5.3. Некоторые образцы и замены для peephole-оптимизации
CIL-кода
Образец Замена
stloc(starg) x dup
dup dup ldloc(ldarg) x stloc(starg) x
ldloc (ldarg) x ldloc (ldarg) x
stloc.0 dup
ldloc (ldarg) x dup
stloc.1 stloc.0 ckfinite ckfinite
ckfinite
ldloc.0 stloc.1 not(neg) pop
pop
add(sub,mul,div,...) pop
pop pop
ldc.i4.0 –
add(sub)
ldloca(ldarga) x ldc.i4.0
Рис. 5.1. Peephole-оптимизация
initobj int32 stloc(starg) x
В таблице 5.3 приведен список некоторых образцов и замен, которые stloc(starg) x dup
можно использовать для peephole-оптимизации CIL-кода. ldloc(ldarg) y stloc(starg) x
ldloc(ldarg) x ldloc(ldarg) y
add (или любая коммутативная add (или любая коммутативная
5.3. Генерация развилок бинарная операция) бинарная операция)
Генерация кода, содержащего инструкции переходов, представляет
некоторую сложность по сравнению с генерацией линейного кода. Дело в Структурные конструкции удобны тем, что имеют ровно один вход и
том, что появляются переходы вперед по коду, то есть переходы на инст- ровно один выход. Этот факт в сочетании с тем, что они вкладываются
рукции, которые еще не были сгенерированы. Общий метод решения этой друг в друга, позволяет использовать для их порождения рекурсивные ал-
проблемы заключается в том, что такие инструкции переходов генериру- горитмы. В данном разделе мы предложим как раз рекурсивный вариант
ются частично, то есть сначала вместо них в код вставляются заглушки, в генерации структурных конструкций.
которых не прописаны адреса переходов, а затем, когда адрес становится
известен, заглушки заменяются на настоящие инструкции переходов. 5.3.1. Генерация кода для логических выражений
Интересен факт, что генерация развилок существенно упрощается, Логические выражения отличаются от рассмотренных ранее в этой
если в процессе генерации придерживаться определенных требований главе арифметических выражений тем, что могут вычисляться не полно-
структурированной парадигмы в программировании. Эти требования за- стью. Например, в выражении
ключаются в том, что в генерируемой программе используются только (a = 10) and (sin(x) = 0.5)
пять структурных конструкций, а именно: последовательность (рис. 5.2a), второе равенство имеет смысл вычислять, только если первое равенство
выбор (рис. 5.2b), множественный выбор (рис. 5.2c), цикл с предусловием истинно (то есть если значение переменной a равно 10).
(рис. 5.2d) и цикл с постусловием (рис. 5.2e). При этом конструкции могут Это означает, что в коде, вычисляющем логические выражения,
быть вложены друг в друга. должны активно использоваться условные переходы.
Страницы
- « первая
- ‹ предыдущая
- …
- 92
- 93
- 94
- 95
- 96
- …
- следующая ›
- последняя »
