17

私は現在、Lua を組み込み、それを美化されたインテリジェントな構成ファイルとして使用しています。しかし、人々が Lua の使い方を絶賛しているので、何かが足りないと思います。

たとえば、次の例を示すことで、C の代わりにシェル スクリプトを使用する理由を簡単に説明できます (確かに、boost regexp はやり過ぎです)。

#include <dirent.h> 
#include <stdio.h> 
#include <boost/regex.hpp>

int main(int argc, char * argv[]) {
    DIR           *d;
    struct dirent *dir;
    boost::regex re(".*\\.cpp$");
    if (argc==2) d = opendir(argv[1]); else d = opendir(".");
if (d) {
    while ((dir = readdir(d)) != NULL) {
            if (boost::regex_match(dir->d_name, re)) printf("%s\n", dir->d_name);
    }

    closedir(d);
}

return(0);

それを次と比較します。

for foo in *.cpp; do echo $foo; done;

Luaで「クリック」できる例はありますか?

EDIT:おそらく私の問題は、Cコードを書く方が簡単だとわかっているので、Luaを流暢に使用するのに十分な知識がないことです。

EDIT2:

1 つの例は、C++ と Lua でのおもちゃの階乗プログラムです。

#include <iostream>

int fact (int n){
    if (n==0) return 1; else
    return (n*fact(n-1));
}

int main (){
    int input;
    using namespace std;
    cout << "Enter a number: " ;
    cin >> input;
    cout << "factorial: " << fact(input) << endl;
    return 0;
}

ルア:

function fact (n)
    if n==0 then
        return 1
    else 
        return n * (fact(n-1))
    end
end

print ("enter a number")
a = io.read("*number")
print ("Factorial: ",fact(a))

ここでは、プログラムは似ていますが、明らかに、include、namespace、および main() の宣言には、削除できる不備があります。また、変数宣言と強い型付けを削除します。

今、人々はこれがより大規模なプログラムに追加される利点であると言っていますか、それともそれ以上のものがあるのでしょうか? これは、bash の例と同じようには目立ちません。

4

9 に答える 9

13

Lua などのスクリプト言語を使用すると、他にも多くの利点があります。

Lua と C++ の利点:

  • あなたの例のように、高レベルの性質により、開発時間の点でより短いことがよくあります。
  • 動作を変更するために再コンパイルする必要はありません。
  • 非開発マシンでは動作を変更できます。
  • 実行時にロジックを微調整するだけでよいため、プロトタイピングは非常に迅速かつ簡単です。
于 2009-06-02T17:45:27.670 に答える
5

スクリプト言語を使用すると、複雑な GUI を構築するために必要な労力が軽減されます。そうでなければ、多くのフレームワークの接着剤とコードの繰り返しが必要になります。wxWidgetsIUP toolkitなど、いくつかの GUI ツールキットが Lua バインディングで利用できます。

これらのバインディングの両方で、ファースト クラスの関数値と完全なクロージャーにより、イベント コールバックのコーディングと使用が容易になります。

コアに Lua を使用する大規模なアプリケーション (Adobe Photoshop Lightroom など) には、Lua インタープリターをホストする外部 C/C++ プログラムがあり、そのインタープリターに C 関数を登録することでコア機能へのアクセスを提供します。通常、C 関数で計算集約型のコア関数を実装しますが、全体的なフロー、操作、さらには GUI レイアウトまでも Lua スクリプトに任せます。

私自身のプロジェクトで、1 つまたは 2 つのカスタム DLL とともに実行時にロードされる IUP と組み合わせた場合、ストック スタンドアロン Lua インタープリター (lua.exe または wlua.exe) が外側のアプリケーションに十分であることがよくあることがわかりました。そのレベルのパフォーマンスを必要とする機能を実装する C でコーディングされたベースの Lua モジュール、または他の C 呼び出し可能なライブラリを介して実装される機能。

私のプロジェクトの重要なポイントは次のとおりです。

  • 真の末尾呼び出しにより、有限状態マシンの簡単な表現が可能になります。
  • ガベージ コレクションのメモリ管理。
  • 無名関数、クロージャ、ファースト クラス関数値。
  • ハッシュ テーブル。
  • 豊富な文字列ライブラリ。
  • ユーザーデータは、ガベージ コレクターを C 側の割り当てに拡張します。
  • メタテーブルを使用すると、さまざまなオブジェクト指向および関数型の手法を使用できます。
  • 小さくても十分に強力な C API。
  • バックアップとしてオープンソースを使用した優れたドキュメント。
  • メーリング リストwikiによるユーザー間の優れたサポート。
  • 作成者やコミュニティから入手できるPEGパーサーなどの強力なモジュール。

私のお気に入りの例の 1 つは、約 1000 行の Lua と 1000 行の C を必要とし、lua.exe で実行し、IUP を使用して完全な Windows GUI を表示する組み込みシステム用に作成したテスト ジグです。最初のバージョンは約 1 日で実行されました。MFC を使用する C++ では、少なくとも 1 週間の作業と何千行ものコードが必要でした。

于 2009-06-05T01:13:20.290 に答える
3

C/C++ で Lua テーブルを実装してみてください。Lua の強みがすぐにわかります。

ルアの場合:

a["index"] = "value"

C では、リンクされたリストについて読むことから始めます...

C++ STL が役立つかもしれませんが、Lua よりもはるかに冗長になります。

また、Lua は優れた接着剤になります。Cとのインターフェースはとても簡単です(IMHO)。

于 2009-06-02T17:46:13.923 に答える
3

「クリック」できるかどうかわかりませんが、やってみます。

Lua を組み込む利点の 1 つは、構成ファイルとして使用できるだけでなく、実際に C/C++ インターフェイスを lua に提供し、Lua スクリプト言語を介してそれらの使用を「スクリプト化」できることです。

アプリケーションの動作/ロジックを変更したい場合は、Lua スクリプトのコードを変更するだけで、アプリケーション全体を再コンパイルする必要はありません。

顕著な用途は、AI やステート マシンなどのゲーム ロジックであり、ゲームの開発には、変更からプレイまでの短い往復時間が不可欠です。

もちろん、メイン ロジックは、効果的に使用するために、C/C++ コード内ではなく、Lua スクリプト内に存在する必要があります。

于 2009-06-02T17:47:45.217 に答える
2

Cでのプログラミングは、非常に面倒で冗長な作業になる可能性があります。これは、より抽象的な高水準言語と比較した場合に確かに当てはまります。

この意味で、Cですべてを直接実行するよりもはるかに迅速に開始および終了できます。これは、Cで明示的および手動でセットアップ、実行、およびクリーンアップする必要がある多くのことは、多くの場合、暗黙的かつ自動的に処理されるためです。 Luaなどのスクリプト言語(たとえば、メモリ管理を想像してください)。

同様に、より多くの抽象データ構造とアルゴリズムがこのような高級言語によって直接提供されることが多いため、必要なのが標準コンテナ(リンクリストを考えてください)だけであれば、車輪を再発明して再実装する必要はありません。ツリー、マップなど)。

