[완료] Lua + GUI → 독립실행형 프로그램?

mirheekl의 이미지

가능한지 궁금합니다.
C컴파일러등 외부 도움 없이, Lua관련 툴만으로 가능할지요?
필요한 GUI는 굉장히 간단합니다. 걍 기본 컨트롤만 사용한 다이얼로그 수준만 되면 상관없을듯 합니다.

이렇게 쓰려는 사람이 없어서 그런지는 몰라도 관련정보를 찾을 수가 없네요..
C프로젝트에 Lua용 그래픽컴포넌트를 같이 올리는 식으로 구현하는 예제는 좀 봤는데요.
C컴파일러가 없는 곳에서도 간단한 프로그래밍을 하고 싶어서 스크립트 언어를 찾는 중이었던터라..

Lua2Exe라는 것으로 Lua를 EXE로 변환할 수 있었습니다만 이녀석은 루아의 기본함수만 쓸 수 있는 것 같았습니다.

관련 정보 아시는 분이 계시면 답변 부탁드리겠습니다.

neogeo의 이미지

Lua 자체가 애초에 C 언어나 C++ 언어에 embedding(?) 되는것을 가정하고 만든 언어라서 순수하게 Lua 만으로는 할 수 있는게 거의 없을 겁니다. C컴파일러 자체는 없어도 상관없지만 기본적으로 필요하신 기능을 확장하려면 C 언어로 전부 확장해두시고 시작하는게 좋을겁니다.

필요하신 GUI LIB 에 딱 걸맞는게 있다면 그녀석을 Lua 와 함께 bind 해서 ( 전 주로 toLua 를 사용합니다만, 게임 프로그래머들 사이에선 Lua Tinker 라는 한국분이 만든 라이브러리가 유명합니다. C++ 전용이라는게 약점입니다만.. toLua 는 C/C++ 전부 다 됩니다만 C++ 관련해선 만져줘야 할 부분이 좀 많습니다. ) 미리 패키지로 꾸려두고 함수를 준비해둔뒤 Lua 만 사용하는게 가능합니다. ( 미리 필요하다고 예상되는걸 다 준비해두셔야 한다는 의미지요. ) 그렇게 하시면 C 컴파일러 없이 루아만 사용하는게 가능할 것입니다. 다만 내부적으로 잘 쓰시려면 Lua 의 가비지 컬렉션 컨트롤이나 메모리 leak 이 없도록 주의하셔서 bind 하셔야 할 것입니다.

PSP 에선 Lua player 라는 녀석이 있습니다. ( 홈브류 입니다. ) 참고해보시면 어떤게 필요해서 Lua 에 함께 올려뒀는지 보실 수 있을 겁니다. 주어진 환경에서 간단한 게임까지 작성이 가능한 녀석으로 알고 있습니다.

Neogeo - Future is Now.

Neogeo - Future is Now.

mirheekl의 이미지

미리 실행파일을 만들어놓고 그 안에 lua를 뒤늦게 껴넣는셈이라.. 이러면 lua를 컴파일한다 한들 어쨌든 그 파일 내용이 밖에 노출되는 문제도 있고, 단일 실행파일로 만들기도 어렵고 해서요. 디버깅도 아무래도 불편할수밖에 없을것 같고요. 그래서 이것 외에 다른 방법이 있을까 해서 질문 드린 것이었습니다. C프로젝트로 그런 작업을 할 수 있다면, 그것을 누군가 간단한 툴이나 IDE 형태로 만들어서 단일 실행파일로 패킹해주는 것도 있지 않을까 하는 거지요.

개인적으로 간단한 독립실행 프로그램 또는 임베딩 루틴 제작용으로 스크립트 언어를 찾고 있었는데, 그중에 가장 속도도 빠르고 컴팩트하고 맘에 드는게 Lua였습니다.

이런 용도로 Lua이외에도 다른 스크립트 언어들을 여러가지 살펴봤는데 제 맘에 안 드는 걸림돌이 꼭꼭 한두개씩 있어서.. (최근에 버전업이 돼서 문법에 혼란이 있다든지 속도가 느리다든지 예제 가독성이 떨어진다든지 임베딩이 복잡하다든지 메이저하지 않아서 자료찾기가 어렵다든지 등등등..) 어차피 모두 걸림돌이 있다면 일단 속도라도 빠른 Lua를 배워보자는 생각이었습니다.

자세한 답변 감사합니다.

--
This is for you new people. I have just one rule :
Everyone fights, no one quits. If you don't do your job, I'll shoot you myself. Do you get me?

--

neogeo의 이미지

미리 실행파일을 만들어 놓고 그 안에 lua 를 껴넣는다는게 이해가 잘 가지 않습니다. 이미 만들어둔 실행파일에 어떤 방법으로 lua 를 껴넣는다는건지 궁금하네요.

