Нашел свое преобразование в Вики:
https://en.wikipedia.org/wiki/Loop-inva ... ode_motion - там тоже отсылают к Ахо, Сети, Ульману.
(Оффтоп)
Язык взят исключительно для примера: он достаточно бедный и безглючный.
Я буквально пару недель назад напоролся на очень неприятный глюк (см. обсуждение
тут). Это пока единственный известный мне глюк такого рода, но неприятно то, что типичная ошибка этапа компиляции вылезает только в рантайме. Другие языки такого себе не позволяют обычно. Oracle, насколько я знаю, в курсе, но считает, что это нормально. Случай не ваш конечно (раз вы в БД не лезете), просто, скорее, как иллюстрация того, что и на старуху бывает проруха.
Ой, да там достаточно того, что криво написанный
group by не вылетает при компиляции. Ой не буду вспоминать.
С таким же успехом я мог бы взять C++, Pascal, м.б. Delphi, Lua какой-нибудь - любой C-подобный процедурный язык.
Ну вот я бы не сказал, что с таким же успехом. Хоть я и фанат PL/SQL, но для вашей задачи он мало подходит, имхо. Может, вам все-таки что-то более классическое взять?
М.б. я вообще себе возьму какой-нибудь абстрактный примитивный язык с минимумом синтаксиса. Буду все писать процедурами вида
pName(par1,...,parn);Если это константное выражение, то да. Ну а так надо быть уверенным в том, составные части не изменились.
Ну да. Я опять повторюсь: я не привожу точные условия применения правила, поскольку они сильно будут зависеть от языка и м.б. еще чего-нибудь. Меня попросили привести примеры, я привел.
Если брать теорию, то мне больше нравится старый двухтомник Ахо, Ульман, «Теория синтаксического анализа, перевода и компиляции», 1978. Она более математична, чем книга Дракона. Там глава 11 (последняя во втором томе) как раз посвящена оптимизации.
Спасибо!
Если брать практику, то одна из самых простых дорог — генерация кода LLVM, который затем может быть оптимизирован средствами самого LLVM.
Спасибо! Нашел чего-то на хабре, почитаю. Интересно, сколько там цельной теории? Или это просто инструмент?
Если от переменной явно или неявно взят адрес, или переменная может изменяться из другого потока?
Конкретно в PL/SQL этого нет.
Ой да, давайте без указателей, адресной арифметики и прочего насилия над мозгом. Не надо также ООП, классов, шаблонов, БД и еще что там есть, вполне достаточно арифметики и строк.
Ну тот же Кнут незабвенный.
А том хотя бы какой? У меня до ИП Кнута руки дошли только до ГСЧ в середине 2-го тома.
Как альтернативу я бы предложил
https://ru.wikipedia.org/wiki/%D0%90%D0 ... 0%B8%D0%B7
Это больше плохо алгоритмизуемое искусство.
Вообще, вот я написал сортировку пузырьком. У меня даже близко нет ни одного преобразования, которое приводило бы к использованию метода "разделяй и властвуй". Потому то, что в Кормене описано - это пока как недоступное искусство. И там оно тоже неконструктивное. Т.е. там типа "возьмем такую-то задачу". Для нее внезапно есть вот такой-то алгоритм. Вот мы можем у него вычислить скорость. А откуда сам алгоритм взялся - непонятно. А в теории схем программ - там хоть преобразования есть.
Под "оптимизацией" понимаются две сильно разные вещи:
- оптимизация порядка сложности алгоритма;
- оптимизация, не меняющая порядка сложности.
Примерно с 2000 года в программировании вырос и закрепился тезис, что первой заниматься нужно, а второй не нужно. <аргументы>
Sonic86, как видно по его примерам, под оптимизацией понимает вторую вещь. Ну так и не надо жаловаться, что она ушла в компиляторы.
Но важнее, конечно же, первая. Теории тут никакой нет, это дело творческое, максимум теория может помочь вычислить сложность алгоритма.
Я согласен полностью! И меня больше интересует все-таки первое, чем второе.
Sonic86, с какой целью оптимизируете?
С целью развлечения
С целью удовлетворения любопытства, например.
Давайте я другой пример приведу, ладно (видимо, никто мне больше все равно не ответит).
Хочу я написать значит программу, которая решает мне судоку. Алгоритм решения я какой-то там себе представляю, он там частичный и все равно может упереться в небольшой перебор. Но писать его мне лень. Зато мне интересно написать программу, которая оптимизирует другие программы (пусть там немножко понижает асимптотику - уже хорошо). И пусть я ее написал. Беру я задачу судоку и переписываю ее в виде совершенно унылого тормозного кода
Код:
A[1][1]=a11;
A[1][2]=a12;
...
A[9][9]=a99;
for(i1=1;i1<10;i1++){
...
for(i81=1;i81<10;i81++){
if(a11=i1 && ... && a81=i81){
if(Все элементы в строках разные &&...){
printf('решение');
}
}
}
...
}
Далее беру я этот код и скармливаю программе-оптимизатору. Насколько сильного эффекта я могу добиться?