스위프트의 코드 실행과정을 알아보자
스위프트는 인터프리터언어가 아니라 컴파일언어이다
c언어를 기반으로 한 언어이다.
큰 흐름은
컴파일 -> 링킹 -> 스토리보드(리소스)처리 -> 패키징, provisioning, signing -> 빌드
빌드 설명
배포 설명???
Apple 에서 진행한 Compiler에 필요한 Toolchain 개발 프로젝트.
얘는 가상 머신이 아니라 컴파일에 필요한 라이브러리이다.
비트코드를 생성한다.
주요 서브 프로젝트: LLVM Core, Clang, libc++, LLDB 등...
preference>components에서 확인한 toolchains
컴파일 후 비트코드를 생성하고
앱스토어에서 최적화과정을 거친 후
어떤 아키텍처(디바이스)에서나 실행될 수 있도록 한다.
고급언어(소스코드)를 IR로 바꾸는 프론트엔드
IR을 아키텍처에 맞는 기계어(*.o)로 바꾸는 백엔드
AST: Abstract Syntax Tree
SIL: Swift Intermediate Language
IR: Intermediate Representation
swiftc를 사용해 AST에서 SIL로, LLVM을 사용해 IR에서 기계어로 두번 최적화가 발생한다.
intermediate representation 중간 표현
LLVM에 의해 컴파일된, 소스코드와 기계코드의 중간단계
어떤 아키텍처(디바이스)에서도 실행되기를 준비하는 중간단계
Always Embed Swift Standard Libraries Yes로 설정 가능하다
로컬의 바이너리가 사용자가 다운받은 바이너리와 다르기 때문에
App build에서 Download dSYM해준다
앱은 크게 Executable Code실행가능한 코드와 Resources자원으로 구성되어 있다
그림에서 armv7/arm7s/arm64는 코드부분
나머지는 자원을 의미한다.
코드부분은 cpu에 따라 armv7/arm7s/arm64이나 32bit/64bit가 될 수 있다.
비트코드를 사용하게 되면 앱 스토어가 디바이스마다 앱 번들을 만들어 필요한 부분만 선택적으로 사용하게 된다.
ASM을 사용하게 되면 그냥 최적화된 완성본을 올리는 격이다.
Enable On Demand Resources에서 설정가능하다.
이건 위의 과정을 더 세분화해서 가져올 수 있도록 한 것이다.
1단계 2단계 3단계로 나뉘어져 있는데
게임에서 1차전직을 하면 1차전직까지의 정보만 가져오는 것과 동일하다.
ODR은 앱스토에 IPA와 별도로 저장되는데
시스템에서 관리 메모리에 저장되어서 여러 앱에서 ODR을 캐시 할 수 있다고 한다.
패키징 작업은 필요한 파일들을 정해진 규칙에 맞게 디렉토리 구조로 만드는 작업이다.
실행 파일과 Info.plist 파일, 각종 이미지, 스토리보드 리소스 등을 적절한 디렉토리에 둔다.
필요한 경우 Frameworks 디렉토리 내에 사용 중인 프레임워크들을 둔다.
프로비전 파일이 임베디드 된다. 개발자 등록을 하고 애플 개발자 콘솔에서 만든 프로비전 파일을 패키지에 둠으로써 누가 만든 애플리케이션인지 알도록 하는 것이다. 간단하게 프로비전 파일을 복사하여 패키지 내에 위치시키는 것으로 된다.
-Code Signing on macOS
macOS .pkg 파일들의 바이너리들은 스위프트 오픈소스 프로젝트(V9AUD2URP3)의 developer ID로 디지털 서명된다.
툴체인은 타이틀바의 오른쪽 사이드에 lock 아이콘을 생성한다. _CodeSignature/CodeResources파일로 확인이 가능하다.
누군가 패키지 내 파일을 변조한 뒤 다시 배포하는 경우 값 대조를 통해 변조 여부를 알 수 있게 된다.
.ipa파일은 패키징이 끝난 압축파일이라고 생각하면 된다.
스위프트 5.3.2는 Xcode 12.3버전의 일부로서 사용가능하다. (특정 버전의 Xcode는 특정 버전의 Swift를 지원한다)
앱스토어에 제출하기 위해 Xcode에 포함된 스위프트의 버전을 사용해 앱을 제출해야한다.
xcodebuild clean install
Products 디렉토리를 정리한 뒤 프로젝트의 첫 번째 타겟을 빌드하여 설치한다.
xcodebuild -project MyProject.xcodeproj -target Target1 -target Target2 -configuration Debug
MyProject 프로젝트의 Target1, Target2를 Debug 모드로 빌드한다.
xcodebuild archive -workspace MyWorkspace.xcworkspace -scheme MyScheme
MyWorkspace의 MyScheme에 해당하는 빌드 결과를 아카이빙한다.
터미널에서 swift라고 치면 나오는 툴
스위프트 코드를 바로 실행할 수 있다
Command Line Tools for Xcode를 다운받으면 사용할 수 있는 도구
출처:
https://zeddios.tistory.com/655
https://blog.daum.net/creazier/15310767
https://swift.org/swift-compiler/#compiler-architecture
https://swift.org/download/#releases