단일 실행파일로 못 만든다는건 결국 lua를 shell 을 통해 실행시킨다는 이야기이십니까? 그렇다면 lua 의 장점을 전부 잃어버리는 결과를 낳을 것입니다. lua 는 app 에 embedded 되었을때 비로소 강점을 발휘합니다.
C의 자료 구조나 함수에 모두 접근이 가능하다는게 최고의 장점 중 하나이며 이것으로 인해 실시간으로 app 조작이 가능하게 되거든요. ( 컴파일 없이 app 의 실행 구조를 마음대로 바꿀 수 있다는게 저에겐 가장 큰 장점입니다. 한번 올려두면 스크립트 파일 수정으로 이것저것 test case 를 바꿔 볼 수 있으니까요. )

예를들어 GUI 프로그램을 짤때 각 GUI 좌표를 고친다던가 GUI 요소의 타이머를 다시 세팅한다던가 직접 실행해보면서 test 해야할 경우가 많습니다. 이런경우 text 파일로 따로 포맷을 만들거나 xml 등을 쓰거나 하지 않는 이상 일일이 다시 컴파일 해서 세팅값을 바꿔보고 다시 실행해서 눈으로 확인해보고 해야합니다. 그러나 Lua 를 embedding 시켰을 경우 런타임에 실행해보면서 값을 바꿔서 다시 이벤트를 주거나 필요한 부분만 반복해서 수행할 수 있습니다. 이런점이 최고의 강점이라고 생각합니다. 게다가 C 함수를 호출하는 부분들이 그냥 C 언어로 호출하는것과 비교해 크게 overhead 가 없다는게 여타의 스크립트 언어와 대비해서 큰 강점이라고 볼 수 있습니다. 말 그대로 가볍고 빠르며, 이러한 강점들때문에 게임 같은 실시간 app 에서 로직을 제어하는데 주요 스크립트 언어로 각광을 받는 것입니다.

저같은 경우 게임 client 개발에 lua 를 접목하면서 개발속도나 테스팅 속도를 비약적으로 축약한 경험이 많습니다. 거의 1/10 이하의 시간으로 훨씬 품질이 좋은 결과를 얻을 수 있었지요.

Neogeo - Future is Now.

Neogeo - Future is Now.

mirheekl의 이미지

임베딩 목적으로 작업할때야 당연히 그렇게 작업하는게 맞겠지요.

하지만 저는 Lua의 빠른속도와 문법의 간결함을 간단한 유틸리티 프로그램을 작성하는 데에 사용하고 싶은 것이거든요.
이를테면 파이썬처럼 쓰고 싶은 겁니다.
여기선 임베딩이 아무런 의미가 없고
그저 일반 스크립트언어처럼 컴파일후 단일 EXE파일 하나만 생기는 그런 기능이 필요한 것입니다.

이경우 외부에 Lua가 노출되면 의미가 없습니다. 베이직 프로그램을 짤 때 BAS파일로 배포하는 셈이나 마찬가지니까요.
임베딩 목적으로 사용하는 경우야 로직이 외부로 떨어져있는게 확실한 의미가 있겠지만,
모든 로직이 다 Lua에 들어있는데 그걸 일반사용자에게 배포하기는 좀 힘들지요.

이렇게 일반적인 스크립트 언어처럼 사용되는 것이 Lua의 장점을 모두 잃게 하느냐..
그렇지는 않다고 생각합니다. (물론 그냥 제 생각입니다.)
간결한 문법과 엄청나게 빠른 속도, 그리고 table자료구조가 갖는 강력함..
이것은 굳이 임베딩하지 않아도 그 자체로 Lua만의 특장점이라고 생각합니다.

허나 기존에 EXE를 만드는 툴이 없다면,
결국 필요 라이브러리를 모두 추가시켜둔 EXE를 미리 만들어둔 뒤
그것을 가지고 다니면서 Lua 인터프리터로 쓰는수밖에 없을것 같습니다. (제가 알아본바로는 그렇습니다.)
그리고 제 질문은 이방법밖에 없느냐 이거였습니다. C컴파일러를 사용하지 않는다는 가정하에서 말입니다.

마침 wxLua라는 녀석을 찾았습니다. IDE를 제공하며, C컴파일러 없이도 UI를 띄울 수가 있군요.
EXE생성까지 가능한지는 모르겠는데.. wxLua만으로는 불가능할지는 몰라도..
생각해보니 제가 원하는 일을 해주는 툴을 만들 수 있을것 같기도 하네요.
wxLua인터프리터랑 이진화된 Lua파일을 하나의 실행파일로 조합해주는 툴은 어떻게든 만들어볼 수 있을 것 같습니다.

아무튼 관심 감사합니다 ^^;;

--
This is for you new people. I have just one rule :
Everyone fights, no one quits. If you don't do your job, I'll shoot you myself. Do you get me?

--

neogeo의 이미지

lua 스크립트 자체파일은 컴파일된( 정확히는 인코딩된 ) 결과물로 luac 라는 바이너리 형태로 배포하는 방법도 있을 수 있겠네요. php 의 zend encoder 와 비슷하다고 보시면 됩니다.

