메뉴 건너뛰기


Developer > Open Source

SpiderMonkey 1장. SpiderMonkey의 개념

2013.11.16 02:25

푸우 조회 수:6955


참고: https://developer.mozilla.org/en/JavaScript_C_Engine_Embedder


이 글을 쓰려는 계획은 3년 전부터 있었는데...
이제서야 실행에 옮기게 되네요.
이글을 끝까지 쓸 수 있길 바라며... 또한 여러분의 많은 호응 부탁드립니다.
참고로 글을 쓸때 자바스크립트를 영문으로 작성하면 뒤에 자바스크립트-x가 붙어서 보이네요.
  
 
1장. SpiderMonkey의 개념
 
1. 글을 시작하며...
 
제가 처음 SpiderMonkey에 관심을 갖었던 것은 약 4년전이였습니다.
사용자 환경에 따라 내가 만든 프로그램이 변화무쌍해야 할 필요가 있었는데...
간단한 경우는 환경파일을 만들고 환경파일에 사용자 환경을 기술 하게 하여 처리할 수도 있겠지만..
뭔가로 제한을 둬야 한다는 면에서 특정 기능을 갖는 스크립트 언어가 있으면 좋겠다고 생각이 들면서임베딩이 가능한 스크립트 언어들을 찾아보면서 관심을 갖게 되었습니다.
사실 임베딩이 가능한 스크립트 언어는 적지 않습니다.
PHP, Lua, Python, Perl 등등...
그 당시 제가 판단한 생각은 다음과 같습니다.
PHP는 많은 확장 모듈이 존재해서 좋긴한데 너무 덩치가 크고 웹에 너무 의존적인 스크립트 언어라서 탈락
Lua는 C언어와 연계시 가장 성능이 좋은 것으로 알려져 있지만 Lua 스크립트 언어의 문법 구조와 개념이 기존의 언어와 사뭇 달라서 탈락
Python과 Perl도 많은 확장 모듈이 존재해서 좋긴한데 너무 덩치가 크고 스크립트 언어의 문법 구조와 개념이 내게 익숙하지 않아서 탈락
 
결국 내가 찾는 것은 덩치는 작고, 스크립트 언어의 문법적인 측면은 C나 Java와 가까우면서 필요한 경우 확장성이 좋은 언어 였습니다.
그런 관점에서 SpiderMonkey가 딱이더군요 그래서 SpiderMonkey를 선택했습니다.
이미 이글을 찾아서 읽으시는 분은 SpiderMonkey가 뭔가 다 아시겠지만...
노파심에 말씀드리면 SpiderMonkey는 Netscape, Mozilla, Firefox 브라우져에 임베딩된 자바스크립트 처리 스크립트 엔진입니다.
문법 자체는 C, Java와 유사하구요.
dll파일 딱 하나만 있으면 구동이 가능합니다.
단점이라고 한다면 스크립트 언어의 문법 체계는 확실한데 제공되는 함수가 너무 없다는 것 입니다.
오브젝트는 Array, Boolean, Date, Math, Number, String와 같이 딱 6개만 제공하며..
toString()계열 함수와 parse()함수 정도를 제공합니다.
하다못해 화면에 뭔가 출력할 함수도 없습니다.
필요한 것은 만들어서 제공하면 되고 문법 체계는 웹개발자나 C나 Java개발자에게도 친숙하고 가독성도 좋으니 저는 SpiderMonkey를 선택하게 되었습니다.
 
이제 부터 쓸 글은 SpiderMonkey를 내 프로그램에 어떻게 임베드 시키는지에 대해서 작성할 것 입니다.
SpiderMonkey를 어떻게 구하는지, 컴파일 방법이나 링크방법은 어떻게 되는지는 제게 예전에 퍼와서 올린글에 있으니 모두 생략합니다.
 
2. SpiderMonkey 구조
 
우선 SpiderMonkey를 실제로 임베딩 시키기 전에 개념부터 잡아보기로 하죠.
SpiderMonkey는  ECMA(European Computer Manufacturers Association)-262라는 script언어에 대한 유럽 표준을 따르는 언어입니다. 제가 알기론 C#도 이 표준을 도입한 것으로 알고 있습니다.
이 표준에 관심있으신 분은 http://www.ecma-international.org/publications/standards/Ecma-262.htm 에 가셔서 한번 보셔도 좋을 것 같네요.
SpiderMonkey는 Object-Based Programming(객체기반) 언어라고 하는데 Object-Oriented(객체지향)가 아님에 유의하세요.
 
이번 강좌는 코드를 직접 짜기 보다는 https://developer.mozilla.org/en/Javascript_C_Engine_Embedder's_Guide 에 나온 내용을 기반으로 개념을 잡아 보도록 하겠습니다.
 
아래의 내용들은 영문 내용을 제 짧은 영어 실력에 번역을 하다 보니깐 한글이 더 어려워졌네요.
번역 문 뒤에 좀 풀어서 다시 이야기 하면 파란색으로 글을 적었습니다. (^^)
 
SpiderMonkey에서 자바스크립트 코드가 돌아기기 위해서 하나의 어플리케이션은 JSRuntime, JSContext, global object라는 세개의 주요 요소를 가져야 합니다.
  
1) JSRuntime
할당된 자바스크립트 변수, 객체, 스크립트, 컨텍스트들의 공간입니다. 모든 JSContext들과 객체들은 하나의 JSRuntime내에 존재하여야 하며 다른 runtime들로 옮겨 다닐 수 없으며 다른 runtime에 공유될 수도 없습니다. 대부분의 어플리케이션들은 오직 하나의 runtime을 갖습니다.
 
