Lua:埋め込みを停止して生活を開始する方法
Luaは半言語の栄光にしっかりと根付いています-必要に応じて、C ++などのコンパイルされた言語で記述されたアプリケーションをスクリプト化するために組み込むことができるツールです。 それにもかかわらず、Luaは独自のインタープリター、モジュールを作成する機能、多数のライブラリーを備えた完全に独立した言語であり、同時にこのPLはアナログの中で最小サイズです。 簡単に言えば、perl、python、その他の一般的なプログラミング言語と同じアプリケーションを作成するためのすべてが揃っています。
Luaに有利な次の議論を提供できます。
- -アプリケーションはWindowsとLinuxの間で簡単に移植できます(コードが変更なしで機能するという事実ではなく、プラットフォーム固有のライブラリを使用しなかった場合、移植は簡単です)
- -作成されたプログラムの小さなオーバーヘッド
- -高速およびアプリケーションのダウンロード
- -アプリケーションにCライブラリをすばやく「貼り付ける」機能-ライブラリに最適な「接着剤」は見つかりません
- -最新のプログラミングパラダイムを実装する可能性がある、言語の快適なミニマルな構文
- -Luaプログラムは非常に簡単に展開できます
- -低メモリ消費
Luaの機能を示すために、Luaを使用して、グラフを画像ファイルとして保存する機能を備えたポイントごとにプロットする小さなプログラムを作成する方法を示します。
グラフィカルツールキットとして、元々Luaの使用計算で作成されたクロスプラットフォームライブラリであるiupを使用します。
Lua SDKをインストールする
Luaをスタンドアロン言語として使用するというアイデアの一部として、Lua for Windowsアセンブリが作成されました。これには、指定されたOSのプログラミング時に発生する日常的なタスク(データベース、GUI、XML解析など)に必要なライブラリが含まれています アセンブリ5.1のLuaバージョンであり、5.2ではないことを気にしないでください。この2つのケースで大きな違いはありません。
アセンブリをダウンロードしてインストールします。
IUPコンセプトの概要
iupデバイスの詳細に入らずに、プログラムを作成するプロセスをペイントする方法を長い間考えていました。 そして、その基本原則を簡単に説明することにしました。
- -iup.dialogはプログラムインターフェイスのルート要素です。すべての要素はこのコンテナに配置されます
- -コンテナ内の要素の配置は、レイアウトを使用して行われます:コンテナ内に要素を配置するためのルールを設定します。 Iupは、規則に従って要素を配置および描画します。 主なコンテナは、フレーム、垂直サイザー、水平サイザーです。
- -イベントハンドラーは、ウィジェットにアタッチされた関数の形式で設定されます
- -ダイアログを作成した後、イベント処理サイクルが開始します
以前にTk、WxWidgets、またはWinAPIを使用してGUI用に作成したことがある場合は、これはすべておなじみのように思えます。 そうでない場合、プログラムはコメント付きで詳細にカバーされます。
プログラムコード
-- iup require("iuplua" ) require("iupluacontrols") require("iuplua_pplot") -- Canvas, require("cdlua") require("iupluacd") require("string") -- -- plots_number = 5 -- , tabs = {} -- vboxes = {} -- , checkboxes = {} -- coords = {} -- legends = {} -- global_legend = {} -- , Lua split function string:split(sep) local sep, fields = sep or ":", {} local pattern = string.format("([^%s]+)", sep) self:gsub(pattern, function(c) fields[#fields+1] = c end) return fields end -- function draw_plot(pwidget, pnum, data) x = data[1].value:split(",") y = data[2].value:split(",") if checkboxes[pnum].value == "OFF" then return end if not (#x == #y) or #x == 0 then iup.Message("", " " .. pnum) return end iup.PPlotBegin(pwidget, 0) iup.PPlotAdd(pwidget, 0, 0) for i = 1,#x do iup.PPlotAdd(pwidget, x[i], y[i]) end iup.PPlotEnd(pwidget) end -- plot_btn = iup.button{ title = ""} -- " " function plot_btn:action() -- plot = iup.pplot { expand="YES", TITLE = "Simple Line", MARGINBOTTOM="65", MARGINLEFT="65", AXS_XLABEL = global_legend[1].value, AXS_YLABEL = global_legend[2].value, LEGENDSHOW="YES", LEGENDPOS="TOPLEFT", size = "400x300" } -- - iup.PPlotBegin(plot, 0) iup.PPlotAdd(plot,0,0) plot.DS_LEGEND = "" iup.PPlotEnd(plot) -- for i = 1, plots_number do -- print(legends[i].value) plot.DS_LEGEND = legends[i].value -- draw_plot(plot, i, coords[i]) end -- save_btn = iup.button{ title = "" } -- , plot_dg = iup.dialog { iup.vbox -- , { plot, save_btn }, } -- function save_btn:action() -- -- EMF fs_dlg = iup.filedlg{DIALOGTYPE = "SAVE", FILTER = "*.emf" } iup.Popup(fs_dlg) -- if tonumber(fs_dlg.STATUS) >= 0 then -- pic = fs_dlg.value if not (string.sub(pic, string.len(pic)-3) == ".emf") then pic = pic .. ".emf" end -- -, tmp_cv = cd.CreateCanvas(cd.EMF, pic .. " 400x300") -- iup.PPlotPaintTo(plot, tmp_cv) -- cd.KillCanvas(tmp_cv) end end -- plot_dg:showxy(iup.CENTER, iup.CENTER) -- if (iup.MainLoopLevel()==0) then iup.MainLoop() end end -- , -- for i=1,plots_number do -- , coords[i] = {} for j = 1,2 do coords[i][j] = iup.text { expand="HORIZONTAL", multiline = "YES", VISIBLELINES = 5 } end -- legends[i] = iup.text{ expand = "HORIZONTAL" } -- vboxes[i] = iup.vbox { iup.hbox { iup.label { title = " :" }, legends[i] }, iup.hbox { iup.label { title="X : ", }, coords[i][1] }, iup.hbox { iup.label { title="Y : ", }, coords[i][2] }; expand="YES", } -- vboxes[i].tabtitle = " " .. i -- , , -- checkboxes[i] = iup.toggle{ title= "" .. i, value = "ON" } end -- tabs = iup.tabs{unpack(vboxes)} -- global_legend[1] = iup.text{} global_legend[2] = iup.text{} -- frame = iup.frame { iup.vbox { iup.label{ title=" :", expand="HORIZONTAL" }, iup.vbox { unpack(checkboxes) }, iup.label{}, -- iup.label{title = ""}, iup.hbox { iup.label{ title = " X "}, global_legend[1] }, iup.hbox { iup.label{ title = " Y "}, global_legend[2] }, iup.label{}, plot_btn }; expand = "VERTICAL", } -- dg = iup.dialog { iup.hbox { frame, tabs }, title=" ", size = "HALF" } -- dg:showxy(iup.CENTER, iup.CENTER) if (iup.MainLoopLevel()==0) then iup.MainLoop() end
展開に関するいくつかの言葉
次のコマンドを使用して、スクリプトを実行できます。
lua plotter.exe
この場合、ライブラリはサブディレクトリclibs /から接続されます。サブディレクトリは、Lua for Windowsがインストールされたディレクトリにあります。 別のマシンに転送するためにスクリプトとライブラリをできるだけコンパクトにパックするには、次のファイルを1つのフォルダー(Luaインストールディレクトリからの相対パスで示されている)にコピーするだけで十分です。
lua.exe lib/lua5.1.dll clibs/cd.dll clibs/cdlua51.dll clibs/iup.dll clibs/iup_pplot.dll clibs/iupcd.dll clibs/iupcontrols.dll clibs/iupgl.dll clibs/iuplua51.dll clibs/iuplua_pplot51.dll clibs/iupluacd51.dll clibs/iupluacontrols51.dll clibs/freetype6.dll
スクリプトをプログラム自体と一緒にこのフォルダーに配置することを忘れないでください。 これで、このフォルダを別のマシンに転送し、上記のコマンドでプログラムを開始できます。 同時に、ライブラリとランタイムをインストールするための他のアクションは必要ありません。
残念ながら、このバージョンのLua for Windowsのcd.dll、cdluad51.dllおよびiupcd.dllファイルは正しく動作しない可能性があるため、以下のリンクを使用してアーカイブから取得することをお勧めします。
まとめ
作業バージョンのアーカイブはこちらにあります 。便宜上、app.batランチャーが追加されています。
スクリーンショット:
その結果は、「真面目な」プログラミング言語で書かれたのと同じ機能を持つ、気取らないユーティリティでしたが。 同時に、簡単に展開でき、総重量は2 mb未満です。 メモリ消費-約7 mb ソースコードは編集可能で、Lua自体はインタラクティブに理解可能であるため、このようなソフトウェアの改良をローカルで簡単に行えます。
私の意見では、これは学校や研究機関向けの教育用ソフトウェアの作成や、企業での内部使用に最適です。 CIS全体の同様の場所にはまだ弱いマシンが豊富にあるため、特にデスクトップでのLinuxの漸進的な出現を考慮すると、この方法でLuを使用することをお勧めします。 さらに、自作ソフトウェアのひどい中毒によりソースコードが失われる傾向は、国家の災害と同一視することができます。