したがって、LuaやPythonなどのかなり抽象的なスクリプト言語を使用すると、特に対応する言語にコア機能の優れたライブラリが付属している場合に、かなり優れたROIを得ることができます。

したがって、スクリプトは、アイデアやプロジェクトのプロトタイプを作成するために実際に理想的です。ほとんどのプロジェクトで同じである可能性が高いすべての機械的な冗長性ではなく、作業に集中できる必要があるためです。

基本的なプロトタイプが完成したら、それをさらに改善および最適化する方法をいつでも確認できます。実行時のパフォーマンスを向上させるために、Cスペースで重要な主要機能を再実装することもできます。

于 2009-06-02T19:37:43.857 に答える
2

LUA にはクロージャーがあり、クロージャーは揺るぎません。: _

function newCounter ()
  local i = 0
  return function ()   -- anonymous function
           i = i + 1
           return i
         end
end

c1 = newCounter()
print(c1())  --> 1
print(c1())  --> 2

関数を作成して渡すことができます。別のクラスを作成してインスタンス化するよりも便利な場合があります。

于 2013-07-09T20:46:48.730 に答える
1

プログラミング言語としてのLuaの主な利点(埋め込み可能性は別として)は次のとおりです。

  • 主なデータ構造としての強力で効率的なハッシュテーブル
  • 複雑さと表現力のバランスに優れた文字列処理ライブラリ
  • 第一級関数とジェネリックforループ
  • 自動メモリ管理!!

これらすべてを説明する短い例を見つけるのは難しいです。~/binディレクトリに191個のLuaスクリプトがあります。これは、の出力を受け取り、pstotextハイフンで終わる行を結合するものです。

local function  printf(...) return io.stdout:write(string.format(...)) end
local function eprintf(...) return io.stderr:write(string.format(...)) end

local strfind, strlen = string.find, string.len

function joined_lines(f)
  return coroutine.wrap(function()
                          local s = ''
                          for l in f:lines() do
                            s = s .. l
                            local n = strlen(s)
                            if strfind(s, '[%-\173]$', n-1) then
                              s = string.sub(s, 1, n-1)
                            else
                              coroutine.yield(s)
                              s = ''
                            end
                          end
                        end)
end

-- printf('hyphen is %q; index is %d\n', '­', string.byte('­'))

for _, f in ipairs(arg) do
  for l in joined_lines(io.popen('pstotext ' .. f, 'r')) do
    printf('%s\n', l)
  end
end

この例は、いくつかの利点を示していますが、テーブルでは何も興味深いことはありません。

