-
Embedded Swift Improvements Coming in Swift 6.3Swift 2025. 12. 26. 08:56
안녕하세요. 그린입니다 🍏
이번 포스팅에서는 Swift 6.3의 Embedded Swift 개선 사항에 대해 알아보겠습니다 🙋🏻
(지금은 아직 Swift 6.3 릴리즈 전입니다 😁)
Swift 6.3에서 Embedded Swift가 대폭 업그레이드됩니다.
마이크로컨트롤러 개발이 더욱 편해질 예정이에요!

Embedded Swift?
Embedded Swift는 마이크로컨트롤러처럼 리소스가 제한된 환경에서 동작하도록 설계된 Swift의 부분 집합입니다.
특별한 컴파일 모드를 사용해서 일반 Swift보다 훨씬 작은 바이너리를 생성하죠.
Swift 언어의 대부분은 Embedded Swift에서도 똑같이 동작하구요.
지난 몇 달간 C 상호운용성부터 디버깅, 링키지 모델까지 다양한 개선이 이루어졌는데 하나씩 살펴볼게요.
이 기능들은 곧 출시될 Swift 6.3에 포함되며, 지금 바로라도 development snapshot으로 테스트해볼 수 있습니다.
Libraries and Diagnostics
부동소수점 출력 지원
이전에는 Float, Double 같은 부동소수점 타입의 description과 debugDescription을 Embedded Swift에서 사용할 수 없었어요.
새로운 순수 Swift 구현으로 이제 사용 가능합니다.
Embedded 제약사항 경고
EmbeddedRestrictions 진단 그룹이 새로 추가되었어요.
Embedded Swift에서 사용 불가능한 언어 구조를 경고해주죠.
untyped throws나 existential 값에서의 제네릭 함수 호출 같은걸 말하죠.
Embedded Swift 빌드 시 기본으로 켜지는데, 일반 Swift에서도 활성화할 수 있습니다.
swiftSettings: [ .treatWarning("EmbeddedRestrictions", as: .warning), ]
Swift MMIO 0.1.x
메모리 매핑 I/O 패키지인 Swift MMIO가 0.1.x로 업데이트되었어요.
많은 버그 수정과 개선이 있었고, Swift Package Index에 완전한 문서도 추가되었구요.
가장 큰 변화는 코드 생성 지원이에요.
svd2swift 툴과 SwiftPM 플러그인으로 CMSIS SVD 파일에서 바로 Swift MMIO 인터페이스를 생성할 수 있어요. 커맨드 라인으로 수동 실행하거나 빌드 타임에 자동 처리가 가능하죠.
디버깅도 SVD2LLDB로 개선되었어요.
원시 메모리 주소 대신 실제 레지스터 이름으로 작업할 수 있으며, 시각적 디코딩 기능도 있습니다.
타이머 제어 레지스터 디코딩 예시를 볼까요?
(lldb) svd decode TIMER0.CR 0x0123_4567 --visual TIMER0.CR: 0x0123_4567 ╭╴CNTSRC ╭╴RST ╭╴S ╭╴RELOAD╭╴CAPEDGE ╭╴MODE ┴ ┴─ ┴─ ┴─── ┴── ┴ 0b00000001001000110100010101100111 ┬─ ┬─ ┬─── ┬ ┬─ ┬ ╰╴IDR ╰╴TRGEXT ╰╴PSC ╰╴EN ╰╴CAPSRC ╰╴CNT [31:31] S 0x0 (STOP) [27:26] IDR 0x0 (KEEP) [25:24] RELOAD 0x1 (RELOAD1) ...비트 필드를 시각적으로 보여주니까 훨씬 편하죠?
C Interoperability
@c 속성
SE-0495 proposal로 @c 속성이 추가되었어요.
C 호환 함수와 enum을 정의할 수 있게 해주죠.
@c(MyLib_initialize) public func initialize() { ... }이렇게 하면 C 헤더에서 이렇게 생성됩니다.
void MyLib_initialize(void);SE-0436의 @implementation 속성과도 함께 사용할 수 있어요.
기존 C 헤더가 있다면 Swift로 구현 가능합니다.
@c @implementation public func MyLib_initialize() { ... }컴파일러가 시그니처 일치 여부를 체크해주니까 안전하게 C 라이브러리를 Swift로 교체할 수 있어요.
@c는 기존의 @_cdecl을 공식화하면서 여러 코너 케이스도 수정했습니다.
C 시그니처 불일치 허용
이전에는 C 함수의 Swift 타입이 정확히 일치해야 했어요.
예를 들어 C 헤더에서는 이렇게 선언하고,
void takePointer(const double *);Swift에서는 이렇게 정의하면,
@c func takePointer(_ values: UnsafePointer<Double>) { ... }불일치 때문에 컴파일 실패가 발생했죠.
deserialization 실패 같은 이해하기 어려운 에러와 함께요.
이제는 컴파일러가 훨씬 관대해졌어요.
서로 다른 뷰를 분리해서 유지하고, 실제 C 선언 자체가 불일치할 때만 진단합니다.
nullability나 sendability 어노테이션 같은 미묘한 차이는 이제 문제가 되지 않아요.
Debugging
값 출력 개선
LLDB의 Embedded Swift 타입 값 출력이 개선되었어요.
memory read 명령에 Swift 타입 이름을 지정할 수 있게 되었습니다.
임의의 주소를 특정 Swift 타입으로 렌더링할 수 있습니다.
(lldb) memory read -t MyMessage 0x000000016fdfe970 (MessageLib.MyMessage) 0x16fdfe970 = { id = 15 timestamp = 793219406 payload = "hello" ... }
코어 덤프 지원 확대
LLDB가 변수를 표시하려면 타입 레이아웃 정보가 필요해요.
Embedded Swift는 reflection 메타데이터가 없어서 컴파일러가 모든 타입 레이아웃을 DWARF 디버그 정보로 내보내죠.
Swift 컴파일러의 디버그 정보 출력이 여러 면에서 개선되었어요.
extension 내부 중첩 타입 선언 지원 같은걸 말합니다.
LLDB도 Embedded Swift의 중첩 제네릭 타입 별칭을 지원하게 되었구요.
이 두 개선으로 Dictionary, Array 같은 표준 라이브러리 타입을 코어 덤프에서 검사할 수 있게 되었어요.
이전에는 라이브 프로세스가 필요한 표현식 평가기로만 접근 가능했는데 말이죠.
새로운 InlineArray 타입도 네이티브로 지원됩니다.
armv7m 예외 프레임 언와인딩
armv7m에서 예외 후 백트레이스 생성이 크게 개선되었어요.
이전 백트레이스는 이랬어요.
(lldb) bt * thread 1 * frame #0: 0x0020392c NeoPixelRainbow`NeoPixelRainbow.swift_UsageFault_Handler() -> () + 28 frame #1: 0x00203910 NeoPixelRainbow`UsageFault_Handler + 8 frame #2: 0xfffffff8 frame #3: 0x00202a86 NeoPixelRainbow`NeoPixelRainbow_main + 8 ...예외 프레임 시작 전 프레임들이 종종 누락되었죠.
이제 LLDB가 예외 프레임을 거쳐 표준 프로그램 프레임으로 돌아갈 수 있어요.
(lldb) bt * thread #1 * frame #0: 0x0020392c NeoPixelRainbow`swift_UsageFault_Handler() + 28 frame #1: 0x00203910 NeoPixelRainbow`swift_UsageFault_Handler() frame #2: 0x00203366 NeoPixelRainbow`static Application.main() + 2270 // 실제 예외 위치! frame #3: 0x00202a86 NeoPixelRainbow`NeoPixelRainbow_main + 8 ...누락된 프레임이 모두 보이죠?
Linking
@section과 @used 속성
SE-0492로 두 가지 새로운 속성이 추가되었어요.
@section은 전역 변수를 특정 섹션으로 내보낼 수 있게 해줍니다.
@section("__DATA,mysection") @used let myLinkerSetEntry: Int = 42objectFormat 체크로 객체 형식별 조건부 컴파일도 가능해요.
#if objectFormat(ELF) @section("mysection") #elseif objectFormat(MachO) @section("__DATA,mysection") #endif var global = ...@used는 컴파일러에게 엔티티를 항상 내보내라고 알려줘요.
링키지 모델 개선
Embedded Swift는 코드 생성을 나중으로 미루는 특별한 컴파일 모델을 사용해요.
아직 완전히 정의되지 않았고 실질적인 문제들이 있었죠.
아래와 같은 종속성 문제가 있었어요.
A / \ B C \ / DB와 C 모두에서 사용되는 A의 심볼이 D로 링크할 때 중복 정의 에러를 일으켰어요.
이제 컴파일러가 가져온 모듈의 심볼을 weak 정의로 내보냅니다.
링커가 중복 제거할 수 있게 된거죠.
-mergeable-symbols나 -emit-empty-object-file 같은 우회 플래그가 필요 없어졌어요.
SE-0497로 @export 속성도 추가되었어요.
함수의 클라이언트 가시성을 제어하죠.
@export(implementation)은 구현을 클라이언트가 내보내거나 특수화하거나 인라인할 수 있게 해요. 기
존의 비공식 @_alwaysEmitIntoClient를 대체합니다.
@export(interface)는 인터페이스만 제공하고 정의는 제공하지 않아요.
호출 가능한 심볼만 내보내서 라이브러리 개발자가 Embedded Swift에서도 구현을 완전히 숨길 수 있게 해줍니다.
Try it out!
어떻게 사용해볼 수 있을까요?
Swift development snapshots에서 사용 가능합니다.
Swift Embedded Examples 저장소가 시작하기 좋은데요, 다양한 하드웨어에서 Embedded Swift 코드를 빌드하고 실행하는 샘플 프로젝트들이 있어요.
질문이나 논의하고 싶은 내용이 있다면 Swift 포럼의 associated thread나 Embedded Swift 카테고리에서 대화에 참여해볼 수 있습니다 😃
Conclusion
Swift 6.3의 Embedded Swift는 많은 부분이 개선되었습니다.
Swift 6.3 release를 기대해봅니다 🚀
References
Embedded Swift Improvements Coming in Swift 6.3
Embedded Swift is a subset of Swift that’s designed for low resource usage, making it capable of running on constrained environments like microcontrollers. Using a special compilation mode, Embedded Swift produces significantly smaller binaries than regu
www.swift.org
'Swift' 카테고리의 다른 글
[SE-0504] Task Cancellation Shields (1) 2026.01.17 [SE-0502] Exclude private initialized properties from memberwise initializer (0) 2026.01.11 Nonexhaustive enums - Swift 6.2.3 (2) 2025.12.20 NSAttributedString Performance Optimization (0) 2025.12.06 Swift Closure Capture Semantics (0) 2025.11.15