← すべての記事

エンジニアリング哲学:Roberto Ierusalimschy

Roberto Ierusalimschy、Luaの作者

要点

  • 彼は、あなたが触れる膨大な量のソフトウェアの内側に潜むスクリプト言語を設計しました。 Roberto IerusalimschyはLuaの設計を主導しました。Luaは1993年にPUC-RioのTecgrafラボで、Luiz Henrique de FigueiredoおよびWaldemar Celesとともに生み出されました。LuaはWorld of Warcraftのゲームロジックを動かし、Roblox(その方言Luau経由)、Dota 2Garry’s Modで動作し、Redisnginx(OpenResty経由)をスクリプティングし、Adobe LightroomWiresharkを駆動し、下はオペレーティングシステムを持たないロボットに至るまで組み込まれています。127
  • 方針ではなく仕組みを。 Luaを特徴づける選択は、拒むことです。Luaはクラスシステムも、オブジェクトモデルも、パラダイムも提供しません。少数の強力で汎用的な仕組み(テーブル、メタテーブル、コルーチン)を与え、その上に自分自身の抽象を構築させます。「Luaはいかなるオブジェクトモデルやクラスモデルもプログラマーに押し付けない」と設計者たちは書きました。代わりに彼らは「柔軟な仕組みを提供する」ことで、アプリケーションに合うどんなモデルでも構築できるようにしたのです。3
  • 小ささは制約ではなく、ひとつの特長です。 リファレンス実装は小さくきれいで、Lua 5.1のソースはおよそ1万7000行のCであり、ディストリビューション全体がフロッピーに収まり、ビルドされたインタプリタはおよそ143 KBです。たいていのスクリプト言語はこれより一桁大きいのですが、Luaは組み込まれることを目的としているからこそ小さく保たれており、単純さこそが小さく高速な実装を可能にするのです。3
  • 移植性と組み込みやすさは初日からの設計目標でした。 Luaは「クリーンなC」――CとC++の共通部分――で書かれており、「ほとんどのプラットフォームで箱から出してすぐにコンパイルできる」もので、その対象はLinuxやWindowsから携帯機器やマイクロコントローラーにまで及びます。明確に定義されたC APIによって、ホストプログラムがLuaを完全に制御し拡張できます。これこそが、ゲーム業界がLuaを準標準として採用した理由にほかなりません。34

原則

「私たちはLuaをオブジェクト指向言語にしたくなかった。なぜならLuaに対してプログラミングパラダイムを固定したくなかったからだ……Luaはいかなるオブジェクトモデルやクラスモデルもプログラマーに押し付けない。その代わりに……アプリケーションに適したどんなモデルでもプログラマーが構築できるよう、柔軟な仕組みを提供することにした。」 – Roberto Ierusalimschy、Luiz Henrique de Figueiredo、Waldemar Celes、The Evolution of Lua3

たいていの言語設計は方針の積み重ねです。チームが、オブジェクトはこう動くべきだ、エラー処理はああ見えるべきだ、並行性とはスレッドか非同期かアクターのことだ、と決め、それらの決定を言語に焼き込みます。その結果、その言語で書かれるあらゆるプログラムが、その選択を受け継ぐことになります。これらの決定は、たいてい妥当なものです。問題は、それらが決定であること――一度、全員のために、あなたのアプリケーションを知りようのない人々によって下された決定であることです。Ierusalimschyの本能は逆方向に向かいました。あなたの代わりに決めるのではなく、Luaは少数の汎用的な仕組みを手渡して脇に退き、あなたが問題に本当に必要な方針を構築できるようにするのです。3

最も明快な例はオブジェクト指向です。1990年代初頭、オブジェクト指向プログラミングがその誇大宣伝の絶頂にあったとき、ユーザーたちはLuaチームにクラスと継承を追加するよう迫りました。チームは拒みました――OOPが間違っていたからではなく、まったく異なるアプリケーションに組み込まれることを意図した言語にとって、ひとつのモデルを固定することが間違っていたからです。テーブルはデータとメソッドの両方を保持でき、関数が第一級の値であるのだから、オブジェクトとクラスは「必要なら、テーブルで実装できる」と彼らは考えました。3 そこで彼らはオブジェクトシステムの代わりに拡張可能なセマンティクス――テーブルの振る舞いに介入できる仕組み――を作り、継承、デフォルト、読み取り専用ビュー、完全なクラス階層をユーザー自身に組み立てさせました。「拡張可能なセマンティクスはLuaの特徴となった」と彼らは書き、「今日に至るまで、その考えを変えていない」のです。3