하나의 어플리케이션에 runtime은 하나면 충분하고 자바스크립트의 변수, 객체, 스크립트, 컨텍스트들이 저장되는 공간으로 활용되며 runtime간에는 서로 공유가 되지 않습니다.
 
2) Contexts
컨텍스트는 자바스크립트 코드와 오브젝트들을 수반하여 많은 일들을 할 수 있는 작은 기계(machine)과 같습니다. 스크립트를 컴파일하고 실행하고, 객체 속성들을 얻어오고 설정하고, 자바스크립트 함수들을 호출하고, 하나의 형식에서 다른 형식으로 자바스크립트 자료를 변환하고, 객체를 만들고, 등등의 일을 할 수 있습니다. 거의 모든 JSAPI함수들은 JSContext *를 첫번째 아큐먼트로써 필요로 합니다.
 
컨텍스트는 자바스크립트의 코드와 오브젝트를 실행하고 호출하고 하는 것들에 관련이 있으며 하나의 runtime에 여러개 존재할 수 있고 일반적으로 쓰레드당 하나씩 생성하여 사용합니다.
 
단일쓰레드 어플리케이션들 모두가 단일 컨텍스트를 사용할 수 있습니다. 그러나 각각의 컨텍스트는
한시점에 단하나의 일만 할 수 있어서 멀티쓰레드 어플리케이션 내에서는 한시점에 하나의 쓰레드가 어떤 주어진 컨텍스트를 사용하여야만 합니다.
하나의 어플리케이션이 쓰레드당 하나의 컨텍스트를 전형적으로 갖는 반면 자바스크립트 오브젝트들은 그들이 만든 스크립트, 쓰레드 또는 컨텍스트와 영구적으로 조합되지 않습니다.
아래의 그림 처럼 그들은 많은 스크립트들 또는 더욱 많은 쓰레드들 사이에 공유될 수 있습니다. 
 
컨텍스트는 하나의 쓰레드 내에서만 사용되는 반면 자바스크립트 오브젝트는 하나의 runtime내에 있는 컨텍스트들 사이에서 공유하여 사용할 수 있습니다.
 
  
그림) runtime, context들, object들의 관계도
over3.gif
 
 
3) Global Objects
global object는 자바스크립트 코드에서 사용 가능한 클래스들과 함수들 그리고 변수들 모두를 담습니다.
자바스크립트 코드가 window.open("http://www.mozilla.org/")와 같은 어떤 것을 수행할때는 그것이 global 속성에 접근하는 것 입니다. (여기서는 window) 
JSAPI 어플리케이션들은 global속성들 스크립트들을 볼 수 있는 전체 제어를 갖습니다.
어플리케이션은 하나의 오브젝트를 생성하고 Array와 Object와 같은 자바스크립트 표준 클래스들과 함께 생성된 오브젝트를 거주함에 의해 시작합니다.
그 다음에 그것은 어플리케이션이 제공하기 원하는 사용자 클래스들, 사용자 함수들 그리고 사용자 변수들(window와 같은)을 추가합니다.
어플리케이션이 JS 스크립트를 수행(예를 들어 JS_Evaluatescript 사용)할 때마다 그것은 스크립트가 사용할 수 있도록 global 오브젝트를 제공합니다.
스크립트가 수행하는것 처럼 그것은 자기자신의 global 함수들과 global변수들을 생성할 수 있다.
함수들, 클래스들 그리고 변수들 모두는 global 오브젝트의 속성으로서 저장됩니다.
 
JSAPI 어플리케이션은 글로벌 오브젝트의 모든 것을 사용할 수 있으며 글로벌 오브젝트에는 자바스크립트 표준 클래스들(Array, Date 등)과 사용자 클래스들, 사용자함수들, 사용자 변수들을 가지고 있습니다.
글로벌 오브젝트도 함수와 변수를 가질 수 있는데 이를 글로벌 함수, 글로벌 변수라고 합니다.
 
3. 그밖에 알아 둬야 할 개념
 
용어 설명이라고 할 수도 있지만 몇가지 개념들을 익혀 둬야 해서 몇자 적습니다.
 
자바스크립트는 객체기반 언어입니다.
객체(Object)는 클래스(Class)가 실제로 메모리에 할당되어 있는 것을 의미합니다.
즉, 클래스는 선언 혹은 정의에 해당되며 객체는 이 클래스의 인스턴스입니다.
객체를 오브젝트(Object)라는 용어의 한국어다 보니 강좌에서 객체와 오브젝트를 혼용해서 사용합니다.
이 점 이해 바랍니다.
자바스크립트의 클래스는 생성자를 가질 수 있으며 멤버 변수를 프로퍼티(Property)라고 하고 멤버 함수를 메소드(Method)라고 합니다.
자바스크립트는 클래스를 객체화 시켜서 제공할 수 있습니다.
즉, 자바스크립트를 작성할 때 클래스를 인스턴스화 시키지 않고 바로 사용가능하게 할 수도 있다는 이야기 입니다.
 
 
 
이번 강좌는 실제 코드는 하나도 살펴보지 않았지만 중요한 개념을 설명한 것이니 꼭 읽어 두세요.
번역한 글이다 보니 좀 엉성하지만 어쨌든간에 이번 강좌는 여기까지 입니다.
다음번 강좌는 SpiderMonkey를 사용한 기본 코드를 살펴보도록 하겠습니다.
  
 
Creative Commons License
Creative Commons License이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
Copyright 조희창(Nicholas Jo). Some rights reserved. http://bbs.nicklib.com