2009-05-02 14 views
16

コンパイル時に型チェックされるLuaフロントエンドコンパイラを探していますが、標準のLua 5.1バイトコード(実行時型のみを持つ)を出力します。私が望むのは、静的なコンパイル時の構文解析とオプションの型定義で、実行時よりも早いエラーを早期に検出することです。結果として得られるバイトコードは、標準のLoadString()でコンパイルされた既存のLuaバイトコードとうまくやりとりする必要があります。スタティック型Lua

明確にするには、バイトコンパイル時にのみ違いがあります。実行時に、バイトコードは、コンパイルフェーズで異なる/珍しいことが起こったことを全く知らないでしょう。

私が心に留めていることは、ActionScriptとよく似ています。私はLuaバイトコードを出力するActionScriptコンパイラを気にしません!

誰もそのような努力を聞いたことがありますか?私はこれを行うためにMetaLuaを使用することについていくつかの参照を見てきましたが、正直なところ私は十分に彼らの文書の末尾を作るために明るくないです

+6

ちなみに、あなたは強いタイピングを言っていますが、私は静的タイピングを意味すると思います。違いがあります。たとえば、Pythonは強く型付けされていますが、動的に型付けされています。 Cは弱く型付けされていますが、静的に型付けされています。 – Zifre

答えて

14

2005年夏に、私はで、Luaのコンパイル時の型推論を行うという問題について、おそらくアノテーションの助けを借りて作業しました。この問題は非常に難しいことが判明しました! (私の生徒が短いテクニカルノートを書きましたが、それは本当に一般的な循環のためのものではないです。)

私はあなたが提起している問題を解決したい場合は、双子の制約と、それは重要な静的な型がをチェックしていることを許可しことは、標準のバイトコードコンパイル済みLuaコードと相互運用しますは、これら2つの制約を満たすために、から新しい言語を設計します。相当な量の作業になりますが、Luaにタイプシステムを改造しようとするよりもはるかに簡単です。

+0

私はあなたが言っていることを聞いています。私はこれに多くの考えを入れてきましたが、最も基本的なケース(つまりローカルx:int = "hello"をエラーとして捕捉)は非常に単純ですが、テーブルや関数から型付きタプルを返す。 しかし、Adobeでそれらの人はJavascriptでそれを理解しました! – Armentage

+0

テーブルとそれらが無限に使用される方法は間違いなく問題です。アノテーションをたくさん用意したい場合は、おそらくもっと簡単になるでしょう。 –

+2

ノーマン、知識を共有する必要があります。私はあなたの研究の結論が何であったかを学ぶことにとても興味があります! – alphazero

4

そのようなものはありません。これを行うためにMetaLuaを拡張することは可能かもしれませんが、誰もそれをやっていません。そしてAFAIK、そうする計画はありません。 Luaは動的言語を意図しています。静的に型指定された言語が必要な場合は、それを使用してください。

あなたが本質的に探しているのは、JavaやC#のようなものです。その場合、Lua.NETのようなプロジェクトを使って、既存のLuaコードをC#と統合することができます。 Javaの場合はKahluaもあります。

+0

私はLUA.NETを探していません。 LUA.NETは、ある種の.NETランタイムを意味します。 .NETランタイムは、LUA ByteCode VMのようなものではありません。私が探しているのは、バイトコンパイル時に強い型付けを適用し、コンパイル時に異常に何か起こったことに気付かずに結果のコードを実行するだけです。 – Armentage

+0

残念ながら、私はすでに大きな(そして成長している)LUAコードベースを扱っています。 LUAの性質上、既存のライブラリコードの変更はほとんど不可能です。言語の基本的な感覚を必ずしも変更することなく、*オプションの*強タイピングフロントエンドがこの問題を解決します。 – Armentage

+5

@Armentage、Luaは頭字語ではなく、固有名詞です。それは "LUA"ではなく "Lua"と書かれています。正式な記事については、http://www.lua.org/about.html#nameを参照してください。 – RBerteig

6

this Metalua blog postを参照してください。

-{ extension "types" } 

function sum (x :: list(number)) :: number 
    local acc :: number = 0 
    for i=1, #x do acc=acc+x[i] end 
    return acc 
end 

これは実行時の解決策のようです。

とにかく、Metalua mailing listで質問してください。 Luaの構文を拡張したい場合、Metaluaが最初に目にするツールです。

P.S. never write Lua as all-capsをお願いします!

3

Dyla'14で公開されたPUC-Rioの新しいペーパー「Typed Lua:Luaのオプションタイプシステム」があります。 http://dl.acm.org/citation.cfm?id=2617553

これは、「Luaスクリプト言語のオプションの型付き拡張であるTyped Luaの初期設計」についてです。それはまだ進行中であり、タイプシステムは比較的単純です。型推論/型チェックツールは提供されていません。

metaluaベースのタイピングシステムについては、タイダルロック:オプションの静的型チェックとFabienのLuaの推論。 http://lua-users.org/lists/lua-l/2013-02/msg00403.html

+0

Dyla14用紙のスライドは利用可能です:http://www.lua.org/wshop14/Murbach.pdf –

4

この質問は、6歳...しかし、ここで新しい答えです:http://terralang.org/

と同様にC、テラは 手動メモリ管理をシンプル、静的型付け、コンパイル言語です。しかし、Cとは異なり、それは からLuaとの相互運用を開始するように設計されています。 Terra関数はファーストクラスです terraキーワードを使用して作成されたルア値。必要なときには マシンコードにJITコンパイルされます。

+1

これは実際にはかなりクールに見えます。 – Tomis

2

ラヴィ はhttps://github.com/dibyendumajumdar/ravi

はラヴィプログラミング言語が限られたオプションの静的型付けとLLVMとlibgccjitベースのJITコンパイラ

とのLua 5.3の誘導体である、私は本当に(上記参照テラでプログラミングを楽しむもあります)