'삽질+돈되는짓/Lua'tic Dawn'에 해당되는 글 3건

  1. 2010.03.03 LuaJIT 만지작 거린 소감 (5)
  2. 2010.03.03 독서: Programming in Lua (6)
  3. 2009.06.29 Lua HTTP Server + Native Agent (6)
posted by 아겔-_- 2010.03.03 23:13
http://luajit.org/

음... 한마디로 말하자면... "헐퀴!"

정말 죽여주게 빠르다. lua자체가 이미 내부적으로 자체 바이트코드로 컴파일을 하는데, 이걸 다시 해당 플랫폼에 맞는 기계어로 JIT 컴파일해서 실행해서 정말 눈물나게 빠르다 ㅜ.ㅜ;;;

거기에 빌드하는 과정도 거의 기존의 lua을 빌드하는 과정과 크게 다르지 않아서 쉽고, C API 레벨에서 호환가능이라 기존 루아연동부분을 거의 링크하는 라이브러리만 교체해서 성공했다. ;-)

Project Euler 001번의 범위를 죠낸 키워서 그냥 루아에서 7.8초정도 걸리도록 범위를 키웠었다. 그리고 그걸 gcc 버젼이랑 자바버젼, LuaJIT버젼이랑 비교해보면 재미있는 결과를 얻을수있었다. (AdHoc 벤치마킹;;; 소스는 쪽팔려서 공개안할래요;;;)
gcc은 1초 안팎, jdk 6도 2초 안팎, luajit은 2초 안팎... 하악하악...

기존 루아부분을 그냥 교체해주면되고 성능은 정말 비교할수없을정도로 향상됐다... 하악...



ps. 오늘도 루아덕질인가...


신고

'삽질+돈되는짓 > Lua'tic Dawn' 카테고리의 다른 글

LuaJIT 만지작 거린 소감  (5) 2010.03.03
독서: Programming in Lua  (6) 2010.03.03
Lua HTTP Server + Native Agent  (6) 2009.06.29
posted by 아겔-_- 2010.03.03 01:47

인사이트 출판사의 "Programming in Lua"을 읽었습니다.

루아라는 언어를 알고있던것은 오래되었고 실제로 사용할 기회는 별로 없었습니다. 가능하면 네이티브 C/C++에서 작업을 안하려고 했었고, 회사일도 대부분은 자바나 플렉스 같은 VM위에서 이루어지는 일이라 Rhino, JRuby같은 스크립팅에만 익숙해져있었지 루아를 적용할 필요랄까 그런걸 잘 모르고 살았었죠. (굳이 네이티브가 아니라도 루아를 적용할수있지만 :-))

루아를 직접 사용하면서 느꼈던것은 이상한 재미였었습니다. 그동안은 필요이상으로 간결하고 너무 loosy한 언어가 아닌가 그럴바에는 그냥 루비나 파이썬을 쓰지 왜 그런걸 쓰는지 이해하기 어려웠었죠. 하지만 직접 사용했을때는 정말 달랐습니다. 테이블, 함수객체, 클로져 등으로 그간 너무 익숙해진 테크닉들을 더 단순한 방법으로 구현하고 있는 자신을 발견했을때는 묘한 기분이었습니다. 거기에 "쉽지않다"라고만 생각하던 C언어를 통한 네이티브 연동이 luabind등을 이용해서 쉽게 이루어지고, 인터프리터를 내장하는것도 정말 딱 필요한만큼의 작업만이 필요했습니다. 무엇보다 수많은 luaforge.net의 모듈들을 적용해서 강력한 무언가를 만들기 수월했습니다. (약간의 require을 통해서!)

물론 최초 진입시 마치 환경을 조성하는것 같은 빌드환경을 만들고 필요한 모듈들을 이에 맞춰 빌드하는 과정은 힘들었었지만 재미있었습니다. (luacom 같은건 다시 컴파일하고 싶지않을 정도에요;;;)

어쨌든 책은 회사에 도서신청해서 받아봤습니다. 루아에 대해서 어느정도 알고 C애플리케이션에 내장하고 C/C++을 통해서 확장할줄 아는 정도의 수준에서 받아봤습니다. 처음엔 "아... 놔... 실수했나" 싶었는데 아니었죠.

