논문 22-1-3 윈도우즈플랫폼에서의프로그램간실행시간상호연동기술에대한조사 Interoperation Techniques On Windows Platform 신승철노상훈권민혁임용수김성민한국기술교육대학교정보미디어공학과 {scshin; noulne; minhyuk; gninraw; smilefe2}@kut.ac.kr 프로그램상호연동기술은웹브라우져, 문서편집기등다양한종류의응용프로그램에서사용되며그필요성이높아지고있다. 프로그램간상호연동은컴파일시간에이미결정되기도하지만, 내장스크립트언어를통한상호연동처럼실행시간에만결정할수있는경우도있다. 본논문에서는실행시간에상호연동할수있는방법에초점을맞추어설명한다. 또한국내 PC 에서널리사용되고있는윈도우즈운영체제를중심으로여러플랫폼에실제로구현된상호연동기술의사례를조사하였다. 그리고마지막으로이상호연동기술들이인터프리터언어에서의상호연동에어떻게응용될수있는지제시한다. 1 서론 서로다른언어로작성되고독립적으로개발된프로그램의상호연동필요성이높아지고있다. 국내의컴퓨터환경에서쉽게접할수있는예는인터넷익스플로러이다. 비록보안문제들로인해비판을받고있긴하지만 ActiveX 라는형태로다양한프로그램이인터넷익스플로러와상호연동하며동작하고있다. 이상호연동기술을통해인터넷익스플로러안에서바로동영상을재생하고플래시를재생한다. 또한, PDF 나 HWP 와같은다양한문서파일을바로열어볼수있는것역시상호연동기술을통한것이다. 만약이러한상호연동기술이없었다면, 인터넷익스플로러의기능확장을통해얻을수있는편리함을취하기어려웠을것이다. 근래에는엑셀과같은문서작성프로그램에서부터게임에이르기까지다양한분야에서인터프리터를내장하고이를통해여러컴포넌트와상호연동하는응용도이루어지고있다. 특히이러한경우는인터프리터를내장하는프로그램을작성할때어떤컴포넌트와어떻게상호연동할지알수없으며, 실행시간에만결정할수있다. 본논문에서는이러한동적인환경을위해어떤상호연동기술이있는지조사하였다. 상호연동에있어서어려운점은서로다른프로그래밍언어로작성된프로그램간에이루어진다는점이다. 직관적으로는두프로그램의프로그래밍언어가무엇이냐에따라다른상호연동기술을필요로할것같지만, 상호연동기술의선택은오히려플랫폼의종류에의해결정된다. 현재국내 PC 운영체제의대부분을차지하고있는것은윈도우즈이다. 본논문에서는윈도우즈운영체제에서많이사용되고있는플랫폼인 WIN32, JVM 그리고.NET 을중심으로상호연동기술들을살펴본다.
2 프로그래밍언어논문지제 22 권 1 호 (2008. 10) 본논문의나머지부분은다음과같이구성된다.2 절에서는상호연동기술의요소를알아보고,3 절에서는여러상호연동기술들을소개한다. 그리고마지막절은결론이다. 2 상호연동기술의요소 상호연동기술을고안할때고려할점은크게두가지이다. 하나는어떻게연동하는프로그램의함수를호출할것인가이고, 또하나는주고받는데이터의호환성을어떻게부여할것인가이다. 함수를호출하는방법은컴퓨터내상호연동인지컴퓨터간상호연동인지에따라달라진다. 컴퓨터내상호연동은효율성을중요시하여함수의포인터를이용한다. 호출하는프로그램에서는어떻게든메모리상에올라가있는이함수포인터를얻어내직접호출을하는방식을취한다. 때문에반드시호출자 (caller) 와피호출자 (callee) 는반드시같은컴퓨터에속해있어야한다. 반면, 컴퓨터간상호연동은메시지를전달하는간접적인방식을사용한다. 많은경우이메시지는소켓을통해전달하며, 호출자는피호출자가다루는 메모리와같은 자원에직접적인접근을하지않는다. 이는호출자와피호출자를완전히분리시켜주며, 동작하는플랫폼이완전히분리되어있더라도무리없이동작가능하다. 이는분산처리와관련된특징이며이러한특성때문에이러한컴포넌트를분산컴포넌트라고한다. 분산컴포넌트여부에따라서상호연동기술을분류하면그림 1 과같다. [ 1] 분산여부별상호연동기술분류 컴퓨터간상호연동기술은플랫폼독립적인특성을갖지만, 컴퓨터내상호연동기술은서론에서언급한것과같이플랫폼에종속된다. 때문에컴퓨터내상호연동기술은그림 2 와같이플랫폼에따라분류할수있다. 상호연동기술의요소중데이터의호환성과관련된문제는마샬링 (marshalling)/ 언마샬링 (unmarshalling) 이라는방법을통해해결한다. 두상호연동하는프로그램이서로다른프로그래밍언어로작성되어있다면한쪽언어에는존재하지만다른한쪽에는존재하지않는데이터타입이존재할가능성이높다. 이는단순한데이터타입의값일수도있지만, 포인터로연결된그래프구조체와같이메모리여기저기흩어져있는복잡한데이터가될수도있다. 이런데이터를두프로그램이주고받으며사용하려고한다면, 두언어가호환할수있는타입으로인코드 / 디코드하는과정이필요하다. 이러한과정을마샬링 / 언마샬링이라고한다. 상호연동기술에따라이에대해서는전혀제한하고있지않은기술도있으며, 제한된표준데이터타입을제시하여항상제시된표준데이터타입으로변환하도록하기도한다.
윈도우즈플랫폼에서의프로그램간실행시간상호연동기술 신승철, 노상훈, 권민혁, 임용수, 김성민 3 3 상호연동기술 [ 2] 플랫폼별상호연동기술분류 앞절에서상호연동기술의두요소에대해서살펴보았다. 이절에서는실제사용되고있는상호연동기술과그사용례를살펴본다. 3.1 DLL DLL(Dynamic Link Library) 은상호연동을위해 WIN32 플랫폼에서가장기본적으로사용되는기술이다. 현재다양한플랫폼에서가장널리사용되고있는언어는 C/C++ 언어이다. 그리고이플랫폼을위해만들어지는실용적인언어는보통 C/C++ 언어와연동을고려한다. 이는 C/C++ 로작성된방대한라이브러리를활용할수있게하는이점을준다. WIN32 플랫폼에서는이를위해 DLL 을사용하며, 그예로 Java, Python, OCaml 등을들수있다. DLL 은호출의방법으로함수포인터를이용한다. DLL 사용과관련된 WIN32 API 로는 LoadLibrary 와 GetProcAddress 가있다. LoadLibrary 는동적으로 DLL 을로드하는역할을하며, GetProcAddress 는함수의이름으로인수로주면함수의포인터를알려준다. 이렇게얻어낸함수포인터를통해직접해당함수를호출할수있다. 단, 여기서의함수포인터는함수의코드위치만을의미하며, 함수의형식인수가어떤모양이며반환타입이어떻게되는지는전혀반영하지않는다. 그것은전적으로프로그래머에의해처리되어야한다. 즉, 완전히동적으로 DLL 의함수를호출하려고한다면이부분에대해서는타입시스템의유용성을포기해야한다. 인수를잘못넣은채호출하는것이허용되며이는해당프로그램의심각한문제를초래할수있다. 이는마샬링문제에도동일하게적용된다. DLL 을통한상호연동에서는어떠한기준도제공되지않으며전적으로상호연동하는두프로그램에책임이있다. 3.2 COM COM(Component Object Model) 역시 WIN32 플랫폼에서기본적으로제공되는기술이다. DLL 이함수수준의상호연동을제공하는것과달리 COM 은클래스수준의상호연동을제공한다. DLL 에서도인스턴스를만드는함수를이용하는편법으로클래스를사용할수있다. 하지만이경우두프로그래밍언어의클래스가호환이되어야만한다. COM 오브젝트를사용하기위해서도마찬가지로 COM 오브젝트와의호환성이필요하긴하지만, 이경우는 COM 기술자체가일종의표준으로쓰이기때문에불특정한프로그래밍
4 프로그래밍언어논문지제 22 권 1 호 (2008. 10) 언어로작성된프로그램간의상호연동에도사용할수있다. DLL 이함수포인터를사용하는것과같이 COM 은메소드의호출을위해가상함수테이블 (virtual function table) 을사용하여직접적인호출방법을제공한다. COM 오브젝트를사용할때필요한 API 는 COM 오브젝트를생성하는 CoCreateInstance 라는함수단하나이다. COM 클래스는특정한매커니즘에의해생성한 GUID 라는전세계적으로고유한식별자를갖으며, 이는윈도우즈레지스트리에등록되어 COM 오브젝트생성에사용된다. CoCreateInstance 로주어지는이식별자는같은객체에한해서는전세계적으로고유하므로단순히 DLL 을사용하는경우처럼어떤 DLL 을로드할지결정하기위해 LoadLibrary 를하는작업은불필요하다. 모든 COM 오브젝트는 IUnknown 인터페이스를구현함으로써만들어진다. IUnknown 인터페이스에는 QueryInterface, AddRef, Release 의세개의메소드가존재한다. 뒤의두개는레퍼런스카운팅목적의메소드이며, QueryInterface 는일종의다운캐스팅과같은역할을한다. 이인터페이스를통해특정한메소드를포함하는다른인터페이스의클래스로변환할수가있다. COM 의기본인터페이스에는비주얼베이직과같은인터프리터언어를지원하기위해 IDispatch 인터페이스가있다. 이인터페이스에는 GetIDsOfNames 와 Invoke 라는두메소드가있다. 각각은메소드의이름으로메소드아이디를얻어내고, 메소드아이디로해당메소드의호출을대행해주는메소드이다. 때문에, 이 COM 오브젝트에이메소드가구현되어있다면 QueryInterface 를통해이인터페이스를얻어내어완전히동적인시간에메소드를사용할수있다. COM 은이러한메소드의호출방법에관한측면만을정의하고있지않다. COM 오브젝트의정의는유한한개수의데이터타입만으로정의가능하다. COM 오브젝트를이용하는프로그램들은때문에적절하게마샬링 / 언마샬링을해야한다. 하지만 DLL 에서와달리이데이터타입들은일종의표준으로사용될수있기때문에불특정한프로그래밍언어로작성된프로그램과도무리없이상호연동할수있다. 3.3 Java RMI 윈도우즈상에서동작하는자바가상기계는 JNI 를통해윈도우즈의 DLL 과상호연동을제공해준다. 이러한기술은운영체제에종속되게되며, 자바가갖는플랫폼독립적인특성을잃게한다. 자바는 Java RMI 라는플랫폼독립적인분산컴포넌트기술을사용하고있다. 이를사용하기위한과정은다음과같다. 1. 서비스할원격객체의인터페이스작성 2. 원격객체및서버프로그램작성 3. 원격객체를사용할클라이언트프로그램작성 4. 스텁 (stub) 과스켈레톤 (skeleton) 생성 5. RMI 레지스트리실행 6. 서버 / 클라이언트실행 여기서주목할만한점은스텁과스켈레톤이다. 이는원격객체의프로그램이있으면툴을이용해자동으로생성할수있는데, 스텁은클라이언트에서사용하고스켈레톤은서버 즉, 원격객체 에서사용한다. 스텁은원격객체와동일한인터페이스를가지고있어, 클라이언트는원격객체의메소드를마치일반객체의메소드를호출하는것처럼사용할수있다. 단지, 그호출대상이원격객체자체가아니라스텁객체라는점이다를뿐이다. 스텁객체는 TCP 를통해서버쪽의스켈레톤객체와연결되어있어, 스텁객체의메소드가호출되면이연결을통해스켈레톤
윈도우즈플랫폼에서의프로그램간실행시간상호연동기술 신승철, 노상훈, 권민혁, 임용수, 김성민 5 객체에메소드호출을요청한다. 스켈레톤객체는 TCP 를통해메소드호출요청이들어오면해당메소드에대응하는원격객체의메소드를대신호출해준다. 이와같은구조는클라이언트의입장에서마치로컬컴퓨터에존재하는메소드를호출하는것처럼원격객체를다룰수있게한다. 두객체간의통신에는마샬링 / 언마샬링의과정을거치며이는바이트스트림의형태로이루어진다. Java RMI 는같은 Java 프로그래밍언어간의상호연동임에도불구하고 TCP 통신을통해호출메시지가전달되어야하므로이러한인코딩 / 디코딩과정이필요하다. 이는분산컴포넌트가비분산컴포넌트에비해성능적약점을갖음을보여준다. Java RMI 는이렇게분산환경에서상호연동을할수있는장점을갖고있지만, 메소드호출과정의간접성과복잡성에의해상당한성능하락을가져온다. 3.4 WCF WCF(Windows Communication Foundation) 는.NET 프레임웍 3.0 이상에서제공해주는상호연동기술이다. 이기술은 SOA(Service Oriented Architecture) 를기반으로하며, SOAP(Simple Object Access Protocol) 메시지를이용해상호간에정보를주고받는다. SOAP 메시지는그림 3 과같은형태의 XML 로구성된다. SOAP Header 는전송할서비스의주소, 라우팅과같은메시지처리에필요한정보들을기술하며, SOAP Body 는실질적인메시지를기술한다. [ 3] SOAP 메시지의구조 SOAP 메시지는 http 나 smtp 와같은채널을통해전달이된다. 이방식의장점은로컬컴퓨터에종속되지않는다는점이다. 앞에서언급되었던 DLL 이나 DCOM 이아닌 COM 과같은상호연동기술은코드가메모리에올라가고그코드에대한포인터를통해접근하기때문에, 반드시같은컴퓨터에있어야만정상적으로사용할수있다. XML 은매우복잡한자료구조도일관된방식으로표현할수있다. 때문에 SOAP 메시지가 XML 의형태로표현된다는점은불특정언어와의상호연동의마샬링 / 언마샬링의측면에서큰장점으로볼수있다. 하지만이러한형태로의인코딩 / 디코딩은파싱단계를포함해야하기때문에상당한성능의하락을수반한다.
6 프로그래밍언어논문지제 22 권 1 호 (2008. 10) [ I] 기본적인타입처리 int, long, short target integers oat, double target oats char, char target strings bool target boolean(target language 가지원하지않을경우 integer 0,1) structure, array, class pointer long long, long double unsupported 3.5 SWIG 앞에서는상호연동기술에따른호출방식의차이와마샬링 / 언마샬링이어떻게다루어지는지에대해서살펴보았다. SWIG(Simpli ed Wrapper and Interface Generator) 는앞에서소개되었던상호연동기술과는달리마샬링 / 언마샬링에관한문제만을다룬다. 이툴은그림 4 과같이 C/C++ 로작성된프로그램을다른다양한스크립트언어들에서사용할수있도록도와준다. [ 4] SOAP 메시지의구조 비록 COM 과같은상호연동기술이일종의표준데이터타입을제공해준다고하여도마샬러 / 언마샬러의구현은프로그래머가직접해주어야한다. 프로그램간상호연동에서발생하는버그의상당수가마샬러 / 언마샬러의잘못된구현에기인한다. 프로그램을넘어상호연동을하기위해다른데이터타입의값으로변환하는과정은타입검사를통한안전성의확보를무력화시킨다. SWIG 는 C/C++ 의원시프로그램을입력받아마샬러 / 언마샬러를자동으로생성해주어이러한문제를경감시켜준다. SWIG 는표 I 에서보여주는것과같이 C/C++ 의타입을목표스크립트언어에서가장유사한타입으로변환하는것을가정하지만, 정교한수준의마샬링 / 언마샬링을제공하지는않는다. 4 상호연동기술의인터프리터로의적용 앞에서는여러가지종류의상호연동기술에대해서조사하였다. 이를인터프리터로의적용하기위해서는다음과같은두가지경우를고려할수있다.
윈도우즈플랫폼에서의프로그램간실행시간상호연동기술 신승철, 노상훈, 권민혁, 임용수, 김성민 7 1. 기존에존재하는인터프리터를사용한다. 2. 새로운인터프리터를구현한다. 1 의방법을사용하기위해서는기본적으로해당인터프리터가상호연동할수있는방법을이미내장하고있어야한다. 윈도우즈플랫폼을위한인터프리터는일반적으로 DLL 사용방법을제공하므로이를이용할수있다. 만약 DLL 을사용할수있다면다른 COM/CORBA 와같은다른상호연동기술도간접적인방법으로사용할수있다. 예를들면 C 로 COM 오브젝트를조정할수있는래퍼함수를만들수있다. 이를 DLL 로만들어인터프리터에서사용을한다면, 함수호출의형태로 COM 오브젝트를사용할수있다. COM 오브젝트와의상호연동의경우 IDispatch 인터페이스를사용한다면특정 COM 오브젝트가아닌 IDispatch 인터페이스로구현한모든 COM 오브젝트를다룰수있으므로이를래퍼함수로만들어사용하면된다. 만약인터프리터가 DLL 은지원하지않지만소켓기능을제공한다면 CORBA 의구현원리를이용할수도있다. DLL 의경우와같이 C 로래퍼함수를만들되서버프로그램의형태로만든다. 이프로그램이패킷에의해래퍼함수를호출할수있는방법을제공해준다면 DLL 로호출하는경우와동일한능력을갖는다. 최악의경우는오직기본입출력 (Standard I/O) 만을제공하는경우이다. 통합개발환경과컴파일러간의상호연동에많이사용되는방법으로컴파일러의에러와같은콘솔출력메시지를통합개발환경에서 GUI 로표현한다. 소켓대신기본입출력을호출의뢰의채널로삼으면앞에서언급한방법들로다른상호연동기술을사용할수있다. 2 의방법을사용하는것은 1 번방법의경우와비교하면매우사소하다고볼수있다. 해당인터프리터를개발하는언어에서상호연동하는기술을가지고있으면직접구현하면된다. COM 오브젝트와같이오브젝트를인터프리터에서사용하기위해서는또다시두가지경우를고려해볼수있다. 1. 인터프리터가클래스를제공하지않는다. 2. 인터프리터가제공하는클래스가 COM 오브젝트와호환되지않는다. 3. 인터프리터가제공하는클래스가 COM 오브젝트와호환되는제공한다. 1 의경우는앞서서술했던것처럼래퍼함수를통한간접적인방법을사용해야한다.2 의경우인터프리터는동적으로클래스를생성할수있으므로인터프리터쪽에서는래퍼클래스를, DLL 쪽에서는래퍼함수를만들어사용할수있다.3 의경우는 COM 오브젝트를직접사용한다. 5 결론 상호연동기술은상호연동이어떤프로그래밍언어간에이루어지는지보다어떤플랫폼간에이루어지는지에따라분류된다. 본논문에서는윈도우즈운영체제에서많이사용되는플랫폼인 WIN32,.NET 그리고 JVM 에대해어떤상호연동기술들이있는지조사하였다. 상호연동기술을구성하는두가지요소인호출방법과데이터호환의속성이실제구현된상호연동기술에서어떻게나타나는지를알아보았다. 호출방법의차이는메모리포인터와 TCP 통신의두가지로나뉘며이는분산컴포넌트의가능성을결정한다. DLL 과 COM 은로컬컴퓨터에서의상호연동에이용할수있으며, WCF 와 Java RMI 는분산환경에서상호연동에이용할수있다. 하지만분산환경에서의호출방식은로컬컴퓨터에서의호출보다더간접적이고복잡한특성으로인해상대적으로성능이떨어지는단점을갖는다. 데이터호환의측면은프로그래밍언어간에데이터타입이호환되지않을가능성이높기때문에발생하며, 바이트스트림이나 XML 과같은형태로마샬링 / 언마샬링하여해결한다. 일반적
8 프로그래밍언어논문지제 22 권 1 호 (2008. 10) 으로는마샬러 / 언마샬러를프로그래머가직접구현해야하지만이과정에서많은상호연동의문제를야기하며, 이러한문제는 SWIG 와같은마샬러 / 언마샬러생성툴을이용하여경감시킬수있다. 하지만, 현재로써는그한계가있음을확인할수있었다. 마지막으로인터프리터언어에서상호연동을사용하려고할때대상인터프리터언어혹은구현하는언어가클래스나 COM 오브젝트를지원하는지에따른여러상황이있음을보이고, 각상황에서앞서소개한상호연동기술들을어떻게적용할수있는지를제시하었다. [1] Interoperability, MSDN, Microsoft, 2008, http://msdn.microsoft.com/enus/library/ms172270(vs.80).aspx [2] Interop Marsahlling, MSDN, Microsoft, 2008, http://msdn.microsoft.com/enus/library/04fy9ya1(vs.80).aspx [3] DLLs, MSDN, Microsoft, 2008, http://msdn.microsoft.com/enus/library/1ez7dh12(en-us,vs.80).aspx [4] Win32 and COM Development, MSDN, Microsoft, 2008, http://msdn.microsoft.com/en-us/library/aa139672.aspx [5] Windows Communication Foundation, MSDN, Microsoft, 2008, http://msdn.microsoft.com/en-us/netframework/aa663324.aspx?phpsessid=0fbb7c61 [6] Using WCF, MSDN, Microsoft, 2008, http://msdn.microsoft.com/enus/library/ms735119.aspx [7] Getting Started Tutorial, MSDN, Microsoft, 2008, http://msdn.microsoft.com/enus/library/ms734712.aspx [8] The Java Native Interface Programmer s Guide and speci cation, Sun Microsystems, 2008, http://java.sun.com/docs/books/jni/html/jnitoc.html [9] George T. Heineman, William T. Councill, Component-Based Software Engineering: Putting the Pieces Together, Addison-Wesley Professional, 2001 [10] Enterprise JavaBeans Technology Home page, Sun Microsystems, 2008, http://java.sun.com/products/ejb/index.jsp [11] Sheng Liang, The Java Native Interface Programmer s Guide and Speci cation, Addison wesley, 1999 [12] David M.Beazley, SWIG Users Manual, Departmaent of Computer Science, University of Utah, 1997 신승철 1992-1996 인하대전자계산학과박사 1999-2000 캔사스주립대연구원 1996-2006 동양대컴퓨터학부부교수 2006- 현재한국기술교육대인터넷미디어학부조교수 <> 프로그래밍언어, 프로그램분석및검증, 소프트웨어보안, 수리논리
윈도우즈플랫폼에서의프로그램간실행시간상호연동기술 신승철, 노상훈, 권민혁, 임용수, 김성민 9 노상훈 2006-2008 한국기술교육대석사 2008-현재한국기술교육대박사과정 <> 프로그래밍언어, 프로그램분석및검증, 소프트웨어보안, 수리논리 권민혁 2007- 현재한국기술교육대석사과정 <> 프로그래밍언어, 프로그램분석및검증 임용수 2001-2008 한국기술교육대학사 <> 프로그래밍언어, 프로그램분석및검증 김성민 2001-2008 한국기술교육대학사 <> 프로그래밍언어, 프로그램분석및검증