Czy można sobie wyobrazić maszynę do programowania się zgodnie ze zdefiniowaną specyfikacją? [Zamknięte]

12

Mój przyjaciel bez znajomości programowania zadał mi to pytanie i uznałem je za interesujące.

Myślę, że nie jest to możliwe, ponieważ wymagałoby to naprawdę zaawansowanej sztucznej inteligencji zdolnej do analizy tekstu problemu, przemyślenia rozwiązania i zaprogramowania go. Samo myślenie o maszynie, która może zaprogramować prosty kalkulator, wydaje mi się dość zaawansowane.

Ale może się mylę i chciałbym wiedzieć, co o tym sądzisz i czy znasz jakieś artykuły / badania na ten temat, lub czy już istnieje, czy istnieje możliwość wyboru specyfikacji i uzyskania maszyna do samodzielnego zaprogramowania do tej „specyfikacji”?

florian
źródło
4
Zdefiniuj programowanie. Mógłbym zbudować program, który tworzyłby inne programy. Ale czy naprawdę się nauczy?
Pieter B,
Tak, pytanie nie dotyczy generowania kodu, ale prawdziwego programowania, tak jak my jako programiści.
florian
To zależy od programu. Program o dużej proceduralnej logice biznesowej byłby znacznie trudniejszy (i znacznie mniej wykonalny) niż coś funkcjonalnego i opartego wyłącznie na matematyce. (W każdym razie to intuicja, ale niestety nie mam sposobu, aby to zrobić).
lunchmeat317
@florian: My sami jesteśmy maszynami, które nauczyły się programować (zakładając, że kosmici / bóg nas stworzyli :-)). Oczywiście nie nabyliśmy jeszcze możliwości programowania sekwencji DNA itp., Więc jeśli stworzysz maszynę, która w końcu nauczy się programować, musisz ją zaprogramować, aby „ewoluowała” i ostatecznie nauczyć się, jak sama została zaprogramowana.
Nav
2
@maple_shaft: Uczyniłem pytanie bardziej obiektywnym, dostosowując je do istniejących odpowiedzi i zastanawiałem się, czy można je ponownie otworzyć w obecnej formie.
Tom Au

Odpowiedzi:

15

Joel faktycznie odpowiedział na to kilka lat temu . Rzeczywiste znaczenie „naucz maszynę samodzielnego programowania” to „naucz maszynę, jak pobrać specyfikację i stworzyć program, który odpowiada tej specyfikacji”. I mając to na uwadze:

Problem tutaj jest bardzo podstawowy. Aby mechanicznie udowodnić, że program odpowiada pewnej specyfikacji, sama specyfikacja musi być bardzo szczegółowa. W rzeczywistości specyfikacja musi definiować wszystko o programie, w przeciwnym razie nic nie może zostać udowodnione automatycznie i mechanicznie. Teraz, jeśli specyfikacja definiuje wszystko o tym, jak program będzie się zachowywał, to oto zawiera wszystkie informacje niezbędne do wygenerowania programu! A teraz niektórzy maniacy idą w bardzo ciemne miejsce, gdzie zaczynają myśleć o automatycznej kompilacji specyfikacji w programy i zaczynają myśleć, że właśnie wymyślili sposób programowania komputerów bez programowania.

Jest to ekwiwalent inżynierii oprogramowania maszyny perpetuum mobile. Jest to jedna z tych rzeczy, które wciąż robią crackpots, bez względu na to, jak wiele im powiesz, że to nigdy nie zadziała. Jeśli specyfikacja dokładnie określa, co zrobi program, z wystarczającą ilością szczegółów, aby można go było użyć do wygenerowania samego programu, to tylko nasuwa się pytanie: jak napisać specyfikację? Tak kompletna specyfikacja jest tak samo trudna do napisania jak program podstawowy, ponieważ pisarz specyfikacji musi odpowiedzieć na tyle samo szczegółów, co programista. Aby użyć terminologii z teorii informacji: specyfikacja potrzebuje tyle bitów entropii Shannona, ile sam program komputerowy. Każdy bit entropii jest decyzją podjętą przez programistę lub programistę.

Podsumowując, jeśli naprawdę istniałby mechaniczny sposób na udowodnienie poprawności programu, wszystko, co można udowodnić, to to, czy ten program jest identyczny z innym programem, który musi zawierać taką samą ilość entropii jako pierwszy program, w przeciwnym razie niektóre zachowania będą niezdefiniowane, a tym samym niesprawdzone. Więc teraz pisanie specyfikacji jest tak samo trudne jak pisanie programu, a wszystko, co zrobiłeś, to przeniesienie jednego problemu z jednego miejsca do drugiego i nic nie osiągnąłeś.

Jedynym sposobem na obejście tego byłoby stworzenie rzeczywistego, inteligentnego komputera z wystarczającą intuicją, aby wykonać wszystkie puste pola, które ty i ja robimy automatycznie, cały czas, przy tworzeniu oprogramowania ... w takim przypadku ty skończy z komputerem, który sam się programuje, a także ludzkim programistą. ;)

