\documentclass{howto}

\usepackage[hangul,nonfrench]{dhucs}
\usepackage{dhucs-ucshyper}
\hypersetup{%
  colorlinks=true,
  plainpages=false,
}

\title{ROVM 설치하기}
\author{정 원교}
\authoraddress{
  \strong{지구 남쪽에서}\\
  이메일 : \email{weongyo@gmail.org}
}
\date{2006.3.20}

\begin{document}
\maketitle

\begin{abstract}
  \noindent
  이 문서는 ROVM Server 와 ROVM Client, ROVM Compiler, ROVM Library 의 설치 방법에 대해서 기술한 문서입니다.  
  ROVM 은 Remote Object Virtual Machine 의 약어로써 `원격 객체 가상 머신' 을 뜻합니다.
\end{abstract}

\tableofcontents

\section{홈페이지}
\label{sec:homepage}

ROVM 은 `에랑' 프로젝트의 한 부분입니다.  현재 ROVM 홈페이지는
KLDP.net (http://kldp.net) 의 작은 프로젝트로 등록되어 운영되고
있습니다.  홈페이지 주소는 아래와 같습니다. 

\begin{itemize}
\item[] \url{http://envlang.kldp.net}
\end{itemize}
국내 오픈소스 발전을 위해 힘써주시고 좋은 공간을 마련해 주시는 KLDP\footnote{\url{http://kldp.org}}
관계자분께 감사를 전합니다.

\section{설치하기 전에}
\label{sec:beforeinstall}

\subsection{사용 조건}
\label{sec:usagecond}

여러분이 ROVM 을 여러분의 시스템에서 사용함은 아래와 같은 조건에 모두 동의를 한다는 것을 의미합니다.

\begin{itemize}
\item ROVM Server 는 서버 프로그램으로써, 네트워크 포트를 통해 Listening 을 하고 있습니다.  이를
  통해 악의적인 Cracker 가 ROVM Server 가 실행되는 권한으로 시스템에 침투를 할 수 있으며, 이로
  인한 피해는 `ROVM 개발팀'가 책임지지 않습니다.
\item 기타 ROVM 관련 프로그램의 잘못된 사용으로 인해 발생하는 피해는 `ROVM 개발팀'가 책임지지
  않습니다.
\end{itemize}

\subsection{공식 지원 환경}
\label{sec:supportarch}

ROVM 패키지는 현재 다섯 개의 패키지로 구성되어 있습니다.  각각의
패키지에 대한 설명을 한다면 아래와 같습니다.

\begin{itemize}
\item ROVM Server \\
  ROVM 을 실제로 수행하는 서버 프로그램입니다.
\item ROVM Library \\
  ROVM Server 를 잘 활용할 수 있도록 도와주는 core 클래스들을 모든 패키지 입니다.  이
  패키지를 설치하지 않아도, ROVM Server 의 실행에는 문제가 없지만 매우
  협소한 기능들만 이용할 수 있을 것입니다.
\item ROVM Client \\
  ROVM Server 와의 통신, 디버깅, 테스트 등등의 이유로 만들어진 프로그램입니다.
\item ROVM Interface \\
  간단하게 ROVM Client 의 C 언어 버전이라고 생각하면 쉽습니다만 디버깅 용이 아닌 실제
  ROVM Server 와의 연동을 목적으로 만든 패키지입니다.
\item ROVM Compiler \\
  ROVM Server 에서 사용하는 ``ENVLANG File Format'' 형식의 바이너리
  포맷을 생성해주는 매우 간단한 컴파일러입니다.
\end{itemize}

ROVM Server 와 ROVM Interface 의 경우, 현재 아래와 같은 컴퓨터 환경을 지원합니다.

\begin{itemize}
\item Linux (i386)
\end{itemize}

위에서 언급된 이외의 환경의 경우, ROVM Server 와 ROVM Interface 가
정확하게 동작한다는 보장을 못해드립니다. 

ROVM Library 의 경우, ROVM Server 가 실행될 수 있는 환경을 지원합니다.

ROVM Client 의 경우, Python 코드로 작성되어 있기 때문에 Python 코드가
실행될 수 있는 환경의 경우 모두 문제없이 실행될 것으로 예상합니다.
테스트가 된 환경은 아래와 같은 환경입니다. 

\begin{itemize}
\item Windows 2003 (i386)
\end{itemize}

ROVM Compiler 의 경우, ROVM Client 와 마찬가지로 Python 코드로
작성되어 있기 때문에 Python 코드가 실행될 수 있는 환경의 경우 
모두 문제없이 실행될 것으로 예상합니다.  테스트가 된 환경은 ROVM
Client 와 동일합니다.

\section{ROVM Server 설치하기}

ROVM Server 를 설치하고자 하는 분이 아닐 경우, 이 절을 건너 뛰어도 좋습니다.

ROVM Server 는 네트워크 통신을 수행하기 때문에, Default Port (4390
포트) 를 통해 계속 Listening 을 수행하고 있습니다.  만약 이전 ROVM
Server 에 취약점이 존재할 경우, 악의적인 Cracker 로 인해 \textbf{ROVM
  Server 가 실행되는 권한으로 임의의 명령이 실행}될 수 있습니다.  항상
최신 버전을 사용하시기 바랍니다. 

\subsection{OpenSSL 설치하기}
\label{sec:opensslinst}

ROVM Server v0.1.35a 버전부터는 모든 통신에 대해 암호화 통신을 하기
때문에 반드시 OpenSSL 이 시스템상에 설치되어 있어야 합니다.

\url{http://www.openssl.org} 에서 최신 소스를 받아 시스템에
설치합니다.

\begin{verbatim}
$ tar xvvzf openssl-0.9.8a.tar.gz
$ cd openssl-0.9.8a
$ ./configure
$ make
$ make install
$
\end{verbatim}

아래에서는 OpenSSL 이 \texttt{/usr/local/ssl} 디렉토리에 설치되어 있다는 것을
가정하고 설명을 하도록 하겠습니다.

\subsection{Server 다운로드 받기}
\label{sec:serverdownload}

ROVM 설치시 항상 최신의 버전을 유지하기를 권해 드리며, 최신 버전은 아래의 사이트에서 구할 수 
있습니다.

\begin{verbatim}
http://kldp.net/frs/?group_id=700
\end{verbatim}

아래와 같이 파일을 임시 디렉토리에 받아 압축을 해제합니다.

\begin{verbatim}
$ mkdir tmp
$ cd tmp
$ wget http://kldp.net/frs/download.php/3160/rovm-latest.tar.bz2
$ tar xvvjf rovm-latest.tar.bz2
$ cd rovm
\end{verbatim}

\subsection{configure 와 make}
\label{sec:serverconfigure}

이제 ./configure 명령을 실행시키게 되는데, 만약 ROVM 개발자의 경우, 좀 더 쉬운 디버깅을
위해서 CFLAGS 를 추가하여 컴파일하기를 권해 드립니다.  ./configure 명령의 옵션은 여러분이
정하시기 바랍니다.  아무런 옵션이 없을 경우, 기본값들이 사용됩니다.

\begin{verbatim}
$ CFLAGS='-g -O0' ./configure
\end{verbatim}

만약 일반적인 컴파일을 하실려면 단순히 ./configure 만 입력하셔도 무방합니다.
\begin{verbatim}
$ ./configure
\end{verbatim}

만약 OpenSSL 을 /usr/local/ssl 이외의 디렉토리에 설치하였다면
\texttt{--with-ssl} 옵션을 이용하여 그 경로를 반드시 지정해 줘야
합니다.
\begin{verbatim}
$ ./configure --with-ssl=/usr/local/ssl2
\end{verbatim}

이제 make 명령을 통해서 build 하시면 됩니다.

\begin{verbatim}
$ make
\end{verbatim}

%\paragraph{ROVM Server 의 설정}
%
%현재 ROVM Server 의 경우, 설정 파일이란 개념이
%존재하지 않습니다, 그래서 직접 ROVM Server 소스 파일을 수정해야
%됩니다.  (이 란은 설정 파일 개념이 도입되면 자동으로 사라지게 될 것입니다)
%
%ROVM Server 의 설정은 \$prefix/src/rovm.c 파일의 init_rovm_config ()
%함수에서 모두 이루어지게 됩니다.
%
%현재 유용하게 수정할 수 있는 항목으로는 아래와 같은 것들이 있을 수 있겠습니다.
%\begin{itemize}
%\item CONF_PORT \\
%  ROVM Server 의 기본 listening 포트를 지정할 때 사용됩니다.
%\item CONF_THREADS_PER_CHILD \\
%  ROVM Server 의 경우, 시작시 listening thread 와 worker thread 를
%  만들게 되는데, 이 값은 worker thread 의 갯수를 지정할 때 사용합니다.
%\item CONF_LOGLEVEL \\
%  ROVM Server 가 실행되는 중, 만나게 되는 로그 기록의 레벨을 정할 수가
%  있습니다.  자세한 내용은 \$prefix/src/log.h 파일을 참조하시면 선택할
%  수 있는 레벨을 보실 수 있습니다.
%\item CONF_CLASSROOT \\
%  Class Root 경로를 지정하는 변수입니다.  ``Class Root''라는 개념이
%  생소하실 분들이 대단히 많을 것 같은데, 이에 대한 자세한 설명은 아래
%  \ref{sec:serverclassroot} 섹션에서 자세히 언급되어 있습니다.
%\end{itemize}

%\subsection{Class Root 설정하기}
%\label{sec:serverclassroot}

%\emph{(이 섹션에서 설명되는 내용은 정확하게 설치하지 않아도 되는
%내용입니다. 만약 이해할 수 없을 경우, 단순히 skip 하시면 됩니다.  단,
%`new', `newarray', 'call' opcode 가 제대로 작동 안될 것입니다.  하지만 실행에는 문제가 없습니다.)}
%
%위 \ref{sec:serverconfigure} 섹션에서 잠깐 Class Root 에 대한 언급이
%되었는데, 이 섹션에서는 이에 대해서 좀 더 자세히 알아 보도록
%하겠습니다.

%``Class Root''는 `NEW' opcode 가 ROVM Server 에 추가되면서 새롭게
%추가된 개념입니다. 설명을 한다면 이렇게 설명할 수 있을 것 같습니다.
%\begin{itemize}
%\item 아파치 서버를 설정해 보신 분들이라면, httpd.conf 파일의
%  DocumentRoot 를 생각할 수 있을 것입니다.  아파치에서는
%  DocumentRoot 를 하위로 HTML 문서들이 나열되어 있습니다.  이와
%  마찬가지로 ROVM Server 에서 사용되는 클래스 파일들은 ``Class
%  Root'' 디렉토리 밑에 모두 나열되어 있다고 보시면 됩니다.
%\item 만약 Java 에 익숙하신 분들이라면 간단하게 CLASSPATH 의
%  축소판이라고 생각할 수 있을 것입니다.  CLASSPATH 의 경우, 구분자를
%  두어 여러 디렉토리를 지정할 수 있도록 하고 있지만, 현재 ROVM
%  Server 에서는 하나의 디렉토리만 선택하도록 되어 있습니다.
%\end{itemize}
%그럼 이 ``Class Root''가 어떻게 동작하는지 자세히 살펴보도록
%하겠습니다.

%ROVM Server 의 ``Class Root'' 값이 ``\texttt{/tmp/classroot}''로 설정되어
%있다고 가정을 하였을 때, 사용자가 아래와 같은 `NEW' opcode 를
%보내왔다고 가정합니다.
%\begin{verbatim}
%... new e://192.168.58.129:4390/ABCDEF
%\end{verbatim}
%이런 경우가 발생하였을 때, ROVM Server 는 `NEW' opcode 의
%``\texttt{/ABCDEF}'' 에 해당하는 경로를 찾아야 합니다.  이 때 같이 결합되게
%되는 것이 바로 ``Class Root''로써 ROVM Server 는 이들의 결합인
%``\texttt{/tmp/classroot/ABCDEF.e}'' (여기서 마지막 .e 는 Class 파일의
%확장자) 를 파일 경로로 하여 클래스 로드를 시도 하게 되는 것입니다.
%
%이제, 실제 Class Root 를 사용할 수 있도록 환경을 구성해 보도록
%하겠습니다.  현재 ROVM Server 에서는 `Class Root' 는 고정값으로
%박혀있기 때문에 다른 경로를 원한다면 이 옵션을 수정해 주셔야 합니다.
%수정 방법에 대해서는 \ref{sec:serverconfigure} 섹션에 자세히 나와
%있습니다.
%
%아래에서는 `Class Root' 가 \texttt{/tmp/classroot} 라고 가정하에
%작성하겠습니다.  먼저 디렉토리를 만듭니다.
%
%\begin{verbatim}
%$ mkdir /tmp/classroot
%\end{verbatim}
%
%그리고 ``ENVLANG File Format'' 에 맞는 클래스 파일을
%\texttt{/tmp/classroot} 디렉토리 아래에 두기만 하면됩니다.  예를 들어
%설명하면 현재 ROVM Compiler v0.0.1a 패키지내에는 ABCDEF.e 파일이
%포함되어 있습니다.  이것을 설치해 보겠습니다.
%
%\begin{verbatim}
%$ cd /tmp
%$ wget http://kldp.net/frs/download.php/3176/rovmcompiler-0.0.1a.tar.bz2
%$ tar xvvjf rovmcompiler-0.0.1a.tar.bz2
%$ cp rovmcompiler/ABCDEF.e /tmp/classroot/
%$ ls -l /tmp/classroot
%total 4
%-rw-r--r--  1 weongyo weongyo 111 2006-02-02 20:15 ABCDEF.e
%\end{verbatim}
%
%이제 ROVM Client 에서 아래와 같은 명령을 통해서 ABCDEF.e 클래스를 ROVM
%상에 로드할 수 있을 것입니다.
%
%\begin{verbatim}
%... new e://192.168.58.129:4390/ABCDEF
%\end{verbatim}

\subsection{ROVM Server 설치하기}
\label{sec:serverinst}

이제 위의 과정으로 Build 가 끝났습니다.  프로그램 바이너리가 제대로 생성되었다면 src/rovm
파일을 확인할 수 있을 것입니다.

\begin{verbatim}
$ ls -l src/rovm
-rwxr-xr-x  1 weongyo weongyo 1786531 2006-01-30 08:21 src/rovm
\end{verbatim}

설치를 하려면 아래와 같이 단순히 명령을 입력함으로써 가능합니다.

\begin{verbatim}
$ make install
\end{verbatim}

만약 configure 단계에서 prefix 를 지정해 주었다면 해당 디렉토리로
설치가 될 것이며 기본값을 사용하도록 하였다면
`\texttt{/usr/local/rovm}' 에 설치가 될 것입니다.

%아래 단계에서 ROVM Library 설치를 할 텐데, 이를 사용하길 바란다면
%``Class Root''의 설정을 제대로 하시기 권고합니다.

\subsection{ROVM Server 설정하기}
\label{sec:serverconf}

ROVM Server 의 설정에 대한 자세한 내용은 문서 ``ROVM Server
설정하기''를 살펴보시기 바랍니다.

\subsection{ROVM Server 실행}
\label{sec:serverexec}

이제 실행을 시켜 봅시다.  만약 아직 ROVM Library 의 설치가 완료가 되지
않았다면, 우선 해당 라이브러리를 설치한 후 실행하시기 바랍니다.

ROVM Server 를 실행하면 아래와 같이 암호를 물어보게 됩니다.  만약 개인
인증서를 사용하지 않고 default 인증서를 사용하고 있다면 암호는
``rovmserver'' 입니다.  (개인 인증서 사용에 대한 자세한 내용은 문서 ``ROVM Server
설정하기''를 보시기 바랍니다.

\begin{verbatim}
$ cd /usr/local/rovm
$ bin/rovm
ROVM Server mod_ssl/0.1.35a (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phrases.

Server localhost:4390 (RSA)
Enter pass phrase:
\end{verbatim}

\textbf{!주의!} ROVM Server 는 네트워크 소켓을 통해서 Listening 을
수행하고 있기 때문에, 되도록 시스템 권한이 없는 `nobody' 와 같은
계정을 이용하여 실행하길 권합니다. 

\section{ROVM Library 설치하기}
\label{sec:library}

(순수히 ROVM Server 의 실험 및 개발을 목적이라고 한다면 이 패키지를
설치하지 않으셔도 됩니다.)

이 절에서는 ROVM Server 에서 사용되는 core 라이브러리에 대한 설치에
대해 알아보도록 하겠습니다.

%현재 ROVM Library 의 구성 트리 구조는 아래와 같습니다.  (현재 v0.0.2a
%이기 때문에 거의 존재하지 않습니다.  아래가 전부입니다.  앞으로 계속
%채워지게 될 것입니다.)

%\begin{itemize}
%\item \texttt{core} (디렉토리)
%  \begin{itemize}
%  \item \texttt{str} (클래스) \\
%    문자열 (String) 을 지원하기 위한 클래스입니다.  str.tolower (),
%    str.rstrip () 과 같은 여러 문자열 기능들이 들어가게 될 것입니다.
%  \item \texttt{array} (클래스) \\
%    배열 (Array) 을 지원하는 클래스입니다.
%  \end{itemize}
%\end{itemize}

ROVM 홈페이지를 통해서 최신 버전을 받을 수 있습니다.

\begin{verbatim}
$ cd /tmp
$ wget http://kldp.net/frs/download.php/3185/rovmlib-latest.tar.gz
$ tar xvvzf rovmlib-latest.tar.gz
$ cd rovmlib-latest
\end{verbatim}

라이브러리를 성공적으로 컴파일하기 위해서는 반드시 ROVM Server 가 이미
시스템에 설치되어 있어야 합니다.  그 이유는 내부적으로 필요로 하는
아래 파일들에 대한 정보를 얻기 위해서 입니다.

\begin{itemize}
\item \texttt{el.h} \\
  모든 확장 모듈들은 el.h 파일을 include 하도록 되어 있으며, el.h 는
  확장 모듈을 만들 수 있도록 하는 모든 함수 prototype 이나 구조체들을
  포함하고 있습니다.
\item \texttt{libel.so} \\
  실제로 el.h 에서 정의된 함수들이 들어있는 공유 라이브러리입니다.
\end{itemize}

configure 를 실행할 때 이에 대한 정보를 \textbf{반드시} 건네주어야
됩니다.  만약 ROVM Server 를 \texttt{/usr/local/rovm} 에 설치를
하였다면 \texttt{--with-rovm} 옵션을 해당 경로로 설정해 주어야 합니다.

\begin{verbatim}
$ ./configure --prefix=/usr/local/rovm/classroot --with-rovm=/usr/local/rovm
\end{verbatim}

그리고 \texttt{--prefix} 는 반드시 ROVM Server 설정 중 ``Class Root''와 같은
경로로 정해야 합니다.  그렇지 않을 경우, 프로그램 실행시 경고가 발생할
것입니다.

이제 실제로 라이브러리를 컴파일하고 설치를 해봅시다.

\begin{verbatim}
$ make
$ make install
\end{verbatim}

그럼 라이브러리가 /usr/local/rovm/classroot 에 추가되는 것을 확인할 수
있을 것입니다.  설치 도중에 발생하는

\begin{verbatim}
----------------------------------------------------------------------
Libraries have been installed in:
   /usr/local/rovm/classroot/core

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
\end{verbatim}

와 같은 메세지는 무시하셔도 상관없습니다.

\section{ROVM Client 설치하기}
\label{sec:client}

이 절에서는 ROVM Server 와의 통신을 목적으로 사용되는 ROVM Client 의 설치 방법에 대해서
알아보도록 하겠습니다.

\subsection{요구사항}
\label{sec:clientreq}

ROVM Client 의 경우 아래와 같은 요구 사항이 존재하며, 아래의 패키지가 반드시 여러분의
컴퓨터 (시스템) 에 설치되어 있어야 원활하게 작동이 됩니다.

\begin{itemize}
\item Python 2.2 이상
\end{itemize}

\subsection{Client 내려받기}
\label{sec:clientdown}

ROVM Client 의 최신 버전은 ROVM Server 와 마찬가지로 아래의 사이트에서 구할 수 있습니다.

\begin{verbatim}
http://kldp.net/frs/?group_id=700
\end{verbatim}

현재 최신 버전은 첫번째 릴리즈인 ROVM Client 0.0.1d 입니다.

\begin{verbatim}
$ mkdir tmp
$ cd tmp
$ wget http://kldp.net/frs/download.php/3159/rovmclient-0.0.1a.zip
$ unzip rovmclient-0.0.1a.zip
$ cd rovmclient
\end{verbatim}

\subsection{실행하기}
\label{sec:clientexec}

ROVM Client 는 python 기반으로 작성되었기 때문에 이를 실행하기
위해서는 반드시 python 이 여러분의 시스템에 설치되어 있어야 합니다.

\begin{verbatim}
$ python rovmclient.py
\end{verbatim}

만약 프로그램의 인사말과 `\texttt{>>>}' 프롬프트를 보셨다면, 제대로
동작하는 것입니다. 

\section{ROVM Interface 설치하기}
\label{sec:rovminterface}

이 절에서는 실제 ROVM Server 와 연동하기 위한 패키지인 ROVM Interface
의 설치에 다룹니다.

\subsection{시작하기 전에}
\label{sec:rovminterfacebefore}

ROVM Server 와 연동하는 프로그램 개발에 관심있으신 분들만 이 패키지를
설치하시기 바랍니다.  그 외의 분들은 이 절을 건너뛰어셔도 무방합니다.

이 패키지가 현재 공식적으로 지원하고 있는 OS 및 시스템은 아래와
같습니다.  그 외의 사항의 경우, 잘 작동한다는 보장이 없습니다.

\begin{itemize}
\item ix86 (Linux)
\end{itemize}

\subsection{OpenSSL 설치하기}
\label{sec:opensslinst}

ROVM Server v0.1.35a 버전부터는 모든 통신에 대해 암호화 통신을 하기
때문에, v0.1.35a 이상의 Server 와 통신을 하기 위해서는 반드시 OpenSSL
이 시스템상에 설치되어 있어야 합니다.

\url{http://www.openssl.org} 에서 최신 소스를 받아 시스템에
설치합니다.

\begin{verbatim}
$ tar xvvzf openssl-0.9.8a.tar.gz
$ cd openssl-0.9.8a
$ ./configure
$ make
$ make install
$
\end{verbatim}

아래에서는 OpenSSL 이 \texttt{/usr/local/ssl} 디렉토리에 설치되어 있다는 것을
가정하고 설명을 하도록 하겠습니다.

\subsection{패키지 내려 받기}
\label{sec:interfacedownload}

현재 ROVM Interface 의 최신 버전은 첫번째 릴리즈인 v0.0.1a 입니다.

\begin{verbatim}
$ mkdir tmp
$ cd tmp
$ wget http://kldp.net/frs/download.php/3172/rovminterface-latest.tar.bz2
$ tar xvvjf rovminterface-latest.tar.bz2
$ cd rovminterface
\end{verbatim}

\subsection{컴파일과 설치}
\label{sec:interfacecompileinstall}

컴파일과 설치의 경우, 기존 다른 패키지 방식과 동일합니다.

\begin{verbatim}
$ ./configure --prefix=/home/weongyo/rovminterface
$ make
$ make install
\end{verbatim}

Default 설치 장소는 \texttt{/usr/local} 하위로 되기 때문에, 그 외의 장소에
설치하기를 원한다면 \texttt{--prefix} 를 적당히 지정하여 주시기 바랍니다.

그리고 만약 OpenSSL 을 /usr/local/ssl 이 아닌 다른 디렉토리에 지정해
주셨다면 \texttt{--with-ssl} 옵션을 이용하여 반드시 해당 디렉토리를 지정해 줘야 합니다.

\subsection{사용하기}
\label{sec:interfaceusage}

``ROVM Interface 문서''를 살펴보시기 바랍니다.

\section{ROVM Compiler 설치하기}
\label{sec:rovmcompiler}

이 절은 ``ENVLANG File Format'' 형식의 바이너리 포맷 파일을 생성할 수
있도록 도와주는 \emph{ROVM Compiler} 을 위한 절입니다.  만약 이에 대한
설명이 필요가 없다면 이 절을 건너뛰시기 바랍니다. 

``ENVLANG File Format'' 에 대한 자세한 설명이 필요하신 분은 홈페이지
(http://envlang.kldp.net) 의 \textbf{파일 포맷 문서}를 받아 보시기
바랍니다.

\subsection{시작하기 전에}
\label{sec:rovmcompilerbefore}

ROVM Compiler 는 매우 단순한 Compiler 이며, 매우 지저분하며... 결론은
\textbf{매우 별로}입니다.  또한 지원하는 문법은 assembly 수준의 매우
low-level 수준입니다.

ROVM Compiler 를 만드는 이유는 오직 ROVM Server 의 테스트 목적이며,
프로그램 개발자 (정원교) 는 이 컴파일러를 진지하게 만들 생각 또한
\textbf{없습니다}.  또한 이에 대한 지속적인 유지보수도 약속 드리지
못합니다. 

``ENVLANG File Format'' 의 파일 포맷에 관심이 있으신 분이나, opcode 의
테스트를 목적으로 하시는 분들께 사용을 권합니다.

\paragraph{언제나 환영입니다}

현재 ROVM Server 의 opcode 들을 활용하는 멋진 언어는 세상에 없습니다.
언제나 ROVM 프로젝트는 VM 의 명령어들을 100\% 활용하면서 간단 명료한
frontend 에 해당하는 언어를 기다립니다.  언젠가 한국인이나 외국인이나
혹은 개발팀이 만들어 줄 것이라 기대하고 있습니다.

컴퓨터를 하는 사람들에게 자신이 만든 언어을 얻는 만큼 괘활한 경험은
이 세상에서 얻기 매우 어려운 것이라 스스로 생각합니다.

여러분의 언어를 \textbf{*진지하게*} 만드십시오.  그리고 ROVM 에서도 돌아갈 수
있도록 만들어 주십시오.

혹시 필요한 opcode 기능이 있다면, ROVM 개발팀에게 연락하십시오.

\subsection{요구사항}
\label{sec:compilerreq}

ROVM Compiler 의 경우 아래와 같은 요구 사항이 존재하며, 아래의
패키지가 반드시 여러분의 컴퓨터 (시스템) 에 설치되어 있어야 원활하게
작동이 됩니다.

\begin{itemize}
\item Python 2.2 이상
\end{itemize}

\subsection{Compiler 내려받기}
\label{sec:compilerdown}

ROVM Compiler 의 최신 버전은 ROVM Server 와 마찬가지로 아래의
사이트에서 구할 수 있습니다. 

\begin{verbatim}
http://kldp.net/frs/?group_id=700
\end{verbatim}

현재 최신 버전은 첫번째 릴리즈인 ROVM Compiler 0.0.1a 입니다.

\begin{verbatim}
$ mkdir tmp
$ cd tmp
$ wget http://kldp.net/frs/download.php/3172/rovmcompiler-0.0.1a.tar.bz2
$ tar xvvjf rovmcompiler-0.0.1a.tar.bz2
$ cd rovmcompiler
\end{verbatim}

\subsection{컴파일하기}
\label{sec:compilercompile}

ROVM Compiler 는 python 기반으로 작성되었기 때문에 이를 실행하기
위해서는 반드시 python 이 여러분의 시스템에 설치되어 있어야 합니다.

일반적으로 프로그램을 실행시켰을 때, 나오는 메세지입니다.
\begin{verbatim}
$ python rovmcompiler.py
rovmcompiler.py: no input files.
\end{verbatim}

만약 도움말을 보시고 싶다면, ``\texttt{--help}'' 옵션을 사용할 수 있습니다만,
현재 지원하는 옵션은 하나도 없습니다.

\begin{verbatim}
$ python rovmcompiler.py --help
Usage: rovmcompiler.py [options] file...
Options:
  --help                Display this information
\end{verbatim}

실제 컴파일이 가능한 파일은 `tests' 디렉토리에 예제로써 들어
있습니다.  그 중 하나인 1.rovms 파일의 내용을 본다면 아래와 같습니다.
\begin{verbatim}
.package test

.class ABCDEF
    .def __init__ (S)V
        nop
    .defend

    .def abc (SII)I
        iload 1
        iload 2
        iadd
        ireturn
    .defend
.classend
\end{verbatim}

실제 컴파일을 한다면, 아래와 같이 하시면 됩니다.

\begin{verbatim}
$ python rovmcompiler.py tests/1.rovms
\end{verbatim}

그럼 ABCDEF.e 파일이 생성된다는 것을 확인할 수 있습니다.  이 파일을
어디로 복사할 것인가에 대해서는 \ref{sec:serverconfigure} 섹션의
``Class Root'' 부분을 보시기 바랍니다.
\bigskip \\
축하합니다.  ROVM 세계에 오신 것을 환영합니다.

\end{document}

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: t
%%% End: 
