2012-03-06 2 views
14

바이트 코드 청크와 함께 lua를 C로 작성된 프로젝트에 임베드했습니다. 이제 루아 코드베이스를 .lua 파일을 추가하여 확장하면이 코드를 단일 바이트 코드 청크에 보관할 수 있습니까?모든 것을 하나의 lua 바이트 코드 덩어리에 보관 하시겠습니까?

(나는 여러 바이트 코드 청크를로드하는 방법을 알고있다.하지만 편안 보인다 단지 것 글루 코드 잊고 다음은 하나의 덩어리를로드하게합니다.)

내가 텍스트 포함을 사용하려고하지만 더있을 것 같다 루아에서 이것에 대한 키워드. "require"및 "dofile"은 런타임에 파일을보고 "lua -b ..."를 실행 한 후 결과 바이트 코드에는 해당 파일의 코드가 포함되지 않습니다.

바이트 코드 파일을 결합 할 수있는 방법이 없습니다. 즉, 바이트 코드 파일을 만들 때 "require"명령을 사용하면 모든 파일의 코드가 하나의 바이트 코드 파일에 추가됩니다.

PS : Michal Kottman의 대답은 내가 요구 한 Lua를 위해 작동합니다. 나는 Lua와 LuaJIT가 같은 방식으로 작동 할 것이라고 생각했다. 그들은하지 않습니다.

  • 에뮬레이션의 luac.c
  • 이 LuaJIT 소스와 루아의 luac.c를 컴파일 한 LuaJIT 바이트 코드 파일에 여러 .lua 파일을 결합하는 한

    • 사용 "LuaJIT -b는"(작동하지 않을 것 같다)한다 루아 명령어 (C API없이)?
  • +0

    다음은 주제와 도움이 될 수있는 답변입니다. http://stackoverflow.com/questions/8936369/compile-lua-code-store-bytecode-then-load-and-execute-it –

    답변

    11

    luac을 사용하면 여러 파일을 하나의 파일로 결합 할 수 있습니다. 당신은 luaL_loadfile를 사용하여 C에서 루아에이 파일을로드 할 수 있습니다

    $ echo "x=1"   > l1.lua 
    $ echo "y=2"   > l2.lua 
    $ echo "print(x, y)" > l3.lua 
    $ luac -o run.luac l1.lua l2.lua l3.lua 
    $ lua run.luac 
    1 2 
    

    의 상단에 기능을 배치 : 실행하면 소스 파일에서 모든 덩어리들은 컴파일 된 파일에 추가 된 순서대로 실행됩니다 스택이 성공적으로로드되면 스택. 그런 다음 lua_call을 사용하여이 기능을 실행하여 결합 된 모든 컴파일 된 파일을 실행할 수 있습니다.

    컴파일 된 파일의 내용을 문자열로 프로젝트에 포함 할 수 있으므로 외부 파일에 보관할 필요가 없습니다. 당신이 발견 한 것처럼 LuaJIT 2

    업데이트

    , 당신은 이전에 언급 한 바와 같이로드 할 수있는 결합 된 파일을 얻을 수있는 Lua Compiler in Lua를 사용할 수 있습니다.

    $ luajit combine.lua l1.lua l2.lua l3.lua > out.ljc 
    $ luajit out.ljc 
    1 2 
    
    +0

    많은 감사합니다! 원래의 Lua를 사용하면 이것이 효과적 일 것입니다. "luajit -b"및 여러 파일을 사용하여 luaJIT를 사용하여 동일한 결과를 얻으려고했지만이를 완료하지 못했습니다. luaJIT에는 luac.c가없고 바이트 코드 형식이 다르므로이 방법이 luaJIT에서도 작동하는지 궁금합니다. 어쩌면 http://lua-users.org/wiki/LuaCompilerInLua와 같은 luac을 에뮬레이트 할 수 있습니다. – John

    +0

    이 http://lua-users.org/lists/lua-l/2005-12/msg00209.html에 따르면 luac.c도 luaJIT와 함께 작동합니다. – John

    +0

    표준 루아 바이트 코드를 읽을 수있는 것은 LuaJIT 1이다. 최신 LuaJIT 2에는 호환되지 않는 바이트 코드가 있습니다. –

    0

    loadstring입니다. 그것은 문자열을 취하고 필요할 경우 바이트 코드로 컴파일 한 후에로드합니다. 나중에 포함 된 코드를 실행하기 위해 실행할 수있는 함수가됩니다. 당신은 여전히 ​​더 일반적인 뭔가를해야 할 경우

    은, 당신이 청크를 공급하는 기능을 지정할 수 있습니다 load를보십시오.

    두 함수는 루아 소스 코드와 컴파일 된 바이트 코드를 모두 처리 할 수 ​​있습니다.

    +0

    나는 그것을 시험해 보았다, 나는 그것이 어떻게 작동하는지 안다. 그러나 내가 단 하나 로드 청크와로드 된 청크를 모두 포함하는 청크. 예를 들어 줄 수 있습니까? 나는 (C로 작업 할 때) 객체 파일에서 하나의 라이브러리 파일을 만드는 것과 같은 것을 찾고 있으므로 모든 객체 파일에 링크 할 필요가 없다. 이처럼,하지만 루아에 대해서, 그래서 나는 하나의 리소스를 내 실행 파일에 포함시킬 필요가있다. – John

    +0

    알겠습니다. 어쩌면이 링크가 더 도움이 될 것입니다 : [루아 컴파일러 in 루아] (http://lua-users.org/wiki/LuaCompilerInLua) – jpjacobs

    +0

    고맙습니다. 루아 킷이 없기 때문에 아마도 이것은 루아 젯 (luaJIT)의 유일한 방법 일 것입니다. – John

    4

    또 다른 대안은 수집 매튜 와일드의 squish 같은 도구를 사용하는 것입니다 : 이것은 표준 출력에 출력하는 단순화 된 버전이며, 다음과 같이 이전 샘플의 경우

    -- http://lua-users.org/wiki/LuaCompilerInLua 
    -- compile the input file(s) passed as arguments and output them combined to stdout 
    local chunk = {} 
    for _, file in ipairs(arg) do 
        chunk[#chunk + 1] = assert(loadfile(file)) 
    end 
    if #chunk == 1 then 
        chunk = chunk[1] 
    else 
        -- combine multiple input files into a single chunk 
        for i, func in ipairs(chunk) do 
        chunk[i] = ("loadstring%q(...);"):format(string.dump(func)) 
        end 
        chunk = assert(loadstring(table.concat(chunk))) 
    end 
    io.write(string.dump(chunk)) 
    

    , 당신은 그것을 사용할 수 있습니다 모든 루아 소스는 하나의 .lua 파일에 저장됩니다. 스 퀴시의 한 가지 좋은 특징은 스 퀴시 된 패키지를 소스 파일의 합계보다 작게 만드는 데 도움이되는 다양한 필터를 지원한다는 것입니다.

    스 퀴시를 적용한 후 luac을 통해 결과를 실행하여 바이트 코드를 얻을 수 있습니다. 그러나 바이트 코드는 종종 소스 코드보다 크며,보다 공격적인 필터 (예 : gzip)가 스 퀴시에 사용되는 경우 거의 더 큽니다.

    바이트 코드 파일이 실행 파일과 별도로 저장되거나 (네트워크를 통해 전송되는 경우), 루아 소스 코드에 적용되지 않는 바이트 코드와 관련된 보안 문제가 발생할 수 있습니다. 그러나 유해한 바이트 코드는 결코 luac을 실행 한 결과가 아니므로 응용 프로그램에 연결된 바이트 코드는 훨씬 더 어렵습니다.

    2

    luac, luajit 및 squish를 사용해 본 결과, 모두 파일 목록을 유지해야합니다. 프로젝트에서 작업 할 때 많은 lua 파일이있을 때 그것은 귀찮습니다.

    그래서 내가 require

    을 분석하여 루아 파일을 병합하는 작은 도구를 썼다 여기있다 :

    https://github.com/yi/node-lua-distiller가 도움이되기를 바랍니다.

    관련 문제