Wie nah sind wir der Automatisierung des Code-Schreibens gekommen? [geschlossen]


8

Und ich meine nicht Autocomplete oder automatische Codefragmente, wie sie von modernen Editoren eingefügt wurden, oder polymorphen Code. Aber wie ist der Stand der Technik in Programmen, die bestimmte Eingaben und Typen und Informationen der gewünschten Ausgaben durchlaufen und einen gültigen Code in einer Sprache ihrer Wahl ausgeben können? Ich bin mir der genetischen Programmierung und der Genexpressionsprogrammierung bewusst, kenne aber keine anderen Bemühungen. Auch googeln taucht nicht viel auf.

Ist jemandem bekannt, dass es an dieser Front Fortschritte gibt?

Bearbeiten: Wenn ich "einen gültigen Code ausgeben" sage, meine ich eine KI oder ähnliches, die die Logik und den Kontrollfluss ausarbeitet und in einer imperativen Sprache implementiert. Nur imperative Sprache, da das der schwierige Teil ist. Wenn Sie jedoch wissen, dass neue Sprachen entwickelt werden, um diese Art von Idee zu unterstützen, erwähnen Sie dies bitte, da unsere aktuellen Sprachen möglicherweise nicht für die Art der frühen KI geeignet sind, auf die wir möglicherweise zuerst stoßen.


10
Bessere Programmierer und Programmiererausbildung.
Oded

@Oded Interessant.
Kumar

