InfoQ

InfoQ

News

マイブックマーク

ブックマークするためにログイン または 会員登録 する

ブックマークされました!

ブックマークがエラーになりました。もう一度お願いします。

ClojureがSTMとLISPをJVMにもたらす

作者 Werner Schuster , 翻訳者 沼田 暁子 投稿日 2009年2月9日

セクション
デベロップメント,
設計/アーキテクチャ
トピック
動的言語 ,
言語 ,
Ruby ,
Java ,
Architecture ,
スクリプティング ,
パフォーマンス&スケーラビリティ
タグ
Concurrency ,
言語特性 ,
言語 ,
LISP ,
メタプログラミング

Clojure(リンク)はLISPファミリの言語のかなり新しいメンバであり、Javaプラットフォームで動作する。2007年に導入され、すで高い関心を集めている。ひとつの理由はClojureの並行処理へのアプローチであり、ソフトウェアトランザクショナルメモリ(STM)のコンセプトを踏まえている。

Stuart Halloway氏は「Programming Clojure」(リンク) (Pragmatic Programmersで公開されている)の著者であるが、この本は現在ベータ版である。私達はStuart氏とClojureやSTM、ツール、さらにたくさんのことを話した。

InfoQ: Clojureは並行処理の支援にSTMを使用していますが、STMについて簡単に教えて下さい。

STMはもっと大きな話である、ミュータブルな状態のための明確なAPIの一部です。みなさんのコードを純粋な機能的でミュータブルなレイヤに分割することによって、2つの大きなメリットがあります。
*純粋な機能的なコードは、テストや再利用がずっと簡単です。
*明確でミュータブルなAPIを選択することが可能ですが、このAPIはみなさんの並行性や拡張性のニーズにぴったりです。Clojureは様々な状況に対して4つの異なるAPIを提供します:refとSTM、agent、varそしてatomです。さらに、いつでもレベルを落としてJava Concurrency APIを使用することが出来ます。

InfoQ: Clojureに興味を持っているもう一つのグループは既にLISPに親しんでいるプログラマ達ですが、彼らがClojureを試す場合にはどのようなことに気をつける必要がありますか?

私からLisperへのアドバイスは「初めは我慢して下さい」です。Clojureは他のLispとの後方互換性に制約されないLispです。これが実際問題として意味しているのは、多くの違いがあるということです。少しClojureを使うとすぐに、みなさんはおそらくRich氏の設計の決定は十分に熱意を持ったものであることに同意するでしょう。

Clojureのウェブサイトには、他の多くのLISPとの違いを示すドキュメントがある(リンク)。Clojureの作者であるRich Hickey氏は、Java開発者のためにClojureを説明したスライド(リンク)と、逆にLISPerの視点から(リンク)書いたものを提供している。

InfoQ: Java利用者、あるいはもっと一般的には、オブジェクト指向プログラミングに慣れている開発者は、Clojureを使うためにどのような習慣を捨てる必要がありますか?

他のホットな新しいVM言語とは異なり、Clojureはオブジェクト指向では *ない* のです。初めはこのことに臆するかもしれません:「どのようにしてオブジェクトなしでシステムを設計するのでしょうか?」
しかしClojureは、皆さんがオブジェクト指向から望む多くのものを提供 *して* います。
* カプセル化(名前空間、private記述と閉鎖による)
*強力な多相性(マルチメソッド)
* 機能的な再利用は継承より優れています(機能とイミュータブルな状態は継承階層よりもうまく構成されます)。
  Clojureと多くのオブジェクト指向言語の違いは、オブジェクト指向言語が固定のメニューを提供するのに対して、Clojureの機能はアラカルトなことです。

InfoQ: LISPから始める場合はどのようなリソースがおすすめですか(もちろん、あなたの本の他に)?

Clojureはたくさんの素晴らしいアイデアを結び付けています。Programming Clojureに加え、
*Lispの知識を得るためにはSeibel氏のPractical Common Lisp(邦訳:実践Common Lisp、オーム社)
*LispマクロにはGraham氏のOn Lisp(邦訳:On Lisp、オーム社)
* 並行処理ではGoetz氏他のJava Concurrency in Practice(邦訳:Java並行処理プログラミング、ソフトバンククリエイティブ)
* 機能的プログラミングにはO'Sullivan氏他のReal World Haskell
* Abelson氏とSussman氏のStructure and Interpretation of Computer Programs(邦訳:計算機プログラムの構造と解釈、ピアソンエデュケーション)
  をお勧めします。誰もが読むべきだからです。

注:これらの本の大半はフリーでオンラインでも入手可能である:Practical Common Lisp(リンク)、On Lisp(リンク)、Real World Haskell(リンク)、SICP(リンク)

InfoQ以前からあるLISPのパターン/プラクティスでClojure開発者が避けるべきものは何ですか?(例えば、いたるところでリストを使う代わりに、可能な限り、マップやベクタのようなClojureのデータ構造を好むようにするとか?)

あなたはほとんど質問の中であげています。Clojureでは、リストはほとんどコードのためのものです。データには、ジョブに適した構造を選び、シーケンスのライブラリを採用してください。Java APIを直接呼び出すことも恐れないで下さい。

InfoQ:Clojureのライブラリはどのようになっていますか?

どんなニーズ(ウェブ開発、DBアクセス、テスト、ビヘイビア駆動開発)のためにも、3つか4つの有望なClojureライブラリがあります。著書は「Clojure in the Wild」という章で終わるのですが、その中ではこれらのいくつかを簡単に紹介し、test-isテスティング・フレームワークとCompojureを使ってもっと拡張した例を示しています。

