Есть ли здесь какой-нибудь самоулучшающийся компилятор?

Я не знаю ни одного самоулучшающегося компилятора, но опять же, я не особо разбираюсь в компиляторах.

Есть ли ЛЮБОЙ самоулучшающийся компилятор?

Обратите внимание, что я говорю о компиляторе, который улучшает сам себя, а не о компиляторе, улучшающем код, который он компилирует.

Любые указатели приветствуются!

Примечание: если вам интересно, почему я прошу, взгляните на this post. Даже если я согласен с большинством аргументов, я не уверен в следующем:

У нас есть программы, которые могут улучшить свой код без участия человека - они называются компиляторами.

... отсюда и мой вопрос.


comment
Самосовершенствование в каком аспекте? Как компилятор будет улучшаться? Добавляет ли он новый язык сам по себе, поэтому gcc решает, что он хочет скомпилировать Ruby, и узнает, как это сделать? Можно ли улучшить компилирование C, добавив новый уровень оптимизации?   -  person James Black    schedule 18.10.2009
comment
А как насчет компилятора, который сам компилируется?   -  person ChrisInEdmonton    schedule 18.10.2009
comment
@JamesBlack самосовершенствование в ЛЮБОМ аспекте :) - Я просто пытаюсь понять, есть ли такое   -  person JohnIdol    schedule 18.10.2009
comment
Пока вы не сможете конкретно сказать, что вы имеете в виду, это не настоящий вопрос. Я имею в виду, как вы думаете, может ли компилятор понять свою производительность и решить, что с этим делать?   -  person dmckee --- ex-moderator kitten    schedule 19.10.2009
comment
Я имею в виду ЛЮБОЙ аспект самосовершенствования, в том числе упомянутый вами, который звучит для меня как вопрос. Дело не в том, что я думаю, я просто пытаюсь понять, есть ли в настоящее время исследования по этой теме на ЛЮБОМ уровне.   -  person JohnIdol    schedule 19.10.2009
comment
Учитывается ли оптимизация по профилю? Я знаю, что компиляторы Intel и TI поддерживают это, но никогда не пробовал   -  person Gautham Ganapathy    schedule 22.10.2009
comment
Им нужно оптимизировать свой собственный исходный код (а не код, который они компилируют) и, возможно, перекомпилировать себя, чтобы это засчиталось! :)   -  person JohnIdol    schedule 22.10.2009
comment
Самостоятельный компилятор мог бы улучшить себя, компилируя себя, не так ли?   -  person mdm    schedule 24.10.2009
comment
Что вы имеете в виду под самообслуживанием? Если он компилируется, у него есть потенциал для улучшения (даже тривиальным образом), но на самом деле он может этого не делать.   -  person JohnIdol    schedule 24.10.2009
comment
Просто чтобы вы знали, компиляторы с самостоятельным размещением - не редкость. SBCL - это самообслуживание, gcc - самообслуживание и т. Д.   -  person jrockway    schedule 08.11.2009
comment
@jrockway - компиляторы на собственном хостинге компилируются сами по себе, что означает, что если они оптимизируют код, который они компилируют ... они оптимизируют себя. Я на что-то наткнулся или это просто собака, преследующая свой хвост?   -  person JohnIdol    schedule 08.11.2009
comment
Пока вы строго не определите улучшение в терминах компиляторов, любое обсуждение этой темы - танец невежества.   -  person xofz    schedule 20.05.2010
comment
@Sam Rigor не требуется - я хорошо разбираюсь во всем, что люди считают улучшением, если это самоулучшение исходного кода компилятора, созданного самим компилятором.   -  person JohnIdol    schedule 16.06.2010


Ответы (8)


Хотя это правда, что компиляторы могут улучшать код без вмешательства человека, однако утверждение о том, что «компиляторы являются самоулучшающимися», довольно сомнительно. Эти «улучшения», которые делают компиляторы, просто основаны на наборе правил, написанных людьми (кто-нибудь киборгами?). Итак, ответ на ваш вопрос: нет.

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