@kumar Die Sprachen der vierten Generation (4GL) und der fünften Generation (5GL) sind einen Blick wert (gehen Sie nicht nur auf die Terminologie ein. Es gibt keine wirklich engen 4GL, obwohl DSLs angenommen werden. Ein großer Sprung wäre nur möglich mit erhöhter KI, die von Kognition, Sprach- und Seherkennung, unbeaufsichtigtem maschinellem Lernen, fortgeschrittener Mustererkennung, Verarbeitung natürlicher Sprache und mehr abhängt. Der derzeitige Stand der Programmierung in Unternehmen würde dies nicht zulassen. Dies ist ein zu großes Thema, als dass ich es beantworten könnte
Ubermensch

4
eine KI oder ähnliches, die die Logik und den Kontrollfluss herausarbeitet und in einer zwingenden Sprache implementiert - sehr ehrgeizig: Das Problem ist für Natural Intelligence noch nicht gelöst.
Mouviciel

Sie kennen das Halteproblem?

Antworten:


17

Domain-spezifische Sprachen sind so nah wie nie zuvor.

Sie müssen dem Computer immer einige Regeln geben, mit denen Sie arbeiten können. Aber je mehr diese Regeln domänenspezifisch definiert sind, desto weniger Eingaben müssen gemacht werden.

Domänenspezifische Sprachen, die auf die Webentwicklung abzielen, erfordern weniger Codierung als allgemeinere Sprachen. Domänenspezifische Sprachen, die auf Tests abzielen, erfordern weniger Codierung als Sprachen, die dies nicht tun. Domänenspezifische Sprachen, die auf die Genetik abzielen, erfordern weniger Codierung als Sprachen, die dies nicht tun. Und so weiter.

Hier kommt nun die große Frage: Wann wird eine Domain groß genug, um das Schreiben einer domänenspezifischen Sprache dafür zu rechtfertigen? Webentwicklung und -tests sind Dinge, an denen mindestens die Hälfte der Entwicklungswelt arbeitet. Es war unvermeidlich, dass Frameworks entstehen und die Menge an Boilerplate-Code für diese Dinge reduzieren (was im Wesentlichen eine domänenspezifische Sprache ist).

Aber wie steht es mit der Geschäftsdomäne Ihres Unternehmens? Lohnt es sich, sich auf die Dinge zu konzentrieren, die in Ihrem Unternehmen häufig erwähnt werden, und sie so zu gestalten, dass Sie diese Dinge einfach im Code referenzieren können? Ich glaube, wir haben dieses Gleichgewicht noch nicht wirklich gefunden, obwohl es beim domänengesteuerten Design darum geht, diese Frage zu beantworten.


13
Ich würde argumentieren, dass dies nur Programmieren auf einer höheren Abstraktionsebene ist. Nicht dasselbe wie die Verwendung von KI zur Lösung von Programmierproblemen, wie vom OP gefordert.
Garrett Hall

4
@ GarrettHall Diese Antwort besagt, dass KI niemals zur Lösung von Programmierproblemen verwendet wird, wie vom OP gefordert. Und +1 dazu
MarkJ

2
@ Garrett Hall, einige deklarative DSLs sind schon etwas zu intelligent, manchmal erschreckend intelligent.
SK-Logik

1
@pdr Vielleicht kann Kumar seine Frage erweitern, aber er erwähnte ausdrücklich die genetische Programmierung . DSL gehört zu einer anderen Kategorie. Ich glaube, wir sind weit von selbstschreibenden Programmen entfernt, aber wer kann mit fortschreitender Geschwindigkeitstechnologie vorhersagen, was in 25 Jahren passieren wird?
Garrett Hall

1
@kumar: "Es ist einfach, eine Reihe von rechtlichen Aussagen zu finden, die in der Syntax einer Sprache geschrieben sind", das ist mein Punkt. Der schwierige Teil - der Teil, der künstliche oder sonstige Intelligenz erfordert, der Teil, den Programmierer jetzt tun - ist die Übersetzung der Eingabe. Wie schlagen Sie vor, dass etwas in eine "KI (nicht im engeren Sinne)" eingegeben wird, damit sie für einen nicht intelligenten Computer übersetzt werden kann?
pdr

6

In den 80er und 90er Jahren gab es viel Aufsehen über sogenannte Sprachen der 4. Generation . Aus dem Wikipedia-Artikel:

Alle 4GLs wurden entwickelt, um den Programmieraufwand, den Zeitaufwand für die Entwicklung von Software und die Kosten für die Softwareentwicklung zu reduzieren. Sie sind bei dieser Aufgabe nicht immer erfolgreich, was manchmal zu unelegantem und nicht wartbarem Code führt. Angesichts des richtigen Problems kann die Verwendung eines geeigneten 4GL jedoch spektakulär erfolgreich sein

...

Es gibt verschiedene Arten von 4GLs:

  • Tabellengesteuerte (codelose) Programmierung, die normalerweise mit einem Laufzeitframework und Bibliotheken ausgeführt wird. Anstatt Code zu verwenden, definiert der Entwickler seine Logik, indem er eine Operation in einer vordefinierten Liste von Speicher- oder Datentabellen-Manipulationsbefehlen auswählt. Mit anderen Worten, anstelle der Codierung verwendet der Entwickler eine tabellengesteuerte Algorithmusprogrammierung (siehe auch Steuertabellen, die für diesen Zweck verwendet werden können). Ein gutes Beispiel für diese Art von 4GL-Sprache ist PowerBuilder. Diese Arten von Tools können für die Entwicklung von Geschäftsanwendungen verwendet werden, die normalerweise aus einem Paket bestehen, das sowohl die Manipulation von Geschäftsdaten als auch die Berichterstellung ermöglicht. Daher werden GUI-Bildschirme und Berichtseditoren mitgeliefert. Sie bieten normalerweise die Integration mit DLLs niedrigerer Ebene, die aus einer typischen 3GL generiert werden, wenn mehr Hardware- / Betriebssystem-spezifische Vorgänge erforderlich sind.
  • Die Programmiersprachen des Berichtsgenerators enthalten eine Beschreibung des zu generierenden Datenformats und des Berichts und generieren daraus entweder den erforderlichen Bericht direkt oder ein Programm zum Generieren des Berichts. Siehe auch RPG
  • In ähnlicher Weise verwalten Formulargeneratoren Online-Interaktionen mit den Benutzern des Anwendungssystems oder generieren Programme, um dies zu tun.
  • Ehrgeizigere 4GLs (manchmal auch als Umgebungen der vierten Generation bezeichnet) versuchen, automatisch ganze Systeme aus den Ausgaben von CASE-Tools, Spezifikationen von Bildschirmen und Berichten und möglicherweise auch der Spezifikation einer zusätzlichen Verarbeitungslogik zu generieren.
  • Datenverwaltung 4GLs wie SAS, SPSS und Stata bieten ausgefeilte Codierungsbefehle für die Datenmanipulation, Dateiformung, Fallauswahl und Datendokumentation bei der Aufbereitung von Daten für statistische Analysen und Berichte.

Es ist interessant, 4GLs mit Programmiersprachen der fünften Generation zu vergleichen :

Eine Programmiersprache der fünften Generation (abgekürzt 5GL) ist eine Programmiersprache, die darauf basiert, Probleme mithilfe von Einschränkungen zu lösen, die dem Programm vorgegeben wurden, anstatt einen von einem Programmierer geschriebenen Algorithmus zu verwenden. Die meisten auf Einschränkungen basierenden und logischen Programmiersprachen sowie einige deklarative Sprachen sind Sprachen der fünften Generation.

Während Programmiersprachen der vierten Generation bestimmte Programme erstellen, sollen Sprachen der fünften Generation den Computer dazu bringen, ein bestimmtes Problem ohne den Programmierer zu lösen. Auf diese Weise muss sich der Programmierer nur darum kümmern, welche Probleme gelöst und welche Bedingungen erfüllt werden müssen, ohne sich Gedanken darüber zu machen, wie eine Routine oder ein Algorithmus implementiert werden muss, um sie zu lösen. Sprachen der fünften Generation werden hauptsächlich in der Forschung mit künstlicher Intelligenz verwendet. Prolog, OPS5 und Mercury sind Beispiele für Sprachen der fünften Generation.

Selbst wenn Sie den Computer nicht "programmieren", muss letztendlich jemand dem Computer Ihre Anforderungen erklären.


Ich bin damit einverstanden, dass ein Mensch (vorerst) die Ein- und Ausgänge erklären muss, aber danach ist eine Möglichkeit bekannt, in der ein Programm den Code schreibt, der dem vorliegenden Problem entspricht. Die 5GLs waren ein guter Hinweis, und ich werde einige Tage brauchen, um mich über ihren aktuellen Zustand vollständig zu informieren, was ich jetzt tun werde. Vielen Dank für das
Einchecken

Aber dann haben wir das alles aufgegeben und festgestellt, dass es Lisp seit 1960 gibt. Oder zumindest angefangen, Ruby zu verwenden.
Jason Lewis

@kumar Sie können regelbasierte Programmierung oder ähnliches verwenden, um zu suchen und Programmierung zu generieren, sobald Sie die Ein- und Ausgänge erklärt haben. Aber in 5GL geben Sie im reinsten Sinne nur eine Beschreibung des Problems und es gibt Ihnen die Lösung. Maschinen werden einfach intelligenter. Zusammen mit Sprache, Vision, maschinellem Lernen und umfangreichen Datenanalysen würde es mindestens drei Jahrzehnte dauern, bis dieser Punkt erreicht ist. Aber zu diesem Zeitpunkt würden wir Ihre Fragen hier nicht beantworten. Computer würden tun.
Ubermensch

3

Einer der am meisten diskutierten Ansätze zur automatisierten Codegenerierung ist "MDA" (Model Driven Architecture). Meistens (aber nicht unbedingt) wird UML über einen visuellen GUI-Editor erstellt, aus dem relevante Klassen generiert werden.

Während ich denke, dass der Ausdruck von voll funktionsfähigem Code noch weit entfernt sein könnte, gibt es ziemlich gute Systeme, die vollständige Skelette erzeugen.

Überprüfen Sie heraus: http://www.actifsource.com/actifsource/index.html

Außerdem: http://www.win.tue.nl/~mchaudro/cbse2007/programgenerators.pdf

http://proglang.informatik.uni-freiburg.de/teaching/mda/2006ss/09-code-gen.pdf


1
Ich würde auch die MDA-Site der Object Management Group vorschlagen .
TMN

@ DipanMehta Ich bin mir nicht sicher, aber ich denke nicht, dass eine ausführbare UML-Datei möglich ist (geben Sie einfach die Spezifikationen als UML an und generieren Sie die Software). Ich bin mir auch nicht sicher, wie sich UML auf Concurrent and Parallel Computing, funktionale Programmierparadigmen und Forschungssoftware einstellt.
Ubermensch

2

Ich habe viele Codegeneratoren für Java und C # geschrieben, die Arbeitscode für verschiedene Aufgaben erzeugen. Es gibt Pakete wie JAXB, das ein XML-Dokument analysiert und entsprechende Java-Klassen und Marshalling- / Unmarshalling-Code für die Übersetzung erstellt, und Entity Framework, das DTO-Klassen für das Marshalling von Daten in / aus einer Datenbank erstellt. Es gibt auch Tools wie Rational XDE (wie auch immer es jetzt heißt), die eine Round-Trip-Code-Generierung zwischen einem Klassendiagramm und Java durchführen.

Wenn Sie nach etwas suchen, das Geschäftsanforderungen oder eine funktionale Spezifikation in Code umwandelt, habe ich in diesem Bereich keine großen Fortschritte gesehen. Ich weiß, dass OMG an einer Art "ausführbarer UML" arbeitet, aber abgesehen von einigen DoD-Prototypen kenne ich keine praktischen Implementierungen.


2

Zählt deklarative Programmierung , zB Prolog oder SQL?

Sie beschreiben lediglich, was das Programm leisten soll oder welche Bedingungen die Ergebnisse erfüllen sollen. Dann fragen Sie das System ab und erhalten Ergebnisse (oder "keine Lösungen").

Natürlich läuft unter der Haube ein Programm, aber Sie sehen den Code nie.

Leider ist deklarative Programmierung kein Wundermittel: Über elementare Fälle hinaus erfordert die genaue Beschreibung des deklarativen Ziels immer noch erhebliche Anstrengungen und Fähigkeiten, ganz zu schweigen davon, dass Sie verschiedene Unvollkommenheiten des tatsächlichen Ziels berücksichtigen müssen, um eine anständige Leistung zu erzielen. unter der Haube Implementierung (zB Verständnis der Rolle von SQL-Indizes oder Tail Call in rekursiven Definitionen ...)

Abhängig von der Art des Problems könnte es tatsächlich einfacher sein, nur das "Wie" zu lösen, als das "Was" genau zu beschreiben. Für Menschen oder zumindest für die meisten durchschnittlichen Programmierer scheint es natürlicher zu sein, darüber nachzudenken, "wie" natürlicher zu sein scheint und "was genau".


+1. Vielleicht zählt auch SQL?
MarkJ

Sicher, jetzt SQL erwähnen.
Joonas Pulakka

@JoonasPulakka Da der gesamte Maschinencode (niedrige Ebene) zwingend erforderlich ist, meinte ich automatisierte Methoden zum Schreiben von Programmen, die aus Anweisungen bestehen, die der Syntax einer zwingenden Sprache (hohe oder niedrige Ebene) folgen. Trotzdem ist Ihr Zweifel eine großartige Ergänzung und ich werde der Frage eine Bearbeitung hinzufügen.
Kumar

+1 noch einmal für "es könnte tatsächlich einfacher sein, das Wie zu lösen, als das Was genau zu beschreiben"
MarkJ

@ Kumar: Ja, der gesamte Code ist unter der Haube unerlässlich. Darüber hinaus kann GNU Prolog beispielsweise Prolog-Code in ausführbare Dateien kompilieren, und es gibt keinen Grund, warum er nicht wie hier beschrieben in z. B. C kompiliert werden konnte . Da ist es also - es würde imperative Aussagen erstellen, die der Syntax einer imperativen Sprache (C) folgen, direkt aus der Problemdefinition. Es gibt jedoch kaum einen praktischen Grund, diesen Zwischen-C-Schritt durchzuführen, da der resultierende C-Code wahrscheinlich ziemlich unverständlich wäre.
Joonas Pulakka

1

Ich bin nicht einverstanden mit Ihrer Aussage, dass "Imperative Sprache ... das ist der schwierige Teil". Das ist der einfache Teil, obwohl es in einigen Sprachen erheblich einfacher ist als in anderen. Herauszufinden, was die Benutzer wirklich wollen, und all diese Informationen zu organisieren, ist der schwierige Teil. Der Teil "Imperative Sprache" sieht schwierig aus, da dann die ganze eigentliche Arbeit erledigt ist. Dann erscheinen die detaillierten Fragen zu den Anforderungen und alle Antworten müssen in einer ausführbaren Systemdefinition organisiert werden.

Ohne Programmierung gibt es keine Programmierung. Jemand muss ungenaue menschliche Wünsche in eine genaue Spezifikation einer Berechnung übersetzen. Diese Spezifikation kann in Assemblersprache oder Java oder LISP, einem Diagrammsystem oder einer Sprache sein, die noch erfunden werden muss. Aber bis Computer in der Lage sind, tief mit Menschen zu kommunizieren, muss jemand mit den Benutzern sprechen und das System genau definieren.


1

Wir sind schon da! Alles, was wir brauchen, ist eine Sprache mit dem heutigen Namen Homo-Ikone und Jahrzehnte zuvor "Code ist Daten". Definieren Sie Ihre eigene Umgebung durch Bottom-Up-Programmierung, anstatt Top-Down zu entwerfen. Sie können beispielsweise Ihre eigenen DSLs in Lisp erstellen. Mit dem Ansatz des Stapelns können Sie so viele DSLs (Layer) übereinander legen, wie Sie für Ihr spezifisches Problem benötigen würden. Dieser Ansatz führt Sie von einer sehr einfachen Darstellung von S-Ausdrücken bis zur komplexesten Datenabstraktion, die Sie sich jemals vorstellen können. Was ist automatisches Schreiben von Code, wenn nicht eine Sprache auf eine andere gestapelt wird?


0

Ich habe Gemurmel von Versuchen gehört, Programme aus Spezifikationen abzuleiten, die unter Verwendung abhängiger Typen in Systemen wie Coq ausgedrückt wurden. Ich habe jedoch keine Ahnung, welche Fortschritte erzielt wurden.


Das ist ein wirklich schlechter Name für eine Programmiersprache / oder Software
NimChimpsky


Der Coq Proof Assistant. Super.
Kumar

0

Wie nah sind wir der Automatisierung des Code-Schreibens gekommen?

Nein, bei weitem nichts, worüber es sich zu reden lohnt.

Ich habe auch stark darauf hingewiesen, dass wir auch nie dorthin gelangen werden.


0

Stand der Technik bei der Automatisierung des Code-Schreibens? Es gibt keinen "Stand der Technik". Aber es gibt einen Zustand ewigen Versagens. Bisher gibt es keine erfolgreichen Versuche. Höchstwahrscheinlich wird es nie eine erfolgreiche Implementierung geben, außer ein paar Beispielen, deren Umfang sehr begrenzt ist.

Das kann eine gute Sache sein, da es uns arbeitslos machen würde.

Übrigens für Leute, die lesen ... Verwechseln Sie die Erstellung von Algorithmen nicht mit trivialen CRUD-Generatoren wie Ruby on Rails. Die CRUD-Generierung ist die Ausführung eines vordefinierten Algorithmus, nicht die Erstellung eines Algorithmus zur Lösung eines Problems.


Wäre nicht irgendein Programm, das einen Algorithmus zur Lösung eines Problems basierend auf den gewünschten Ein- und Ausgängen erstellen könnte, einfach die Ausführung eines vordefinierten Algorithmus?
Dunk

@ Dunk. Es wäre eigentlich beides. Es würde einen vordefinierten Algorithmus ausführen, aber auch einen "neuen" Algorithmus "erstellen". "Neu" und "Schöpfung" sind die Schlüsselelemente, die schwer zu tun sind.
Lord Tydus

Es wird immer wieder von Menschen neu definiert, da Computer immer mehr können. Ein Auto, das sich selbst parken kann, hätte vor 30 Jahren wie eine magische KI ausgesehen.
Michael Durrant

@ Michael Durrant. Die Ausführung eines Parkalgorithmus ist beeindruckend, aber nicht die "Erstellung" eines "neuen" Algorithmus. Wenn die Software selbst den Parkalgorithmus im laufenden Betrieb dynamisch erstellen würde, wäre es das. Es gibt viele nette Dinge, die Algorithmen tun, aber Algorithmen, die Algorithmen erstellen, sind ein ganz anderer Ballpark.
Lord Tydus

0

Es gibt verschiedene Tools, mit denen Sie Dinge tun können, ohne Code zu schreiben (MS Access, Filemaker). Einige generieren Code im Hintergrund, der geändert werden kann. Dies funktioniert gut mit Geschäftsanwendungen und Datenbank-Frontends. Der Benutzer stößt an eine Wand und stellt schließlich einen Programmierer ein. Die Logik wird zu komplex. Ich habe Web-Apps gesehen, die ein Formular erstellen, das eine Tabelle auffüllt. Dies ist ideal, bis Sie ein übergeordnetes Formular mit einem untergeordneten Formular benötigen, das mehrere Datensätze verarbeitet. Keiner von ihnen bietet dies an.

Ich versuche mir vorzustellen, wie das funktioniert, wenn ich das Ändern von Bild-, Video- oder Audiodateien automatisieren / codieren möchte. Wie eine Datenbank-GUI könnte jemand sie für diese erstellen, die Code generieren, anstatt nur die Datei zu manipulieren.

Tabellenkalkulationen verarbeiten alles von einfacher Mathematik bis hin zu Statistiken ziemlich gut. Nehmen Sie ein Makro auf und ein Skript wird erstellt.

Die Komplexität holt normalerweise auf. Schließlich möchten Sie etwas wirklich Neues erstellen. Es ist schwierig, einen Codegenerator zu erstellen, der Code für etwas erstellt, an das sonst niemand gedacht hat.


0

Ich glaube, Sie fragen sich mit Ihrer Frage, wie viel zukünftige Entwicklung in der Lage sein wird, den Arbeitsaufwand eines Softwareentwicklers zu minimieren. Selbst wenn Sie eine KI haben, die Ihr gesamtes Programm schreiben kann, müssen Sie ihr immer noch sagen, was zu tun ist, genau wie bei einem automatischen Autobauer, Sie müssen ihr immer noch eine Blaupause geben, und diese Blaupause erfordert einige Arbeit.

Und wenn Sie eine KI haben, müssen Sie sie noch unterrichten und sie muss durch mehrere Projekte lernen. Daher denke ich nicht, dass eine KI für diese Art von Arbeit geeignet ist, sondern eher für einen deterministischeren Ansatz, bei dem Codegeneratoren verwendet werden. Diese Codegeneratoren können sehr komplex werden, müssen jedoch nicht unbedingt maschinelles Lernen einsetzen.

Es gibt jedoch bereits Forschungsarbeiten in den Bereichen Feature-Oriented Software Design und Aspect-Oriented Software Design. Diese befassen sich mit dem Zusammenstellen von Softwareanwendungen, indem sie einige Funktionen auswählen, die sie haben sollten, und dann wird Code dafür generiert. Ziel ist es, Implementierungen für mehrere Funktionen zu haben, die in einer bestimmten Domäne wiederholt angezeigt werden, und diese wie Bausteine ​​zusammenzusetzen, je nach Ihrer speziellen Anwendung. Für die Webentwicklung umfassen die Funktionen beispielsweise Transaktionen, Statistiken, Skalierbarkeit, Protokollierung und alles, was Sie sich als wiederkehrende Merkmale verschiedener Web-Apps vorstellen können.

Merkmale und Aspekte unterscheiden sich von Komponenten, da es sich in der Regel um Querschnittsthemen handelt. Nehmen Sie zum Beispiel die Protokollierung. Sie können nicht einfach eine Bibliothek nehmen und in Ihre Anwendung aufnehmen und sagen, dass Sie sich jetzt anmelden. Sie müssen Ihre Protokollierungsaufrufe über Ihren gesamten Code verteilen, und hier sind Codegeneratoren praktisch. Ich habe kürzlich von all diesen Dingen aus diesem zweiteiligen Interview auf Software Engineering Radio gehört .

Es scheint, dass diese Art der Forschung in Europa und insbesondere in Deutschland, sogar in der Industrie, ziemlich im Trend liegt, wie ich aus eigener Erfahrung sagen kann. Die Codegenerierung kann nützlich sein, um den erforderlichen Infrastrukturcode zu generieren, sodass sich der Entwickler ausschließlich auf die Implementierung des spezifischen Verhaltens seiner Anwendung konzentrieren kann und sich nicht bei jedem Projekt mit denselben Nebenproblemen befasst.

Es bleibt abzuwarten, inwieweit dieser anwendungsspezifische Code eingegrenzt werden kann. Es kann sicherlich nicht vollständig beseitigt werden, sondern nur auf eine Art Blaupause reduziert werden, wie ich am Anfang erwähnt habe.

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.