その拒みが成り立つのは、それとともに歩む他の三つのこだわりがあるからにすぎません。単純さ――仕組みが理解可能であり実装が正しくあるよう、言語は十分に小さく保たれます。特長としての小ささ――リファレンス実装全体がおよそ1万7000行のクリーンなCであり、アプリケーションにLuaを加えても「肥大化させない」ほど小さいのです。3 そして移植性――CとC++の共通部分で書くことは、同じソースがスーパーコンピュータからセンサーまでどこでもコンパイルできることを意味します。3 あらかじめ決められたボタンが詰まった戸棚ではなく、少数の鋭く汎用的なてこを人々に与え、しかも全体をどこへでも持ち運べるほど小さく保つこと。 それが原則であり、Luaの他のすべては、その帰結なのです。

背景

Roberto Ierusalimschyは1960年5月21日、リオデジャネイロで生まれ、彼のキャリア全体はひとつの機関のそばに留まり続けました――リオデジャネイロ・カトリック大学(PUC-Rio)であり、彼はそこで1990年に計算機科学の博士号を取得し、現在は情報工学の正教授を務めています。ウォータールー大学でポスドクを、スタンフォードで客員教授を務めましたが、PUC-Rioが本拠地であり、Luaの物語はそこにある特定のラボと切り離せません。5

そのラボがTecgraf、コンピュータグラフィックス技術グループです。1987年に産業顧客向けのソフトウェアツールを作るために設立され、その最大級の顧客のひとつが、当時も今もブラジルの石油会社ペトロブラスでした。3 Luaの起源は、ある意味でブラジルの貿易政策をめぐる物語でもあります。1977年から1992年まで、ブラジルはコンピュータのハードウェアとソフトウェアに対して強い貿易障壁――「市場保護」――を維持しました。これは、自国でそれらを作れるし作るべきだという国家主義的な信念に突き動かされたものでした。そうした風潮の中で、Tecgrafの顧客は「政治的にも財政的にも、海外からカスタマイズされたソフトウェアを買う余裕がなかった」のです。外国製のツールを買うことは、「自分たちのニーズがブラジル企業では満たせないことを証明するための、複雑な官僚的手続き」を意味しました。これらの制限は、ブラジルが他の研究拠点から地理的に孤立していたことと相まって、「Tecgrafが必要とする基本的なツールを一から実装する」ことへと導いたのです。3 設計者たち自身の言葉によれば、Luaは「世界的な影響力を獲得した、発展途上国で生み出された唯一の言語」なのです。3

Luaの前には、ふたつの小さな言語があり、どちらもペトロブラスのために作られました。DEL――「データ入力言語」――は、技術者が数字の列を編集する代わりに図上をクリックしてシミュレーターの入力を行えるよう、グラフィカルなフロントエンドを生成しました。3 SOL――「単純オブジェクト言語」――は、レポート生成器のための設定言語で、その型宣言構文はBibTeXの影響を受けていました。3 1993年初頭までに、どちらも当初の範囲を超えて成長していました。DELのユーザーは本格的な制御フローを求め、SOLは手続き的な力を必要としていたのです。1993年半ば、Ierusalimschy、de Figueiredo、Celesは、ふたつをより強力なひとつの言語で置き換えられると結論づけ――こうしてLuaチームが誕生しました。3 名前は、定着した小さな冗談です。SOLはポルトガル語で「太陽」を意味します。Tecgrafの友人Carlos Henrique Levyが、その後継者を「Lua」――ポルトガル語で「月」――と呼ぶことを提案したのです。3 1993年7月までに、Waldemar Celesが最初の実装を完成させました。それはIerusalimschyの指導のもとでの課題プロジェクトとして作られ、「可能なかぎり最も単純なもの」というエクストリーム・プログラミングの信条に従っていました。3

仕事

テーブルとメタテーブル――ひとつのデータ構造、ひとつの仕組み

テーブルから始めましょう。なぜなら、それは言語全体の縮図だからです。Luaはひとつのデータ構造化の仕組み――連想配列を指す用語であるテーブル――を提供し、その単一の構造がレコード、配列、集合、リスト、モジュール、オブジェクトの役割を担います。3 「ほとんどのスクリプト言語は連想配列を提供する」が、「他のどの言語でも連想配列がこれほど中心的な役割を果たすことはない」と設計者たちは述べています。3 レコードはフィールド名をキーとするテーブルであり、配列は整数をキーとするテーブルであり、オブジェクトはたまたまデータとメソッドの両方を保持するテーブルです。ひとつの仕組みで、多くの用途を――これこそ「方針ではなく仕組み」という賭けを、データに当てはめたものにほかなりません。