person aviraldg    schedule 18.10.2009
comment
Ах - ирония судьбы ... ваш пост даже помечен как сингулярность - person aviraldg; 18.10.2009
comment
тогда это стало бы вирусом, заставляющим всех разработчиков использовать его ... Так что же, Java? - person jrockway; 08.11.2009
comment
Ах! Спасибо jrockway за смешок. - person MaD70; 08.11.2009
comment
Не знаю, как вы, но мои составители посещают вечерние занятия, чтобы научиться плести корзин под водой! - person Donal Fellows; 13.06.2010
comment
Скайнет улучшил свой компилятор - person gringo; 11.04.2019

MilepostGCC - это компилятор MachineLearning, который со временем улучшается в том смысле, что способна измениться, чтобы со временем стать «лучше». Более простой подход итеративной компиляции может улучшить практически любой компилятор.

person Community    schedule 06.12.2009

25 лет программирования, и я никогда не слышал о таком (если вы не говорите о компиляторах, которые автоматически загружают обновления программного обеспечения!).

person dicroce    schedule 18.10.2009

Насколько мне известно, еще не реализовано практически, но да, теория есть:

  • Машины Goedel: самореференциальные универсальные средства решения проблем, обеспечивающие доказуемо оптимальные самоусовершенствования.
person Community    schedule 07.11.2009
comment
так что ответ: НЕТ, такого нет. Теоретически путешествия во времени возможны, но я никого из будущего не вижу :) - Без шуток, спасибо за ссылку. Есть ли другие примеры, которые вы можете придумать, или машины Геделя - единственные теоретические примеры такого рода? - person JohnIdol; 08.11.2009
comment
Насколько мне известно, они соответствуют последнему слову техники, предыдущая работа была выполнена Маркусом Хаттером (hutter1.net), ученик Шмидхубера. Но мне нужно внести ясность: машины Геделя не теоретизируются в том смысле, что есть расплывчатые утверждения о том, что они возможны; нет, в работе Шмидхубера есть четкий план по созданию (программированию) такового. Остается только инженерия, что не обязательно просто: в частности, она требует аксиоматической модели производительности оборудования, на котором оно работает. С нынешними дрянными процессорами нереально детерминированная модель производительности, я думал позволить программе ... - person MaD70; 08.11.2009
comment
... контролировать себя (с помощью аппаратных счетчиков производительности), изучать и постепенно совершенствовать аксиоматическую вероятностную модель производительности. Но это чистое предположение. - person MaD70; 08.11.2009
comment
Со страницы по ссылке - поисковик систематически и эффективно проверяет вычислимые методы доказательства (программы, выходные данные которых являются доказательствами), пока не найдет доказуемо полезную вычислимую самоперезапись. Мы показываем, что такая самоперезапись глобально оптимальна - никаких локальных максимумов! - поскольку код сначала должен был доказать, что продолжать поиск доказательства для альтернативных самопереписаний бесполезно. Как долго это обычно занимает? Это звучит очень похоже на гонку против тепловой смерти Вселенной. Тем более, что существующая теория компиляторов уже довольно продвинута. - person Adam Luchjenbroers; 01.12.2009
comment
Нет: время делится поровну между реальным делом и поиском лучших решений. Представьте робота, выполняющего план - если есть жесткие временные рамки, в худшем случае он выполнит задачу, выполнив менее эффективный план. Итак, если есть ограничение по времени, фактическая задача будет выполнена в любом случае (если, конечно, план вычислим и выполним в этот срок). Кроме того, если у кого-то есть хорошая отправная точка, нет ничего, что мешало бы начать оттуда - возможно, переписывание обнаружит лучшую версию, (пока) не вычисляемую традиционными средствами. - person MaD70; 03.12.2009
comment
@ MaD70: Не нашел упоминания о машинах Goedel на странице Хаттера (возможно, я не знал, что именно искать), но мне это кажется невозможным. Невозможно алгоритмически найти простейшую программу, эквивалентную программе X. Если бы это было так, мы могли бы, скажем, написать программу, которая проверила бы гипотезу Гольдбаха и либо напечатала бы контрпример, либо никогда не остановилась бы, и уменьшила бы ее до простого бесконечного цикл или оператор печати. Любой вид исчерпывающего поиска поспорит с распадом протона и проиграет. - person David Thornley; 20.05.2010
comment
@David Thornley: ссылка ведет прямо на домашнюю страницу машин Goedel на сайте Шмидхубера: idsia.ch/ ~ juergen / goedelmachine.html Прочтите статью на той странице: он не писал, что машина Геделя найдет простейшую программу, эквивалентную программе X. Машина Геделя будет постепенно переписывать себя и это только доказывает, что каждая перезапись будет лучше, чем предыдущая версия. В конце концов, за отведенное время он случайно обнаружит глобальную оптимальную перезапись, но это, конечно, не гарантируется, и вы никогда не можете быть уверены, что текущая перезапись оптимальна. - person MaD70; 07.06.2010
comment
@ MaD70: Спасибо, нашел там препринт. Мне кажется, что машина ограничится исправлениями, которые можно доказать, и в этом есть свои недостатки. Обратите внимание, что детерминированная модель производительности процессора почти наверняка медленнее, чем реальная модель, а это означает, что у нее изначально есть дефицит производительности. Не похоже, что это будет практично для меня, хотя мы, вероятно, научимся чему-то, попробовав это. - person David Thornley; 07.06.2010
comment
@ Дэвид Торнли: пожалуйста. На аксиоматической детерминированной модели производительности процессора: вы должны понимать это НЕ как эмуляцию, а как подсчет циклов команд, как в прошлом. Таким образом, при перезаписи вы можете рассчитать ее производительность, просто добавив каждый цикл команд перезаписанной программы. Но см. Следующий комментарий. - person MaD70; 08.06.2010
comment
@youngsters: раньше в таблицах данных ЦП для каждой инструкции указывалось количество циклов, необходимых для их выполнения (1 цикл = 1 такт). Производительность процессоров в то время была гораздо более предсказуемой. Конечно, сейчас картина совсем иная. По этой причине во втором комментарии к этому ответу я сослался на аксиоматическую вероятностную модель производительности, построенную автоматически (снова машинное обучение). - person MaD70; 08.06.2010
comment
Итак, ваш аргумент в пользу несуществующей машины основан на расплывчатой, неосуществимой теории? К сожалению, ответ - НЕТ. - person Cerin; 15.03.2011

