Ist es vorstellbar, einer Maschine beizubringen, wie man sich selbst auf eine definierte Spezifikation programmiert? [geschlossen]


12

Ein Freund von mir ohne Programmierkenntnisse hat mir diese Frage gestellt und ich fand sie interessant.

Ich denke, es ist nicht möglich, weil es eine wirklich fortgeschrittene künstliche Intelligenz erfordern würde, die in der Lage ist, den Text eines Problems zu analysieren, über eine Lösung nachzudenken und es zu programmieren. Allein der Gedanke an eine Maschine, die einen einfachen Taschenrechner programmieren kann, scheint mir ziemlich weit fortgeschritten zu sein.

Aber vielleicht irre ich mich und ich würde gerne wissen, was Sie darüber denken und ob Ihnen Artikel / Recherchen zu diesem Thema bekannt sind oder ob es bereits existiert oder ob die Möglichkeit besteht, eine Spezifikation auszuwählen und die zu erhalten Maschine selbst auf diese "Spezifikation" programmieren?


4
Programmierung definieren. Ich könnte ein Programm erstellen, das andere Programme erstellt. Aber würde es wirklich lernen?
Pieter B

Ja, bei der Frage geht es nicht um Code-Generierung, sondern um echte Programmierung, wie wir es als Entwickler tun.
Florian

Es kommt darauf an, was das Programm ist. Ein Programm mit viel prozeduraler Geschäftslogik wäre viel schwieriger (und viel weniger machbar) als ein funktionales und rein mathematisches Programm. (Das ist sowieso eine Intuition, aber ich habe leider keine Möglichkeit, das zu
belegen

@florian: Wir selbst sind Maschinen, die gelernt haben, wie man programmiert (vorausgesetzt, Aliens / Gott hat uns erschaffen :-)). Natürlich haben wir noch nicht die Fähigkeit erlangt, DNA-Sequenzen usw. zu programmieren. Wenn Sie also eine Maschine erstellen, die lernen muss, wie man schließlich programmiert, müssen Sie sie programmieren, um sich zu "entwickeln" und schließlich zu lernen, wie sie selbst programmiert wurde.
Nav

2
@maple_shaft: Ich habe die Frage objektiver gestaltet, indem ich sie mit den vorhandenen Antworten in Einklang gebracht habe, und mich gefragt, ob sie in der aktuellen Form wieder geöffnet werden kann.
Tom Au

Antworten:


15

Joel hat diese Frage tatsächlich vor ein paar Jahren beantwortet . Die eigentliche Bedeutung von "einer Maschine beibringen, wie man von selbst programmiert" ist "einer Maschine beibringen, wie man eine Spezifikation nimmt und ein Programm erstellt, das dieser Spezifikation entspricht". Und in diesem Sinne:

Das Problem ist hier sehr grundlegend. Um mechanisch nachzuweisen, dass ein Programm einer Spezifikation entspricht, muss die Spezifikation selbst äußerst detailliert sein. In der Tat muss die Spezifikation alles über das Programm definieren, sonst kann nichts automatisch und mechanisch überprüft werden. Wenn die Spezifikation nun alles darüber definiert, wie sich das Programm verhalten soll, dann enthält sie alle Informationen, die zum Generieren des Programms erforderlich sind! Und jetzt gehen bestimmte Geeks zu einem sehr dunklen Ort, an dem sie anfangen, über das automatische Kompilieren von Spezifikationen in Programme nachzudenken, und sie beginnen zu glauben, dass sie gerade eine Möglichkeit erfunden haben, Computer ohne Programmierung zu programmieren.

