#1-1. LLVM은 무엇이며 스위프트 코드는 어떻게 실행하는 것인가 [Swift]

인생노잼시기·2021년 4월 8일
1

🦅 스위프트 문법

목록 보기
3/13

스위프트의 코드 실행과정을 알아보자

시작하기 전에

스위프트는 인터프리터언어가 아니라 컴파일언어이다
c언어를 기반으로 한 언어이다.

큰 흐름은
컴파일 -> 링킹 -> 스토리보드(리소스)처리 -> 패키징, provisioning, signing -> 빌드

컴파일, 빌드, 배포의 뜻은?

  • 컴파일compile: 소스코드를 컴퓨터가 이해할 수 있는 기계어로 번역하는 일
    ex) javac Hello.java 하면 Hello.c파일이 생성되는 것
  • 빌드build: 컴파일된 파일을 실행할 수 있도록 패키징하는 일
    ex) war, jar 파일 생성
    스위프트에서 빌드 결과물은 Target이라고 부른다
    기본적으로 device/simulator, debug/release 2X2=4가지 상황에 따라 빌드가 가능하다
  • 배포distribution: 빌드된 파일을 사용자가 접근할 수 있는 환경에 배치시키는 일
    .ipa파일 생성
    ex) scheme으로 archive를 만들어 접근하는 것?
    scheme은 url scheme으로 접근할 때 봤던건데...
    edit scheme에 나오는 내용

    1~2 과정을 통합해서 빌드라고 부르기도 한다
    이클립스와 같은 IDE환경에서 RUN하는 것은 컴파일+실행을 합친 일이다.

빌드 설명

배포 설명???

LLVM이란? Low Level Virtual Machine

Apple 에서 진행한 Compiler에 필요한 Toolchain 개발 프로젝트.
얘는 가상 머신이 아니라 컴파일에 필요한 라이브러리이다.
비트코드를 생성한다.
주요 서브 프로젝트: LLVM Core, Clang, libc++, LLDB 등...

  • 툴체인이 무슨 말이지?
    Xcode에서 사용하는 프로그램 개발을 위한 개발도구 모음
    컴파일, 빌드, 디버깅, 코드완성, 문법에 따라 폰트 색상 변경하게 하는 것들 등...
    스위프트 toolchain을 선택하는 것은 Xcode IDE에만 영향을 끼친다.

preference>components에서 확인한 toolchains

컴파일 후 비트코드를 생성하고
앱스토어에서 최적화과정을 거친 후
어떤 아키텍처(디바이스)에서나 실행될 수 있도록 한다.

구조

고급언어(소스코드)를 IR로 바꾸는 프론트엔드
IR을 아키텍처에 맞는 기계어(*.o)로 바꾸는 백엔드


AST: Abstract Syntax Tree
SIL: Swift Intermediate Language
IR: Intermediate Representation

  • IR은 비트코드(.bc) 아닌가?
    .ll(LLVM 어셈블리어), .bc(LLVM 비트코드), .o(c++ objective code) 세 가지 종류가 있는데
    설정에서 Enable Bitcode를 Yes로 설정해야만 .bc가 생성이 된다고 한다.
    아닌 경우엔 ASM(기계어)만 생성됨

swiftc를 사용해 AST에서 SIL로, LLVM을 사용해 IR에서 기계어로 두번 최적화가 발생한다.

비트코트(.bc)

intermediate representation 중간 표현
LLVM에 의해 컴파일된, 소스코드와 기계코드의 중간단계
어떤 아키텍처(디바이스)에서도 실행되기를 준비하는 중간단계

  • 비트코드 생성했을 때와 비트코드 생성하지 않았을 때 더 자세히 알아보기
    Enable Bitcode 설정
    모든 앱과 앱 번들 안의 모든 프레임워크(타겟)은 비트코드를 포함해야한다. watch와 tv는 반드시 포함해야한다.
    (만약 비트코드가 없으면 다 없어야 하고 있어야 하면 다 있어야 한다는 말)

링킹

Always Embed Swift Standard Libraries Yes로 설정 가능하다

  • 라이브러리 모듈을 연결하는 것
    • 동적 링킹: .dll, .dylib
    • 정적 링킹: *.lib

앱시닝

로컬의 바이너리가 사용자가 다운받은 바이너리와 다르기 때문에
App build에서 Download dSYM해준다

앱은 크게 Executable Code실행가능한 코드Resources자원으로 구성되어 있다
그림에서 armv7/arm7s/arm64는 코드부분
나머지는 자원을 의미한다.

코드부분은 cpu에 따라 armv7/arm7s/arm64이나 32bit/64bit가 될 수 있다.

비트코드를 사용하게 되면 앱 스토어가 디바이스마다 앱 번들을 만들어 필요한 부분만 선택적으로 사용하게 된다.

ASM을 사용하게 되면 그냥 최적화된 완성본을 올리는 격이다.

ODR(On Demand Resource)

Enable On Demand Resources에서 설정가능하다.

이건 위의 과정을 더 세분화해서 가져올 수 있도록 한 것이다.
1단계 2단계 3단계로 나뉘어져 있는데
게임에서 1차전직을 하면 1차전직까지의 정보만 가져오는 것과 동일하다.

ODR은 앱스토에 IPA와 별도로 저장되는데
시스템에서 관리 메모리에 저장되어서 여러 앱에서 ODR을 캐시 할 수 있다고 한다.

패키징, provisioning, signing -> .ipa파일 생성

  • 패키징 작업은 필요한 파일들을 정해진 규칙에 맞게 디렉토리 구조로 만드는 작업이다.
    실행 파일과 Info.plist 파일, 각종 이미지, 스토리보드 리소스 등을 적절한 디렉토리에 둔다.
    필요한 경우 Frameworks 디렉토리 내에 사용 중인 프레임워크들을 둔다.

  • 프로비전 파일이 임베디드 된다. 개발자 등록을 하고 애플 개발자 콘솔에서 만든 프로비전 파일을 패키지에 둠으로써 누가 만든 애플리케이션인지 알도록 하는 것이다. 간단하게 프로비전 파일을 복사하여 패키지 내에 위치시키는 것으로 된다.

-Code Signing on macOS
macOS .pkg 파일들의 바이너리들은 스위프트 오픈소스 프로젝트(V9AUD2URP3)의 developer ID로 디지털 서명된다.
툴체인은 타이틀바의 오른쪽 사이드에 lock 아이콘을 생성한다. _CodeSignature/CodeResources파일로 확인이 가능하다.
누군가 패키지 내 파일을 변조한 뒤 다시 배포하는 경우 값 대조를 통해 변조 여부를 알 수 있게 된다.

.ipa파일은 패키징이 끝난 압축파일이라고 생각하면 된다.

스위프트 버전과 Xcode버전과 최저 target 플랫폼

스위프트 5.3.2는 Xcode 12.3버전의 일부로서 사용가능하다. (특정 버전의 Xcode는 특정 버전의 Swift를 지원한다)
앱스토어에 제출하기 위해 Xcode에 포함된 스위프트의 버전을 사용해 앱을 제출해야한다.

  • 지원 가능한 Target(빌드) 플랫폼:
    macOS 10.9.0 or later
    iOS 7.0 or later
    watchOS 2.0 or later
    tvOS 9.0 or later

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에 해당하는 빌드 결과를 아카이빙한다.

REPL read-eval-print loop

터미널에서 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

앱번들

https://sihyungyou.github.io/iOS-app-bundle/

profile
인생노잼

0개의 댓글