Самоулучшающийся компилятор по определению должен иметь самомодифицирующийся код. Если вы посмотрите вокруг, вы можете найти примеры людей, делающих это (самомодифицирующийся код). Однако это очень редко можно увидеть, особенно в таких больших и сложных проектах, как компилятор. И это необычно по очень веской причине - до смешного сложно (то есть почти невозможно) гарантировать правильную работу. Многие программисты, которые думают, что они умны (особенно кодировщики на ассемблере), в тот или иной момент экспериментируют с этим. Те, кто на самом деле умны, в большинстве своем выходят из этой фазы. ;)

person Community    schedule 06.11.2009

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

  1. У нас есть весь исходный код GCC, но единственный доступный компилятор C на этой машине - это не GCC. Увы, некоторые части GCC используют «расширения», которые могут быть созданы только с помощью GCC. К счастью, на этой машине есть функциональный исполняемый файл make и некоторый произвольный частный компилятор C. Человек идет в каталог с исходным кодом GCC и вручную набирает "make".

  2. Утилита make находит MAKEFILE, который дает указание запустить (проприетарный) компилятор C для компиляции GCC, и использует параметр «-D», чтобы все части GCC, использующие «расширения», # ifdef'ed out. (Эти фрагменты кода могут быть необходимы для компиляции некоторых программ, но не на следующем этапе GCC.). Это создает очень ограниченный урезанный двоичный исполняемый файл, у которого едва хватает функциональности для компиляции GCC (и люди, которые пишут код GCC, тщательно избегают использования функций, которые этот урезанный двоичный файл не поддерживает).

  3. Утилита make запускает этот урезанный двоичный исполняемый файл с соответствующей опцией, так что все части GCC скомпилированы, в результате чего получается полнофункциональный (но относительно медленный) двоичный исполняемый файл.

  4. Утилита make запускает полнофункциональный двоичный исполняемый файл в исходном коде GCC со всеми включенными параметрами оптимизации, в результате чего создается фактический исполняемый файл GCC, который люди будут использовать с этого момента, и устанавливает его в соответствующем месте.

  5. Утилита make проверяет, все ли работает нормально: она запускает исполняемый файл GCC из стандартного места в исходном коде GCC со всеми включенными параметрами оптимизации. Затем он сравнивает полученный двоичный исполняемый файл с исполняемым файлом GCC в стандартном расположении и подтверждает, что они идентичны (за возможным исключением нерелевантных временных меток).

