모바일 개발을 위한 델파이 언어 (1)

1069854281델파이 XE4 버전에서는 iOS 및 ARM 컴파일러 지원을 위해, 기존의 델파이와는 다른 새로운 델파이 컴파일러를 도입했습니다. 기존 델파이 컴파일러와의 호환성을 위해 대부분의 문법들은 하위호환되지만 델파이로 모바일 개발을 하기 위해서는 알아두어야 할 주의해야 할 부분들이 상당히 많습니다.

현재 엠바카데로에서 델파이 프로덕트 매니저를 맡고 있는 마르코 칸투는 문서 “The Delphi Language for Mobile Development“에서 이러한 주의점들을 간략히 설명하고 있습니다. 모바일 개발을 생각하는 델파이 개발자들에게는 아주 중요한 문서이므로, 총 4회로 나누어 이 문서를 번역해서 올립니다. 이번 글은 그중 첫번째입니다.

 

모바일 개발을 위한 델파이 언어

마르코 칸투, 델파이 프로덕트 매니저, Embarcadero Technologies
박지훈.임프 번역

서론

이 문서에서는 델파이의 “모바일” 버전과 새로운 델파이 ARM 컴파일러의 변경 사항들에 대해 소개합니다. 이 문서는 언어의 변경 사항들과 기존의 코드를 포팅하고 하위 호환성을 유지하는 데 사용될 수 있는 테크닉들에 초점을 둡니다.

필자: 마르코 칸투, 델파이 프로덕트 매니저, 엠바카데로 테크놀로지
(수정 및 추가 제안 사항들은 marco.cantu@embarcadero.com으로 보내주십시오)
이 문서는 앨런 바우어를 비롯한 많은 리뷰어들의 도움으로 작성되었습니다.

문서 리비젼: 1.0

1. 새로운 컴파일러 아키텍처

델파이를 모바일 ARM 플랫폼으로 옮기는 것은 델파이 언어에 있어 큰 진화입니다. 따라서, 엠바카데로의 R&D 팀은 엠바카데로의 언어들에 공통적으로 적용될 새로운 아키텍처를 적용하였습니다. “툴체인”이라고 하는 모든 관련된 툴들을 독자적인 방식으로 개발하는 대신, 업계에서 광범위하게 지원하고 있는 기존의 컴파일러와 툴체인 기반 기술을 활용하기로 결정했습니다. 이렇게 하면 미래에 시장이 요구하게 될 새로운 플랫폼 및 운영체제를 더 빠르게 지원할 수 있게 됩니다.

구체적으로 말하면, 새로운 세대의 델파이 컴파일러(C++빌더 컴파일러도 포함)는 LLVM 아키텍처를 이용합니다. LLVM이란 무엇이고 왜 이것이 중요할까요? LLVM에 대해 간단히 알아보고 우리의 주 주제로 다시 돌아오겠습니다.

1.1: LLVM 소개

LLVM

LLVM

LLVM 프로젝트에 대해서는 LLVM 메인 웹 사이트에서 자세히 알아볼 수 있습니다.

http://llvm.org

짧게 설명하자면, LLVM은 “모듈화되고 재사용 가능한 컴파일러 및 툴체인 기술들의 집합”입니다.

그 이름과 달리(LLVM이라는 이름은 처음에는 알파벳 이니셜 이름이었지만 이제는 프로젝트의 이름일 뿐입니다), LLVM은 가상 머신과는 거의 관련이 없습니다.

LLVM은 일리노이 대학교에서 연구 프로젝트로 시작되었으며, 그 목적은 어떤 프로그래밍 언어든 정적 혹은 동적 컴파일을 할 수 있는 현대적이며 SSA 기반의 컴파일 방식을 제공하는 데 있었습니다. 이후로 LLVM은 여러 서로 다른 서브프로젝트로 구성된 우산 프로젝트로 성장해왔고, 그 서브프로젝트들 중 많은 것들은 대단히 다양한 상용 및 오픈소스 프로젝트들의 개발 과정, 그리고 학술적 연구들에서 이용되어왔습니다.

