Можно ли научить машину программировать себя по определенной спецификации? [закрыто]

12

Мой друг без знания программирования задал мне этот вопрос, и я нашел его интересным.

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

Но, возможно, я ошибаюсь, и я хотел бы знать, что вы об этом думаете, и если вам известны какие-либо статьи / исследования по этому вопросу, или если они уже существуют, или если существует возможность выбора спецификации и получения машина для самопрограммирования на эту "спец?"

Флориан
источник
4
Определите программирование. Я мог бы построить программу, которая бы делала другие программы. Но будет ли это действительно учиться?
Питер Б
Да, вопрос не в генерации кода, а в реальном программировании, как мы делаем как разработчики.
Флориан
Это зависит от того, что программа. Программа с большим количеством процедурной бизнес-логики будет намного сложнее (и гораздо менее осуществимой), чем что-то функциональное и чисто математическое. (
Во
@florian: Мы сами являемся машинами, которые научились программировать (предполагая, что инопланетяне / бог создал нас :-)). Конечно, мы еще не приобрели способность программировать последовательности ДНК и т. Д., Поэтому, если вы создаете машину, которая должна научиться программировать в конечном итоге, вы должны запрограммировать ее на «развитие» и в конечном итоге узнать, как она сама была запрограммирована.
Nav
2
@maple_shaft: я сделал вопрос более объективным, приведя его в соответствие с существующими ответами, и задавался вопросом, может ли он быть вновь открыт в его нынешнем виде.
Том Ау

Ответы:

15

Джоэл на самом деле ответил на это несколько лет назад . Фактическое значение «научить машину программировать самостоятельно» - «научить машину брать спецификацию и создавать программу, соответствующую этой спецификации». И с учетом этого:

Проблема здесь очень фундаментальная. Чтобы механически доказать, что программа соответствует какой-то спецификации, сама спецификация должна быть предельно подробной. На самом деле спецификация должна определять все о программе, в противном случае, ничего нельзя доказать автоматически и механически. Теперь, если спецификация определяет все о том, как программа будет вести себя, то, о чудо, она содержит всю информацию, необходимую для генерации программы! И теперь некоторые фанаты уходят в очень темное место, где они начинают думать об автоматическом компиляции спецификаций в программы, и они начинают думать, что они только что изобрели способ программирования компьютеров без программирования.

Теперь это программный эквивалент вечного двигателя. Это одна из тех вещей, которые постоянно пытаются взломать, независимо от того, сколько вы им говорите, это никогда не сработает. Если спецификация точно определяет, что будет делать программа, достаточно подробно, чтобы ее можно было использовать для генерации самой программы, то напрашивается вопрос: как написать спецификацию? Такую сложную спецификацию написать так же сложно, как и основную компьютерную программу, потому что специалистом по написанию спецификаций необходимо ответить на столько же деталей, сколько и программисту. Чтобы использовать терминологию из теории информации: спецификации нужно столько же энтропии Шеннона, сколько самой компьютерной программе. Каждый бит энтропии - это решение, принятое специалистом или программистом.

Итак, суть в том, что если бы действительно был механический способ доказать правильность программы, все, что вы могли бы доказать, это то, идентична ли эта программа какой-либо другой программе, которая должна содержать такое же количество энтропии. как первая программа, в противном случае некоторые из поведений будут неопределенными, и, следовательно, бездоказательными. Так что теперь написание спецификаций так же сложно, как написание программы, и все, что вы сделали, это перенесли одну проблему отсюда туда и ничего не достигли.

Единственный способ обойти это - создать настоящий разумный компьютер, обладающий достаточной интуицией, чтобы автоматически заполнять пробелы, которые вы и я выполняем автоматически все время при создании программного обеспечения ... в этом случае вы в конечном итоге компьютер, который программирует себя так же, как и человек-разработчик. ;)

Мейсон Уилер
источник
7
Я могу написать полную спецификацию для алгоритма сортировки гораздо проще, чем придумать сортировку вставкой, быструю сортировку или сортировку по сегментам. Тем не менее, вы утверждаете, что легко превратить первое во второе.
raptortech97
Джоэл ... Хватит! ;-) Я понимаю, что для этого нам понадобится спецификация на данном языке. Но я не полностью убежден в аргументе, что спецификация должна быть очень подробной. Мы, как разработчики, способны разрабатывать программы, не имея очень подробной спецификации. Разве мы не можем разработать искусственный интеллект, способный принять «случайное» решение о разработке программы?
Флориан
6
@florian Итак, вы хотите, чтобы программа выполняла задачу по интерпретации спецификаций, которую выполняют программисты? Тогда это становится извечной проблемой «сильного ИИ», которую многие разумные люди исследовали в течение десятилетий без какого-либо прогресса, чтобы показать это. Существуют горячие философские споры о том, возможен ли ИИ даже метафизически, а тем более практически невозможен в далеком будущем, и, по моему опыту, никто, кроме продавцов змеиной нефти, не прогнозирует сильного ИИ в ближайшем будущем.
Я действительно не хочу этого, я спрашивал себя (как мой друг спросил меня), возможно ли это. Я прекрасно понимаю, что ИИ на самом деле не существует и что он просто сводится к какому-то «случайному» запрограммированному выбору.
Флориан
2
@ raptortech97: Нет, вы не можете. Не «полный» в значении этого вопроса. Чтобы ваша спецификация была настолько полной, чтобы ее можно было механически преобразовать в исполняемую программу, она должна быть написана на языке программирования. В противном случае ваша спецификация будет иметь неопределенное поведение, или вы просто пишете код в документе MSWord.
whatsisname
4

