當前位置:首頁 » 編程語言 » javalua

javalua

發布時間: 2023-07-29 14:50:56

㈠ c,c++,java,lua那種語言易學

說實話,都不好學!C語言在處理很多問題是很麻煩,而c++中指針也是一個容易出問題的關鍵,好不好學在羽你自己的理解和運用的能力,不過推薦你學C++,畢竟它是後起之秀,而且現在c++語言也在逐步淘汰中~~,其實你也可以考慮JAVA,相對容易點 追問: lua呢 就是寫腳本的 回答: lua的設計目的是為了嵌入應用程序中,從而為應用程序提供靈活的擴展和定製功能。Lua最著名的應用是在暴雪公司的網路游戲WOW中 ,Lua由標准C編寫而成,代碼簡潔優美,幾乎在所有操作系統和平台上都可以編譯,運行。 一個完整的Lua解釋器不過200k,在目前所有腳本引擎中,Lua的速度是最快的。這一切都決定了Lua是作為嵌入式腳本的最佳選擇。LUA語言的官方版本只包括一個精簡的核心和最基本的庫。這使得LUA體積小、啟動速度快,從而適合嵌入在別的程序里。LUA可以很容易地被擴展:由宿主語言(通常是C或C++)提供其大部分功能,總的一句話,程序語言都是相通的一門學好了,其他的就容易多啦!好友如果你是學專業的話 c++ 絕對不會錯,而且其他都必須有所懂,業余的話就夠了,lua是在他們的基礎上發展的,想往游戲之類的發展的話先了解一下前二者再來學它!!

㈡ 請教如何用.lua調用.java包內的方法和變數

1.lua加入到環境變數中。即cmd可以識別lua命令
(右鍵計算機-》高級系統設置 在高級面板 -》環境變數 在系統變數或者用戶變數中找到path(沒有就新建path) path 中加入lua的路徑即可,如:D:\Developments\Lua\5.1(原來有path時,在原來的path值後加分號,再加路徑,如:原來的值;D:\Developments\Lua\5.1))
2.寫一個lua的腳本,放在任意路徑下。比如在桌面下有文件 hello.lua文件內容為
print('Hello World!')
3進入cmd(win+R 輸入cmd回車) 切到桌面
cd C:\Documents\Desktop\
運行腳本即可:lua hello.lua
輸出結果為:Hello World!

㈢ 在java中調用lua執很多次之後,內存使用率持續上升,無法釋放

要看LuaState luaState = LuaStateFactory.newLuaState();
和 luaState.close();的實現方式。
lua中有調用內存分配用戶對象,但沒注冊gc的話,luastate的close不會釋放內存。

㈣ lua和java有關系嗎

ava和lua之間進行交互,可是用一種基於jni的luajavaBridge方法,目前已經集成在quick-cocos引擎中了。
luaj的功能整理:
1.lua能夠查找java的方法;
2.lua能夠把函數作為參數傳入到java;
3.lua能夠從java獲得查找調用方法的返回值;
4.java能夠調用lua的函數;

㈤ 如何在Java中使用Lua腳本語言

如何在Java中使用Lua腳本語言是本文要介紹的內容,主要是來學習LUA腳本語言在JAVA中如何來使用,Lua就不說了, 現在比較熱門, 語法也很簡單. 為了在Java中調用, 折騰了比較長的時間, 就把一些東西記在下面.來看詳細內容講解。
Lua是支持內嵌在C程序中的, 但是官方不支持Java. 在網上查了下, 有LuaJava開源庫, 拿來試用了一下, 發現這個庫還算比較完善的.

這個LuaJava實際上就是按照Lua官方文檔, 把Lua的C介面通過JNI包裝成Java的庫. 下載, 裡面是一個.dll, 一個.jar. 把.dll放到java.library.path下, 再把.lib放到classpath中, helloworld運行OK.
但是, 測試的時候, 很快發現了第一個問題: 在調用LuaJava中提供的LuaState.pushInteger 方法的時候, 出現了錯誤 : Unsatisfied Link Error. 其他的LuaState.pushNumber方法倒是沒有問題. 用Depends工具看了下, 這個.dll居然沒有導出pushInteger這個函數. 暈....
下載LuaJava的源代碼, 查看了下Luajava.c 和 Luajava.h, 發現果然裡面有點問題, 在.h裡面定義了JNI中對應Java函數的C函數
JNIEXPORT void JNICALL Java_org_keplerproject_luajava_LuaState__1pushInteger
但是.c中沒有實現這個函數. 無語, 看來大馬虎哪都有啊. 幸虧有源代碼, 照貓畫虎在Luajava.c中加上這個函數的實現,
JNIEXPORT void JNICALL Java_org_keplerproject_luajava_LuaState__1pushInteger (JNIEnv * env, jobject jobj, jobject cptr, jint i) { lua_State * L = getStateFromCPtr( env , cptr ); lua_pushinteger(L, i); }