LLVM의 메인 웹사이트에는 다양한 서브프로젝트들이 나열되어 있는 것을 볼 수 있습니다. LLVM 코어는 중간 코드 표현(representation)을 중심으로 개발되어있으며, 이것을 LLVM 중간 표현 (LLVM IR)이라고 부릅니다. 엠바카데로 같은 툴빌더들은 자사의 언어를 중간 표현으로 번역하는 컴파일러를 개발하고 이 중간 표현을 다시 CPU에 네이티브한 코드나 실행 중간 표현으로 “컴파일”하는 추가 툴들을 개발할 수 있습니다.

1209800615

LLVM IR과 다른 비슷한 중간 표현들의 차이점은, LLVM은 프론트엔드와 백엔드를 분명하게 분리하는 것을 목적으로 한다는 것입니다. 따라서, 가상 실행 환경과 JIT 컴파일도 허용하기는 하지만, LLVM IR은 C/C++의 OBJ나 델파이의 DCU와 같은 중간 컴파일러 표현처럼 여길 수 있습니다(하지만 각 타겟 플랫폼을 위한 바이너리 코드를 생성하므로 OBJ나 DCU보다 추상적입니다). 이런 시나리오의 장점은, 일단 한 언어로부터 LLVM IR으로 컴파일하는 컴파일러를 개발하면 기존의 모든 백엔드들을 이용할 수 있다는 것으로, 여기에는 ARM도 포함됩니다. 이런 백엔드들은 CPU 벤더들로부터 고도로 최적화된 실행 파일을 생성할 수 있도록 잘 지원되고 있습니다.

마지막으로, LLVM 아키텍처가 오픈소스 툴들과 상용 툴들 업계에서 큰 영향력을 갖고 있다는 점도 언급할 필요가 있습니다. 일례로 애플도 Xcode에서 Mac OS X와 iOS 애플리케이션을 위해 LLVM과 Clang(C/C++/ObjectiveC를 위한 프론트엔드)를 이용하고 있습니다.

1.2: 델파이와 LLVM

위에서 설명한 것들을 고려하면, 델파이의 차세대 컴파일러 아키텍처가 아주 적합하다는 것은 분명할 것입니다. 기본적인 아이디어는, 델파이 소스 코드를 LLVM IR로 컴파일하여 iOS 및 안드로이드 ARM 컴파일러를 비롯한 여러 CPU 타겟들을 지원하는 것입니다. 이것은 운영체제 플랫폼들이 더욱 분화되고 과거보다 더 빠르게 바뀌어가고 있는 지금과 같은 상황에서는 더욱 중요해집니다.

따라서 델파이 iOS ARM 애플리케이션을 개발할 경우 새로운 컴파일러가 실행됩니다.


물론 컴파일러가 기술의 중심이긴 하지만, 개발 환경에는 컴파일러 외에도 많은 것들이 있습니다. 예를 들어 델파이 IDE에는 ARM 애플리케이션들을 델파이 IDE 내에서 디버그할 수 있게 해주는 디버깅 툴들도 통합해야 합니다. IDE 외에도 델파이에는 컴파일러, 포팅 가능한 런타임 라이브러리, 윈도우 전용 및 플랫폼 독립적인 애플리케이션 프레임워크 등이 포함되지만, 이 문서에서는 컴파일러에만 초점을 둡니다.

LLVM 아키텍처와 그 컴파일러 백엔드들은 툴빌더들에게 메모리 관리와 코어 런타임 라이브러리(메모리, 쓰레드, 예외, 기타 저수준 언어 요소들)에 있어 특정 아키텍처를 요구합니다. 이런 요구는 강제적인 것은 아니므로 여러분은 LLVM과 다른 메모리 모델을 적용할 수도 있습니다.

