Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

[Yukon 베타] RAD 스튜디오 12에 들어 있는 윈64 Clang 툴체인(들)


Recommended Posts

데이비드 밀링턴 (David Millington)"Win64 Clang Toolchains in RAD Studio 12" 를 번역했습니다. (원문 작성: 2023년 10월, 번역 업데이트:  2023년 10월)

이 글은 RAD 스튜디오 소프트웨어의 출시 전 버전을 기반으로 작성되었으며 엠바카데로의 허가를 받고 작성되었다. 사전 공개 되는 기능이 반드시 GA (정식 출시, General Availability)에 포함된다는 보장은 없다.

RAD 스튜디오 12 출시가 드디어 얼마 남지 않았다. 이와 관련하여 공유할 신나는 소식이 있다!

지난 8월, 비하인드 스토리를 공유하는 평소와 다른 세미나에서, RAD 스튜디오의 C++ 측면 즉 C++빌더를 위해 우리가 진행 중인 작업을 보여 주었다. 그 세미나에서 소개된 내용 중 하나는 업그레이드된 Clang을 기반으로 하는 윈64 컴파일러였다. 이는 단순한 업그레이드 수준이 아니라 핵심 영역의 일부 주요 기술을 강화하는 새 STL과 새 링커 등까지 포함하고 있다. 우리는 전체 툴체인(Toolchain)들을 철저히 재작업한다. 그 시작은 품질과 수명에 대한 올바른 결정이라는 확고한 신념이었다.

비하인드 스토리를 공유하는 평소와 다른 세미나 보기

목차


새 Clang

C++ 컴파일러는 RAD 스튜디오의 기초이다. Clang 및 LLVM 작업을 통해, 우리는 LLVM을  델파이에서 사용할 수 있도록 했다. 물론, 현대적이고 강력한 C++ 컴파일러 역시 우리에게 필요하다. 그래야 C++ 개발자에게 소스 호환성, 라이브러리, 앱 성능 등에서 최고를 제공할 수 있기 때문이다.

이번 작업의 목표(들):

  • 매우 높은 품질. 견고한 STL. 당신이 제공하는 것이 무엇이고 얼마나 많든 모두 처리할 수 있는 링커(linker).
  • 모든 분야에서 우수한 품질 (예외 처리 등 )
  • 뛰어난 언어 표준 호환성
  • 컴파일된 코드가 고성능이 되도록 할 것. 런타임을 최적화하기
  • 플랫폼 표준에 최대한 일치시키기

이것들을 어떻게 충족하는지 역순으로 살펴보자.

 

플랫폼 표준

새 툴체인(Toolchain)의 기반은 Clang 15*이다. 이전 툴체인은 ELF 오브젝트 파일 포맷을 사용했었다. ELF는 주로 Unix/Linux 포맷인데, 역사적으로 그 이유를 보면, (이야기하자면 길지만) 실제로 Kylix와 관련이 있다. 우리는 이제 툴체인용 포맷을 COFF로 가고 있다. COFF 포맷은 컴파일되는 언어가 무엇이든 윈도우 컴파일러의 표준 오브젝트 파일 포맷이다. 이와 같은 맥락에서, 우리는 PDB 디버그 포맷을 사용한다. 이것 역시 표준이다. 비록 우리가 어떠한 써드-파티 도구도 공식적으로 지원하고 있지는 않지만, 개발자들이 사용하는 많은 도구들은 COFF와 PDB를 처리할 수 있다. 따라서 이처럼, 우리가 플랫폼 표준(norm)을 고수함으로써, 여러분에게 C++빌더와 여러분의 앱들에서 다양하고 방대한 도구들을 사용할 수 있는 기회가 열릴 것으로 기대한다. 

[*] 이 작업이 시작될 당시, 최신 버전이 Clang 15였다. 달리는 자동차에서 바퀴를 교체하는 일은 피하기 때문에 지금 Clang 15을 유지하고 있다. 하자만, 우리는 앞으로도 계속 이와 같이 Clang 자체를 최신 버전으로 유지하면서 발전시킬 계획이다.

 

컴파일된 코드의 성능이 높음

우리가 그 무엇보다 중점을 두고 지향하는 바는 컴파일된 코드가 정확하게 동작하는 것이다. 하지만, 그와 동시에 우리는 높은 성능 역시 지향한다. 새 툴체인 기술은 더욱 최적화된 코드를 만들어 낸다. 그리고 과거에는 불가능했던 추가 최적화를 앞으로 가능하도록 한다.

DALLE-2023-10-25-170802-Illustration-of-

 

런타임이 최적화됨

C++ 툴체인 하나에는 여러 계층이 있다:  C 런타임(콘솔에 프린트하기, 파일 입출력 등의 기능 제공), C++ 런타임(예외 처리 등의 기능 제공), STL(표준 입출력, 알고리즘, 컬렉션 등 C++ 라이브러리 기능 제공)이 그것이다. 우리 툴체인에서는, 이 세 가지를 모두 교체하고 있다.

DALLE-and-DM-C-Layers-4518001.png?resize


