디버깅과 컴파일, LLDB

Wonbi·2022년 10월 7일
0

✅ 학습 내용

📌 디버깅과 컴파일

💎 디버깅

  • 컴퓨터 프로그램 개발 단계 중에 발생하는 시스템의 논리적인 오류나 비정상적 연산을 찾아내고 그 원인을 밝히고 수정하는 작업 과정 - wiki

💎 컴파일

  • 언어를 다른 언어로 번역 하는 것을 의미한다.
  • 원시 코드 -> 목적 코드

✏️ 1. 컴파일러

1. 특징
  • 원시코드를 다른언어로 번역해서 사용자에게 제공한다.
  • 마치 책을 각 나라 언어로 번역해서 배포하는 느낌
  • 번역하는데 시간이 오래걸린다.
  • 한번 번역되면 그것을 다시 회수하거나 수정하기 쉽지 않다.
  • 하지만 번역이 끝나면 읽는 사람은 매우 빠르게 읽을 수있다.
2. 장점
  • 한번 빌드가 끝나 앱 배포가 끝나면 빠르게 앱을 실행할 수 있다.
  • 하드웨어의 자원을 덜 소모해서 성능에 영향을 덜 받으면서 안정적으로 구동이 가능하다.
  • 소스 코드가 실행되기 전에 버그를 인지하기 쉬워 에러를 빠르게 발견할 수 있다.
3. 단점
  • 컴파일러 과정이 필요하기 때문에 생산 속도가 느리다.
  • 시스템마다 언어가 다르기 때문에 컴파일 과정에서 많은 비용을 소모해야만 한다.
  • 한번 빌드할 때마다 각각의 언어에 맞게 모두 빌드해야 한다.
4. 스위프트에서 컴파일러
  • LLVM이 컴파일러의 오래걸리는 빌드시간 등의 단점을 잡아주는 역할을 한다.
  • 더 자세한 건 WWDC 2018을 참고하면 좋다.

✏️ 2. 인터프리터

1. 특징
  • 원시코드를 실시간으로 번역해서 사용자에게 제공한다.
  • 마치 책을 영어 원문으로 주고 동시통역을 해주는 느낌
  • 빌드과정이 없고 실행할 때 고수준 언어를 바로바로 컴파일을 진행한다.
2. 장점
  • 빠른 수정과 배포가 가능한 장점이 있어 웹 프론트에서 많이 사용한다.
  • 별도의 컴파일러 과정이 필요하지 않아 빠른 구현이 가능하다.
3. 단점
  • 컴파일러가 없어 오류 인지 시점이 늦다. 디버깅이 불편하다.
  • 실시간으로 번역을 해주는 번역기가 필요하기 때문에 읽는 속도가 느리다.
  • 컴퓨터의 자원을 많이 소모하고 안정적이지 않다.

✏️ 3. 바이트코드

1. 특징
  • 중간 언어를 두는 방법이다.
  • 지구 공용어가 있고 어느나라 언어든 지구 공용어로 통번역을 한 후 그 공용어로 배포하는것
  • 각 나라에는 자신의 나라 언어로 번역하는 번역가가 있다.
2. 장점
  • 이식성이 아주 높고 범용성이 높은 언어이다. 공용어를 번역할 수 있는 사람만 있으면 어디서든 사용할 수 있기 때문
  • 예전에 컴퓨터에 깔던 자바 뭐시기가 바로 이 번역가이다.
3. 단점
  • 장점은 이것 뿐이고 나머지 두 언어의 단점을 모두 가진다는 단점이 있다.

💎 빌드란?

  • 소스코드 파일을 실행가능한 소프트웨어 산출물로 만드는 일련의 과정
  • 소스코드의 언어 -> 전처리 -> 컴파일 -> 링크 -> 컴퓨터가 이해할 수 있는 바이너리 언어
    고수준 언어 ————————————————————> 저수준 언어

✏️ 전처리?

  • 코드의 최적화를 먼저 진행한다. 전처리기가 대치해줘야할 것들을 대치해주기도 한다. 일단 이정도만 알고 있으면 된다.

✏️ 링크?

  • 여러 소스코드를 컴파일러는 따로 컴파일하기 때문에 A소스 코드에서 B소스 코드의 메서드나 인스턴스를 모른다. 이를 연결해주는 것이 링크이다.
  • 링크에서 오류가 자주 나온다. 연결이 여기저기 복잡하게 엮이면서 심볼을 못찾았다.. 링커 커맨드가 실패했다.. 등등…
  • 그래도 요즘은 의존성 관리해주는 툴들이 있어서 (코코아팟 등등..) 좀 덜하다

💎 컴파일의 단점을 잡아주는 디버깅 도구

✏️ GCC

  • GNU Compiler Colletion
  • 시스템마다 다른 컴파일을 해줘야 한다.
  • 한때 옵젝C에서도 많이 사용했다.
  • 현재는 라이선스가 바뀌면서 사용하지 않는다.

✏️ LLVM

  • GCC를 버리고 크리스 레트너라는 사람을 영입해 2007년 부터 LLVM개발하여 사용한다.
  • 컴파일러, 디버거, 라이브러리 모두를 하나의 패키지로 제공한다.
  • LLVM만 알아들을 수 있게 코드를 짜면, LLVM이 알아서 아키텍쳐에 맞게 컴파일링해줬다. 당시로선 매우 센세이셔널한 것.
  • GCC보다 훨씬 편한게 컴파일이 가능했다. 여담으로 크리스 레트너는 스위프트 언어를 개발한 사람이기도 하다.

✏️ LLDB

  • LLDB는 LLVM front-end debugger이다. LLVM은 컴파일 시스템이고 LLDB은 디버깅을 도와주는 도구이다.

💎 LLDB가 왜 필요할까?

  • 걍 print 쓰면 되는데.. 이 LLDB를 써야하는 이유는
  • 앱을 실행하는 동안 실시간으로 변수나 인스턴스를 만드는 등의 행동을 할 수 있다.
  • 컴파일은 통번역이다. 앱의 규모가 커지면, 컴파일하는것 자체 만으로 엄청난 시간이 걸리게 될 것이다.
  • 우스갯 소리로 빌드 해두고 밥먹고 온다는 것이 농담이 아닌 것이다.
  • print문 하나 더 써서 확인하려면 30분에서 1시간도 넘게 걸리게 된다.
  • 결국 빌드 시간이 매우 느려지기 떄문에 LLDB는 코드를 공부하는 것 만큼 매우 중요한 것이다.
  • 지금부터 의식적으로 의지적으로 print문 쓰지말고 LLDB를 사용하는 습관을 기르자.

0개의 댓글