모바일 플랫폼들에서는 LLVM이나 Java, .NET 같은 가상 실행 환경을 이용하고 가비지 컬렉션이나 자동 참조 카운팅(Automatic Reference Counting; ARC)을 적용하는 것이 일반적입니다. 많은 개발자들이 가비지 컬렉션에는 친숙하지만(좋은 쪽으로든 나쁜 쪽으로든), ARC는 훨씬 덜 알려져 있죠. Clang 프로젝트의 ObjectiveC에서의 ARC 사용에 대한 페이지를 참고하면 ARC에 대해 더 자세히 알아볼 수 있습니다.

http://clang.llvm.org/docs/AutomaticReferenceCounting.html

LLVM에서 다른 메모리 관리 모델을 사용할 수 있지만, 적용할 만한 더 발전된 것들을 지원하고 있으며, 특히 리소스가 제한된 모바일 플랫폼들에서는 더욱 그렇습니다. 또한 메모리 관리를 더 자동화시키는 것은 새로운 개발자들이 델파이 언어를 받아들이기 쉽게 해주는 효과도 있습니다.

기존의 델파이 코드를 모바일 플랫폼으로 옮기려면 기존 코드를 다시 살펴봐야 하므로, 우리는 지금이 새로운 모바일 세상을 위해 델파이 언어를 더 진화시킬 좋은 시점이라고 생각했습니다. 이런 변화는 기본적으로 모바일 플랫폼들에만 적용되지만, 델파이 XE3에는 모바일용 명령들, 라이브러리 함수들, 컴파일러 디렉티브들이 이미 포함되어 있습니다. 이것이 이 문서의 핵심 주제입니다.