( 물론 사용자가 역컴파일 하는게 비교적 쉽겠지만요... ) 아니면 기존 exe 파일이 자기자신의 특정 주소를 읽어서 ( 어차피 사이즈 고정이므로 ) 그 이후부분을 컴파일된 lua 바이너리로 인식하게 하는 방법도 가능하겠습니다. 즉 특정 유틸로 lua 를 컴파일(인코딩) 하고 기존 exe 파일 뒤에 luac 결과를 덧붙이는 것이지요. 그리고 그 exe 파일은 자기 자신의 특정 사이즈 이후 부분을 모두 읽어서 luac script 인양 사용하시면 되겠네요.

상황이 잘 이해가 안가서 임베딩하는 경우만 생각했네요 :) 죄송합니다.

Neogeo - Future is Now.

Neogeo - Future is Now.

mirheekl의 이미지

일단 EXE직전까지의 기능은 wxLua가 모두 지원하고 있는 것 같고..
(요녀석은 그자체가 원래 Lua의 기능을 모두 포함하는데다 C/C++임베딩까지 지원하고 있어서 나중에 임베딩용으로 전환하기에도 편할듯 합니다)

EXE를 만드는 것은 말씀하신 대로 이진화된 Lua파일을 EXE파일에 아예 붙여버리든지, 아니면 이진화된 Lua파일을 다시 인크립션하고 CRC같은걸 걸어서 쉽게 조작하기 어렵게 만들어버리면.. 이러면 별도파일로 존재해도 큰 지장은 없겠죠.. 이정도까지는 독립적인 툴로 만들어낼 수 있을 것 같아요

이것도 뒤져보면 누군가 해놨을것 같긴 한데..
이러면 제가 원하는 스크립트 언어가 됩니다. ^^;;

좋은 말씀들 대단히 감사합니다.

--
This is for you new people. I have just one rule :
Everyone fights, no one quits. If you don't do your job, I'll shoot you myself. Do you get me?

--

mandami의 이미지

제목만 보자마자 이것이 생각났습니다.

http://idogame.hangame.com/

한게임의 게임 제작 공모전(?) 비슷한건데 리소스랑 엔진을 제공해주더군요.

그런데 그 엔진이 lua기반으로 돌아가는거 같습니다. (직접 해보지는 않아 정확히는 모르겠습니다.)

튜터리얼
http://idogame.hangame.com/guide/tutorial.nhn

mirheekl의 이미지

wxLua라는 프로젝트가 있습니다.. http://wxlua.sourceforge.net

wxWidgets을 이용하는 것이며 동일한 라이센스를 가지고 있고.. 기존 윈도 프로그램과 아주 유사한 UI를 생성할 수 있으며 플랫폼 의존성이 적은 wxWidget의 장점을 그대로 가지고 있습니다. 또한 기본 Lua 5.1위에다가 GUI라이브러리를 덧씌운 셈이라 사용법상 거의 차이가 없습니다. 기존 Lua에 GUI함수가 없는걸 보완해서 만든 것이라고 생각하면 될듯 합니다.

요녀석만 있으면 함께 제공되는 통합 개발 환경에서 디버깅, EXE파일 만들기까지 간단하게 가능했습니다
그리고 wxLua라이브러리를 일반 C/C++프로젝트에 넣어서 일반적인 Lua처럼 임베딩하는것도 가능하고..
여기에 기존 Lua에서 쓰던 라이브러리를 추가시킬 수도 있습니다. 기존 Lua를 쓰던 것과 동일하게 이용할 수 있는 모양입니다.

단지 wxLua의 인터프리터 사이즈가 기본적으로 큰 관계로 만들어진 EXE파일도 좀 큰 것이 문제인데..
한 5~6MB 정도 됩니다만, 비슷한 일을 기타 스크립트로 했을때보단 속도가 빠릅니다.
파일구조가 간단한지 UPX로 압축을 하게 되면 1.xMB 정도로 많이 줄어들고요.
이건 스태틱방식으로 컴파일했을때 이렇고..
DLL을 사용하는 인터프리터를 동원하게 되면 필요없는 DLL을 빼버릴 수 있으므로 훨씬 라이트해지지 않을까 했는데..
필수 라이브러리 덩치가 크네요 젝일ㅠ.ㅠ

동일한 소스를 가지고 기존처럼 C임베딩을 이용하면.. GUI컴포넌트중에 필요없는 파트는 쳐낼 수 있으므로 이렇게 해서 사이즈를 줄일 수 있을것 같기도 하고요. 물론 이경우 C컴파일러가 필요해지니.. 평소에는 그냥 사용하다가 사이즈가 중요한 프로젝트에서만 이런식으로 하면 될것 같아요.

생각보다 EXE파일 크기가 작지 않은게 약간 불만이지만.. 그것 외에는 괜찮은것 같네요. 일단 속도가 빠르니 시원시원한 느낌입니다. 근데 마음 한구석 어딘가가 좀 찜찜하네요.. 흠..

도와주신 모든 분들께 감사드립니다.
위에 한게임 링크도 들어가봤는데, Lua가 참 여러곳에 쓰이는구만요.. 배워두면 쓸모가 많겠다는 생각이 계속 듭니다.

--
This is for you new people. I have just one rule :
Everyone fights, no one quits. If you don't do your job, I'll shoot you myself. Do you get me?

--

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.