web-dev-qa-db-ja.com

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

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

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

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

8
kumar

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

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

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

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

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

17
pdr

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世代言語の例です。

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

6
Mark Booth

自動コード生成に対する最も議論されたアプローチの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

3
Dipan Mehta

行う 宣言型プログラミング カウント、たとえばプロローグまたはSQL?

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

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

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

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

2
Joonas Pulakka

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

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

2
TMN

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

1
metaman

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

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

1
kevin cline

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

話す価値のあるものに近いところはありません。

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

0
Darknight

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

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

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

0
Lord Tydus

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

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

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

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

0
JeffO

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

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

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

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

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

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

0
Andrei Vajna II

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

0
Ryan Culpepper