C++ 런타임의 세 가지 계층(표준 라이브러리, C++ RTL, C RTL)을 보여주는 이미지. 이미지 제공: DALL-E와 David Millington이 작성한 이미지

C 수준 런타임은 UCRT(Universal C Runtime)를 사용한다. UCRT는 윈도우 컴포넌트이다. 이는 고도로 최적화되어 있으며 (플랫폼 표준을 반영하는) 윈도우 자체의 한 부분이다. 또한 윈도우 8, 7, 비스타 및 심지어 XP에도 설치할 수 있다 (참고로, 우리는 XP와 비스타를 지원하지 않는다) 물론, 여러분이 우리 런타임에서 사용해오던 우리 자체의 메서드들 역시 여기에 추가되도록 하는 작업을 우리가 하고 있다: 여러분의 코드 안에서 표준이 아닌 우리 것들이 있었더라도 걱정하지 않아도 된다. 새 런타임에 그것들이 이미 들어 있을 것이다.

C++ 런타임은 새 것이다. 이것의 기반은 MinGW와 LLVM의 혼합이다. MinGW는 오픈 소스 툴체인이지만, 우리는 그 중에서 엄선한 부분들만 사용하고 있다. LLVM은 주요 런타임 영역에서 많은 것들을 제공한다. LLVM에 초점을 맞춤으로써, 우리가 알려진 공유 동작을 담은 표준 라이브러리를 고수한다는 점을 다시 분명히 한다는 것을 알 수 있을 것이다.

마지막으로, STL은 LLVM의 libc++이다. 이것은 성능이 좋은 훌륭한 라이브러리이다.

 

언어 표준 호환성이 뛰어남

우리는 여러 테스트 스위트들을 실행한다. 그리고, 새 런타임 삼총사는 이전 툴체인보다 훨씬 더 많은 C++ 및 STL 적합성 테스트를 통과하고 있는 것을 목격하고 있다: 이는 표준 준수, 호환성 및 품질을 보여준다. 이런 결과를 이미 초기 내부 버전에서 확인했으며, 통과하고 있는 테스트는 지금도 계속 증가하고 있는 중이다.

 

모든 분야에서 품질이 우수함 (예외 처리 등)

올바르게 하자는 것이 우리의 방식이다. 예를 들어, 예외 처리는 우리가 항상 집중하고 있는 부분이다. 우리는 이미 10.4.2에서 핵심 사용 사례 향상과 현격한 품질 향상에 집중했었다. 새 C++ RTL을 사용하는 새 툴체인을 위해 우리는 완전히 재작업을 하고 있고, 이 동작 만을 위한 테스트를 수백 개나 새로 만들었다. 거기에는 매우 다양한 순열(permutation)이 있다: 같은 모듈 안에서 또는 다른 모듈 간에 던지기(throw)/잡기(catch), 다시 던지기, 델파이에서 나오는 예외(exception)들, C++에서 나오는 델파이 예외들, 등등이다. 또한 우리의 지향점은 동일한 프레임 안에서 모두 이 테스트 스위트를 통과하는 것이다. 단, 동일한 프레임 안에서 예외 던지기/잡기만 제외하고 말이다 (Clang 자체에서 지원하지 않는 기능임).

 

STL이 견고함. 링커는 무엇이든 처리할 수 있음

위에서 STL을 언급했는데, 오브젝트 파일 형식이 바뀌면서 링커도 바뀌었다.

ilink와는 작별이다.

이제는 LLVM의 lld를 만날 시간이다.

LLD는 ilink와는 매우 다른 아키텍처를 갖고 있다. 우리는 LLD가 여러분이 구축하는 복잡하고 큰 앱을 쉽게 처리할 것이라고 믿는다.

 

기술 세부 정보

새 툴체인에서 사용하는 것들은 다음과 같다:

  • Clang 15를 사용함
  • LLVM의 lld를 링커로 사용함
  • COFF64 오브젝트 파일을 내보냄 (이는 델파이 역시 12.0에서 COFF64 오브젝트 파일을 내보낼 수 있음을 의미함: "-JL" 또는 "-JPHN[E]" 옵션이 지정된 경우, 컴파일러 옵션 "-jf:coff"가 대상 파일들에 의해 지정됨)
  • PDB 포맷으로 디버그 정보를 내보냄
  • Itanium ABI 사용함(Microsoft ABI가 아님)
  • LLVM의 libc++ STL을 사용함
  • C 런타임용으로 UCRT를 사용함
  • C++ 런타임용으로 LLVM과 MinGW를 혼합하여 사용함
  • 윈64를 대상으로 함
  • bcc64x로 명명됨


물론 C++ 확장(속성, 클로저 등등)과 VCL 및 FMX 앱을 위한 델파이 링크(linking, 아직 완성되지 않았으며 곧 제공될 예정임), 그리고 여러분이 깨닫지 못했을 수도 있는 확장들이 툴체인에 종속적이다 (예: auto-linking). 이는 여러분의 코드에서도 이와 똑같은 동작을 얻게 된다는 의미이다. 물론 여러분이 이미 가지고 있는 코드들은 이 새롭고 강력하며 현대적이고 견고하고 성능이 뛰어나고 표준화되었고, 신나는 새 기반 위에서 여전히 작동할 것이다.

 

