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.
Antworten:
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.
quelle
In den 80er und 90er Jahren gab es viel Aufsehen über sogenannte Sprachen der 4. Generation . Aus dem Wikipedia-Artikel:
...
Es ist interessant, 4GLs mit Programmiersprachen der fünften Generation zu vergleichen :
Selbst wenn Sie den Computer nicht "programmieren", muss letztendlich jemand dem Computer Ihre Anforderungen erklären.
quelle
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
quelle
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.
quelle
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".
quelle
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.
quelle
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?
quelle
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.
quelle
Nein, bei weitem nichts, worüber es sich zu reden lohnt.
Ich habe auch stark darauf hingewiesen, dass wir auch nie dorthin gelangen werden.
quelle
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.
quelle
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.
quelle
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.
quelle