これは、Key Word In Contextインデックスプログラムからの短いスニペットです。このプログラムは、テーブルからコンテキストをフェッチし、コンテキスト内のキーワードをフォーマットします。この例では、ネストされた関数をより広範囲に使用し、テーブルと文字列の内容をさらに示しています。

local function showpos(word, pos, lw, start)
  -- word is the key word in which the search string occurs
  -- pos is its position in the document
  -- lw is the width of the context around the word
  -- start is the position of the search string within the word
  local shift = (start or 1) - 1  -- number of cols to shift word to align keys
  lw = lw - shift -- 'left width'
  local rw = cols - 20 - 3 - lw - string.len(words[pos])  -- right width
  local data = assert(map:lookup(pos)[1], "no map info for position")
     -- data == source of this word
  local function range(lo, hi)
    -- return words in the range lo..hi, but only in the current section
    if lo < data.lo then lo = data.lo end
    if hi > data.hi then hi = data.hi end
    local t = { }
    for i = lo, hi-1 do table.insert(t, words[i]) end
    return table.concat(t, ' ')
  end
  -- grab words on left and right, 
  -- then format and print as many as we have room for
  local left  = range(pos-width, pos)
  local right = range(pos+1, pos+1+width)
  local fmt = string.format('[%%-18.18s] %%%d.%ds %%s %%-%d.%ds\n', 
                            lw, lw, rw, rw)
  printf(fmt, data.title, string.sub(left, -lw), word, right)
end
于 2009-06-04T03:45:10.943 に答える
1

Lua が c++ よりも適している例として、スクリプトの配布を見てください。Mush Clientはスクリプト言語として Lua を提供します。上記のリンクで示されているように、プログラムを拡張するために Lua で多くのことができます。C++ とは異なり、Lua はコンパイルする必要がなく、制限することができます。たとえば、ファイル システムにアクセスできないように Lua をサンドボックス化できます。これは、他の誰かからスクリプトを取得した場合、ディスクに書き込むことができないため、データを破壊できないことを意味します。

于 2009-06-02T18:10:07.097 に答える
1

Lua を使用してゲームを作成する Love2D というゲーム エンジンを使用しています。すべてのシステム コールと手間のかかる作業は、Lua スクリプトを読み取る C プログラムで行われます。

C や C++ でゲームを書いていると、自分のアイデアを実装するだけでなく、システムの機微を操作しようとしていることに気づきます。

Lua では、「クリーンな」ダーティ スタイルのコーディングが可能です。

純粋な lua で書かれたゲーム オブジェクトの例を次に示します。

local GameObj = {}              -- {} is an empty table
GameObj.position = {x=0,y=0}
GameObj.components = {}

function GameObject:update()
    for i,v in ipairs(self.components) do    -- For each component...
        v:update(self)                       -- call the update method
    end
end

インスタンス化するには:

myObj = setmetatable({},{__index=GameObj})
-- tables can have a meta table which define certain behaviours
-- __index defines a table that is referred to when the table
-- itself doesn't have the requested index

コンポーネントを定義しましょう。キーボード コントロールはどうでしょうか。入力を行うオブジェクトがあると仮定します (C 側で提供されます)。

KeyBoardControl = {}
function KeyBoardControl:update(caller)
    -- assuming "Input", an object that has a isKeyDown function that returns
    -- a boolean
    if Input.isKeyDown("left") then
        caller.position.x = caller.position.x-1
    end
    if Input.isKeyDown("right") then
        caller.position.x = caller.position.x+1
    end
    if Input.isKeyDown("up") then
        caller.position.y = caller.position.y-1
    end
    if Input.isKeyDown("down") then
        caller.position.y = caller.position.y+1
    end
end
--Instantiate a new KeyboardControl and add it to our components
table.insert(myObj.components,setmetatable({},{__index=KeyboardControl})

myObj:update() を呼び出すと、入力がチェックされて移動されます

この種の GameObj を KeyboardControl で大量に使用するとします。プロトタイプの KeyObj をインスタンス化し、それを継承されたオブジェクトのように使用できます。

KeyObj = setmetatable( {}, {__index = GameObj} )
table.insert(KeyObj.components,setmetatable( {}, {__index = KeyboardControl} )    

myKeyObjs = {}

for i=1,10 do
    myKeyObjs[i] = setmetatable( {}, {__index = KeyObj} )
end

これで、操作できる KeyObj のテーブルができました。ここでは、言語に合わせて問題を曲げる必要がなく、解決しようとしている問題に応じてプログラムを構築できる、強力で拡張が容易で柔軟なオブジェクト システムを Lua がどのように提供しているかがわかります。 .

また、Lua には、第一級の型としての関数などの優れた機能が他にもあり、ラムダ プログラミング、無名関数、および通常は comp-sci の教師が不気味な笑みを浮かべるその他の機能が可能になります。

于 2013-05-07T12:13:47.177 に答える