テーブルをプログラム可能にするてこが、メタテーブルです。通常、テーブルが持たないキーを探すとnilが返ります。しかし、テーブルにメタテーブル――最初のテーブルが異常な状況でどう振る舞うべきかを記述する第二のテーブル――を与えることができます。最も重要なエントリは__indexです。検索が失敗すると、Luaはメタテーブルの__indexを参照し、それは次に探すべき別のテーブルを指し示すことができます。それらを連ねれば、テーブルとただひとつのリダイレクトだけから組み立てられた継承が手に入ります。同じ仕組みは、異なるメタメソッドのもとで、演算子のオーバーロード、デフォルト値、読み取り専用プロキシ、遅延フィールドを与えます。そのどれも、通常の意味での言語機能ではありません――すべてがひとつの仕組みであり、異なる形で使われているだけなのです。3

この仕組みは、まるごと一度に現れたわけではありません――その進化そのものが、抑制についての教訓です。それはLua 2.1(1995年)の「フォールバック」として始まりました。フォールバックとは、「誤った」種類の値に演算が適用されたときにLuaが呼び出すフックで、その先に何が起こるかをプログラマーが決められるようにするものでした。3 テーブル索引のフォールバックは、userdataや他の値が「テーブルとして振る舞う」ことを可能にし、「(委譲による)多くの形の継承」を支えました。3 フォールバックはグローバルでした――イベントごとにひとつのフック――ため、ライブラリ間で共有するのが扱いづらく、Lua 3.0(1997年)はそれを型ごとの「タグメソッド」に置き換えLua 5.0(2003年)はすべてをメタテーブルとメタメソッドに統一しました。これが今日Luaが用いる形です。(「メタテーブル」という用語は、2001年にRici Lakeが提案しました。)3 各段階は、新しい機能を積み重ねるのではなく、仕組みを一般化していきました――言語がクラスシステムの搭載を拒み続けたのと、同じ本能です。

組み込みやすさ、C API、そしてなぜゲームがLuaを採用したのか

Luaは、実のところ独立した言語であることを意図していません。設計者たちはそれを「拡張可能な拡張言語」と呼びます――設定とスクリプティングを通じてホストアプリケーションを拡張するから拡張言語であり、それ自体がC関数で拡張できるから拡張可能なのです。3 その要となるのが、「Luaコードと外部コードの完全な意思疎通を可能にする」明確に定義されたC APIであり、それはLuaとホストの間で値をやり取りするためのきれいなスタックの比喩を中心に作られています。このAPIによって、LuaはCやC++だけでなく、それらを通じてFortran、Java、C#、その他まったく別の言語ともインターフェースできます。3

その見返りはゲームにおいて訪れ、その物語は具体的です。1997年1月、LucasArtsのアドベンチャーGrim Fandangoの主任プログラマーBret Mogilefskyが、ゲームの自作スクリプト言語をLuaに置き換えたこと、そして「ゲームの途方もない量がLuaで書かれた」ことをLuaチームに伝えました。3 Mogilefskyはゲーム開発者会議のラウンドテーブルでそれについて語り、そこから「Luaは口コミでゲーム開発者の間に広まり、ゲーム業界で間違いなく市場価値のある技能となった」のです。3 その相性は構造的なものです。ゲームエンジンは、組み込みのスクリプティング層から恩恵を受ける、まさにその種のホストです――重い処理(レンダリング、物理)は高速なC++に留まり、ゲームロジック、クエスト、振る舞いは、設計者がエンジンを再コンパイルせずに編集・再読み込みできる小さなLuaスクリプトに収まります。小さく、高速で、移植可能で、組み込み可能であることは、まさにゲームが必要としたプロファイルであり、Luaは最初のリリースからそれに合わせて作られていたのです。34

コルーチン、そして小さく高速な実装

