自動プログラミング

自動プログラミング（じどうプログラミング、）は、人間のプログラマがコードを書くのではなく、何らかの機構によってプログラムを生成するプログラミングの一種であるRicardo Aler Mur, "Automatic Inductive Programming", ICML 2006 Tutorial. June 2006.。時代はすでに変わっており、人工知能の専門家は、現時点で自動プログラミングを使えないプログラマーは、使えるプログラマーに取って代わられる可能性が高いと警告している。

 概要 
自動プログラミングという用語に関しては、これまでその意味がさまざまに変化してきたため、定義について明確な合意が得られているとは言い難い。例えば、デイビッド・パーナスが公開されている研究成果から「自動プログラミング」の歴史を調査したところ、1940年代では、紙テープのパンチ処理を自動化することを意味していたとされる。その後、FORTRANやALGOLといった高水準言語で書かれたプログラムの変換を指すようになった。実際、初期のコンパイラには Autocode と名づけられたものがあった。パーナスは、「自動プログラミングとは、いつの時代もその当時のプログラマが使える言語より高水準の言語でプログラミングすることを意味する婉曲表現だった」と結論付けたD. L. Parnas. "Software Aspects of Strategic Defense Systems." American Scientist. November 1985.。

 例 
自動プログラミングはコンピュータプログラムの歴史と共にある。より高いプログラミング効率を求めて、より高水準の自動化が長い間推し進められている。

現在のところ、人の指示なしにプログラムを自動生成する技術は実用化されていない。すなわち現在の自動プログラミングは全自動プログラム生成ではなく、抽象度の高いソースコードを基にしたコード生成・変換および記述の省力化と同義である。

以下は自動プログラミングの例である。

 紙テープへのコードパンチング自動化（現代でいうタイピングが当時のパンチング。両方ともコードを「打ち込む」）
コード変換
プログラミング言語から機械語へのコンパイル自動化（c.f. ハンドアセンブル。詳しくはアセンブリ言語）
 プログラミング言語から中間言語（中間表現）へのコンパイル自動化（例：Java→Javaバイトコード、C#→CIL）
 プログラミング言語からプログラミング言語へのコンパイル自動化
 より高水準な言語からのコンパイル（TypeScript→JavaScript ES6→JavaScript ES5）
ソースコード生成
 スキーマ定義言語で書かれたスキーマからプログラミング言語で書かれたclientコードの生成
スキーマ定義言語で書かれたスキーマからプログラミング言語で書かれたserverスタブの生成
スキーマ定義言語で書かれたスキーマからDSLで書かれたバックエンドプロビジョニングコード (Infrastructure as Code) の生成、それによるプロビジョニング
テンプレートと変数セットからのコード生成（テンプレートエンジン）

 生成的プログラミング 
生成的プログラミング（）とは、ジェネリックなクラス、プロトタイプベース、テンプレート、アスペクト、コード生成などの技法を使ってソースコード作成を自動化し、プログラマの生産性を向上させるプログラミングのスタイルである。ソフトウェアコンポーネントなどのコード再利用の技法とも連携して使用される。

 ソースコード生成 
ソースコード生成（）とは、テンプレートなどのオントロジー的モデルを使ってソースコードを生成することであり、テンプレートエンジンや統合開発環境（IDE）などのプログラミングツールを使って行われる。これらのツールは、様々なソースコード生成手段を提供する。ソースコード生成器の単純な例としてマクロプロセッサ（例えば、C言語のプリプロセッサ）があり、ソースコード上のパターンを比較的単純な規則に従って置換する。

Microsoft Visual Studio などの IDE はさらに進んだソースコード生成を行う。プログラマは、ソースコードの「スニペット（snippet、断片）」と呼ばれるものを対話的に選択しカスタマイズできる。プログラム「ウィザード」もソースコード生成の典型的な形態であり、プログラマは対話的にグラフィカルユーザインタフェースを設計し、その結果を自動的に反映したソースコードが生成される。Windows Formsではフォームデザイナーを使って視覚的にGUI部品を配置したり、プロパティを設定したりすると、対応するC#やVB.NETによるプログラムコードが自動生成される。

3次元コンピュータグラフィックスの統合ソフトウェアやグラフィックスエンジンの中には、直感的な操作によって各種視覚効果のノードをつなぎ組み合わせることで、リアルタイムまたは非リアルタイムのシェーダープログラムを自動生成する、「ノードエディター」と呼ばれるオーサリングツールを備えているものもある。

 実装例 
 NConstruct - .NET Framework 環境での開発ツール。C# ソースコードを生成する。
 MyGeneration - .NET Framework 向けソースコード生成器。ORMアーキテクチャ向けのコードを生成する。データベースのメタデータを MyMeta API を使ってテンプレート化する。

 問題点 
著作権の問題だけでなく、自動プログラミングにはコードのセキュリティとデバッグの問題があり、プログラミング・エンジニアは自動プログラミングを使う際にセキュリティとデバッグに深い関心を持つこと。

 関連項目 

 Meta-Object Facility (MOF)
 MOF Queries/Views/Transformations (QVT)
 XML Metadata Interchange (XMI)
 XML変換言語 (XTL)
 アスペクト指向プログラミング
 インテンショナルプログラミング (IP)
 オブジェクト指向分析設計 (OOAD) 
 コード生成
 ソフトウェアファクトリー
 データ変換 
 テンプレートエンジン
 統一モデリング言語 (UML)

 ドメイン固有言語  (DSL)
 ドメイン固有モデリング (DSM)
 プログラム合成
 変換言語 (TL)
 メタデータ
 メタモデル
 メタプログラミング
 モデリング言語
 モデル駆動工学  (MDE)
 モデル駆動型アーキテクチャ  (MDA)
 モデル変換言語 (MTL)
 AUTOCODING

 脚注 

 参考文献 
Generative Programming: Methods, Tools, and Applications by Krzysztof Czarnecki and Ulrich W. Eisenecker, Addison Wesley, 2000.

 外部リンク 
Code Generation Network
Generative Programming 公式サイト: www.generative-programming.org
GPCE (Generative Programming and Component Engineering) conference
Generative Programming Wiki

Category:プログラミングパラダイム