Mason Wheeler
źródło
7
Potrafię napisać pełną specyfikację algorytmu sortowania znacznie łatwiej niż wymyślić sortowanie wstawiane, szybkie lub kubełkowe. Jednak twierdzisz, że łatwo jest przekształcić pierwszy w drugi.
raptortech97
Joel ... Wystarczy powiedzieć! ;-) Rozumiem, że aby to zrobić, potrzebowalibyśmy specyfikacji w danym języku. Ale nie jestem całkowicie przekonany co do argumentu, że specyfikacja powinna być bardzo szczegółowa. My, jako programiści, jesteśmy w stanie opracować program bez bardzo szczegółowej specyfikacji. Czy nie możemy opracować sztucznej inteligencji, która byłaby w stanie podjąć „losową” decyzję dotyczącą projektu programu?
florian
6
@florian Czy chcesz, aby program wykonywał zadanie interpretacji specyfikacji przez programistów? Następnie staje się odwiecznym problemem „silnej sztucznej inteligencji”, którą wielu inteligentnych ludzi badało od dziesięcioleci, nie wykazując przy tym żadnego postępu. Trwa gorąca filozoficzna debata, czy sztuczna inteligencja jest nawet metafizycznie możliwa, a znacznie mniej praktycznie możliwa w dalekiej przyszłości, a z mojego doświadczenia wynika, że ​​nikt poza sprzedawcami snakeoil nie przewiduje silnej sztucznej inteligencji w najbliższej przyszłości.
Naprawdę tego nie chcę, zadawałem sobie pytanie (jak zapytał mnie mój przyjaciel), czy to możliwe. Doskonale rozumiem, że sztuczna inteligencja tak naprawdę nie istnieje i sprowadza się do „losowych” zaprogramowanych wyborów.
florian
2
@ raptortech97: Nie, nie możesz. Nie „kompletny” w rozumieniu tego pytania. Aby specyfikacja była tak kompletna, że ​​można ją mechanicznie przekształcić w program wykonywalny, musi ona zasadniczo zostać napisana w języku programowania. W przeciwnym razie twoja specyfikacja będzie miała niezdefiniowane zachowanie lub po prostu piszesz kod w dokumencie MSWord.
whatsisname
4

Jasne, możemy zrobić to przez cały ten czas (na bardzo ograniczonych podzbiorów problemy). Wyobrażenie sobie, że wykonasz kolejny krok lub dwa i powiązasz coś takiego jak Siri z wejściem tych generatorów kodu (lub czegoś takiego jak Wolfram Alpha), które z kolei zapisuje kod i rozwiązuje problem, jest dość trywialne . Spodziewałbym się, że coś już istnieje gdzieś, aby zrobić najbardziej podstawowe rzeczy.

Problem z pisaniem złożonego oprogramowania dla biznesu nie polega na tworzeniu programu do pisania kodu - jest pisaniu programu spełniającego wymagania.

Telastyn
źródło
Dzięki za linki. Mimo że Yacc i Xamarin są czysto deterministycznymi generatorami kodów. Nie tworzą rzeczy od zera.
florian
@florian - nic nie tworzy rzeczy od zera. Zawsze jest jakiś wkład, są po prostu bardziej wybredni niż większość.
Telastyn
1
@Telastyn: porównywanie danych wejściowych / wyjściowych generatora analizatora składni z danymi wejściowymi / wyjściowymi dla ludzkiego umysłu, ponieważ bycie „bardziej wybrednym” jest w najlepszym razie nieuczciwe.
whatsisname
2

Myślę, że odpowiedź @Mason Wheeler zawiera kluczowy pomysł. Wygląda to tak:

Entropia Shannona w kółko i krzyżyk jest naprawdę niewielka. Nazywamy więc grę kółko i krzyżyk „rozwiązaną” lub „deterministyczną” grą. To nie jest naprawdę interesujące, gdy przejdziesz szkołę podstawową. Warcaby mają wyższą entropię, jeśli weźmie się pod uwagę entropię wszystkich możliwych gier, w które można grać. Ale warcaby również są grą „rozwiązaną” lub „deterministyczną”. Jeśli wykonasz ruch jako pierwszy, powinieneś wygrać lub zremisować. Szachy mają znacznie wyższą entropię, ale żaden człowiek nie pokonał najlepszych graczy komputerowych od 2006 roku. W pewnym sensie komputery opanowały szachy w sposób, którego ludzie nie potrafią. Big Blue przeanalizował wikipedię, a następnie zagrał w Jeopardy przeciwko ludzkim graczom i pobił ich mocno.

Co dalej? Jaka jest entropia powieści, czy sonety Shakepeare'a?

Podobnie w przestrzeni programowania prawdopodobnie pojawi się rosnący zestaw kompetencji. Prolog zajął się zestawem problemów z komputerem, na którym skonfigurowałeś problem, a komputer rozwiązał odpowiedź. Ktoś prawdopodobnie znajdzie klasy prostych problemów programistycznych, które komputer będzie w stanie zaspokoić, itp. Następnie ktoś wykorzysta to, aby uzyskać „dostosowanie na żądanie” w obrębie pewnego obszaru problemów. I tak to idzie.

