PGLight 배포파일

Posted by 적분 ∫2tdt=t²+c
2013.10.11 01:17 프로그래밍/PG어



PGLight.dll


PGLight.lib


PGLAPI.h


정리해서 사용할 수 있게끔 올려놓는다는걸 깜박하고 있었네요.

PGLight의 DLL과 헤더 파일입니다.


PGLight 라이브러리를 이용하면 C/C 로 개발된 프로그램에서 PG어 코드를 불러와서 수행하고, 결과를 얻어내는 일을 할 수 있습니다. API함수에 대한 레퍼런스는 여기에서 확인하실 수 있습니다.

다음 예제는 간단한 PG어 인터프리터 프로그램입니다. 커맨드라인이나 프로그램으로 입력된 PG어 코드 파일을 컴파일하고, 이를 실행합니다.




PGLight API를 이용하여 PG어 스크립트를 실행하는 과정은 크게 다음과 같습니다.


1. PGL 라이브러리 초기화

2. 코드 불러오기 및 컴파일

3. 스레드 생성 후 실행

4. 종료


1. PGL 라이브러리 초기화

 PGL초기화는 PGL_Init함수를 이용합니다. 이 함수는 가상머신을 생성하고 초기화합니다. 이 함수는 가상머신의 핸들(PGLM 타입)을 반환하는데, 이는 코드 실행이 모두 끝나고 마지막에 PGL_Close로 닫아주어야 합니다.

 PGL 표준 라이브러리를 사용하고자 할 경우는 PGL_LoadStdLibrary 를 호출하여 표준 라이브러리를 로드하여야 합니다.

 기타 사용목적에 알맞게 전역변수/함수 선언이 필요할 경우는 PGL_RegisterGlobal 함수를 이용하여 전역변수/함수를 등록합니다. 전역변수/함수 등록은 반드시 컴파일 이전에 이루어져야 합니다. 등록된 전역변수/함수를 통해 코드 실행 중에도 C/C 측에서 PGL_GetGlobalValue 함수를 통해 PG어 스크립트의 값을 얻어낼수 있습니다.


2. 코드 불러오기 및 컴파일

 초기화 작업이 끝났으면, 실제로 실행할 PG어 스크립트 파일을 로드해야합니다. 이는 PGL_Load 함수를 통해 이루어집니다. 여러 개의 스크립트 파일을 로드해야할 경우는 PGL_Load 함수를 여러 번 호출하면 됩니다. PGL_Load 함수가 실패한 경우 PGL_GetErrorMsg 함수를 이용해 에러의 원인을 알아낼 수 있습니다.

 코드 로드가 완료되었으면, PGL_Run 함수를 호출하며 가상머신을 동작시킵니다. 변수나 함수가 unresolved된 경우에는 링크 에러를 발생시키며 이 함수는 종료됩니다. 그 경우 역시 PGL_GetErrorMsg 함수로 에러의 원인을 알아낼 수 있습니다.


3. 스레드 생성 후 실행

 가상머신이 시작되었으면, 이제 실제 스레드를 생성하고 코드를 실행할 수 있습니다. PGL_NewThread 함수로 새로운 스레드를 만들수 있습니다. 이 함수는 생성된 스레드의 핸들을 반환합니다. 사용을 다한 스레드는 PGLT_Close 함수로 닫아주어야 합니다. 생성한 스레드는 전역공간에 있는 코드를 실행하도록 시작위치가 자동으로 잡혀있습니다. 이 상황에서 바로 PGLT_Resume 함수를 호출하면 모든 전역 공간의 명령을 수행할 것입니다.

 만약 특정한 함수를 호출하고 싶을 경우에는 PGL_GetGlobalValue 로 전역함수의 핸들을 가져온뒤, PGLT_Push 로 스레드에 넣고, 함수의 인자로 사용될 데이터를 추가적으로 스레드에 푸시합니다. 그 뒤 PGLT_Entry 함수를 호출하면 스레드에 푸시된 함수와 그 인자를 바탕으로 코드를 수행할 준비를 합니다. 그리고 나서 PGLT_Resume 함수를 호출하면 해당 함수의 코드만 수행할 것입니다.

 스레드 수행 도중 발생한 에러는 PGLT_GetErrorMsg 함수로 알아낼 수 있습니다. 

 스레드는 메모리가 허용하는 만큼 무수히 생성할 수 있습니다. 


4. 종료

 모든 스크립트 코드의 수행이 끝났다면 PGLT_Close, PGL_Close 와 같이 종료함수를 반드시 호출해주어야 합니다. 그렇지 않으면 메모리 누수가 발생할 것입니다. 이는 PGLData도 마찬가지로 사용이 끝난 PGLData는 반드시 PGLD_Release 함수로 제거해 주어야합니다.


A. PG어 스크립트 측에서 C/C 함수를 호출하기

 1번 과정 중에 PGL_RegisterGlobal 함수를 이용해 C/C 함수를 등록하여 주면 됩니다. C/C 함수는 PGLD_CreateCFunction 을 이용하여 PGLData로 만들수 있습니다. 이렇게 만들어진 PGLData를 PGL_RegisterGlobal 함수로 "abc"라고 등록하였다면, PG어 스크립트에서 abc(); 와 같이 이 함수를 호출함으로써 C/C 언어의 함수가 실행되게 됩니다.


B. C/C 에서 PG어 스크립트 측의 함수를 호출하기

 3번 과정과 상동


추후 업데이트 예정




신고
Tags
이 댓글을 비밀 댓글로