일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 비트코인
- 파이썬
- 프로그래밍
- AWS
- 개발자
- AUTOSAR
- 자동매매
- probability
- 토플 라이팅
- 퀀트
- Cloud
- 자동차sw
- GeorgiaTech
- 오토사
- 아마존 웹 서비스
- 클라우드
- 확률
- Bitcoin
- 블록체인
- backtrader
- toefl writing
- backtest
- can
- 백테스트
- python
- 토플
- 백트레이더
- it
- TOEFL
- 암호화폐
- Today
- Total
Leo's Garage
Compile 본문
전자공학도로 학부 시절 Programming 수업 때 마주했던 새로운 개념들 중 하나인 Compile에 대해 이야기해보도록 하겠다.
학부시절에는 대부분 단순한 PC프로그램이나 이미 거의 다 구성된 간단한 embedded board에 작성한 코드를 기계어로 번역해서 넣을 수 있게 만든다?? 정도의 굉장히 모호한 개념만을 갖고 있다가 현업에 발을 들였던 것 같다.
실제로 Compile에 대한 개념을 이해한 시기는 현업에서 Compile 문제로 골머리를 싸매면서이다. (아이러니하게도 사람은 모든게 갖춰진 학습현장보다 사활이 걸린 업무현장에서 수 배는 더 학습할 수 있다)
Compile에 대한 사전적인 의미를 먼저 생각해보자
네이버 사전에 검색해보면, "엮다, 편집하다" 라는 뜻을 갖고 있음을 알 수 있다.
그렇다, 사실 Programming에서 Compile은 책을 만드는 것과 일맥상통한다.
다만, 이 책을 읽을 주체는 우리가 아니라 바로 Processor이다!
PC를 기준으로 하면 intel이나 AMD에서 만드는 CPU를 이야기할 수 있을 것이며, 임베디드 세계에서는 ARM, Aurix, MPC등 과 같은 MCU를 들 수 있다.
이러한 Processor들은 실제로 굉장히 많은 Switch로 구성되어 있는데 이들을 눈으로 보기는 매우 힘들다.
이러한 Switch를 동작시키기 위해서는 Switch에 연결된 Line(BUS)를 통해서 전기적인 신호가 들어와야 하는데 이러한 전기적인 신호를 우리는 보통 1 과 0으로 만들어서 전송한다.
즉, Processor는 사실 1010101 과 같은 전기적인 Bit pattern만을 해석할 수 있다.
예를 들어 우리가 Hex Data 0x0A를 Processor에게 전해주고 싶다면, 전기적인 신호로 00001010을 전해주면 되는 것이다.
과거에는 Program이라는 의미가 실제로 명령어 단위의 순차적인 나열을 의미했다.
따라서 사람이 원하는 동작(패턴)을 직접 Processor에게 전달해주고는 했다.
이후 Assembly라는 개념을 도입하기 시작했는데, 사람이 보기 편하도록 표기체계를 만들어서 Program을 설계하는 식이다.
예를 들면
MOV R1 R2
라는 표기는 R1 Register에 있는 값을 R2 Register로 옮기는 동작을 표현한 Assembly이며, 이를 미리 정해진 Bit Pattern으로 해석해주는 것을 Assembler라고 이야기한다.
이야기가 중간에 다른 곳으로 빠졌는데, 이 Assembly라는 녀석이 굉장히 편리하기는 하지만 문제가 있었는데 바로 Processor에 따라 서로 다른 규칙을 가진다는 점이다.
왜냐면 각 Processor HW 엔지니어는 각자의 노하우를 가지고 있으며 설계하는 방식이 서로 상이했기 때문이다.
매번 각각의 Processor에 대응하는 Assembly를 학습할 수는 없었기 때문에 사람들은 HLL(High Level Language)를 만들게 되는데 이게 바로 C 혹은 C++과 같은 언어들이다.
이러한 언어로 Program을 짜고 나서 입맛에 맞는 Processor에 대응하는 Assembly를 만들어 내는 것을 오늘날의 Compiler라 부르는 것들이다. (물론 이것이 정의는 아니지만, 오늘날에는 대부분 이렇게 사용하고 있다.)
보통 C언어가 이식성이 좋다고 하는 말을 흔히들 한다.
이 말은 많은 HW Processor에서 C Compiler를 지원한다는 말과 일맥상통하다.
왜냐하면 한 Processor에 동작하는 Program을 C로 짜고 나서 또 다른 Processor에 쉽게 올릴 수 있기 때문이다.
(결국 C언어 자체의 이식성이 좋다는 것이 아니라, 그 만큼 C언어를 지원하는 Processor가 광범위하다라고 볼 수 있다.)
또 Embedded 환경에서 설계하다 보면 Cross Compile 환경이라는 말을 종종 듣게 되는데 이것은 실제로 우리가 Program을 돌리게 될 Processor가 아닌 PC환경에서 binary image를 Compile 할 수 있게 해주는 환경을 말한다.[보통 Embedded Target Board는 매우 작은 시스템이기 때문에 Compile하기에는 적합하지 않다.]
파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
'Embedded > Embedded SW 이야기' 카테고리의 다른 글
Preprocessor (전처리기) (0) | 2020.01.17 |
---|---|
Compile 두번째 이야기 (0) | 2020.01.12 |
Embedded SW Design (0) | 2020.01.06 |