三つ目の偉大な仕組みがコルーチンです――そしてOOPと同様、これはチームによる方針の意図的な拒みです。1990年代後半を通じて、ユーザーたちはマルチスレッドを求め、当然の一手は、標準的なプリエンプティブで共有メモリのスレッドモデルを採用することでした。Luaチームはそれを断りました。理由は二つです。Cでプリエンプティブなスレッドを実装するには「ANSI Cの一部ではない」プリミティブが必要であり、それはLuaの移植性を損なったはずだということ。そしてより根本的には、「私たちは標準的なマルチスレッドモデルを信じていなかった(し、今も信じていない)」ということです。そこでは「『a=a+1』が決定的でない言語では、誰も正しいプログラムを書けない」のです。3 そこでチームはスレッドの代わりに、Lua 5.0(2003年)でコルーチンを出荷しました。これは、関数が自らを中断し、後で中断したまさにその地点から再開できる、協調的で非プリエンプティブなマルチタスクのための仕組みです。3 コルーチンは並行性の表現力――ジェネレータ、協調スケジューラ、状態機械――を、共有メモリのスレッドを正しく扱うことをあれほど難しくしている非決定性なしに与えます。またしても、方針ではなく仕組みなのです。

そのすべての下には、小さいからこそ高速な実装があります。Luaの仮想マシンはLua 4.0までスタックベースでしたが、Lua 5.0でレジスタベースになり、それはコード生成器に最適化の余地を与え、典型的なプログラムが実行するVM命令の数を減らしました。設計者たちは「Lua 5.0の仮想マシンは、広く使われた最初のレジスタベース仮想マシンだった」と述べています。3 メモリはインクリメンタルなガベージコレクタ(Lua 5.1で導入)によって管理され、長い「世界を止める」一時停止ではなく、小さなステップで作業を行います――ゲームの実時間ループにとって重要なことです。3 独立したベンチマークはLuaをインタプリタ式スクリプト言語の中で最速の部類に位置づけており、設計者たちの説明によれば「Adobe Lightroomの40%超がLuaで書かれている」、およそ10万行ほどになるほど高速なのです。3

Luaプログラミング言語

Luaの広がり――World of WarcraftからOSを持たないロボットまで

すべてを足し合わせると、Luaは膨大な範囲のソフトウェアの、目に見えないスクリプティング層となりました。ゲームでは、World of Warcraftがそのインターフェース全体をLuaに公開し、プレイヤーがアドオンを書けるようにしています。RobloxはLuaの方言Luauを、何百万もの若い創り手がコーディングを学ぶ言語として築きました。Dota 2CrysisGarry’s Modもそれを組み込んでいます。1 ゲーム以外では、Redisがデータベース内部でLuaスクリプトをアトミックに実行し、nginxはOpenRestyディストリビューションを通じて、ウェブサーバー自体をプログラムするのにLuaを使います。Adobe LightroomWiresharkは、かなりの部分がLuaの上に築かれており、NeovimはLuaを第一級の設定・プラグイン言語として採用しました。1 そして、インタプリタが小さく移植可能であるため、Luaはほとんど何も持たないハードウェアにまで手を伸ばします――設計者たちは、RoboCupで優勝したロボットCrazy Ivanの話を語っています。その「頭脳」は「下にいかなるオペレーティングシステムもなしに、Motorola Coldfire 5206eプロセッサ上で直接Luaを動かしていた。言い換えれば、Luaがオペレーティングシステムだったのだ」。7 リオのラボで貿易制限のもとに作られたひとつの小さな言語が、結局どこにでも行き着きました――それは、ほとんど何も要求せず、残りを構築するためのてこをあなたに与えたからなのです。

方法

DEL、SOL、メタテーブル、コルーチン、そして言語を肥大化させることを30年拒み続けてきた歩みを横断して読むと、同じ手つきが繰り返し現れます。Ierusalimschyの方法は、スローガンというより、一連の不変のこだわりです。

方針ではなく仕組みを出荷する。 その特徴的な習慣は、汎用的なてこを提供し、それがどう使われるべきかを決めることを拒むことです。組み込みのクラスシステムも、固定された並行性モデルもなく――ただテーブル、メタテーブル、コルーチンがあり、そこからアプリケーションが必要とするものを何でも構築します。この一般的な教訓は言語設計をはるかに超えて当てはまります。最も長持ちする道具とは、解決策の形を指図することなく能力を授けるものなのです。それはGuido van Rossumの「ひとつの明白なやり方」の対極にあり、その対比こそが核心です――どちらも一貫しており、自分の道具がどちらの哲学を体現すべきかを知ることが、実際の決定なのです。3