임프 역주: 이 문서에서 ‘클래식 델파이’ 혹은 ‘클래식 컴파일러’라고 쓰는 것은 XE3 이전 버전들을 말하는 것이 아니라, 새로 추가된 모바일 컴파일러에 대비하여 윈도우 및 Mac용 델파이 컴파일러를 말합니다. 이 문서에서 설명하는 델파이 언어의 변경이 새로 추가된 모바일용 ARM 컴파일러에만 적용되고 윈도우, Mac 컴파일러에는 아직 적용되지 않았기 때문입니다. 하지만 이 문서에 따르면, 미래에는 윈도우와 Mac 컴파일러에도 새로운 컴파일러 변경 사항들이 적용될 가능성이 높습니다. 이런 이유로 필자는 ‘모바일 컴파일러’라고 부르기보다는 ‘새로운 컴파일러’라고 부르고 있습니다. (원문의 classic Delphi를 ‘전통적 델파이’ 혹은 ‘기존의 델파이’라고 번역할 경우 이전 버전의 델파이를 가리키는 것으로 오인될 가능성이 높아 그냥 ‘클래식 델파이’라고 표기했습니다.

1.3: 왜 델파이 언어를 변경하는가?

우리의 목적은 델파이 언어를 진화시키면서도 하위 호환성을 최대한 유지하는 것이었습니다. 그러면, 왜 우리는 기존의 델파이 언어를 변경해야 했을까요? 기존의 코드를 이전할 때 이슈를 일으킬 수 있는 변경까지 포함해서 말이죠.

여기에는 아래와 같은 세 가지 주된 이유들이 있습니다. 자세한 내용은 이 문서 전체에 걸쳐 자세히 설명할 것입니다.

  • 동일한 일을 하는 새로운 방법이나 기존 데이터 타입에 대한 새 변형을 위한 기능들을 계속 언어에 추가해나간다면, 델파이 언어는 지나치게 무겁고 복잡해질 것이며, 유지하고 새 플랫폼으로 포팅하는 일도 더 어려워질 것입니다.
  • 동일한 기본 작업에 대해 여러 가지 방법을 제공하는 것은 언어를 처음 접하는 사용자들을 혼란시키기 쉽습니다.
  • 델파이 언어 내에서 불일치한 부분이 있다는 것은 중요한 이슈입니다(또한 다른 언어들과 다르기 때문에 델파이 언어를 배우는 개발자들에게는 더욱 문제가 됩니다). 예를 들어, 클래식 델파이에서는 대부분의 데이터 구조들은 데이터 액세스에서 0 기반의 인덱스를 사용하는 데 반해, 문자열에서는 1 기반의 인덱스를 사용하여 서로 일치하지 않습니다. 델파이 개발자들은 자유롭게 배열 범위를 지정할 수 있지만(전통적인 파스칼에서의 부분 범위 사용을 따른 것), 동적 배열의 경우엔 0 기반입니다.

델파이 언어에 새로운 개발자들을 끌어들이는 것도 우리의 목표들 중 하나이므로, 불필요한 소소한 장애물들을 없애는 것이 적절할 것입니다. 델파이 모바일이 제공하는 비즈니스 면과 기술적인 면의 이점들 덕분에, 의미 있는 수준의 새로운 개발자들이 유입될 것으로 기대하고 있습니다.

1.4: 어떤 것이 바뀌지 않는가?

그 답은 간단합니다. 거의 모든 것입니다! 클래스, 객체, 메소드, 상속, 다형성, 인터페이스, 제네릭 타입, 어노니머스 메소드, 리플렉션(혹은 RTTI) 등등.

그중에는 아주 오래된 기능들도 여전히 델파이 언어에 포함되어 있는 것들도 있습니다. 터보 파스칼에서부터 내려온 전역 함수 및 변수들의 사용 같은 것들입니다. 다시 말하지만, 새로운 컴파일러 아키텍처로 바뀌면서도 변경되지 않은 기능들이 압도적으로 많으므로, 여러분이 기존의 코드를 이용하고 기존의 델파이 개발자들이 기존의 지식을 그대로 유지할 수 있도록 해줍니다.

현재까지 여러분이 모바일 개발에 접근하려 할 때 일반적으로 여러분은 새로운 언어, IDE, RTL, 유저 인터페이스 라이브러리를 배워야 했지만, 델파이 XE4 개발자들은 최소한의 변경만으로 동일한 IDE, 언어, 라이브러리를 그대로 사용하는 사치를 누릴 수 있습니다. 이 문서의 초점은 이런 변경 사항들을 기술하는 데 있으며, 델파이 언어 기능들 대부분(그리고 여러분의 기존의 델파이 코드 대부분)이 새로운 모바일 플랫폼으로 포팅될 수 있으며 이미 크로스플랫폼이 지원되고 있다는 것을 인식하는 것이 중요합니다.

1.5 XE4의 델파이 컴파일러들

여기까지 읽으면서 눈치챘겠지만, 델파이 XE4에는 여러 종류의 컴파일러가 포함되어 있습니다. 데스크톱 플랫폼들을 지원하기 위한 세 가지의 컴파일러들, 맥 플랫폼에서의 iOS 시뮬레이터를 위한 컴파일러, 새로운 ARM 컴파일러 등입니다. 약간 혼란스러울 수도 있으므로 각각의 컴파일러들을 간단히 나열해봅니다.

  • Win32 컴파일러 (DCC32)
  • Win64 컴파일러 (DCC64)
  • Mac 컴파일러 (DCCOSX)
  • iOS 시뮬레이터 컴파일러 (DCCIOS32)
  • iOS ARM 컴파일러 (DCCIOSARM)

이 다섯 가지 컴파일러들 중 마지막 컴파일러만이 LLVM 툴체인 기반이지만, iOS 시뮬레이터 컴파일러도 문자열 및 메모리 관리 설정 일부에서 LLVM 컴파일러의 설정을 이용합니다. 이에 대해서는 이후에 더 자세히 살펴보겠습니다.

2 comments for “모바일 개발을 위한 델파이 언어 (1)

답글 남기기

이메일 주소는 공개되지 않습니다.