LuaTinker

http://www.lua.org/images/logo.gif

LuaTinker 란?

LuaTinker 는 프로젝트중 LuaBind 를 사용중 너무 느린 Boost 의 컴파일을보고 이것들을 모아서 비슷 대체품을 만들어 쓰는게 낫겠단 생각에 탄생한 물건입니다. LuaBind 를 써보신 분들은 아시겠지만 컴파일시 파일 하나당 30초가까이 걸렸기 때문에 이 시간들은 무시할 수 없는 것이죠. 원래 작업 계획에 이틀을 세웠는데 결과적으로 일주일가까이 시간이 소모되었고 아직 완벽한 테스트는 끝나지 않았습니다. 단..!!! 프로젝트에서 Boost 를 사용하지 않으면서 Lua Bind 를 쓰고 싶은 분들이거나 Lua Bind 보다 빠른 라이브러리를 갖고 싶으신 분들께 권하고 싶습니다.

LuaTinker 는 다음을 목표로 작성되었습니다.

LuaTinker 의 문제점

작성하면서 몇가지 문제점이 있었는데 일단 내린 결론은 '가능한 가볍게, 깃털보다 가볍게, 무엇보다 가볍게'가 목표였습니다. 그래서 LuaBind 에서 구성된 몇가지 장점이 제거되는 결과를 나았습니다. 일단 Lua Bind 에 익숙하지 않으므로 제거된 기능을 아래 나열해 보았습니다. 그렇지만 이러한 작업으로 LuaTinker 는 매우 가볍고 작은 코드로 작성 되었으며 다른 어떠한 dependency 단지 헤더파일 두개만으로 컴파일이 가능합니다.

LuaBind 의 장점중 하나가 Function Overloading 을 사용하는 것입니다. 그렇지만 LuaTinker 는 빠른 호출을 위해서 함수명-functor 을 묶어서 사용하기 때문에 인자값을 분석해서 적절한 함수가 호출되도록 하는 기능을 제거하였습니다. functor 내에서 Stack 을 조사해서 적절한 함수를 호출해주는 코드를 작성할 수도 있지만 그러기 위해서는 overloading이 사용된 각 함수마다 functor 들을 관리하는 관리자가 필요하고 함수 호출시마다 적절한 함수를 찾는 작업을 수행해야 합니다. 저는 C++ 에서도 이 기능을 잘 활용하지 않기 때문에 LuaTinker 에는 해당 기능을 넣지 않았습니다. 덕분에 constructor 도 한가지만 지원하게 되어 있는데 현재 프로젝트에서는 Lua 내에서 C++ 인스턴스를 만드는 경우가 한정되어있는 관계로 이것도 큰 문제가 되지 않았습니다.

아직 지원하지 않지만 프로젝트가 진행되는 동안 지원을 계획하고 있습니다. 현재 Lua 실행중 LuaTinker 와 연계한 에러가 날 경우 어떠한 에러 출력도 포함하지 않고 있습니다. 일단 디버그 모드로 작성한 프로그램은 직접 디버깅이 가능하기 때문에 큰 문제없이 알아서 쓰고 있지만 추후 제가 쓰는 Lua 프로젝트 규모가 늘어남에 따라서 각종 에러 출력 부분을 추가할 생각입니다. 현재 나오는 에러는 개발자에게 연락을 주시거나 아니면 그냥 열심히 템플릿 디버깅을 해보시는 방법밖에 없을 것 같습니다. 일단 LuaBind 와 문법상 호환되므로 문제가 발생함에 따라 컴파일을 바꿔서 사용하는 것도 좋습니다.

LuaTinker 의 작동 방식

LuaTinker 가 C++과 사이좋게 작동하기 위해서 Lua의 userdata형과 metatable 기능을 적극 사용하였습니다. 일단 Lua에서 하나의 클래스 인스턴스는 userdata에 적당한 구조체를 생성해서 포인터나 인스턴스를 생성합니다. 그리고 이 구조체에 접근하는 Lua 접근들은 metatable 을 통해서 LuaTinker가 정의한 functor 를 호출해주게 되는데 이 과정을 metatable의 __index 와 __newindex 의 재정의로 구현하고 있습니다. 현재 예저에 들어 있는 dir() 이라는 간단한 함수를 살펴보면 메타 테이블을 어떻게 뒤져서 그것이 구현되어 있는지 알 수 있습니다.