正しくあり、どこへでも運べるほど小さく保つ。 Luaのリファレンス実装はおよそ1万7000行のクリーンなCであり、他のスクリプト言語より一桁小さく、その小ささは意図的な特長です――それこそが、言語を組み込み可能に、移植可能に、信頼できるものにするのです。その規律は、もうひとつ取り除けば壊れるところまで削り続けることであり、それがLuaをARMにおけるSophie Wilsonの容赦ない最小主義のソフトウェア版にしています――荷重を支える本質まで削ぎ落とし、効率はおまけとして手に入れるのです。それは言語ランタイムの水準におけるminimum worthy productです。3

求められた機能には、その下にある仕組みを見つけるまで抵抗する。 ユーザーがオブジェクトを求めたとき、Luaは拡張可能なセマンティクスを与えました。スレッドを求めたとき、コルーチンを与えました。そのたびにチームは個別の方針を断り、ユーザー自身が方針を構築できる、より汎用的な仕組みを出荷し――そして肝心なことに、何年経ってもその考えを変えませんでした。3 それは機能要求に当てはめた証拠の関門です。求められたからその物を加えるのではなく、それがどんな問題を解くのか、すでに手にしている仕組みでそれを解けないかを突き止めるのです。

一般化せよ、蓄積するな。 メタテーブルはまるごと一度に現れたのではありません――フォールバックからタグメソッド、メタメソッドへと育ち、各段階は前の仕組みのかたわらに新しい機能をねじ込むのではなく、より汎用的なものに置き換えました。3 その教訓は、追加によってではなく統一によって進化させること、それによって言語は同じ大きさのまま、より能力を増していくということです――それはトンプソンとリッチーが、小さく組み合わせ可能な部品からUnixを築く際に用いたのと、同じ手段の倹約です。

制約に道具を設計させよ。 Luaが存在するのは、ブラジルの貿易障壁がTecgrafに自前のソフトウェアを作ることを強いたからであり、その移植性が存在するのは、ラボの顧客が「実に多様なコンピュータプラットフォームの集まり」を使っていたからです。3 それらの制約を足かせとして扱うのではなく、Ierusalimschyはそれらに設計を駆動させ、潤沢な資源を持つチームならおそらく作らなかったであろう、より小さく、よりきれいで、より移植性の高いものへと向かわせました――真剣に受け止められた稀少さは、言い訳ではなく設計の道具である、という教訓です。3

影響の連鎖

彼を形づくった者たち

Schemeとリスプの伝統。 設計者たちは「SchemeのLuaへの影響は次第に増していった」と明言しており、それは「とりわけ無名関数と完全なレキシカルスコープの導入とともに、ひとつの霊感の源」となりました。3 Schemeと同様、Luaは動的型付けであり、関数を普通の第一級の値として扱い、コアを小さく保ちます――言語は大きさではなく最小性によって強力になりうる、という信念です。(形成的影響)

DELとSOL、ふたつの小さな言語。 Luaは理論から生まれたのではなく、ペトロブラスのために作られたふたつのドメイン固有言語から育ちました。SOLはデータを記述するためのテーブル構築子の構文を提供し、両者の経験は「複雑なアプリケーションの大部分は組み込み可能なスクリプト言語を使って書ける」ことをチームに教えました――彼らの言葉によれば、Luaの誕生が拠って立った気づきです。3(直接的影響)

ブラジルの市場保護。 1977年から1992年まで続いた貿易障壁は、ありそうにないが本物の影響です。それは、そもそもなぜTecgrafが自前のツールを作ったのかの理由であり、その顧客のプラットフォームの多様性こそが、移植性を第一級の設計目標にした理由です。政策が言語を作ったのです。(形成的影響)

彼が形づくった者たち

ゲーム業界のスクリプティング層。 Grim Fandango以降、Luaはゲームロジックを組み込むための準標準となり、それが広めたパターン――高速なエンジンはC++で、編集可能な振る舞いは組み込みスクリプトで――は、いまや標準的な実践です。RobloxのLuauは、ひと世代の子どもたちにLuaの方言でプログラミングを教えてきました。(分野を定義する影響)

組み込みおよびシステムソフトウェア。 Redis、nginx/OpenResty、Wireshark、Neovim、そして数えきれない機器が、まさにそれが要求するものがあまりに少ないがゆえに、Luaをスクリプティング層として採用しました。データベースからネットワークアナライザ、ベアメタルで動くロボットにまで手を伸ばす言語は、ほとんどありません。

小ささを尊ぶ言語設計者たち。 Luaは、小さくパラダイムに依らないコアが、組み込みという用途において、大きく主張の強い言語を凌駕しうることの、働く証明として立っています――それ以来、あらゆる最小ランタイムや「フレームワークより仕組み」の設計を貫いて響く論証です。

