コード作成の自動化にどれくらい近づきましたか?[閉まっている]


8

また、現代のエディターによって挿入されたオートコンプリートや自動コードスニペット、またはポリモーフィックコードを意味するものではありません。しかし、与えられた入力とタイプ、および望ましい出力の情報を通過し、選択した言語で有効なコードを出力できるプログラムの最先端は何ですか。遺伝的プログラミング、遺伝子発現プログラミングは知っていますが、他の取り組みについては知りません。また、グーグルはあまり現れません。

この面での進歩を誰かが知っていますか?

編集:「有効なコードを出力する」と言うとき、私はAIまたは類似の何かがロジックと制御のフローを処理し、命令型言語で実装することを意味します。命令型言語のみです。それが難しい部分だからです。それでも、この種のアイデアをサポートするために開発されている新しい言語を知っている場合は、言及してください。おそらく、現在の言語セットは、最初に遭遇する可能性のある初期のAIには適していない可能性があります。


10
優れたプログラマーとプログラマー教育。
2012

@おもしろい。
クマール2012

@kumar第4世代(4GL)と第5世代の言語(5GL)は調べる価値があります(用語だけで説明しないでください。DSLはそうであると考えられていますが、それほど近い4GLはありません。大きな飛躍が可能になるのは、認識、音声認識と視覚認識、教師なし機械学習、高度なパターン認識、自然言語処理などに依存するAIが増加しています。企業のプログラミングの現状ではそれが許されません。これは私にとって答えるには大きすぎるテーマです
Ubermensch

4
AIまたは同様の、ロジックと制御のフローを処理し、命令型言語で実装する -非常に意欲的:問題は、Natural Intelligenceではまだ解決されていません。
mouviciel 2012

あなたは停止問題を知っていますか?

回答:


17

ドメイン固有言語は、これまでにないほど近くなっています。

常に、コンピュータで使用するいくつかのルールを与える必要があります。しかし、それらのルールがドメイン固有の方法で定義されるほど、必要な入力は少なくなります。

Web開発を対象とするドメイン固有の言語は、より一般的な言語よりも少ないコーディングで済みます。テストを対象とするドメイン固有の言語は、そうでない言語よりも少ないコーディングで済みます。遺伝学を対象とするドメイン固有の言語は、そうでない言語よりもコーディングが少なくて済みます。等々。

さて、ここで大きな問題が出てきます。ドメインはいつドメイン固有の言語を書くことを正当化するのに十分な大きさになるのですか?Web開発とテストは、開発の世界の少なくとも半分が取り組んでいることです。フレームワークが急上昇し、これらのもの(基本的にはドメイン固有の言語)のボイラープレートコードの量が減ることは避けられませんでした。

しかし、あなたの会社のビジネスドメインはどうですか?あなたの会社で一般的に言及されていることに焦点を当て、それらをコードで簡単に参照できるようにすることは価値がありますか?ドメイン主導の設計はその質問に答えることですが、まだそのバランスを実際に見つけたとは思いません。


13
これは、抽象化のより高いレベルでのプログラミングにすぎないと主張します。OPが要求したように、AIを使用してプログラミングの問題を解決するのとは異なります。
ギャレットホール

4
@GarrettHallこの答えは、OPが要求したように、プログラミングの問題を解決するためにAIが使用されることは決してないということです。そして+1します
MarkJ

2
@ギャレットホール、一部の宣言型DSLはすでに少しインテリジェントすぎて、恐ろしくインテリジェントな場合があります。
SK-logic

1
@pdrたぶんクマーは彼の質問を拡張することができますが、彼は特に遺伝的プログラミングに言及しました。DSLは別のカテゴリです。私たちは自己記述型プログラムから遠く離れていると思いますが、25年後に何が起こるかを予測できる技術の進歩によって、
ギャレットホール

1
@kumar:「言語の構文で書かれた合法的なステートメントのセットを思いつくこと」は簡単だ、それが私のポイントです。難しい部分-人工またはその他の何らかの知能が必要な部分、つまりプログラマーが現在行っている部分-は、入力を変換することです。「AI(厳密な意味ではない)」に何かを入力して、非インテリジェントコンピュータ用に変換することをどのように提案しますか?
pdr 2012

6

80年代と90年代には、いわゆる第4世代言語について多くの話題がありました。ウィキペディアの記事から:

すべての4GLは、プログラミングの労力、ソフトウェアの開発にかかる時間、およびソフトウェア開発のコストを削減するように設計されています。それらはこのタスクで常に成功するとは限らず、場合によっては、エレガントで保守不可能なコードが生成されます。ただし、適切な問題があれば、適切な4GLの使用は見事に成功する可能性があります。

...

さまざまなタイプの4GLがいくつか存在します。

  • テーブル駆動型(コードレス)プログラミング。通常、ランタイムフレームワークとライブラリで実行されます。コードを使用する代わりに、開発者はメモリまたはデータテーブル操作コマンドの事前定義されたリストで操作を選択することにより、ロジックを定義します。つまり、開発者はコーディングの代わりに、テーブル駆動型アルゴリズムプログラミングを使用します(この目的で使用できるコントロールテーブルも参照してください)。このタイプの4GL言語の良い例は、PowerBuilderです。これらのタイプのツールは、ビジネスデータの操作とレポートの両方を可能にするパッケージに通常含まれるビジネスアプリケーション開発に使用できるため、GUI画面とレポートエディターが付属しています。それらは通常、より多くのハードウェア/ OS固有の操作の必要が生じたときに、典型的な3GLから生成された低レベルDLLとの統合を提供します。
  • レポートジェネレータープログラミング言語は、データ形式とレポートを生成して生成し、そこから必要なレポートを直接生成するか、プログラムを生成してレポートを生成します。RPGも参照
  • 同様に、フォームジェネレーターは、アプリケーションシステムユーザーとのオンラインのやり取りを管理したり、そうするためのプログラムを生成したりします。
  • より野心的な4GL(第4世代環境と呼ばれることもある)は、CASEツールの出力、画面とレポートの仕様、および場合によっては追加の処理ロジックの仕様からシステム全体を自動的に生成しようとします。
  • SAS、SPSS、Stataなどのデータ管理4GLは、統計分析とレポート作成のためのデータの準備において、データ操作、ファイル再整形、ケース選択、およびデータドキュメントのための高度なコーディングコマンドを提供します。

4GLと第5世代のプログラミング言語を対比すると興味深いです

第5世代のプログラミング言語(省略5GL)は、プログラマーが作成したアルゴリズムを使用するのではなく、プログラムに与えられた制約を使用して問題を解決することに基づいたプログラミング言語です。ほとんどの制約ベースのロジックプログラミング言語と一部の宣言型言語は第5世代言語です。

第4世代のプログラミング言語は特定のプログラムを構築するように設計されていますが、第5世代の言語は、プログラマーがなくてもコンピューターで特定の問題を解決できるように設計されています。このようにして、プログラマは、問題を解決するためのルーチンやアルゴリズムの実装方法を気にすることなく、解決する必要がある問題と満たす必要がある条件についてのみ心配する必要があります。第5世代言語は、主に人工知能の研究で使用されます。Prolog、OPS5、およびMercuryは、第5世代言語の例です。

最終的には、コンピュータを「プログラミング」しなくても、誰かがコンピュータに要件を説明する必要があります。


私は今のところ人間が入力と出力を説明しなければならないことに同意しますが、その後、プログラムがコードを書いて、目の前の問題に適合する方法が知られています。5GLは適切な指針であり、現在の状態を完全に把握するには数日かかります。チップインしていただきありがとうございます
。– kumar

しかし、それから私たちはそれらすべてを捨てて、Lispが1960年頃にあることに気づきました。あるいは少なくともRubyを使い始めました。
Jason Lewis、

@kumar入力と出力について説明したら、ルールベースのプログラミングなどを使用して、プログラミングを検索および生成できます。しかし、5GLでは、最も純粋な意味では、問題の説明を提供するだけで解決策が得られます。簡単に言うと、機械はよりインテリジェントになります。音声、ビジョン、機械学習、膨大なデータ分析と合わせて、その時点に到達するには少なくとも30年かかります。ただし、現時点では、お客様の質問に回答することはできません。コンピュータはそうするでしょう。
Ubermensch 2012

3

自動コード生成に対する最も議論されたアプローチの1つは、「MDA」、つまりモデル駆動型アーキテクチャです。ほとんどの場合(必須ではありません)、関連するクラスが生成されるビジュアルGUIエディターを介してUMLを表示します。

完全に機能するコードの表現はまだ遠いかもしれませんが、完全なスケルトンを生成するのに十分なシステムがあります。

チェックアウト:http : //www.actifsource.com/actifsource/index.html

また:http : //www.win.tue.nl/~mchaudro/cbse2007/programgenerators.pdf

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


1
Object Management GroupのMDAサイトもお勧めします
TMN

@DipanMehta確かではありませんが、UML実行可能ファイルは可能だと思いません(UMLとして仕様を指定し、ソフトウェアを生成するだけです)。また、UMLが並行および並列コンピューティング、関数型プログラミングパラダイム、研究ソフトウェアにどのように採用されているかについても疑問があります。
ウベルメンシュ

2

さまざまなタスクの作業コードを生成するJavaおよびC#用のコードジェネレーターを多数作成しました。XMLドキュメントを分析し、対応するJavaクラスとマーシャリング/アンマーシャリングコードを生成して変換を行うJAXBのようなパッケージと、データベースとの間でデータをマーシャリングするためのDTOクラスを生成するEntity Frameworkがあります。クラスダイアグラムとJavaの間の往復コード生成を行うRational XDE(現在の名前は何でも)などのツールもあります。

ビジネス要件や機能仕様を取り入れてコードに変換できるものを探しているなら、その分野での進展はあまり見られません。OMGが何らかの「実行可能なUML」に取り組んでいることは知っていますが、DoDプロトタイプを除いて、実用的な実装については知りません。


2

宣言型プログラミングは、例えばプロローグまたはSQLを数えますか?

プログラムが達成すべきこと、または結果が満たすべき条件を説明するだけです。次に、システムにクエリを実行し、結果(または「ソリューションなし」)を取得します。

もちろん、内部ではプログラムが実行されていますが、コードは表示されません。

残念ながら、宣言型プログラミングは特効薬ではありません。基本的なケースを超えて、宣言型の目標を十分に正確に説明するにはかなりの労力とスキルが必要です。内部での実装(例:再帰的な定義におけるSQLインデックスまたは末尾呼び出しの役割の理解...)

問題の種類によっては、「何を」を正確に説明するよりも、「方法」を解決する方が実際には簡単な場合があります。人間、または少なくともほとんどの平均的なプログラマーにとって、「どうやって」を考えることはより自然になり、「正確には」はより多くの精神体操を必要とします。


+1。たぶんSQLも重要ですか?
MarkJ

さて、今SQLについて言及します。
Joonas Pulakka、2012

@JoonasPulakkaすべてのマシンコード(低レベル)が必須であるため、命令言語(高レベルまたは低レベル)の構文に従うステートメントで構成されるプログラムを記述する自動化された方法を意味しました。それにもかかわらず、あなたの疑問は素晴らしい追加であり、私は質問に編集を追加します。
クマール2012

もう一度「+1は、「何を正確に説明するより実際に解決する方が簡単かもしれない」
MarkJ

@kumar:はい、すべてのコードは内部で必須です。さらに、たとえば、GNU PrologはPrologコードを実行可能ファイルにコンパイルできますここで説明するように、それ Cなどにコンパイルできなかった理由はありません。つまり、問題定義から直接、命令型言語(C)の構文に従って命令型ステートメントを作成します。結果のCコードは非常にわかりにくいため、中間のCステップを実行する実用的な理由はほとんどありません。
Joonas Pulakka、2012

1

「命令型言語...それは難しい部分だ」というあなたの発言には同意しません。これは簡単な部分ですが、一部の言語では他の言語よりもはるかに簡単です。ユーザーが本当に何を望んでいるかを理解し、そのすべての情報を整理することは難しい部分です。「命令型言語」の部分は、実際の作業がすべて完了したときなので、難しいように見えます。そのとき、要件に関する詳細な質問が表示され、すべての回答を実行可能なシステム定義に整理する必要があります。

プログラミングなしにはプログラミングはありません。誰かが不正確な人間の欲求を計算の正確な仕様に変換する必要があります。その仕様は、アセンブリ言語、Java、LISP、いくつかの図式システム、またはまだ発明されていない言語で作成できます。しかし、コンピューターが人間との深いコミュニケーションが可能になるまで、誰かがユーザーと話し、システムを正確に定義する必要があります。


1

私たちはすでにそこにいます!私たちが必要としているのは、ホモ・アイコニック文字と呼ばれる今日の言語と数十年前の「コードはデータ」です。トップダウンで設計するのではなく、ボトムアッププログラミングで独自の環境を定義します。たとえば、Lisp内で独自のDSLを構築できます。スタッキングのアプローチを使用すると、特定の問題に必要なだけのDSL(レイヤー)を相互に重ねることができます。このアプローチは、S式の非常に低レベルの表現から、考えられる最も複雑なデータ抽象化までをもたらします。では、ある言語を別の言語にスタックしない場合、自動コード書き込みとは何でしょうか?


0

Coqのようなシステムで依存型を使用して表現された仕様からプログラムを派生させる試みのつぶやきを聞いたことがあります。しかし、どのような進展があったのかはわかりません。


これはプログラミング言語やソフトウェアにとって本当に悪い名前です
NimChimpsky


Coqプルーフアシスタント。素晴らしい。
クマール2012

0

コード作成の自動化にどれくらい近づきましたか?

話す価値のあるものはどこにもありません。

私たちも決してそこに到達することはないだろうとも強く言います。


0

コード作成の自動化における最先端の技術ですか?「最先端」はありません。しかし、永続的な失敗の状態があります。これまでのところ成功した試みはありません。範囲が非常に制限されているいくつかの例を除いて、これの実装が成功することはほとんどありません。

それは私たちを失業させるので、それは良いことかもしれません。

ところで、読んでいる人には.... Ruby on Railsのような些細なCRUDジェネレータとアルゴリズムの作成を混同しないでください。CRUDの生成は、事前定義されたアルゴリズムの実行であり、問​​題を解決するためのアルゴリズムの作成ではありません。


必要な入力と出力に基づいて問題を解決するアルゴリズムを作成できるプログラムは、単に事前定義されたアルゴリズムの実行ではないでしょうか?
ダンク

@ダンク。それは実際には両方でしょう。定義済みのアルゴリズムを実行するだけでなく、「新しい」アルゴリズムを「作成」します。「新しい」と「創作」は難しい部分です。
ティドゥス卿、12

コンピュータがますますできるようになると、それは人間によって再定義され続けるでしょう。駐車できる車は、30年前は魔法のAIのようでした。
Michael Durrant

@マイケル・デュラント。パーキングアルゴリズムの実行は印象的ですが、「新しい」アルゴリズムの「作成」ではありません。ソフトウェア自体が動的にパーキングアルゴリズムを動的に作成した場合は、これで完了です。アルゴリズムが行う優れた機能はたくさんありますが、アルゴリズムを作成するアルゴリズムは、まったく別のものです。
Tydus卿2012年

0

コードを記述せずに操作できるツールがいくつかあります(MS Access、Filemaker)。変更可能なバックグラウンドでコードを生成するものもあります。これは、ビジネスアプリやデータベースのフロントエンドでうまく機能します。ユーザーは壁にぶつかり、最終的にプログラマーを雇います。ロジックが複雑になります。テーブルにデータを入力するフォームを作成するWebアプリを見てきました。複数のレコードを処理する子フォームを持つ親フォームが必要になるまで、これはすばらしいことです。それらのどれもこれを提供しません。

画像、ビデオ、またはサウンドファイルの変更を自動化/コード化する場合に、これがどのように機能するかを想像してみます。データベースGUIのように、ファイルを操作するだけでなくコードを生成するために、誰かがそれらを作成することができます。

スプレッドシートは、単純な数学から統計まですべてをかなりうまく処理しています。マクロを記録すると、スクリプトが作成されます。

通常、複雑さが追いつきます。最終的に、あなたは本当に新しいものを作りたいと思っています。誰も考えていない何かのためのコードを作成するコードジェネレータを構築するのは難しいです。


0

あなたの質問で、ソフトウェア開発者がしなければならない仕事の量を最小限に抑えることができる将来の開発がどれだけできるかをあなたは尋ねていると私は信じています。プログラム全体を作成できるAIがある場合でも、自動自動車ビルダーの場合と同様に、何をすべきかを指示する必要があります。設計図を与える必要があり、その設計図にはいくつかの作業が必要です。

AIを使用している場合でも、AIを教える必要があり、いくつかのプロジェクトを通じて学習する必要があります。したがって、私はAIがこの種の作業に適しているとは思いません。むしろ、コードジェネレーターを使用したより確定的なアプローチです。これらのコードジェネレーターは非常に複雑になる可能性がありますが、必ずしも機械学習を採用する必要はありません。

とはいえ、機能指向ソフトウェア設計およびアスペクト指向ソフトウェア設計と呼ばれる分野での研究はすでに存在しています。これらは、必要な機能を選択してソフトウェアアプリケーションをアセンブルし、そのためのコードが生成されます。目標は、特定のドメインに繰り返し現れるいくつかの機能の実装を用意し、特定のアプリケーションに適したように、それらをビルディングブロックのようにアセンブルすることです。たとえばWeb開発の場合、機能には、トランザクション、統計、スケーラビリティ、ロギングなど、さまざまなWebアプリの繰り返し発生する特性と考えることができるものが含まれます。

機能と側面は、通常、横断的な関心事であるため、コンポーネントとは異なります。ロギングを例にとります。ライブラリを取得してアプリケーションに組み込んで、今すぐログに記録したと言うことはできません。ロギング呼び出しをコード全体に分散させる必要があります。そのため、コードジェネレーターが便利です。最近、ソフトウェアエンジニアリングラジオに関するこの2部構成の インタビューから、これらすべてについて聞いたことがあります。

個人的な経験からも言えるように、この種の研究はヨーロッパ、特にドイツ、特に業界でも非常に流行しているようです。コード生成は、必要なインフラストラクチャコードの生成に役立ちます。これにより、開発者はアプリケーションの特定の動作の実装に専念でき、すべての異なるプロジェクトで同じ問題に悩まされることがなくなります。

アプリケーション固有のコードをどれだけ絞り込むことができるかはまだ不明です。最初に述べたように、完全に排除することはできず、ある種の青写真にまで縮小することはできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.