Dies ist das Software-Engineering-Äquivalent einer Perpetual-Motion-Maschine. Es ist eines dieser Dinge, die Crackpots immer wieder versuchen, egal wie oft man ihnen sagt, dass es niemals funktionieren könnte. Wenn die Spezifikation genau definiert, was ein Programm tun wird, mit genügend Details, um das Programm selbst zu generieren, wirft dies nur die Frage auf: Wie schreibt man die Spezifikation? Eine solche vollständige Spezifikation ist genauso schwer zu schreiben wie das zugrunde liegende Computerprogramm, da der Verfasser der Spezifikation ebenso viele Details beantworten muss wie der Programmierer. Um die Terminologie der Informationstheorie zu verwenden: Die Spezifikation benötigt genau so viele Bits Shannon-Entropie, wie das Computerprogramm selbst haben würde. Jedes Entropiebit ist eine Entscheidung, die vom Spezifikationsschreiber oder Programmierer getroffen wird.

Das Fazit ist also, dass, wenn es wirklich einen mechanischen Weg gäbe, die Richtigkeit eines Programms zu beweisen, Sie nur beweisen könnten, ob dieses Programm mit einem anderen Programm identisch ist, das die gleiche Menge an Entropie enthalten muss Andernfalls werden einige der Verhaltensweisen als erstes Programm undefiniert und somit nicht bewiesen. Jetzt ist das Schreiben von Spezifikationen genauso schwierig wie das Schreiben eines Programms, und Sie haben lediglich ein Problem von hier nach dort verschoben und nichts erreicht.

Die einzige Möglichkeit, dies zu umgehen, besteht darin, einen wirklich intelligenten Computer zu erstellen, der über die nötige Intuition verfügt, um alle Lücken auszufüllen, die Sie und ich bei der Erstellung von Software immer automatisch ausführen Am Ende stünde ein Computer, der sich selbst programmiert, sowie ein menschlicher Entwickler. ;)


7
Ich kann eine vollständige Spezifikation für einen Sortieralgorithmus viel einfacher schreiben, als ich es mit Einfügesortierung, Schnellsortierung oder Eimersortierung tun kann. Sie behaupten jedoch, es sei einfach, die erste in die zweite umzuwandeln.
Raptortech97

Joel ... Genug gesagt! ;-) Ich verstehe, dass wir dazu eine Spezifikation in einer bestimmten Sprache benötigen. Aber ich bin nicht ganz überzeugt von dem Argument, dass die Spezifikation sehr detailliert sein sollte. Wir als Entwickler sind in der Lage, ein Programm zu entwickeln, ohne eine sehr detaillierte Spezifikation zu haben. Können wir nicht eine künstliche Intelligenz entwickeln, die eine "zufällige" Entscheidung über die Gestaltung eines Programms treffen kann?
Florian

6
@florian Sie möchten also, dass das Programm die Aufgabe der Spezifikationsinterpretation übernimmt, die menschliche Programmierer ausführen? Dann wird es das uralte Problem der "starken KI", das zahlreiche intelligente Menschen jahrzehntelang erforscht haben, ohne dass es irgendwelche Fortschritte dafür gibt. Es gibt eine hitzige philosophische Debatte darüber, ob KI überhaupt metaphysisch möglich ist, und meiner Erfahrung nach wird in naher Zukunft nur ein Schlangenölverkäufer eine starke KI prognostizieren.

Ich will es nicht wirklich, ich habe mich gefragt (wie mein Freund mich gefragt hat), ob es möglich ist. Ich verstehe vollkommen, dass AI nicht wirklich existiert und dass es nur auf einige "zufällig" programmierte Entscheidungen ankommt.
Florian

2
@ raptortech97: Nein, das kannst du nicht. Nicht 'vollständig' im Sinne dieser Frage. Damit Ihre Spezifikation so vollständig ist, dass sie mechanisch in ein ausführbares Programm umgewandelt werden kann, muss sie im Wesentlichen in einer Programmiersprache geschrieben sein. Andernfalls weist Ihre Spezifikation ein undefiniertes Verhalten auf, oder Sie schreiben nur Code in ein MSWord-Dokument.
Whatsisname

4

Sicher, wir tun diese alle die Zeit (für extrem begrenzte Teilmengen von Problemen). Es ist ziemlich trivial, sich vorzustellen , ein oder zwei weitere Schritte zu unternehmen und etwas wie Siri in die Eingabe dieser Codegeneratoren (oder etwas wie Wolfram Alpha) einzubinden, die wiederum Code schreiben und Ihr Problem lösen. Ich würde erwarten, dass irgendwo bereits etwas existiert , um die grundlegendsten Dinge zu tun.