一本の筋

Ierusalimschyは、道具がどれだけあなたの代わりに決めるべきかという、このシリーズの長い論争の一方の極に立っています。Guido van RossumはPythonを「それをするための明白なやり方がひとつあるべきだ」の上に築き、バッテリー同梱で出荷しました――言語は主張を持ち、それに従うことが最小抵抗の道です。Bjarne StroustrupはC++を、ほとんどあらゆるパラダイムを表現できるほど豊かに築き、その豊かさを大きさと複雑さで支払いました。Ierusalimschyは両者とは逆の道を行きました――方針をほとんど出荷せず、機能をほとんど出荷せず、ただ少数の汎用的な仕組みと1万7000行のランタイムを出荷し、残りはユーザーに構築させたのです。彼はSophie Wilsonのソフトウェア版です。彼女のARMは2万5000個未満のトランジスタまで削ぎ落とされることで勝ちました――LuaはCにおける同じ容赦ない小ささであり、ARMの偶然の低消費電力と同じく、その小ささこそが、誰も設計時に意図しなかった領域(組み込み)を制覇させた当のものだったのです。van Rossumがこれが明白なやり方だと言い、Stroustrupがこれがあらゆるやり方だと言うところで、Ierusalimschyはこう言います――ここにてこがある。何を作るかはあなたが決める。そして私は、全体をどこへでも運べるほど小さく保とう。(シリーズの橋渡し)

私がここから受け取るもの

Ierusalimschyから私が留め置く教訓は、誰かに手渡せる最も強いものは、方針ではなく仕組みであるということです。道具を作るとき、それがどう使われるべきかについての自分の意見を焼き込みたくなる――クラスシステムを、フレームワークを、唯一の祝福されたワークフローを出荷したくなるものです。Luaのキャリア全体が、その逆こそがより良く老いていく、という論証です。オブジェクトモデルを固定することを拒み、代わりにメタテーブルを出荷することで、言語はユーザーに、設計者たちが想像もしなかった継承の仕組みを、彼らが予期もしなかったゲームやデータベースやエディタの中で構築させました。いま私が何かを作るとき、Luaから借りる問いは、自分が決定を出荷しているのか、それとも能力を出荷しているのか、というものです――なぜなら、決定はいま見えている事例に仕えるが、能力は見えていない事例に仕えるからです。

二つ目の教訓は、小ささは耐え忍ぶ制約ではなく、守るべき特長であるということです。30年にわたるユーザーの圧力のなかで、Luaをクラスのキーワードとスレッドライブラリと何でも揃った標準フレームワークを備えた大きな言語へと成長させることは、たやすかったでしょう。チームは拒み、その拒みこそが、Luaがフロッピーに収まり、どこでもコンパイルでき、ロボットのベアメタルの頭脳に組み込まれる理由です。小さく留まる規律――蓄積ではなく一般化し、その下にある仕組みを見つけるまで機能を断る規律――は、加える規律よりも難しく、はるかに価値があります。それは抑制として読まれた品質こそが唯一の変数です。正しく小さなものを、何十年も守り抜けば、それは他のすべてが上に立てる基盤となるのです。

FAQ

Roberto Ierusalimschyとは誰で、何を生み出したのですか?

Roberto Ierusalimschyはブラジルの計算機科学者で、1960年にリオデジャネイロで生まれ、PUC-Rioの情報工学の正教授です。彼は1993年にPUC-RioのTecgrafラボで、Luiz Henrique de FigueiredoおよびWaldemar Celesとともに生み出した、小さく高速で組み込み可能なスクリプト言語Luaの主任設計者です。また、書籍Programming in Luaの著者であり、パターンマッチングライブラリLPegの作者でもあり、言語の主要な歴史「The Evolution of Lua」を共同執筆しました。356

Luaにおける「方針ではなく仕組み」とは何を意味しますか?

それは、Luaが固定された決定を押し付けるのではなく、少数の強力で汎用的な仕組みを与える、という意味です。最も明快な例はオブジェクト指向です。Luaには組み込みのクラスシステムがありません。代わりにテーブル(データとメソッドの両方を保持できる)とメタテーブル(テーブルの振る舞いをカスタマイズできる)を提供し、継承やクラス、その他どんなオブジェクトモデルでも、あなた自身が構築します。設計者たちは「Luaはいかなるオブジェクトモデルやクラスモデルもプログラマーに押し付けない」と書き、代わりに「柔軟な仕組みを提供する」ことを選びました――1993年以来保ち続けている姿勢です。3

