그럼, 실제로 EFL이 어떠한 라이브러리들로 구성되어 있는지 살펴보고 각 라이브러리에서 제공하는 기능과 특징들을 하나씩 살펴보도록 하자. 우선 EFL블록 다이어그램을 보도록 하자.
EFL 블록 다이어그램
그림에서 보여주듯이, EFL은 적지 않은 라이브러리들로 구성되어 있다. 그만큼 EFL은 다양한 기능들을 제공하며 확장성을 고려하여 모듈화가 잘 되어 있음을 암시한다. 구축된 블록들의 위치가 다소 복잡해 보일 수도 있지만, 위 그림은 각 EFL 모듈 간의 빌딩 순서를 명확히 보여주고 있다. 예로, Elementary는 이하 모든 라이브러리들에 의존하고 있으며 Ecore 같은 경우는 Evas, Eet, Eina에 의존하게 된다. EFL은 OS를 기반으로 작동하며 EFL어플리케이션은 EFL의 각 라이브러리가 제공하는 기능들을 이용하여 구현될 수 있다. 그럼 각 모듈의 역할을 순서대로 살펴보도록 하자.
Eina
EFL의 가장 기본이 되는Eina(에이나)는 자료구조 라이브러리이다. C++의 STL과 같이 배열, 리스트, 해시, 트리 그리고 공유 문자열(shared string)과 같은 다소 복잡한 로직을 사용자가 쉽고 빠르고 안전하게 구현할 수 있도록 유용한 기능들을 제공한다. Eina 상단의 모든 EFL 라이브러리뿐만 아니라, 어플리케이션에서도 이러한 데이터 구조 기능들을 이용하여 필요한 로직을 효과적으로 구현할 수 있을 것이다.
Eet
Eet(이이티)는 데이터 인코딩 및 디코딩의 역할을 제공한다. 임의의 자료구조나 이미지 데이터 등을 압축하여 파일로 저장하거나 네트워크를 통해 다른 머신으로 전송할 수 있으며 후에 다시 Eet를 이용하여 압축된 파일을 읽고 디코딩할 수가 있다. Eet에서 사용되는 이러한 압축기법은 zip과 매우 유사하며파일로부터 임의의 위치의 데이터에 매우 빠르게 접근할 수 있다는 장점도 제공한다. 뿐만 아니라, 데이터 압축시 암호화하는 기능을 부가적으로 제공하므로 보다 안정적인 데이터 보관이 가능하다.
Evas
EFL의 가장 핵심으로 볼 수 있는 Evas(에바스)는 하나의 캔버스 또는 렌더링 엔진으로 불린다. 사용자는 Evas를 통해 윈도우 내에 이미지, 사각형, 선, 폴리곤 그리고 텍스트 등을 표현할 수 있는데 그러한 출력물 개별은 모두 객체화가 되어있다. Evas에서는 이러한 객체들을 Evas_Object 타입으로 제공하며 사용자는 EFL 프로그래밍에서 모든 그래픽 객체들을 Evas_Object 라는 인터페이스로 접근하고 이를 통해 화면 상에 특정 그래픽 객체들을 표현할 수가 있다. 또한, Evas는 사용자 입력 이벤트 전달 메커니즘도 담당하고 있으므로 각 오브젝트가 사용자 입력 이벤트에 적절히 반응하도록 그 인터페이스도 제공한다.
하지만, Evas는 렌더링 방식에 있어서 리테인 모드(retain mode)를 채택하였으며, 내부적으로 장면그래프(scene-graph)를 통해 오브젝트들을 관리하면서 화면상에 보여야 할 객체들을 적절히 최적화하여 알아서 렌더링 해준다는 특징을 지니고 있다. 이는 사용자들로 하여금 복잡한 렌더링 매커니즘으로부터 좀더 자유로워질 수 있다는 것을 의미하며 사용자들이 어플리케이션의 주 로직의 구현에 집중할 수 있게 도와준다.
Evas에서의 기본 Workflow
기본적으로 Evas는 소프트웨어 렌더링 방식을 지원하지만, 플랫폼 환경에 따라 오픈지엘, 오픈지엘 ES 등과 같은 그래픽 H/W 가속 기능을 벡엔드(backend)로 지원하며, MMX나 네온과 같은 SIMD 벡터화도 이용하므로 최적의 렌더링 성능을 보장하고 있다.
Ecore
Ecore(이코어)는 사용자들의 편의를 위해 제공되는 시스템 기반 라이브러리이며 메인루프, 타이밍, 이벤트, 커넥션, IPC, 스레드, 윈도우 시스템 등과 관련된 기능들을 제공하고 있다. 이러한 기능들은 각 시스템 API들의 복잡한 설정 및 사용 단계들을 내부적으로 처리해주고 보다 쉽고 단순화하여 사용자들에게 제공되므로, 사용자들이 직접 시스템 기능들을 구현할 때 필요한 시간과 노력이 단축될 수 있으며 보다 안정적으로 EFL 일관된 방식의 프로그래밍을 할 수 있게 도와준다.
특히나 EFL 어플리케이션은 Ecore에서 제공하는 메인루프를 기반으로 작동되는데, Ecore에서 제공되는 기능들이 Ecore 메인루프의 주 로직에 적합하게 접합되어 처리되므로 필요 시에는 시스템 API를 이용하지 말고 반드시 Ecore에서 제공되는 기능들을 이용해야 한다.
Edje
Edje(엣지)는 복잡한 GUI 구성을 위한 기능들을 제공한다. Edje는 EDC라는 스크립트 언어를 제공하며 사용자는 EDC 스크립트를 통해 프로그램 코드로부터 GUI 부분을 분리하여 프로그램을 작성할 수가 있다. EDC는 edje_cc 컴파일러를 통해 EDJ 바이너리 형태로 변환되는데, 프로그램은 이러한 EDJ파일을 런타임시에 읽어서 Evas_Object로 바인딩하여 GUI를 구축할 수가 있다. Edje의 이러한 특성 때문에 어플리케이션은 재컴파일없이 GUI 디자인을 바꿀 수도 있게 된다.
Edje를 이용하면 코드에서 GUI 부분을 분리할 수가 있다
Embryo
일종의 바이트코드 가상 머신인 Embryo(엠브리오)는 EDC 파일 내에서 구현될 수 있는 작은 프로그램을 위해 이용된다. 일반적으로 사용자들은 EDC 내에서 단순한 계산을 구현하거나 각 오브젝트 상태를 바꾸는 등의 간단한 기능을 구현하기 위해 C 언어 스타일의 Embryo 스크립트 언어를 추가로 이용할 수 있으며, 이러한 Embryo 스크립트는 폰(PAWN) 컴파일러를 통해 폰 바이너리로 변환된다. 결국, 폰 프로그램은 머신의 환경에 의존하지 않고Embryo의 AMX(Abstract Machine eXecutive) 가상머신에 의해 해독되어 작동될 수 있으며 하나의 출력물을 가지고도 다른 시스템 환경에서도 동일한 동작을 보장할 수 있게 한다.
Emotion
Emotion(이모션)은 비디오/오디오 플레이백(Playback) 라이브러리이다. Emotion은 Gstreamer, Xine 혹은 VLC와 같은 다른 비디오 재생 플러그인 등을 이용하여 영상을 재생하고 이러한 영상 출력 결과물을 Evas Object에 연동하여 사용자에게 제공한다. 이를 통해 사용자는 동영상 재생과 함께 GUI를 결합한 화면 구성을 쉽고 간단히 구현할 수가 있다.
Emotion을 이용한 동영상 재생
Elementary
사실 앞서 EFL 라이브러리들을 살펴보았지만, Elementary(엘레멘트리)야 말로 GUI 어플리케이션 개발에 있어서 가장 유용한 기능들을 제공할 것이다. Elementary는 위젯 툴킷(Widget 툴킷) 라이브러리이며, 버튼, 리스트, 레이블, 슬라이더와 같은 범용의 위젯들을 제공할 뿐만 아니라 다양한 룩 앤 필(Look & Feel)을 지원하기 위한 동적 테마 변경, 다양한 스크린 해상도를 지원하기 위한 GUI 확장성(Scalability) 등의 특징들을 갖는다.
Elementary 위젯들
Elementary 확장성: 스크린 사이즈 / 해상도에 따라 GUI 구성이 자동 조정된다.
Elementary Theme: 동일한 애플리케이션일지라도 테마 속성에 따라 룩앤필(Look & Feel)이 달라진다.
Efreet, Eio, Eeze, Ethumb, E_dbus
Efreet, Eio, Eeze, Ethumb, E_Dbus는 부가적으로 추가된 라이브러리이다. Efreet는 아이콘, 데스크톱 파일, 메뉴 등과 관련하여 Freedesktop.org의 표준에 맞춰 애플리케이션이 작동할 수 있도록 설계된 라이브러리이며, Eio는 비동기 입출력(I/O)을 위한 라이브러리, Ethumb은 frame 이미지를 더한 썸네일 이미지를 생성해주는 기능을 제공하며, Eeze는 udev를 통하여 하드웨어 장비를 조작하기 위해 쓰이는데, 예로 cd-rom의 디스크 삽입 여부, CPU 온도, 전원의 밧데리와 같은 장비의 상태 및 정보를 얻고 조작하는데 사용된다. 마지막으로 E_dbus는 메세지 버스 시스템인 dbus의 랩퍼(wrapper)로 볼 수 있으며,IPC를 수행하는데 있어서 dbus의 명세서(specification)를 구현하고 있다.
Languauge Bindings
그 외 EFL 커뮤니티에서는 Elev8(Java script), 파이선, Perl, C++, Vala와 같은 랭귀지 바인딩 프로젝트를 진행하고 있으며, 기본 C언어를 비롯한 다양한 랭귀지를 지원하여 보다 다양한 프로젝트 환경에서 EFL을 이용할 수 있도록 노력하고 있다. 많은 오픈소스 개발자들이 바인딩 프로젝트에 참여한다면 보다 사용성이 높은 EFL이 될 수 있을 것이다.
참고 - www.enlightenment.org