Das Problem beim Schreiben komplexer Software für Unternehmen besteht nicht darin, ein Programm zum Schreiben des Codes zu erstellen, sondern darin, ein Programm zum Abrufen der Anforderungen zu schreiben.


Danke für die Links. Obwohl Yacc & Xamarin rein deterministische Codegeneratoren sind. Sie erstellen keine Sachen von Grund auf neu.
Florian

@florian - nichts schafft Sachen von Grund auf neu. Es gibt immer einen Input, sie sind nur wählerischer als die meisten.
Telastyn

1
@Telastyn: Das Vergleichen der Eingabe / Ausgabe für einen Parsergenerator mit der Eingabe / Ausgabe für einen menschlichen Verstand als "wählerischer" ist bestenfalls unaufrichtig.
Whatsisname

2

Ich denke, die Antwort von @Mason Wheeler enthält die Schlüsselidee. Es geht so:

Die Shannon-Entropie von Tic-Tac-Toe ist wirklich klein. Wir nennen Tic-Tac-Toe also ein "gelöstes" oder "deterministisches" Spiel. Es ist nicht wirklich interessant, wenn man die Grundschule hinter sich hat. Dame hat eine höhere Entropie, wenn Sie die Entropie aller möglichen Spiele betrachten, die Sie spielen können. Aber auch Dame ist ein "gelöstes" oder "deterministisches" Spiel. Wenn Sie zuerst ziehen, sollten Sie nur gewinnen oder unentschieden spielen. Schach hat eine viel, viel höhere Entropie, aber kein Mensch hat die besten Computerspieler seit 2006 geschlagen. In gewisser Weise haben Computer Schach auf eine Weise gemeistert, die Menschen nicht können. Big Blue analysierte Wikipedia und spielte dann Jeopardy gegen menschliche Spieler und schlug sie lautstark.

Was kommt als nächstes? Was ist die Entropie eines Romans oder Shakepeares Sonette?

In ähnlicher Weise werden sich im Programmierbereich wahrscheinlich immer mehr Kompetenzen herausbilden. Prolog hat eine Reihe von Computerproblemen behoben, bei denen Sie das Problem eingerichtet haben und der Computer die Antwort gelöst hat. Jemand wird wahrscheinlich Klassen von einfachen Programmierproblemen finden, die ein Computer erfüllen kann, usw. Dann wird jemand darauf aufbauen, um "Anpassungen nach Bedarf" in einem bestimmten Problembereich zu erstellen. Und so geht es.

Ich denke, die Frage verwandelt sich in Wie lange braucht eine KI, um eine bestimmte Menge an Entropie zu meistern ... und wie viele Rechenressourcen werden benötigt? Ich denke, es ist unvorstellbar, dass ein Computer die Entropie, die vom besten menschlichen Gehirn beherrscht wird, nicht beherrscht - das Gehirn hat nichts mit Magie zu tun -, aber die Frage ist, wie viele Kerne Sie benötigen und wie viele Jahrhunderte werden Sie brauchen, um dorthin zu gelangen?

Aber ... wird ein Computer jemals in der Lage sein, meine Arbeit ? Undenkbar!


Ich denke, es ist fair zu sagen, dass Jeopardy ein Sonderfall ist: Es läuft darauf hinaus, Fakten abzurufen und zu verknüpfen. Nehmen Sie selbst die besten Spezialisten mit, und es wird Nuggets geben, von denen selbst die Öffentlichkeit weiß, dass sie sie nicht kennen oder unter Druck nicht zurückrufen können. Auf der anderen Seite ist für einen Computer, der eine Enzyklopädie (wie Wikipedia, Encyclopedia Britannica oder eine andere) analysieren kann, keine in dieser Enzyklopädie angegebene Tatsache mehr (oder weniger) exotisch als jede andere.
ein Lebenslauf vom

1

