3

Lua のスタンドアロン インタープリターのソース コードを見てきましたが、これまでのところ理解できませんでした。

おそらく私のグーグル スキルが使い果たされているのでしょうが、それがどのように機能するかについての適切な説明を見つけることができませんでした。Lua のコードは、読みやすさではなく、パフォーマンスのために最適化されているようです。

4

2 に答える 2

6

速度の知覚には、スクリプトのコンパイルとスクリプトの実行の 2 つのソースがあります。

スクリプトのコンパイルでは、優先式パーサーと組み合わせた再帰降下パーサーが使用されます。http://www.lua.org/source/5.1/lparser.c.htmlを参照してください。

スクリプトの実行により、仮想マシンの命令が解釈されます。このマシンは、Lua のセマンティクスに特化しているため、またレジスターベースの仮想マシンであるため、高速です。これは、以前のバージョンの Lua で使用されていたスタックベースの仮想マシンよりも高速です。http://www.lua.org/source/5.1/lopcodes.h.htmlを参照してください。

于 2013-11-13T19:15:33.270 に答える
6

大まかに言えば、Lua コアは、まずソース テキストをバイトコードと呼ばれる中間形式にコンパイルし、それをインタープリターによって実行することによって動作します。バイトコードへのコンパイルは、コストのかかる字句解析と構文解析を 1 回だけ実行することでパフォーマンスを向上させ、コンパイル フェーズなしでは実行が非常に困難な最適化の機会を提供することでパフォーマンスを向上させます。バイトコードはレジスタ仮想マシンの機械語です。Lua のセマンティクスにうまく対応し、簡単に解釈できるように設計されています。

スタンドアロンの実行可能ファイルは、単に Lua コアをロードし、名前付きスクリプトの前に有効になるオプション ( や など-l)-eに作用し、名前付きスクリプトをコンパイル、ロード、実行し、通常の方法で OS にステータスを返します。

エラーが一貫して処理されるlua.cように、Lua 状態の作成を除くすべての実際の作業をpmainで行うのではなく、関数に委譲することが での混乱の 1 つmainです。これによりpmain、保護されたコンテキストで を呼び出すことができるため、スローされたエラーは の異常終了を引き起こすのではなくキャッチされますmain

Lua のコアのソースは不明ですが、非常によく文書化されています。それを深く理解するには、コンパイラ設計、言語設計、仮想マシン、および関連トピックのかなりの背景知識が必要です。

この言語、その実装、およびその応用に関する学術論文は数多くあります。それらは、特定の決定が行われた理由に関する情報の宝庫を提供し、場合によっては後で修正されます。

Lua User's Wikiには、言語のいくつかの機能の内部メカニズムの調査に特化したページがいくつかあり、その使用と拡張に関する多くのコンテンツがあります。

最後に、標準ライブラリ モジュールのソース コードは、コアのソースよりもはるかにアクセスしやすいことを述べておきます。外部ライブラリをLuaに接続するためのテクニックの確かな例を常に提供します。

于 2013-11-13T19:28:36.777 に答える