分12本連載が書籍化されました。978-4-7741-4596-9おっす、おらメタプログラマ!前回まで「良いコードとは?」という観点から,「⁠名前付け」「⁠スコープ」「⁠処理の分割」といったプログラミングで必須の基礎内容を解説してきました。今回は少し趣向を変えてメタプログラミングを取り上げます。実際,「⁠メタプログラミングとは何ですか?」と聞くと,人によって回答がまちまちです。そんなメタプログラミングですが,使いこなすとたいへん強力です。それでは,メタプログラミングについて考えを深めていきましょう。メタプログラミングの悩みまずは毎回好例,各界の代表者にメタプログラミングについての所信表明演説をしてもらいましょう。初級~中級のプログラマ達人プログラマさすがに今回は達人プログラマ以外は歯切れが悪いですね。言葉が難しく感じる,使いやすく作るのが難しいという意見が多いようです。「メタプログラミングとは何なのか?」を見ていきましょう。普通のプログラムを「普通に処理を並べたプログラムを書くこと」だとすると,メタプログラミングは「ある特定の問題を解決するプログラムを生み出すプログラムを書くこと」です。これではよくわからないので,いくつかの適用場面ごとに具体例を見ていきます。コードの自動生成プログラムを自動生成するプログラムはメタプログラムです。SeasarプロジェクトのS2JDBCGenやDBFluteなどは,データベースのスキーマをもとにエンティティクラスなどたくさんのソースコードを自動生成してくれます。RailsなどのモダンなWebフレームワークにもビューやコントローラを自動生成してくれる機能があります。Studioなどの統合開発環境(IDE)で「ぽとぺた」でGUIフォームやデータベースにアクセスできるアプリが作れるのも,マウスからの指示を入力にしたコードの自動生成であり,メタプログラミングの一種です。自動生成のうれしい点として,単純作業の繰り返しコードを書かなくてよいことや,自動生成されたコードは基本的にエラーや間違いがあり得ないことが挙げられます。このように「コードを自動生成するプログラム」をプログラミングすることが「メタプログラミング」です。要件が変わった場合は「生成されたコードを修正する」のではなく,「⁠コードを自動生成するプログラム」を修正することで,「⁠自動生成されたコード」が変更されるようなプログラミングスタイルになります。ドメイン特化言語)といいます。DSLを用いることでホストとなる言語でプログラムを書くことなくプログラミングできるようになるので,DSLはメタプログラミングの一種であるといえます。外部DSLJavaで一番使われているDSLはJSPでしょう。JSPは「HTMLを出力する」という領域を満たすテンプレート言語です。JSPではもととなるテンプレートがプリコンパイルされてJavaコードに変換されます。その後さらにJavaコードがコンパイルされて実行されます。以下は,JSPとプリコンパイル後のJavaコードです。return;out.write('\n');JSPのようにホストとなる言語(Java)とは別の言語(JSP)を外部から読み込むことで実現するDSLを「外部DSL」(⁠または言語外DSL)と言います。外部DSLとしてはXML形式の設定ファイルが利用されることが多いです。以下はSeasar2の設定ファイルです。</initMethod></component>XML形式の外部DSLでは,プログラム(通常はフレームワーク)がXMLを読み込み,内容を解釈しながら処理を組み立てて実行していきます。上記のXMLをSeasar2が読み込むと次の処理が実行されます。helper.Printerクラスのオブジェクトを動的に作成する作成したオブジェクトに対して"Printer1"を引数にaddPrinterNameメソッドを実行するこのように外部DSLは,ときとして設定ファイルと見分けがつかないことがあります。メタプログラミングの入り口としては,外部DSLを「設定ファイルに毛が生えたようなもの」ぐらいの軽いものとして考えてもよいのではないかと思います。オリジナルのミニ言語を作成して外部DSLとして利用する場合もあります。その場合はパーサ作成のコストやオリジナル構文を新たに考えるコストが必要なので,通常は何かの言語に似せるかXMLなどのような汎用データ形式を利用することが多いようです。本稿ではのちほど汎用データ形式であるExcelを使ってDSLっぽい小さなフレームワークを作成します。Java著者プロフィール縣俊貴(あがたとしたか)学生時代にMSXで制限された環境でのプログラミングの楽しさを学ぶ。以来,オープンソースのWiki実装「MobWiki」の開発や受託開発などを経て,現在はプロジェクト管理ツール「Backlog」,ドローツール「Cacoo」など,コラボレーション型のWebサービスの企画と製品開発を行う。言うは易く行うは難し。言うは易く行うは難し。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。