Dies ist schwer zu beantworten, da wir, genau wie bei der künstlichen Intelligenz, ein Programm dafür geschrieben haben, wenn wir dies erreicht haben. Und Kritiker werden sagen: "Nun, diese Maschine programmiert sich nicht wirklich selbst! Sie folgt einfach genau dem Programm, das Sie ihr gegeben haben!"

Nun ja. Was auch immer wir jemals mit Computern erreichen werden, wir werden es mit einem Programm ausführen. Wenn das ein Argument dagegen ist, können wir nichts erreichen. Und doch dachten die Leute irgendwann, ein Schachcomputer wäre offensichtlich intelligent. Jetzt können sie, und wir wissen genau, wie und wir finden das nicht intelligent. U-Boote können immer noch nicht schwimmen.

Also - betrachten Sie ein paar Beispiele.

Seit Jahrzehnten haben wir gehabt Parser-Generatoren . Sie geben ihnen eine Beschreibung einer Sprache, diese wird verarbeitet und das Ergebnis ist Code für einen Parser für diese Sprache. Wir wissen genau, wie es gemacht wird, aber ist das nicht eine Computerprogrammierung selbst?

Second - Editoren, die Ihnen mitteilen, dass Sie einen Fehler gemacht haben (Syntaxfehler, nicht vorhandene Variable usw.). Es programmiert selbst nichts, aber es kann Ihnen sagen, dass Sie etwas falsch gemacht haben. Es ist sehr viel nur an der Oberfläche.

Sprachen, in denen Sie einfach auf Steuerelemente der Benutzeroberfläche klicken und sie ziehen können, und der Code, mit dem sie tatsächlich funktionieren, wird automatisch generiert.

JIT-Compiler. Software, die Hotspots in der aktuell ausgeführten Software erkennt und einige davon durch hochoptimierten kompilierten Code ersetzt und sich während der Ausführung effektiv selbst optimiert. Ich denke, dies ist ein Beispiel für das, was als Maschinenprogrammierung erscheinen kann, bis Sie genau wissen, wie es geschieht, und sich dann herausstellt, dass es nur das tut, was der Programmierer wie immer gesagt hat.

Allgemeines Spielen. Dies ist ein interessantes Forschungsgebiet, in dem Forscher Programme schreiben, die Beschreibungen der Spielregeln lesen können, die die Programme dann gegeneinander spielen. Anstelle eines Tic-Tac-Toe-Programms oder eines Schachprogramms sind dies Programme, die die Regeln für Tic-Tac-Toe oder Schach oder ein neues Spiel vor Ort lesen und dann spielen können. Das Programm programmiert nicht selbst, aber es spielt Schach, ohne dass die Schachregeln fest programmiert wurden. Es gab eine Zeit, in der dies eindeutig war als Computer angesehen wurde, der sich selbst etwas beibrachte.

Wir haben viele kleine Schritte in die allgemeine Richtung gemacht.

Aber ich kann mir keine Programme vorstellen, die sich aufgrund der Ergebnisse früherer Läufe neu schreiben oder die veraltete oder ineffiziente Routinen in ihrem eigenen Code erkennen können. Ich denke, dass wir das eines Tages haben werden, und wir werden es für nichts Besonderes halten, da es nur ein Feature des neuesten Compilers sein wird ...


0

Nicht aktuell und nicht in absehbarer Zeit, da Sie die unglaubliche Komplexität des menschlichen Gehirns benötigen, um ein Programm zu erstellen. Und selbst dann müssen diese Gehirne sehr gut trainiert sein, um dies richtig zu tun, und selbst dann sind nicht alle in der Lage, die Aufgabe zu erledigen, obwohl man argumentieren könnte, dass man mit genügend Zeit irgendjemanden zum Programmieren trainieren könnte.

Ich habe Ihre Frage so formuliert, dass es sich nicht um einfache emulierte Aufgaben handelt.

Sie haben nach Artikeln gefragt, und dieser Science Blogs-Artikel zu Developing Intelligence beantwortet diese Frage in vielerlei Hinsicht.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.