После того, как человек напечатал "make", весь процесс запускается автоматически, каждый этап генерирует улучшенный компилятор (пока он не достигнет плато и не сгенерирует идентичный компилятор). http://gcc.gnu.org/wiki/Top-Level_Bootstrap и http://gcc.gnu.org/install/build.html и "Скомпилировать GCC с исходным кодом" можно подробнее.

Я видел другие компиляторы, у которых в этом процессе было бы намного больше этапов, но все они требуют некоторого человеческого участия после каждого этапа или двух. Пример: «Начальная загрузка простого компилятора с нуля» Эдмунд Гримли Эванс, 2001 г. http://homepage.ntlworld.com/edmund.grimley-evans/bcompiler.html И есть вся историческая работа, проделанная программистами, которые работали над GCC, которые используют предыдущие версии GCC. скомпилировать и проверить свои умозрительные идеи о возможно улучшенных версиях GCC. Хотя я бы не сказал, что это происходит без какого-либо человеческого участия, тенденция, похоже, такова, что компиляторы выполняют все больше и больше «работы» за одно нажатие клавиши человеком.

person Community    schedule 14.03.2011

Я не уверен, подходит ли он, но компилятор Java HotSpot улучшает код во время выполнения, используя статистику.

Но во время компиляции? Как этот компилятор узнает, что несовершенно, а что нет? Какая мера добра?

Есть много примеры людей, использующих генетические методы, чтобы противопоставить алгоритмы друг другу, чтобы найти «лучшие» решения. Но обычно это хорошо изученные проблемы, у которых есть метрика.

Итак, какие показатели мы можем применить во время компиляции? Минимальный размер скомпилированного кода, циклометрическая сложность или что-то еще? Что из этого имеет значение во время выполнения?

person duffymo    schedule 18.10.2009
comment
Во-первых: это не самосовершенствование, не так ли? Во-вторых: если кто-то думает, что это приложение ИИ, это не так. Он просто проверяет наличие узких мест в производительности и пытается их улучшить, идя на компромисс в отношении других вещей. - person aviraldg; 18.10.2009
comment
Спасибо, я понимаю вашу точку зрения, но я говорю о компиляторе, который улучшает себя, а не о коде, который он компилирует. - person JohnIdol; 18.10.2009

Что ж, есть методы JIT (как раз вовремя). Кто-то может возразить, что компилятор с некоторыми оптимизациями JIT может перенастроить себя, чтобы быть более эффективным с программой, которую он компилирует ???

person Community    schedule 19.05.2010
comment
Я больше говорю об улучшениях исходного кода компилятора самим компилятором. - person JohnIdol; 16.06.2010