なぜLuaはゲームと組み込みシステムでこれほど広く使われているのですか?

それは、Luaが最初から、小さく、高速で、移植可能で、組み込みやすいように設計されたからです。リファレンス実装はほぼどこでもコンパイルできるおよそ1万7000行のクリーンなANSI Cであり、ビルドされたインタプリタはおよそ143 KBで、明確に定義されたC APIによってホストプログラムがLuaを完全に制御できます。そのプロファイルは、ゲームエンジンや組み込み機器が必要とするものそのものです――重い処理はC/C++で、編集可能なロジックは小さなスクリプトで――だからこそWorld of WarcraftRoblox(Luau経由)、Redis、nginx/OpenResty、Adobe Lightroom、そして下はベアメタルのロボットに至る機器をスクリプティングしているのです。137

「Lua」という名前はどこから来たのですか?

Luaはポルトガル語で「月」を意味します。それは、SOL――「単純オブジェクト言語」、そしてポルトガル語で「太陽」――と呼ばれる、より古いTecgrafの言語の後継者として名づけられました。Tecgrafの同僚Carlos Henrique Levyが新しい言語に「Lua」という名前を提案し、太陽から月への流れを完成させたのです。プロジェクト全体は、ブラジルの石油会社ペトロブラスのために作られたふたつの小さな言語、DELとSOLから育ちました。3