Конечно, мы делаем это все на время (для очень ограниченных подмножеств проблем). Довольно просто представить себе, что нужно сделать еще один или два шага и привязать что-то вроде Siri к входу этих генераторов кода (или что-то вроде Wolfram Alpha), который, в свою очередь, пишет код и решает вашу проблему. Я ожидал бы, что что-то уже существует где-то, чтобы сделать самые основные вещи.

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

Telastyn
источник
Спасибо за ссылки. Хотя Yacc & Xamarin являются чисто детерминированными генераторами кода. Они не создают вещи с нуля.
Флориан
@florian - ничто не создает вещи с нуля. Всегда есть какой-то вклад, они просто более требовательны, чем большинство.
Теластин
1
@Telastyn: сравнение ввода / вывода для генератора синтаксического анализатора с вводом / выводом для человеческого разума как «более требовательного» в лучшем случае неискренне.
whatsisname
2

Я думаю, что ответ @Mason Wheeler содержит ключевую идею. Это выглядит так:

Энтропия Шеннона Tic-Tac-Toe действительно мала. Поэтому мы называем крестики-нолики «решенной» или «детерминированной» игрой. Это не очень интересно, когда ты заканчиваешь начальную школу. Шашки имеют более высокую энтропию, если учесть энтропию всех возможных игр, в которые вы можете играть. Но шашки тоже "решенная" или "детерминистическая" игра. Если вы двигаетесь первым, вы должны только выиграть или сыграть вничью. В шахматах энтропия намного выше, но с 2006 года ни один человек не побил лучших компьютерных игроков. Таким образом, компьютеры освоили шахматы так, как не могут люди. Big Blue проанализировали Википедию, а затем сыграли в «Опасность» с игроками-людьми и добросовестно победили их.

Что дальше? Что такое энтропия романа или сонеты Шекпира?

Точно так же, в области программирования, вероятно, появится растущий набор компетенций. Пролог решил ряд компьютерных проблем, где вы создали проблему, и компьютер решил ответ. Кто-то, вероятно, найдет классы простых задач программирования, которые сможет решить компьютер и т. Д. Затем кто-то воспользуется этим, чтобы произвести «настройку по требованию» в некотором проблемном пространстве. И так далее.

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

Но ... сможет ли компьютер когда-нибудь выполнять мою работу? Немыслимо!

обкрадывать
источник
Я думаю, что было бы справедливо сказать, что Jeopardy - это особый случай: он сводится к напоминанию и сопоставлению фактов. Возьмите даже самых лучших специалистов, и будут даже кусочки общественного знания, о которых они не знают или не могут вспомнить под давлением. С другой стороны, для компьютера, который способен анализировать энциклопедию (такую ​​как Википедия, Британская энциклопедия или любая другая), в этой энциклопедии нет фактов, более или менее экзотических, чем любая другая.
CVn
1

На это сложно ответить, потому что, как и в случае с искусственным интеллектом, как только мы это сделаем, это произойдет потому, что мы напишем программу, которая это делает. И критики скажут: «Ну, эта машина на самом деле сама не программирует! Она просто точно следует программе, которую вы ей дали!»

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

Итак - рассмотрим несколько примеров.

На протяжении десятилетий у нас были генераторы парсеров . Вы даете им описание языка, он обрабатывается, и в результате получается код для синтаксического анализатора для этого языка. Мы точно знаем, как это делается, но разве это не компьютерное программирование?

Второй - редакторы, которые сообщают вам, что вы допустили ошибку (синтаксическая ошибка, несуществующая переменная и т. Д.). Он сам ничего не программирует, но может сказать, что вы сделали что-то не так. Это очень только на поверхности.

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

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

Общая игра играет. Это интересная область исследований, в которой исследователи пишут программы, которые могут читать описания правил игр, чтобы затем программы играли друг против друга. Таким образом, вместо программы «крестики-нолики» или шахматной программы, это программы, которые читают правила игры в крестики-нолики или шахматы или какую-то новую игру, составленную на месте, и затем могут играть в них. Программа сама не программирует, но играет в шахматы без жестких правил. Было время, когда это явно считалось, что компьютер чему-то учит.

Мы сделали много маленьких шагов в общем направлении.

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

RemcoGerlich
источник
0

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

Я понял из того, как вы сформулировали свой вопрос, что вы не говорите о простых эмулируемых задачах.

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

Ян Макинтош
источник