Swift 채택 중단 – Ladybird 브라우저의 Swift 6.0 지원 이슈 종료
(github.com/LadybirdBrowser)- Ladybird 브라우저 프로젝트는 Swift 6.0 지원을 실험 단계에서 정식으로 전환하는 과정에서 발생한 문제 목록을 정리했으나, 이후 Swift 채택을 더 이상 추진하지 않기로 결정함
- 주요 장애 요인은 Swift와 C++ 상호운용성(Interop) 관련 ABI 불일치, 헤더 순환 의존성, 특정 타입 반환 불가 등으로, 여러 항목이 Swift 6.0.0 이후 수정되었음
- CMake 빌드 시스템에서도 Swift + Ninja 환경에서의 배포 타깃 불일치, install_name 처리 오류, 비호환 컴파일 옵션 등 문제가 보고됨
- Ladybird 자체 코드에서도 AK 및 LibGfx 모듈의 modulemap 구성, Swift 프론트엔드 크래시, 타입 네임스페이스 충돌 등 다수의 빌드 불안정성이 확인됨
- 이러한 누적된 기술적 제약으로 인해 Swift 통합이 중단되었으며, 이는 C++ 중심의 개발 유지 결정으로 이어짐
Swift 관련 문제
- Swift 6.0 지원을 실험 단계에서 벗어나기 위해 해결해야 할 언어 및 ABI 수준의 버그가 다수 존재
- LLVM 버전 불일치로 인해 Swift 오픈소스 빌드 시 어설션 실패 발생
-
Optional<CxxValueType>반환 시 컴파일러와 브리징 헤더 간 ABI 불일치 문제 - Ubuntu 22.04 환경에서
<execution>헤더 포함 시 libstdc++ 모듈 순환 의존성 발생 -
swift::Optional<swift::String>반환 불가,<chrono>헤더 불러오기 실패 등 C++23 호환성 문제 포함
- 일부 문제는 Swift 6.0.0 이후 릴리스에서 수정되었으나, 일부는 main 브랜치에서만 해결되어 안정 버전에는 미반영
- 여러 항목에서 “워크어라운드(우회 빌드 방법) ”가 제시되었으나, 완전한 해결책은 아님
CMake 관련 문제
- Swift와 Ninja 빌드 조합 시 CMAKE_OSX_DEPLOYMENT_TARGET 미적용으로 경고 다수 발생
- 수동으로
CMAKE_Swift_COMPILER_TARGET설정 필요
- 수동으로
- CMP0157 정책 활성화 시 install_name 디렉터리 설정이 무시되어 수동 수정 필요
- 관련 수정이 CMake 3.29, 3.30에 백포트 예정
- Swift 컴파일러가 이해하지 못하는 링크 옵션이 외부 종속성에서 전달되는 문제 존재
Ladybird 프로젝트 내부 문제
- AK 및 LibGfx 모듈의 clang module map 구성 시 시스템 헤더 충돌 발생
-
<math.h>포함 시 모듈 인식 오류로 빌드 실패
-
- Swift 프론트엔드가 AK 컨테이너 테스트 중 디버그 빌드에서 크래시
- 릴리스 모드 빌드로만 회피 가능
-
String타입 네임스페이스 충돌로 Swift 프론트엔드 비정상 종료-
AK.String또는Swift.String으로 명시적 지정 필요
-
- Swift Testing 모듈 사용 시 컴파일러 프론트엔드 크래시,
AK::StringView의 CxxSequenceType 불인식 문제 존재
추가 개선 항목
- Swift에서 C++ 함수가
Optional<CxxType>을 반환할 때 애플리케이션 크래시 발생- 임시 해결책으로 0 또는 1 크기의 배열 반환 사용
- SourceKit-LSP 및 vscode-swift가 루트 수준 compile_commands.json을 요구
- 심볼릭 링크 생성으로 해결 가능
- Linux 환경에서
<swift/bridging>경로를 수동 추가해야 하는 불편 존재
미해결 질문
- Swift로 C++의 view 타입이나 byte slice를 복사 없이 전달하는 방법 불명확
- Swift가 AK::Optional, AK::HashMap 등 자체 타입을 std:: 타입과 동등하게 인식하지 못함
- Swift 가비지 컬렉터와 Ladybird의 메모리 관리 통합 방식도 미정 상태
이 이슈는 Swift 6.0 통합을 위한 기술적 장애를 체계적으로 기록한 문서였으나, 이후 Ladybird 팀이 Swift 채택을 중단하면서 “Swift 6.0 Blockers” 이슈는 종료됨.
Hacker News 의견들
-
Swift 제거 커밋에는 약간의 추가 설명이 있음
“오랫동안 **진전이 없었으므로 Swift 도입을 포기하고 코드베이스에서 제거함”이라는 메시지가 포함되어 있음
관련 커밋은 여기에서 볼 수 있음- 여기에 더 자세한 맥락이 이슈 #933에 정리되어 있음
-
나는 2021년에 Swift를 처음 써봤는데, 10년 넘게 C#/.NET을 하다가 와서 놀랐음
C#도 복잡하다고 생각했는데 Swift는 그보다 훨씬 복잡한 언어였음
특히 백엔드 API나 데이터 접근 계층을 만들 때는 참고할 자료가 거의 없었음
Swift는 대부분 Apple 플랫폼용으로 지식이 쌓여 있어서, 그 밖의 영역에서는 거의 개척자가 되어야 하는 느낌이었음- 최근 몇 년간 Python이나 Go 같은 단순한 언어들이 “복잡성은 나쁘다”는 주장을 강화했지만, 언어의 표현력이 높으면 오히려 유지보수에 도움이 된다고 생각함
Larry Wall이 말했듯, 도구의 복잡도는 문제의 복잡도에 맞춰야 함 (Raku 언급) - 나는 2018년쯤 Objective-C에서 Swift로 넘어왔는데, 처음엔 개선된 느낌이었음
하지만 “struct는 값 전달, class는 참조 전달” 같은 규칙과 “하나의 진실된 소스 유지” 원칙이 충돌해서 개발이 지루하고 느려지는 경험을 했음
Swift의 모순된 베스트 프랙티스 때문에 진전이 없었고, 결국 많은 조언들이 믿을 게 못 된다는 걸 깨달았음 - M1 맥북에서 Vapor 템플릿을 컴파일할 때마다 노트북이 과열되는 문제도 있었음
- 나도 비슷했음. Rust처럼 금방 익힐 줄 알았는데 전혀 아니었음
문법 설탕이 너무 많고, 같은 일을 하는 방법이 수십 가지라서 매번 언어 레퍼런스를 찾아봐야 했음 - 그래서 결국 C#/.NET으로 다시 돌아갔는지 궁금함
- 최근 몇 년간 Python이나 Go 같은 단순한 언어들이 “복잡성은 나쁘다”는 주장을 강화했지만, 언어의 표현력이 높으면 오히려 유지보수에 도움이 된다고 생각함
-
언어가 무엇이든, Ladybird가 나중에 사용자 친화적인 JavaScript 구현에 집중하길 바람
JS가 사용자 활동 추적이나 붙여넣기 차단, 과도한 디바이스 정보 수집에 악용되는 건 문제임
Tor처럼 사용자 간 표준화된 스푸핑 값을 보고하도록 하면 프라이버시 보호에 도움이 될 것 같음- 하지만 이런 방식은 많은 웹사이트에서 봇 탐지로 오인되어 접속이 막힐 수 있음
토글 옵션으로 제공하는 건 괜찮지만 기본값으로 두면 채택이 어려울 것 같음 - 웹 표준을 무시하고 독자적으로 동작하는 브라우저는 개인적으로는 절대 쓰고 싶지 않음
- 하지만 이런 방식은 많은 웹사이트에서 봇 탐지로 오인되어 접속이 막힐 수 있음
-
Swift 제거가 흥미로움. 이유가 명확히 설명되지 않았는데 궁금함
Linux에서 돌아가기만 하면 나중에 테스트해볼 생각임- 내가 보기엔 빌드 충돌이 반복돼서 포기한 듯함
Swift가 여러 C++ 버전 라이브러리를 동시에 임포트하지 못하거나, 연산자 버전 충돌이 생기는 문제였음
Swift는 좋은 언어지만, 이미 큰 프로젝트에 나중에 추가하기엔 너무 복잡했을 것 같음
- 내가 보기엔 빌드 충돌이 반복돼서 포기한 듯함
-
왜 Ladybird가 Swift를 시도했는지 궁금함. Rust가 더 나은 C++ 상호운용성을 갖고 있지 않나 생각함
Swift의 GC도 브라우저 성능엔 불리할 것 같음- Andreas Kling이 트위터에서 “Swift vs Rust 중 Swift가 객체지향 지원과 C++ 연동에서 더 낫다”고 언급했음
링크1, 링크2 - Rust가 게임 개발에서 불편한 이유와 비슷함. borrow checker가 순환 참조 구조와 잘 맞지 않음
우회 방법은 있지만 생산성이 떨어짐 - Swift는 실제로 C++ interop 문서에 나와 있듯 상호운용성이 꽤 좋음
다만 Ladybird에는 충분하지 않았던 듯함 - Andreas Kling은 Rust가 객체지향 기능이 부족해서 GUI 개발에 불리하다고 말했음
예전엔 SerenityOS에서 Jakt라는 언어를 만들기도 했지만, 결국 C++로 돌아온 듯함 - Rust가 DOM 계층 구조나 OOP 문제로 거절된 적이 있었던 걸로 기억함
관련 과거 논의는 이 글에 있음
- Andreas Kling이 트위터에서 “Swift vs Rust 중 Swift가 객체지향 지원과 C++ 연동에서 더 낫다”고 언급했음
-
Swift는 Apple에 너무 의존적인 언어라 놀랍지 않음
C++의 안전한 부분만 잘 쓰면 충분하고, 실제로 대부분의 브라우저가 C++로 작성되어 있음- 하지만 모든 브라우저가 C++에 갇혀 있는 상태일 뿐임
Chromium과 Firefox는 점진적으로 더 안전한 언어로 교체 중이고, 새 브라우저를 C++로 다시 쓰는 건 과거의 실수를 반복하는 셈임
C++ 사용은 1998년 KHTML 시절의 유산임 - “현대적 메모리 안전 C++ 서브셋”이란 게 구체적으로 뭔지 모르겠음
string_view 같은 최신 STL 기능을 포함하나? 여전히 완전한 메모리 안전과는 거리가 있음 - Rust는 Mozilla에서 개발된 걸로 알고 있는데, Mozilla 자체가 Rust로 작성된 건지 궁금함
- 어쨌든 Swift는 고성능이 필요한 영역에서는 C++을 이기기 어려움
일부 벤치마크를 제외하면 실제 프로그램에서는 거의 항상 느림
- 하지만 모든 브라우저가 C++에 갇혀 있는 상태일 뿐임
-
Swift 제거라니 아쉬움. 그럼 자체 언어 Jakt가 다시 후보에 오르는 건가 궁금함
- Ladybird는 SerenityOS에서 이미 분리됐고, Jakt는 그들의 언어가 아님
새로운 언어를 도입할 가능성은 낮다고 봄 - 개인적으로는 프로젝트가 너무 방향을 자주 바꾸는 게 걱정임
외부 후원으로 운영되는 프로젝트가 이런 식이면 장기적으로 지속되기 어려움 - 왜 Rust를 안 쓰는지 답답함. 혹시 C++ 집착 때문인가 싶음
- Ladybird는 SerenityOS에서 이미 분리됐고, Jakt는 그들의 언어가 아님
-
Swift는 결국 Apple의 장난감 언어에 불과하다고 생각함
Apple이 그 이상으로 성장하도록 두지 않을 것임 -
Ladybird의 Mac UI는 AppKit 위에 얇게 얹은 레이어임
Swift가 아니라 Objective-C++로 작성되어 있음
소스 코드 참고- 내가 그 코드를 처음 작성한 사람임
Swift 도입 훨씬 전, SerenityOS 시절에 만든 거라 Objective-C++을 쓴 건 단지 익숙한 언어였기 때문임
- 내가 그 코드를 처음 작성한 사람임
-
예전에 Swift로 전환한다고 했을 때 비판했었음
Swift는 설계가 엉성하고, 컴파일 속도도 느리며, 시스템 언어로 성장할 가능성이 낮다고 봤음
전문가도 없었으니 이번 결정은 잘한 일이라 생각함- Swift는 오픈소스처럼 보여도 실제로는 Apple이 모든 결정권을 쥐고 있음
Concurrency나 Swift Testing 같은 기능도 Apple의 필요에 따라 밀어붙인 사례임
크로스플랫폼 작업은 대부분 소규모 팀이 따로 진행 중임 - Swift의 문제는 인정하지만, “전문가가 없었다”는 건 과장임
Chris Lattner를 제외하더라도 Swift 리드들은 C++ 커뮤니티에서 인정받은 인물들이었음 - Swift의 핵심은 언어 자체보다 표준 ABI임
Rust 진영이 C와 함께 Swift ABI도 FFI로 지원하면 좋겠음 - 그렇다면 어떤 언어를 추천하는지 궁금함
- Go도 비슷한가? 요즘 가장 합의된 선택지가 뭔지 알고 싶음
- Swift는 오픈소스처럼 보여도 실제로는 Apple이 모든 결정권을 쥐고 있음