出典


  1. “Lua (programming language),” Wikipedia。Luaは1993年に、ブラジルのリオデジャネイロ・カトリック大学(PUC-Rio)のコンピュータグラフィックス技術グループ(Tecgraf)で、Roberto Ierusalimschy、Luiz Henrique de Figueiredo、Waldemar Celesによって生み出された。ANSI Cで実装され、MITライセンスで、Lua 5.0以降はレジスタベースの仮想マシン、ガベージコレクション、コルーチン、第一級の関数を備える。近年のリファレンス実装は依然として小さい(記事はLua 5.5.0がおよそ3万2000行のCから成ると記している)。記録されている利用者には、ゲームWorld of WarcraftRoblox(Luaの派生であるLuauを開発した)、Dota 2CrysisGarry’s Mod、およびRedis、nginx(OpenResty経由)、Adobe Lightroom、Wireshark、Neovimを含む非ゲームソフトウェアがある。 

  2. “Roberto Ierusalimschy: Known for Lua Programming Language,” machaddr(伝記的プロフィール)。IerusalimschyのLuaの作者および主任アーキテクトとしての役割を要約している。LuaはPUC-RioでLuiz Henrique de FigueiredoおよびWaldemar Celesとともに開発され、1993年に初めてリリースされた。World of WarcraftやAdobe Lightroomを含むソフトウェアでのLuaの世界的な利用、彼のProgramming in Luaの著述、およびLPegライブラリの作成について述べている。 

  3. Roberto Ierusalimschy、Luiz Henrique de Figueiredo、Waldemar Celes、“The Evolution of Lua,” Proceedings of the Third ACM SIGPLAN Conference on the History of Programming Languages (HOPL III), 2007。一次資料。”Lua is a scripting language born in 1993 at PUC-Rio.” “From the start, Lua was designed to be simple, small, portable, fast, and easily embedded into applications.” 単一のデータ構造について:”it offers a single kind of data structure, the table.” “clean C,” “the intersection of C and C++” で実装され、”compiles out-of-the-box on most platforms.” 小さなサイズ:Lua 5.1のソースは “around 17,000 lines of C”、tarballは “fits comfortably on a floppy disk”、”the Lua interpreter built with all standard Lua libraries takes 143K.” “over 40% of Adobe Lightroom is written in Lua (that represents around 100,000 lines of Lua code).” ブラジルの貿易政策について:”From 1977 until 1992, Brazil had a policy of strong trade barriers (called a ‘market reserve’) for computer hardware and software”、そして “those reasons led Tecgraf to implement from scratch the basic tools it needed”。Luaは “the only language created in a developing country to have achieved global relevance.” 前身のDEL(”data-entry language”)とSOL(”Simple Object Language”)。命名:SOLはポルトガル語で太陽であり、”a friend at Tecgraf (Carlos Henrique Levy) suggested the name ‘Lua’ (moon in Portuguese), and Lua was born.” 最初の実装は1993年7月に “the simplest thing that could possibly work” に従って完成した。「方針ではなく仕組み」について:”we did not want to turn Lua into an object-oriented language because we did not want to fix a programming paradigm for Lua”;”Lua does not force any object or class model onto the programmer”;”we decided to provide flexible mechanisms that would allow the programmer to build whatever model was suitable to the application”;”Extensible semantics has become a hallmark of Lua.” 仕組みの進化:fallbacks (Lua 2.1, 1995) → tag methods (Lua 3.0, 1997) → metatables and metamethods (Lua 5.0, 2003);テーブル索引のフォールバックは “many forms of inheritance (through delegation)” を支えた;”metatable” という用語は2001年にRici Lakeが提案した。Luaは “an extensible extension language” で、C APIが “full communication between Lua code and external code” を可能にする。ゲーム:1997年1月、LucasArtsのGrim Fandangoの主任プログラマーBret Mogilefskyが “a tremendous amount of the game was written in Lua” と報告し、その後 “Lua spread by word of mouth among game developers to become a definitely marketable skill in the game industry.” 並行性:プリエンプティブなスレッドの実装には “not part of ANSI C” のプリミティブが必要であり、”we did not (and still do not) believe in the standard multithreading model… no one can write correct programs in a language where ‘a=a+1’ is not deterministic”;協調的マルチタスクはコルーチン経由でLua 5.0(2003年)に提供された。VM:”Since Lua 5.0, the virtual machine is register-based”、そして “the virtual machine of Lua 5.0 was the first register-based virtual machine to have wide use”;インクリメンタルなガベージコレクションはLua 5.1で現れる。 

  4. “Lua: about,” Lua.org(公式サイト)。”Lua is a powerful, efficient, lightweight, embeddable scripting language.” それは “implemented as a small library of C functions, written in clean C, the common subset of Standard C and C++” であり、”runs on all kinds of Unix and Windows systems, as well as on mobile devices… embedded microprocessors… and IBM mainframes.” Luaを “simple procedural syntax with powerful data description constructs based on associative arrays and extensible semantics” を組み合わせ、動的型付け、インクリメンタルなガベージコレクションによる自動メモリ管理を備え、”fast” かつ “portable” であると説明している。 

  5. “Roberto Ierusalimschy,” Wikipedia、彼の“faculty profile,” PUC-Rio情報工学科によって裏づけられている。1960年5月21日、ブラジルのリオデジャネイロ生まれ;PUC-Rioで計算機科学の博士号(1990年);PUC-Rioの情報工学の正教授;ウォータールー大学でのポスドク研究、スタンフォードでの客員教授(2012年)。Luaプログラミング言語の作者かつ主任アーキテクト、Programming in Lua(四版)の著者、そしてパーシング表現文法を実装するためのLuaライブラリLPegの開発者。 

  6. “Programming in Lua,” by Roberto Ierusalimschy, Lua.org。Luaに関する公式の書籍で、その主任設計者によって書かれ、言語の設計と利用を記述している;初版はオンラインで自由に入手できる。唯一のデータ構造化の仕組みとしてのテーブル、拡張可能な振る舞いのためのメタテーブル、第一級の関数、協調的マルチタスクのためのコルーチンを中心としたLuaの設計を補強している。 

  7. Roberto Ierusalimschy、Luiz Henrique de Figueiredo、Waldemar Celes、“The Evolution of Lua,” HOPL III, 2007、組み込み利用についての脚注。”Crazy Ivan, a robot that won RoboCup in 2000 and 2001 in Denmark, had a ‘brain’ implemented in Lua. Lua ran directly on a Motorola Coldfire 5206e processor without any operating system (in other words, Lua was the operating system). Lua was stored on a system ROM and loaded programs at startup from the serial port.” Luaのベアメタル組み込み機器への到達を示しており、その小さく移植可能な実装の帰結である。 

関連記事

エンジニアリング哲学:Guido van Rossum、可読性は重要だ

Guido van RossumはPythonを、たったひとつの賭けの上に築きました。コードは書かれるよりもはるかに多く読まれる——だからこそ言語そのものを、その行を読む人間のために最適化すべきだ、という賭けです。

1 分で読める

エンジニアリング哲学:グレース・ホッパー、コンピューターに人間の言葉を話させる

グレース・ホッパーは、プログラムを人間の言葉で書けるよう最初のコンパイラーを作り、ナノ秒のワイヤーでレイテンシーを物理的なものに変え、古びた教条と闘い続けました。

1 分で読める

The Shader Gallery That Lied: Debugging 216 WebGL Presets

A user said the shader playground looked broken. Pixel-readback testing found 30 dead presets, 11 that never compiled, a…

11 分で読める