책에는 내가 루아에 대해 잘못알고있던 많은 semantic한 부분들, 그리고 너무 복잡하게 정리가 안되있던 부분들까지 깔끔하게 정리해줬습니다. 더 놀라운건 오히려 다른 수많은 applicative, functional언어들을 설명한 책들보다 오히려 간결하고 쉽게 강력한 패러다임들을 소개하고 접근하는책이라는 느낌이 들었습니다.

어떻게보면 정말 설명하기 어려울수도 있는 클로져, first-class function, iterator, coroutine(continuation)등을 쉽게 설명해줬습니다. 차라리 누군가에게 applicative programming, functional programming이 어떤거다라고 알려주려면 루아와 이 책을 이용하는게 최선이지 않을까 하는 생각이 들정도로.

루아 언어 자체의 특징과 기능(몇개 안되지만), 그리고 간결한 기능들을 이용해서 다른 언어에서는 복잡하게 구현했던 기능들을 너무도 간결하고 직교적으로 표현함을 보입니다. (그러면서도 조잡하지않아요.)

이런 테크닉적인 부분까지 세세히 다루면서 더욱이 보통 이런 책에서는 대충 넘어가기 쉬운 자원관리나 쓰레기수집에 대한 부분, C API을 이용하여 확장하고 내장하는 방법등을 정말 정확하고 지루하지 않게 설명하는 책이었습니다.

보통 균형의 측면에서 너무 디테일해서 사전을 출력한게 아닌가 싶은 책도 있고, 너무 러프해서 웹에서 튜토리얼 읽는게 더 나았겠다 싶은 책도 많은 요즘에 좋은책을 발견해서 기쁩니다.


신고

'삽질+돈되는짓 > Lua'tic Dawn' 카테고리의 다른 글

LuaJIT 만지작 거린 소감  (5) 2010.03.03
독서: Programming in Lua  (6) 2010.03.03
Lua HTTP Server + Native Agent  (6) 2009.06.29
posted by 아겔-_- 2009.06.29 21:12

Lua HTTP Server + Native Agent

 

2009/06/29 00:52:49

 

 

native-agent의 새로운 아키텍쳐를 생각해냈다.

 

  1. Lua인터프리터만을 내장한 .exe가 실행하고 autoexec.lua을 실행화일이 위치한 디렉토리에서 실행.
  2. 필요한 lua extension은 모두 .exe와 함께 배포하고, autoexec.lua에서 로딩.
  3. 심지어 http서버도 extension으로 배포하고 autoexec.lua에서 시작

 

이렇게만 되면...

  • 이후에 native agent의 기능이 추가되더라도

    • lua extension만 c로 작성하고
    • 이걸 autoexec.lua에서 로드하고
  • 요청을 받은 lua 코드를 실행후 결과를 되돌리면 ok

 

단순히 ecm용 native agent가 아니라 재사용가능.

 

 

 

 

 

  • the Xavante Lua Web Server

 

Lua 5.1 custom interpreter build

인터프리터를 내장한 실행화일을 하나 만들기

 

MS Visual Studio 2008 / C++

 

충족할 조건은

  1. 시작후 같은 위치의 autoexec.lua을 평가할것

    1. 시작후 해당 위치로 chdir() (혹은 이후 로딩할 디렉토리를 지정 가능할까?)
  2. 같은 위치의 lua extension을 실행시간에 로딩할수있는 환경을 제공할것

 

프로토타입 프로젝트 세팅은

  1. 단순히 Win32 Console Application
  2. lua 5.1 소스에서 lua.c, luac.c등을 제외하고 헤더, 소스를 모두 프로젝트에 추가-_-;;;
  3. 별일 없이 바로 컴파일/링크 성공-_-b

 

 

__cdecl이 아니라서 lua_close을 링크 못한다네-_-;;; 이거 어떻하지 2009/06/29 01:35:38

http://terry51.egloos.com/998726

관련 lua.h등을 #include할때...

 

  1. extern "C" {
  2. #include "lua.h"
  3. #include "lauxlib.h"
  4. #include "lualib.h"
  5. }

 

extern "C"로 살포시 감싸주기

 

"luaL_dofile()"로 같은 디렉토리의 파일을 읽는건 성공한듯 (에러가 없는듯)

그런데 파일의 내용을 실행하지 못하는것으로 보이는데?;;; 2009/06/29 01:43:57

 

"luaL_openlibs()"을 호출해서 기본 라이브러리를 로드해야 하는구나.

  1. luaL_openlibs(L);

그럼에도 불구하고 어째서 Win32 + MSVC에서는 PANIC일까 2009/06/29 10:11:19