(자세한 내용은 추후 추가)

LuaTinker 사용법

LuaTinker 는 두개의 헤더파일로 이루어져 있습니다. 각각은 다음과 같습니다.

LuaTinker 를 구성하는 모든 template 들과 class, 자료형 들이 정의되어 있습니다. LuaTinker는 Lua 의 CClosure 형을 만족하는 함수형을 만족하기 위해서 functor 객체들을 사용하고 있습니다. 현재 functor 들은 6개의 인자값까지 받도록 되어 있는데 더 많은 인자값이 필요한 경우 직접 코드를 수정하여 이 부분들을 늘려 주어야 합니다. 또한 push_/pop_ 을 통해 루아와 자료형을 주고 받게 되는데 이때 부족한 부분이 있을 경우 컴파일 에러가 발생하게 되니 그런 경우 바로 연락을 주시면 수정하도록 하겠습니다.

template 를 사용하지 않은 몇몇 함수들이 들어 있습니다. 또한 디버그를 위한 enum_stack() 함수도 정의되어 있습니다.

LuaTinker 다운로드

LuaTinker 는 현재 GPG 자료실을 통해서 다운로드가 가능합니다.

LuaTinker 0.5b 소스 및 예제

LuaTinker 0.5c gcc 지원버젼 소스 및 예제

see also: LuaTinker Manual


LuaBind 를 쓰시는 분들의 많은 도움이 있었으면 좋겠습니다. Lua 공식 페이지에도 등록하고 싶은데 아직 테스트가 덜된 관계로 GPGStudy 에서 Lua를 쓰는 분들의 반응을 듣고 싶습니다. 그리고 Licence 관련 문구도 조금 정리를 해야할 것 같군요. 흠.. 연초에 만들었는데 회사에서 공개해도 된다고 하니 등록하게 되었습니다.~ 저희도 Free Library 를 몇가지 쓰고 있으니까요. ^_^ --zupet

방금 다운 받아서 아직 컴파일은 안 해 봤고 소스 코드를 조금 훑어보았습니다. KLDP.net으로 가시면 어떨까요!!! 오픈소스로 진행하신다면 돕고 싶습니다(특히 문서화 쪽...)

라이선스는 어차피 Lua의 헤더를 참조하니 Lua의 라이선스를 따르는 게 좋을 것 같네요....

--류광

전 그냥 lua 표준 c 소스로만 작성중인데, luabind는 좀 무겁다는 결론을 내려서... 어쨌든 수고하셨습니다. redpixel

PyTinker 도 만들었습니다 후후 -_- -- myevan

잘쓰겠습니다. lua공부하려고 헤매다가 좋은거 발견했네요 ^^ -- gal_yong

먼저 이런 멋진 라이브러리를 공개 해 주셔서 감사합니다. 그런데 C++Builder6에서 컴파일 해보니 오버로딩된 read함수등이 오류가 나더군요.. 함수 오버로딩이 인자로 구분되고 리턴값으론 안되는게 아닌가요? VC가 특수한 컴파일러라서 그런가? gcc에도 된다고 하시니 어느게 정답인지 궁금하네요 -- emptyspear

잘 쓰겠습니다. - ikpil

C++ Builder 관련 문제는 볼랜드포럼에 남병철.레조 님이 올리신 글을 참조하세요. 최신버전인 2010에서도 같은 문제가 발생하는지에 대해서는 확인되지 않은 듯 합니다. http://turboc.borlandforum.com/impboard/impboard.dll?action=read&db=lua_qna&no=4 -- peperu

zupet님께서 luaTinker의 저장소를 github에 만들어주셨습니다. dexgame쪽은 이전부터 링크가 불가능 한 듯 하여 우측에 링크를 덧붙입니다 http://github.com/zupet/luatinker -- minqoos