Clojureのメーリングリストで、Rich Hickey氏が先ごろClojureライブラリのメンテナに、彼らが取り組んでいるライブラリの報告を求めていた(リンク)。たくさんのClojureプロジェクトをGitHubのClojure言語のカテゴリ下(リンク)で見つけることができる。

InfoQ: (Javaプラットフォームだけではなく)マルチプラットフォームのClojureを見てみたいと思いますか?

いいえ。ClojureがJavaと統合されていることは、そのパワーの鍵です。もちろん、私は機能的なLispが.NETプラットフォームと一緒になったものを歓迎します -- しかし、それはClojureであるべきではありません。

InfoQ: あなたはClojureプログラミングにどんなツールを使っていますか?

私はEmacsと、SLIMEをときどき使っています。しかし、私は既にEmacsユーザだったので、この選択はいうまでもなかったことです。viやEclipse、IDEA、NetBeans用のプラグインもあります。

IDE/エディタのClojureサポートの例としては:clojure-dev(リンク)(Eclipse)、clojure-intellij-plugin(リンク)(IntelliJ)、enclojure(リンク) (NetBeans)がある。Gorilla(リンク)(VIM)はSLIME(リンク)(Emacs)と似ている。(Bill Clementson氏はClojure用にEmacsとSLIMEを設定する方法を知っている。(リンク))

これらのツールの多くは同じようなことをする必要があるので、こうしたツールのための共通のバックエンドを共同で行う話がある(リンク)。ひとつの選択肢はSLIMEやGorillaのようなアプローチを使うことであり、つまり、Clojureインスタンスを実行し、ドキュメントのルックアップ(Clojureのシンボルはドキュメンテーション文字列をメタデータ(リンク)として持っている)、コードのルックアップ、名前空間のブラウジング等の問い合わせを行うのである。

InfoQ: あなたは今、商用の重要なプロジェクトでClojureを使用したいと思いますか?

もしあなたがアジャイルチームにいて優れたテストスイートがあれば、私はClojureを製品に使用することをためらわないでしょう。

InfoQでは先ごろClojureで作成されたアプリケーションが製品で使用されている例(参考記事)をレポートした。(InfoQにはさらなるClojureに関するコンテンツがある(参考記事リンク))。


みなさんはClojureを検討したいと思われるだろうか?みなさんが面白いとおもわれるのはClojureのどの面だろうか - LISPから受け継いだもの、STM、あるは他のものだろうか?

原文はこちらです:http://www.infoq.com/news/2009/01/clojure-interview-halloway

特集コンテンツ一覧

GAE開発の落とし穴

Googleのクラウド環境をつかったGoogle App Engineによる開発するにあたり、初めての試みで苦悩する開発者達の経験をもとに、各開発フェーズにあわせて問題点やどう解決したかをご紹介します

イベントレポート:「Coqチュートリアル#1」

去る1月12日、定理証明支援系ツールCoqの初心者向けチュートリアルが開催さ れた(http://kokucheese.com/event/index/23667/)。今後も2月2日 (http://kokucheese.com/event/index/23744/)、2月9日、2月16日と引き続き開 催されていく予定である。本記事では、開催の様子をレポートする。

Javaの未来についてのNeal Gafter氏とのディスカッション

Choosing Options

Neal Gafter氏はOracleによるJava買収の影響に関する議論、Javaにセグメンテッドスタックやメタオブジェクトプロトコルを追加することについての主張、そしてJavaとC#との比較について話をしてくれた。

Google Dartのエッセンス:アプリケーションの構築、スナップショット、Isolate

GoogleはVMをともなう新しい言語であり、JSコンパイラでもあるDartをプレビューした。 InfoQはDartのアプリの構築に貢献する文法の裏側を探った:スナップショット、Isolate、モジュール方式

CSPベースのモデル検査ツール「Process Analysis Toolkit」

本記事ではCSPベースの「マルチドメイン・モデル検査ツール」である、PAT(Process Analysis Toolkit)について紹介する。モデル検査は、形式手法(Formal Method)という方法論を基礎とする技術であり、複雑さが増大しながらも安全性を求められる、現在のソフトウェア開発の状況に対する処方箋の1つとして注目されている手法である。

Jenkinsによる継続的インテグレーションのススメ(4) ~CloudBeesでJenkinsをサービスとして使う~

前回まで、Jenkinsの幾つかの側面に注目して解説をしてきました。シリーズ最後の今回は、Jenkinsをサービスとして使う方法を紹介します。

書籍『抽象によるソフトウェア設計-Alloyではじめる形式手法-』の紹介

Alloyは、MITにて開発された仕様記述言語であり、ツールによる自動解析を使い、インクリメンタルに形式仕様が書けることが特長である。筆者らはAlloy開発者による、Alloyを使った形式手法入門書を翻訳、今夏にオーム社より刊行した。本記事では、Alloyの簡単な概要と、翻訳書『抽象によるソフトウェア設計』(「Alloy本」)を紹介する。

Windows デバイスで開発するタッチユーザーインターフェイス

スマートフォンを中心としたマルチデバイスにおけるタッチユーザーインターフェイスへの対応は、既に必須の項目となりつつある。本記事では、Windows デバイスにおける UX のベースとなっている「メトロ」というデザイン言語を掘り下げながら、既存環境を意識しつつもどのようにタッチユーザーインターフェイス開発に取り組んでいくべきであるかについて解説していく。