상태

이 업그레이드를 진행하는 우리의 방식에서, 핵심 요소 중 하나는 올바르게 하자는 것이다: 견고한 기반, 철저한 작업, 매우 높은 품질, 그리고, 모든 단계에서 올바른 결정을 내리는 것이다. 우리는 툴체인이 12.0 릴리스에 맞춰 준비될 것으로 예상하지 않고 있다. 올바르게 한다는 것은 시간이 더 걸린다는 뜻이다.

하지만, 새 툴체인은 여러 면에서 놀랍다. 우리가 가고 있는 방향을 여러분이 보기를 정말 바란다. 버전 12.0에서, 이 새 툴체인이 프리뷰(Preview) 형식으로 제공될 수 있어서 기쁘다. 여러분은 지금껏 사용하던 이전 툴체인을 계속 사용하면서 이 새 툴체인을 병행하여 사용할 수 있다.

여러분이 테스트해보면 좋을 것 같다. '순수한 C++'에 집중하자. 델파이 VCL/FMX를 테스트할 준비는 아직 되지 않았다. 여러분은 고품질 STL을 보게 된다. 그리고 우리가 COFF 오브젝트 포맷을 사용하고 있음을 보게 된다. PDB 디버그 파일을 보게 된다. (써드-파티 도구를 여러분이 사용해 볼 것인지 궁금하기도 하다. PDB는 널리 지원되는 포맷이기 때문이다). 성능을 보게 된다. 표준 호환성이 보게 된다. 새 C RTL을 보게 된다. 새 C++ RTL을 보게 된다. 새 링커를 보게 된다. (링커에 부담이 많은 대규모 프로젝트를 가지고 있는 개발자들이라면 이 링커를 좋아할 것이다.) 12.0이 출시되고 나면, 자세한 사용법을  블로그에 올릴 예정이다.

12.0에서, 이 새 툴체인은 기술 프리뷰(Technology Preview) 형식으로 제공된다. (프로퍼티 등 델파이-호환 기능들이 작동하고 있음에도 불구하고) 우리는 여전히 델파이 런타임에 대한 linking 등 주요 영역에서 작업을 진행 중이다. 하지만, 이것은 다르다. 그리고 놀랍다. 이 프리뷰(Preview)가 근간이라고 우리는 믿는다. 그리고 여러분이 이 결과를 보고 함께 기뻐하면 좋겠다.

 

버전 12.0의 툴체인(Toolchain)들

C++빌더/RAD 스튜디오 12.0의 Win64 툴체인은 어떤 모습이 될까? 음, 위에서 언급한 대로 두 가지가 있게 된다.

  • 우리는 기존 Clang 5 기반 툴체인을 계속 제공한다. 이것은 IDE에서 활성화 된 상태로 제공된다.
  • 새 Clang 15 기반 툴체인은 프리뷰 버전으로 제공된다. 명령-줄에서만 작동한다 (이것을 불러내려면 컴파일러 bcc64x를 호출한다)

어떤 업그레이드든 마이그레이션 경로가 있으면 더 쉬워진다. 따라서 도구 체인이 준비된다고 해도, 우리는 마이그레이션 및 업그레이드를 돕기 위해, (적어도 릴리스 한 번 정도에서는) 이전 툴체인과 새 툴체인을 함께 제공할 가능성이 높다. (새 툴체인은 모든 면에서 품질이 더 좋고, 기존 C++빌더와의 호환성이 뛰어나도록 작성되었기 때문에 전환이 쉬울 것이라고 생각한다. 하지만 다시 말하지만, 우리는 올바르게 하려고 노력하고 있다. 그 의미는 한 릴리스에서 다음 릴리스로 가면서 갑자기 툴체인을 전환해야 하는 상황은 없을 것이라는 의미이다.)

bcc64x-command-line-7687950.png?resize=7

 

총평

새 Clang 툴체인(Toolchain)은 흥미롭고 놀라운 요소이다. 기존 툴체인보다 많은 영역에서 훨씬 뛰어나다. 우리는 12.0에서 프리뷰(Preview) 형식으로 제공하여 우리가 가고 있는 방향을 여러분에서 구체적으로 보여주고자 한다. 여러분이 사용해 볼 수 있도록 제공한다. 각 새 에디션을 직접 사용할 수 있다. 우리의 메시지: 엄청난 작업량, 모든 영역에서 견고한 품질, 표준, 현대성, 올바른 결정을 바탕으로 한 구축. C++빌더는 견고한 바탕 위에 있다.

RAD 스튜디오 새버전 12! 출시전 특별 웨비나 다시보기에서, RAD 스튜디오, 델파이, C++빌더 12.0에 대해 더 많은 것들을 알 수 있다.

이 글은 RAD 스튜디오 소프트웨어의 출시 전 버전을 기반으로 작성되었으며 엠바카데로의 허가를 받고 작성되었다. 사전 공개 되는 기능이 반드시 GA (정식 출시, General Availability)에 포함된다는 보장은 없다.

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.