리눅스에서는 잘 굴러가는구만...

PANIC: unprotected error in call to Lua API (unable to get ModuleFileName)

 

http://blog.naver.com/PostView.nhn?blogId=sinerujin&logNo=60034089717

lua-shell_mbcs.png

VC++의 프로젝트 설정에서 유니코드에서 MBCS로 전환하니 또 되는군항-_- 2009/06/29 10:31:35

해결: lua 5.1에서 lua 5.1.4로 업그레이드 하니 문제가 없네-_-;;; 2009/06/29 10:42:51

 

 

lua-socket extension loading

http://www.tecgraf.puc-rio.br/~diego/professional/luasocket/home.html

 

여기서 소스를 다운받고, dll로 빌드했다. 기존 lua-shell에서 lua부분을 static library로 빼서 공유하고, lua-shell은 소스 하나짜리인 프로젝트로 수정. 그래도 뭔가 실행시간에 로딩하는데 문제가 있는걸까.

 

lua-socket -> project(lua-socket) -> socket.dll

                -> project(lua-mime) -> mime.dll

 

 

에러가 있을때 에러내용을 알수있는 방법이 필요하다.

  1. static int report (lua_State *L, int status) {
  2.   if (status && !lua_isnil(L, -1)) {
  3.     const char *msg = lua_tostring(L, -1);
  4.     if (msg == NULL) msg = "(error object is not a string)";
  5.     l_message(progname, msg);
  6.     lua_pop(L, 1);
  7.   }
  8.   return status;
  9. }

뭔가 스택에서 에러와 관련한걸 꺼낸 모양이군. 이렇게 찍으니 다음처럼...

LUA-SHELL: error loading module 'socket.core' from file '.\socket\core.dll':

        지정된 프로시저를 찾을 수 없습니다.

--> 간단한 .lua 모듈을 만들어 테스트해보니 정상적으로 작동하는걸로봐서 socket.core가 잘못 컴파일된 모듈이구나... 2009/06/29 12:02:40

 

결국 loadlib.c:loader_C()함수에서 모든걸 처리하는걸 알았고, "msgbox" 모듈일 경우에 dll을 로드한 다음에 luaopen_msgbox_core()라는 함수를 호출해 함수등을 등록함을 알았다.

 

다음과 같은 dll을 작성했고

  1.  
  2. #include "stdafx.h"


  3. #include "lauxlib.h"

  4.   /* Pop-up a Windows message box with your choice of message and caption */
  5.   int lua_msgbox(lua_State* L)
  6.   {
  7.     const char* message = luaL_checkstring(L, 1);
  8.     const char* caption = luaL_optstring(L, 2, "");
  9.     int result = MessageBoxA(NULL, message, caption, MB_OK);
  10.     lua_pushnumber(L, result);
  11.     return 1;
  12.   }

  13.   int __declspec(dllexport) luaopen_msgbox_core (lua_State* L)
  14.   {
  15.    lua_register(L, "msgbox",  lua_msgbox);
  16.    return 0;
  17.   }

 

다음처럼 불러내니 성공

  1.  
  2. require("msgbox.core")
  3. msgbox("OH HAI!", "!!!")

 

이걸 socket, mime에도 적용해야지-_- 2009/06/29 20:57:36

 

결국 다른 함수는 둘째치고, luaopen_msgbox_core()함수에만 다음처럼 선언하면 되는거였음.

  1.   int __declspec(dllexport) luaopen_msgbox_core (lua_State* L)

(함수원형에라도...)

 

 

결국 lua-socket에서 mime, socket을 각각 분리해내고 빌드&실행성공 하악...

  1. -- socket
  2. socket = require("socket")
  3. print(socket._VERSION)

  4. -- mime
  5. mime = require("mime")
  6. print(mime._VERSION)

 

 

extension loading 규칙
  • .lua 소스는 같은 디렉토리의 lua/ 이후에

    • lua/socket.lua
  • .dll 확장은 조금씩 다르지만 그냥 같은 디렉토리에 예를 들어 socket.core 확장은

    • socket/core.dll

 

 

 

 

 

 

이 글은 스프링노트에서 작성되었습니다.

신고

'삽질+돈되는짓 > Lua'tic Dawn' 카테고리의 다른 글

LuaJIT 만지작 거린 소감  (5) 2010.03.03
독서: Programming in Lua  (6) 2010.03.03
Lua HTTP Server + Native Agent  (6) 2009.06.29

티스토리 툴바