然後編譯. 編譯也出現了問題了, 官方文檔中說可以用VC++來Build, 但是沒有說官方用的是什麼版本. 我用VC2005就不行. 好在Luajava比較小, 就一個.h 一個 .c , 在VC中新建一個.dll項目, 把文件加進去, 修改一下build參數 (Include 需要加上lua的頭文件, lib中需要加上lua的.lib文件, 另外要選上 Compile as C Code (/TC) ) Build, 通過了.
這時再在Java中調用pushInteger方法就沒有問題了.
在測試中, 發現Luajava提供的文檔中, 對於Lua腳本怎麼調用Java對象/方法很詳細, 但是在Java中怎麼調用Lua函數/取得返回值 就沒有. 參考了http://www.lua.org/manual/5.1/manual.html#lua_CFunction 的Lua C文檔, 實現了傳遞對象到Lua中並取得返回值的代碼:
Test1: 測試傳遞簡單類型, 並取得返回值:
Lua 腳本(test.lua):
function test(a,b) return a+b end

Java代碼:
static { //載入Lua5.1.dll, 因為LuaJava最後還是要調用Lua的東西 System.loadLibrary("lua5.1"); } public static void main(String[] argu) throws LuaException { LuaState L = LuaStateFactory.newLuaState(); L.openLibs(); //讀入Lua腳本 int error = L.LdoFile("test.lua"); if (error != 0) { System.out.println("Read/Parse lua file error. Exit."); return; } //找到函數test L.getField(LuaState.LUA_GLOBALSINDEX, "test"); //參數1壓棧 L.pushInteger(1); //參數2壓棧 L.pushInteger(2); //調用!! 一共兩個參數, 1個返回值 L.call(2, 1); //保存返回值, 到a中 L.setField(LuaState.LUA_GLOBALSINDEX, "a"); //讀入a LuaObject l = L.getLuaObject("a"); //列印結果. System.out.println("Result is " + l.getString()); L.close(); }

測試2: 傳遞Java對象
class Value { public int i; public void inc() { i++; } public int get() { return i; } public String toString() { return "Value is " + i; } }

Lua腳本: (該腳本中調用兩次對象的inc方法, 並調用get方法輸出結果)
function test1(v) v:inc(); v:inc(); print("In lua: " .. v:get()); return v end

Java 代碼: (前面都一樣, 略)
//找到函數test1 L.getField(LuaState.LUA_GLOBALSINDEX, "test1"); //生成新的對象供測試 Value v = new Value(); //對象壓棧 L.pushObjectValue(v); //調用函數test1, 此時1個參數, 1個返回值 L.call(1, 1); //結果放在b中. L.setField(LuaState.LUA_GLOBALSINDEX, "b"); LuaObject l = L.getLuaObject("b"); System.out.println("Result is " + l.getObject());

運行結果:
Result is Value is 2 In lua: 2

和預期的一致.
實現一個怪物的創建,把lua里的設定當作初始狀態傳給monstor,名字為sample monstor,防禦10,攻擊10,生命100
1.先導入lib--luajava-1.1.jar
import org.keplerproject.luajava.LuaState; import org.keplerproject.luajava.LuaStateFactory; public class Load{ LuaState luaState; /** * Constructor * @param fileName File name with Lua . */ Load(final String fileName) { this.luaState = LuaStateFactory.newLuaState(); this.luaState.openLibs(); this.luaState.LdoFile(fileName); } /** * Ends the use of Lua environment. */ void close() { this.luaState.close(); } /** * Call a Lua inside the Lua to insert * data into a Java object passed as parameter * @param Name Name of Lua . * @param obj A Java object. */ void run(String Name, Object obj) { this.luaState.getGlobal(Name); this.luaState.pushJavaObject(obj); this.luaState.call(1,0); } } public class Monster{ /* Info */ protected String race; protected int defense; protected int attack; protected int life; /* */ private Load ; public Monster(String race) { /* Loads Lua for this race.*/ this. = new Load(race+".lua"); /*Call Lua create .*/ .run("create", this); } public void setRace(String race) { this.race = race; } public String getRace() { return race; } public int getDefense() { return this.defense; } public void setDefense(int defense) { this.defense = defense; } public int getLife() { return this.life; } public void setLife(int life) { this.life = life; } public void setAttack(int attack) { this.attack = attack; } public int getAttack() { return this.attack; } } monstor.lua--- create(monster) monster:setRace("Sample Monster") monster:setDefense(10) monster:setAttack(10) monster:setLife(100) end

但總是拋出這個錯誤:
PANIC: unprotected error in call to Lua API (Invalid method call. No such method.)

不知為何,以後用到的時候再research.
已經查出來,原來在Monster類中少了個方法:
public void setRace(String race) { this.race = race; }

怪不得會找不到,
要在一lua文件a.lua里導入其他的lua文件b.lua,用require "b"
如果要從lua中運算後得到返回參數,則需要做一下修改:在lua文件中改成:
create(monster) monster:setRace("Sample Monster") monster:setDefense(10) monster:setAttack(10) monster:setLife(100) return monster end

在Load.java中的run改成如下:
void run(String Name, Object obj) { this.luaState.getGlobal(Name); this.luaState.pushJavaObject(obj); this.luaState.call(1, 1);// 一個參數,0個返回 try { Object object =luaState.getObjectFromUserdata(1); } catch (LuaException e) { e.printStackTrace(); } }

轉載僅供參考,版權屬於原作者。祝你愉快,滿意請採納哦

㈥ 想做副業,學編程,學哪種語言比較好(零基礎)

最近有很多同學問我,我是一個零基礎的小白,到底學習哪一種語言比較好?作為一個寫了十年代碼程序員,用過七種語言的我來說,必須要強調一下,語言只是一種工具,當你真正理解了要做的事,選一個順手的就行。跟工具一樣,哪天有新的好用的語言出來,把舊的扔掉就好。

我今天寫這篇文章的目的是想給大家一個參考。

決定用什麼語言的因素有有很多,比如性能,內存佔用,開發難度,運維難度,目標平台,可執行文件大小,代碼可維護性,項目周期,項目規模,招聘難度,團隊構成,歷史遺留問題,甚至派系斗爭等。

比如騰訊就有大量歷史遺留的C和C++的伺服器代碼,畢竟20年前沒得選。又比如空降技術負責人可能會為了讓自己人上位,讓自己團隊出成績,選擇用其他語言或者框架對本來工作良好的系統進行重構。

下面開始聊語言

python

先說python,是因為這個語言小學生都開始學習了,以後不會python要被小學生欺負了。語法簡單,除了前端幾乎萬能,可用的庫極其豐富,能想到的功能幾乎都有現成的庫可以用。不管是搞爬蟲,做人工智慧,機器學習,數據分析,還是自動化運維,自動化測試,python幾乎都是首選。不想當程序員還想學習一門語言的話,學習python就沒錯了。缺點是慢,但是能讓機器累的事,何必讓人來累。

php

PHP是世界上最好的語言,可能這個已經成為很多程序員的梗。

我沒用php開發過大型項目,自己做東西的感覺是這語言非常簡單,以前用的人很多,招聘容易,但是不適合做復雜的項目。現在用得越來越少了,迅雷以前有不少運營活動頁面是PHP做的。

C

C的語法足夠簡單,應該是最接近機器語言的高級語言,適合編寫操作系統底層,驅動程序,硬體相關的程序以及看重性能的程序。由於過於簡單,構建大型程序的復雜度非常高,建議想往研發方向走的同學都學習一下C語言。

可以對計算機一些底層原理了解,比如指令執行過程,內存管理,異常,多線程,編譯過程等又更深層次的了解。掌握C語言再學習其他語言會變得很輕松,學習破解也有幫助,畢竟匯編基本都可以反編譯出C代碼。

C++

C++是一個糟糕的語言,這不是我說的,這是Linux之父說的。我自己用C++四五年時間,越到後面就感覺這句話越有道理。

首先C++的強大是毋庸置疑的,但是作為一個跟C一樣偏底層的語言,如果不理解寫的代碼背後到底發生了什麼事,如果出了錯,你是永遠不可能知道錯在哪裡的。

一個沒有垃圾回收的語言,不用智能指針很容易導致內存泄漏,錯誤的用了智能指針不但內存泄漏之後不好解決,還容易導致提前釋放等問題。

C++支持強制類型轉換,如果轉換前後的內存結構不一樣,很有可能導致各種隱性問題。還有Java之類非原生語言的異常處理都是語言自定義的異常,而C和C++中的異常很多都是操作系統層的異常。

Windows下一個簡單的try catch,你覺得可以抓到try中所有的異常,但是由於異常處理函數的指針保存在棧上,這時一個棧溢出可能直接導致異常處理函數指針被覆蓋,異常會出現在你意想不到的地方。微軟有大神曾說過,想你的代碼後續可維護就刪掉代碼中所有的try catch。

又由於語言非常底層,當程序出現底層崩潰的時候,想解決掉這個崩潰往往要讀一些匯編,這時候如果使用了大量的模板,比如stl和boost,那生成的匯編幾乎完全不可讀。看過stl代碼的人應該都知道這玩意兒寫的有多晦澀,就導致了你想用一個C++庫,如果不了解這個庫的實現原理,那大概率會出錯。

C++的復雜度又讓你很難真的理解那個庫的原理,結論就是C++強大,但是必須用的人也強大。C++直到現在還在瘋狂的增加特性,我用了四五年我自己都不敢說自己會玩C++,能用其他語言就優先考慮其他的,把C++作為最後的選項,不建議新手學,除非你的目標領域必須使用。

Rust

Rust是為了解決C和C++的各種問題而出現的語言,性能接近C++,通過所有許可權,不用垃圾回收就解決了生命周期管理。有包括管理,又有極其嚴格的編譯器檢查,能編譯通過的代碼就不會有大問題,編譯器直接把水平不夠的新手擋在了門外,通過解決出問題的人是方式,從根本上解決了C++的問題。

我第一次用rust寫個小程序就跟編譯器較了一天的勁。它的缺點就是學習難度太大,語言太小眾,庫太少,很多輪子都要自己造。但是隨著微軟之類的大廠使用,相信之後發展會比較好,新項目如果需要C或者C++可以優先考慮rust。

Java

我現在主要也是一個Java程序員,對於Java這個語言我並沒有什麼很特別的感覺,配套設施完善,什麼都能幹,體驗非常贊,就是內存佔用有點難看。想搞安卓考法的必修,阿里有大量的伺服器項目使用Java。

唯一想吐槽的是gradle這個構建系統,版本問題搞得很頭疼。

JavaScript

js是前端的必修課,沒得選,然而node讓js也萬能了。用node做過後端項目後,感覺動態類型語言還是不太適合,由此帶來的低級錯誤很多,雖然可以用typescript解決,但是最終還要編譯成js,無法直接調試。由於沒有原生的多線程支持,利用cpu也只能通過開多個進程的方式。小項目的後端做著玩還可以,大點的還是考慮Java或者是go吧。

Lua

Lua是極其輕量的語言,語言特性接近js,runtime非常小。作為一個腳本語言,性能出色,內存佔用低,很適合各種嵌入式設備或者插件系統。

Go

這玩意兒一定是谷歌為了解決自己後端項目中遇到的問題而開發的語言,各種特性直戳痛處。語法簡單,規范嚴格,這就讓不管什麼水平的開發寫出來的代碼差距都不會太大。

靜態類型,沒有默認參數,沒有異常處理,可以降低犯低級錯誤的概率。編譯成原生代碼,可內嵌C代碼,原生支持協程和多線程,可以保證性能,支持跨平台編譯,輸出單文件方便部署,這些優點帶來的問題是Go的指向性太強,只適合做高並發api類的後端服務。

想用Go開發其他任何領域都會覺得特別別扭,類似C的語法過於簡單,又沒有泛型,導致很多功能都顯得很啰嗦。但由於Go解決了部署問題,跨平台問題,降低了研發人員的水平要求,降低了犯錯誤的概率。

關於這些語言的性能沒有絕對的排序,但根據我做項目帶團隊和面試的經驗,絕大多數的程序員的水平都還碰不到語言的性能瓶頸。一般來說對語言的理解以及多線程,演算法,網路,資料庫緩存。硬體甚至業務的理解都比語言的性功能影響更大。

再次強調,語言只是工具,只有適不適合,沒有好與不好。基礎強大,用哪個都不怕,基礎太差,用什麼都尷尬。

只是會語法並不是掌握了這門語言,要知道程序背後發生了什麼。比如C++的對象模型,Java的虛擬機,垃圾回收,Go的協程,js的promise,rust怎麼編譯通過等等。

基礎是一門語言的核心,不管學習哪一門語言都要重點學好基礎。

㈦ 用Java編寫一個程序,要求如下:

1.內部使用 C 的 longjmp 機制讓出一個協程。因此,如果一個 C 函數 foo 調用了一個 API 函數, 而這個 API 函數讓出了(直接或間接調用了讓出函數)。 由於 longjmp 會移除 C 棧的棧幀, Lua 就無法返回到 foo 里了。

2.為了迴避這類問題, 碰到 API 調用中調用讓出時,除了那些拋出錯誤的 API 外,還提供了三個函數: lua_yieldk, lua_callk,和 lua_pcallk 。 它們在讓出發生時,可以從傳入的 延續函數 (名為 k 的參數)繼續運行。
3.我們需要預設一些術語來解釋延續點。對於從 Lua 中調用的 C 函數,我們稱之為 原函數。從這個原函數中調用的上面所述的三個 C API 函數我們稱之為 被調函數。 被調函數可以使當前線程讓出。 (讓出發生在被調函數是 lua_yieldk, 或傳入 lua_callk 或 lua_pcallk 的函數調用了讓出時。)
4.假設正在運行的線程在執行被調函數時讓出。當再次延續這條線程,它希望繼續被調函數的運行。 然而,被調函數不可能返回到原函數中。 這是因為之前的讓出操作破壞了 C 棧的棧幀。 作為替代品,Lua 調用那個作為被調函數參數給出的 延續函數 。 正如其名,延續函數將延續原函數的任務。
5.注意這里那個額外的顯式的對延續函數的調用:Lua 僅在需要時,這可能是由錯誤導致的也可能是發生了讓出而需要繼續運行,才會調用延續函數。 如果沒有發生過任何讓出,調用的函數正常返回, 那麼 lua_pcallk (以及 lua_callk)也會正常返回。 (當然,這個例子中你也可以不在之後調用延續函數, 而是在原函數的調用後直接寫上需要做的工作。)
6.Lua 會把延續函數看作原函數。延續函數將接收到和原函數相同的 Lua 棧,其接收到的 lua 狀態也和 被調函數若返回後應該有的狀態一致。 (例如, lua_callk 調用之後, 棧中之前壓入的函數和調用參數都被調用產生的返回值所替代。) 這時也有相同的上值。 等到它返回的時候,Lua 會將其看待成原函數的返回去操作。

7.我們需要預設一些術語來解釋延續點。對於從 Lua 中調用的 C 函數,我們稱之為 原函數。 從這個原函數中調用的上面所述的三個 C API 函數我們稱之為 被調函數。 被調函數可以使當前線程讓出。 (讓出發生在被調函數是 lua_yieldk, 或傳入 lua_callk 或 lua_pcallk 的函數調用了讓出時。)
8.假設正在運行的線程在執行被調函數時讓出。當再次延續這條線程,它希望繼續被調函數的運行。 然而,被調函數不可能返回到原函數中。 這是因為之前的讓出操作破壞了 C 棧的棧幀。 作為替代品,Lua 調用那個作為被調函數參數給出的 延續函數 。 正如其名,延續函數將延續原函數的任務。

希望能幫到你,謝謝!

熱點內容
流控腳本破解 發布:2025-02-07 08:39:09 瀏覽:413
什麼是資源為什麼要研究資源配置 發布:2025-02-07 08:25:19 瀏覽:87
釣魚網站源碼製作 發布:2025-02-07 08:23:54 瀏覽:139
mac運行fl需要什麼配置 發布:2025-02-07 08:15:45 瀏覽:573
安卓怎麼做都比不了蘋果 發布:2025-02-07 08:12:47 瀏覽:238
怎麼給物理機配置ip地址 發布:2025-02-07 08:01:37 瀏覽:139
三國志13未加密 發布:2025-02-07 07:54:37 瀏覽:926
馬斯克中國訪問 發布:2025-02-07 07:54:29 瀏覽:102
資料庫有表 發布:2025-02-07 07:50:49 瀏覽:29
基於nginx搭建圖片伺服器原理 發布:2025-02-07 07:44:18 瀏覽:449