DrawingProcess
드프 DrawingProcess
DrawingProcess
전체 방문자
오늘
어제
«   2025/05   »
일 월 화 수 목 금 토
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
  • 분류 전체보기 (964)
    • Profile & Branding (22)
      • Career (15)
    • IT Trends (254)
      • Conference, Faire (Experien.. (31)
      • News (187)
      • Youtube (19)
      • TED (8)
      • Web Page (2)
      • IT: Etc... (6)
    • Contents (97)
      • Book (66)
      • Lecture (31)
    • Project Process (94)
      • Ideation (0)
      • Study Report (34)
      • Challenge & Award (22)
      • 1Day1Process (5)
      • Making (5)
      • KRC-FTC (Team TC(5031, 5048.. (10)
      • GCP (GlobalCitizenProject) (15)
    • Study: ComputerScience(CS) (72)
      • CS: Basic (9)
      • CS: Database(SQL) (5)
      • CS: Network (14)
      • CS: OperatingSystem (3)
      • CS: Linux (39)
      • CS: Etc... (2)
    • Study: Software(SW) (95)
      • SW: Language (29)
      • SW: Algorithms (1)
      • SW: DataStructure & DesignP.. (1)
      • SW: Opensource (15)
      • SW: Error Bug Fix (43)
      • SW: Etc... (6)
    • Study: Artificial Intellige.. (149)
      • AI: Research (1)
      • AI: 2D Vision(Det, Seg, Tra.. (35)
      • AI: 3D Vision (70)
      • AI: MultiModal (3)
      • AI: SLAM (0)
      • AI: Light Weight(LW) (3)
      • AI: Data Pipeline (7)
      • AI: Machine Learning(ML) (1)
    • Study: Robotics(Robot) (33)
      • Robot: ROS(Robot Operating .. (9)
      • Robot: Positioning (8)
      • Robot: Planning & Control (7)
    • Study: DeveloperTools(DevTo.. (83)
      • DevTool: Git (12)
      • DevTool: CMake (13)
      • DevTool: NoSQL(Elastic, Mon.. (25)
      • DevTool: Container (17)
      • DevTool: IDE (11)
      • DevTool: CloudComputing (4)
    • 인생을 살면서 (64)
      • 나의 취미들 (7)
      • 나의 생각들 (42)
      • 여행을 떠나자~ (10)
      • 분기별 회고 (5)

개발자 명언

“ 매주 목요일마다 당신이 항상 하던대로 신발끈을 묶으면 신발이 폭발한다고 생각해보라.
컴퓨터를 사용할 때는 이런 일이 항상 일어나는데도 아무도 불평할 생각을 안 한다. ”

- Jef Raskin

맥의 아버지 - 애플컴퓨터의 매킨토시 프로젝트를 주도

인기 글

최근 글

최근 댓글

티스토리

hELLO · Designed By 정상우.
DrawingProcess

드프 DrawingProcess

Study: ComputerScience(CS)/CS: Basic

[CS] 컴파일(Compile), 링킹(Linking), 빌드(Build), 배포(Release, Deploy, Distribute) 란?

2022. 6. 17. 10:02
반응형
1. 컴파일(Compile): 사용자가 작성한 코드를 컴퓨터가 이해할 수 있는 언어로 번역하는 일
2. 링크(Link): 컴파일된 소스코드를 연결하는 일
3. 빌드(Build): 컴파일된 코드를 실제 실행할 수 있는 상태로 만드는 일
4. 배포
   * Release: 같은 제품을 새롭게 만드는 것
   * Deploy: 프로그램 등을 서버와 같은 기기에 설치하여 서비스 등을 제공하는 의미
   * Distribute: 제품을 사용자들이 사용할 수 있도록 서비스 등을 제공하는 의미

C++ 코드를 실행파일로 변환하는 과정.


  1. 전처리(Preprocessing) 단계: #include 와 #define 와 같은 전처리기 매크로들을 처리합니다.
  2. 컴파일 (Compile) 단계: 각각의 소스 파일들을 어셈블리 명령어로 변환합니다.
  3. 어셈블 (Assemble)단계: 어셈블리 코드들을 실제 기계어로 이루어진 목적 코드(Object file)로 변환합니다.
  4. 링킹 (Linking) 단계: 각각의 목적 코드들을 한데 모아서 하나의 실행 파일로 만듭니다.

 

전처리(Preprocessing)


  1. 문자들 해석: 소스 파일에 있는 문자들을 해석하는 것입니다.
    • 5 종류의 공백 문자들 (스페이스, 탭, 개행 문자 등등)
    • 10 종류의 숫자들 (0 부터 9 까지)
    • 52 종류의 알파벳 대소문자
    • 29 종류의 특수 문자들 (_, {, + 등등)
    • 이 기본 문자 셋(총 96개)에 포함되어 있지 않은 다른 모든 문자들 컴파일러에 의해서 따로 해석합니다.
  2. 문자 해석
    • 만약에 백슬래시 (\) 문자가 문장 맨 끝 부분에 위치해있다면, 해당 문장과 바로 다음에 오는 문장이 하나로 합쳐지고 개행 문자는 삭제합니다.
  3. 전처리 토큰들로 분리: 소스 파일을 주석 (comment), 공백 문자, 전처리 토큰(Preprocessing token)들로 분리합니다.
    • 헤더 이름 (<iostream> 과 같이)
    • 식별자
    • 문자/문자열 리터럴
    • 연산자들 (+, ##)
  4. 전처리기 실행 단계: 전처리 토큰들로 분리하였으므로 전처리기를 실행합니다.
    • #include 에 지정된 파일의 내용을 복사합니다.
      • 참고로 #include 로 복사된 헤더 파일은 다시 Phase 1 부터 4 단계까지의 과정을 거칩니다.
      • 이 과정은 소스 파일에 더이상의 전처리기문이 없을 때 까지 지속됩니다.
    • #define 에 정의된 매크로를 사용해서 코드를 치환합니다.
    • #if, #ifndef 와 같은 구문들을 실행해서 코드를 치환합니다.
    • #pragma 와 같은 컴파일러 명령문들을 해석합니다.
      • 보통 헤더파일이 중복되어서 include 되더라도 한 번만 포함이 되게 헤더 가드(Header guard) 를 작성합니다.
      • 헤더 가드(Header guard)에 대한 자세한 내용은 [C++] 조건부 컴파일 매크로(전처리기 지시어): Header Guard를 참조해주시기 바랍니다.
  5. 실행 문자 셋으로 변경
    • 모든 문자들은 이전의 소스 코드 문자 셋에서 실행 문자 셋(Execution character set) 의 문자들로 변경됩니다.
    • 마찬가지로 이전의 Escaped 된 자들도 실행 문자 셋의 문자들로 변경됩니다.
  6. 인접한 문자열 합치기
    • 기존: std::cout << "abc" "def"; 
      변환: std::cout << "abcdef";

 

컴파일(Compile)


  • 개발자가 작성한 source code를 (어셈블리 형태로 변환한 후) binary code인 기계어로 변환하는 과정입니다.
  • 해당 작업을 해주는 프로그램이 Compiler입니다.
    • Java의 경우, JVM(Java Virtual Machine)에서 byte 코드 형태의 *.class 파일이 생성됩니다.
    • C++의 경우, MinGW, Clang에서 byte 코드 형태의 *.o(Object file) 파일이 생성됩니다.
  • 추가로 컴파일에 대한 보다 자세한 내용은 [CS] 컴파일(Compile)에 대해 보다 심도있는 내용를 참조해주시기 바랍니다.

Compile된 어셈블리 코드를 확인하고 싶다면? 

  • compiler explorer: https://godbolt.org/
    • 위 링크에 코드를 넣으면 어셈블리 코드를 확인할 수 있습니다. 

 

링킹(Linking)


  • A와 B 소스파일이 있을 때, 각각 compile만 하면 A가 B에 존재하는 함수(메서드)를 찾을 수 없어 호출할 수가 없습니다.
    • 따라서, A와 B를 연결해주는 작업이 필요한데 이를 Linking라 합니다.
  • 여러 개로 분리된 compile한 소스파일들을 최종 실행 가능한 파일로 만들기 위해 필요한 부분을 찾아서 연결해주는 작업입니다.
    • 주로 사용하는 실행 파일 형태는 Portable Executable 이라 불리는 PE 파일 형식의 파일을 생성하게 됩니다.
      • 윈도우 계열: *.exe
      • 맥 계열: *.pkg *.dmg
      • 리눅스 계열: *.ELF (Executable and Linkable Format)
        • 추가로 ELF에 대한 보다 자세한 설명은 [Linux] Executable and Linkable Format(ELF): 실행 및 링킹 파일 포멧를 참고하시기 바랍니다.
  • Link는 정적링크(static link)와 동적링크(dynamic link)가 있습니다.
    • 정적링크(static link): compile된 소스파일들을 연결해서 최종 실행 가능한 파일을 만드는 것입니다.
    • 동적링크(dynamic link): 프로그램 실행 도중, 프로그램 외부에 존재하는 코드를 찾아서 연결하는 것입니다.
  • 추가로 링킹에 대한 보다 자세한 내용은 [CS] 링킹(Linking)에 대해 보다 심도있는 내용를 참조해주시기 바랍니다.

 

빌드(Build)


  • 개발자가 작성한 source code를 실행 가능한 소프트웨어 결과물로 만드는 일련의 과정입니다.
  • Build 단계 중 Compile이 포함되어 있으며, Build tool은 다음과 같은 Build 과정을 도와줍니다.
    • 전처리(Preprocessing)
    • 컴파일(Compile)
    • 패키징(Packaging)
    • 테스팅(Testing)
    • 배포(Distribution)
  • Build tool
    • JAVA: Ant, Maven, Gradle 등
    • C++: CMake, Gradle, Ninja, SCons, MSbuild, Meson 등
      • C++의 Build tool 과 관련된 상세내용은 [C++] C++ 빌드 시스템(툴)에는 뭐가 있을까?를 참조합시다.
      • C++의 Build tool 중 CMake에 대한 상세내용은 [CMake] CMake 소개 및 필요성: Modern CMake 3.23+과 이후에 연재되는 글을 참조합시다.

 

배포(Release, Deploy, Distribute)


  • Release: 같은 제품을 새롭게 만드는 것(예: 새로운 버전을 배포, 새로운 아이피 번로 부여)
  • Deploy: 프로그램 등을 서버와 같은 기기에 설치하여 서비스 등을 제공하는 의미
  • Distribute: 제품을 사용자들이 사용할 수 있도록 서비스 등을 제공하는 의미

 

참고

  • [CS] Compile, Link, Build 란?: https://velog.io/@leede418/CS-Compile-Link-Build-%EB%9E%80
  • [Github] 컴파일, 빌드, 배포의 개념 및 차이: https://itholic.github.io/qa-compile-build-deploy/
  • [TROLL:티스토리] 빌드, 배포, 컴파일의 개념 & 차이점 (Build, Deploy, Complie): https://choseongho93.tistory.com/296 
  • [tistory] 배포의 의미: https://ukcasso.tistory.com/73
  • [씹어먹는 C++]: https://modoocode.com/319 
반응형
저작자표시 비영리 변경금지 (새창열림)

'Study: ComputerScience(CS) > CS: Basic' 카테고리의 다른 글

[CS] 캐시(Cache)란?  (0) 2022.07.06
[CS] 링킹(Linking)에 대해 보다 심도있는 내용  (0) 2022.07.05
[CS] 컴파일(Compile)에 대해 보다 심도있는 내용  (0) 2022.07.05
[CS] 래퍼(Wrapper) 클래스란?  (0) 2022.07.04
[CS] 컴퓨터 CPU 용어: CPU 코어, 쓰레드, 클럭, 캐시메모리  (0) 2022.06.17
    'Study: ComputerScience(CS)/CS: Basic' 카테고리의 다른 글
    • [CS] 링킹(Linking)에 대해 보다 심도있는 내용
    • [CS] 컴파일(Compile)에 대해 보다 심도있는 내용
    • [CS] 래퍼(Wrapper) 클래스란?
    • [CS] 컴퓨터 CPU 용어: CPU 코어, 쓰레드, 클럭, 캐시메모리
    DrawingProcess
    DrawingProcess
    과정을 그리자!

    티스토리툴바