Myślę, że pytanie zmienia się w to, jak długo AI potrzebuje opanowania danej ilości entropii ... i ile zasobów obliczeniowych jest wymaganych? Myślę, że to niewyobrażalne, że komputer nie byłby w stanie opanować entropii opanowanej przez najlepszy ludzki mózg - w mózgach nie ma magii - ale pytanie brzmi: ile rdzeni potrzebujesz i ile stuleci zajmie, aby się tam dostać?

Ale ... czy komputer kiedykolwiek będzie w stanie wykonać moją pracę? Niepojęty!

Obrabować
źródło
Myślę, że można śmiało powiedzieć, że Jeopardy to szczególny przypadek: sprowadza się do przypominania sobie i łączenia faktów. Weź nawet najlepszych specjalistów, a pojawią się bryłki nawet publicznej wiedzy, których nie są świadomi lub nie mogą przypomnieć sobie pod presją. Z drugiej strony, w przypadku komputera, który jest w stanie analizować encyklopedię (taką jak Wikipedia, Encyclopedia Britannica lub jakąkolwiek inną), żaden fakt nie jest podany w tej encyklopedii bardziej (lub mniej) egzotyczny niż jakikolwiek inny.
CVn
1

Trudno na to odpowiedzieć, ponieważ podobnie jak w przypadku sztucznej inteligencji, kiedy to osiągniemy, będzie tak, ponieważ będziemy pisać program, który to robi. A krytycy powiedzą: „Cóż, ta maszyna tak naprawdę sama się nie programuje!

No tak. Cokolwiek zrobimy z komputerami, zrobimy to, dając mu jakiś program i on go wykona. Jeśli jest to argument przeciwko, nie możemy nic osiągnąć. A jednak w pewnym momencie ludzie myśleli, że komputer do gry w szachy będzie oczywiście inteligentny. Teraz mogą, a my wiemy dokładnie jak i nie uważamy, że to inteligentne. Okręty podwodne wciąż nie potrafią pływać.

Więc - rozważ kilka przykładów.

Od dziesięcioleci mamy generatory analizatorów składni . Dajesz im opis języka, jest on przetwarzany, a wynikiem jest kod parsera dla tego języka. Wiemy dokładnie, jak się to robi, ale czy to nie samo oprogramowanie komputerowe?

Po drugie - edytory, które informują o popełnieniu błędu (błąd składni, nieistniejąca zmienna itp.). Sam niczego nie programuje, ale może powiedzieć, że zrobiłeś coś złego. Jest bardzo na powierzchni.

Języki, w których można po prostu kliknąć i przeciągnąć elementy sterujące interfejsu użytkownika, a kod, który sprawi, że będą działać, jest generowany automatycznie.

Kompilatory JIT. Oprogramowanie, które rozpoznaje punkty aktywne w aktualnie uruchomionym oprogramowaniu i zastępuje niektóre z nich wysoce zoptymalizowanym skompilowanym kodem, skutecznie optymalizując się podczas działania. Myślę, że jest to przykład tego, co może wydawać się samym programowaniem maszynowym, dopóki nie dowiesz się dokładnie, jak to się dzieje, a potem okazuje się, że robi to, co programista powiedział, jak zawsze.

Ogólna gra. Jest to interesująca dziedzina badań, w której badacze piszą programy, które potrafią czytać opisy zasad gier, które następnie grają przeciwko sobie. Więc zamiast programu kółko i krzyżyk lub programu szachowego, są to programy, które czytają zasady gry w kółko i krzyżyk lub szachy lub jakąś nową grę wymyśloną na miejscu, a następnie mogą je zagrać. Program sam się nie programuje, ale gra w szachy bez ustalonych zasad gry w szachy. Był czas, kiedy to byłoby wyraźnie uważane za komputer, który sam się czegoś uczy.

Zrobiliśmy wiele małych kroków w ogólnym kierunku.

Ale nie mogę wymyślić żadnych programów, które same przepisują się na podstawie wyników wcześniejszych uruchomień lub które mogą rozpoznać przestarzałe lub nieefektywne procedury we własnym kodzie. Myślę, że któregoś dnia będziemy to mieć i uważamy, że to nic specjalnego, ponieważ będzie to tylko funkcja najnowszego kompilatora ...

RemcoGerlich
źródło
0

Nie obecnie i nie w przewidywalnej przyszłości, ponieważ potrzebujesz całej niesamowitej złożoności ludzkiego mózgu, aby stworzyć program. I nawet wtedy te mózgi muszą być dobrze wyszkolone, aby robić to właściwie, i nawet wtedy nie wszystkie z nich są w stanie wykonać to zadanie, choć można argumentować, że przy wystarczającym czasie można przeszkolić każdego do programowania.

Wziąłem ze sposobu, w jaki sformułowałeś swoje pytanie, że nie mówisz o prostych emulowanych zadaniach.

Poprosiłeś o artykuły i ten artykuł na blogach naukowych dotyczący rozwoju inteligencji, który na wiele sposobów odpowiada na to pytanie.

Ian Macintosh
źródło