Intro
前置きが長くなりましたが、私は Lua でほとんどプログラミングをしたことがありません。 私はこの超簡単なゲームを作り、現在別のゲームに取り組んでいます。 しかし、Lua でプログラミングすることの欠点がいくつか見えてくるには十分でした。
不満
以下は私の3つの主な不満です。
1) 動的で(やや)弱い型付け
2) すべてが実行時エラー
3) クラス
例
動的型付け/型注釈の欠如
具体例として関数を見てみます。
function Ent:update_state(cmd, params) if cmd == 'at' then self.x, self.y = params.x, params.y endend
まず、関数そのものを読むことが難しくなります。 この関数は何を取り込んでいるのでしょうか。 そして、何かあるとすれば、何を返すのでしょうか。 関数のシグネチャを見ても、この情報は得られません。 代わりに、関数の本文を読まなければならない。 単純な関数であれば、これで問題ありません。
さらに、関数呼び出しの読み取り/書き込み/デバッグが困難になります。 cmd
にはどんな型の値でも渡すことができる! ent:update_state(4, …)
を実行すると、ent
は更新されません。 しかし、これを型エラーとして捕らえるのではなく、実行時にデバッグしなければなりません。
一般に、動的型付けを持つ言語は読みにくくなります。 変数の型を知りたい場合、型アノテーションをちらっと見たり (例: Java)、REPL で型を確認したり (例: ghci を使用して Haskell の型を確認) することができず、コードの実行経路について考えなければならない。 Hack言語は一つの例外です。 これは動的型付けですが、静的な型チェックが可能です。 Luaでは、動的型付け言語の長所と短所を全て得ることができます。 コードを書くのは非常に簡単ですが、正しさを保証するのは同じぐらい難しいのです。
Runtime/Silent Errors
function test_func(test_arg) print(test_arg)endtest_func() -- prints 'nil'
ここで、私がよく遭遇するシナリオがあります。 私は関数を追加/削除/変更する必要があります。 そこで、私は関数を変更し、それから、回り回ってすべての呼び出しを変更します。 プロジェクト全体を検索し、呼び出しを 1 つずつ更新することができます。 しかし、もし一つを見逃したらどうでしょう? あるいは、新しい呼び出しを追加して、関数を変更したことを忘れてしまったらどうでしょう? そうです、ランタイムエラーです。
Random other example: 4 / 0 = inf
.
No Classes
There’s this, which works okay.これはエラーになりません。 しかし、これはまだ多くの素晴らしい OO 機能を欠いています。例えば、メソッドの可視性とインターフェイスなどです。 前者がないと、コードのどこからでもオブジェクトの状態を変更するのが非常に簡単になり、オブジェクトの状態について推論するのが非常に難しくなります。 実はこれを書きながら、ちゃんと勉強したんですよ。 私はグローバルなスコープについて文句を言うつもりでしたが、これを見つけました。 型強制については文句を言おうと思ったが、それほど悪くはない(文字列とint型でのみ発生する)。 そして、Luaの型付きバージョンがあることが判明しました! 私はまだ試していませんが、期待できそうです。 もしこれを読んでいる人で typedlua を試した人がいたら、コメントでどんな感じか教えてください。
なぜ私は文句を言うのでしょうか。
これらすべてのことについて文句を言うのは、ちょっと馬鹿らしく見えるかもしれないことを理解しています。 Lua は軽量なスクリプト言語です。私が上に挙げたものは、常に短所というわけではありません。 Lua は大規模で複雑なアプリケーションを構築するために設計されているわけではありません。 しかし、だからこそ、私はこれをLove2D subredditに投稿しているのです。 LuaとLove2Dを使って、かなり大規模で複雑なゲームを作っている人たちがいるようなのです。 例えば、Mari0、Warlock’s Towerなどです。 彼ら(あなた?)はどのようにしているのでしょうか? Lua/Love2Dで「正統派」のゲームを作るなんて、私にはとても想像できません。 もし私が1週間休んだら、コードの半分を忘れてしまうでしょうし、変数や関数の型を理解するのに時間がかかりすぎてしまいます。 ゲームでは通常、Luaを「接着剤」のような言語として使用し、残りはC/C++で実装するのでしょうか? 上記のような問題があるとしても、Luaで大規模なゲームを作るのは、他の言語よりも簡単なのでしょうか?
これを読むのに時間を割いてくれてありがとうございます :D. そして、もし私が上で何か間違っていたら、教えてください!
Interestaining reads:
Lua: 良い部分、悪い部分、醜い部分
Weak and Strong Typing
…