[TIL] KDT Clouding APP - CS
DAY2
대학교 전공 수업을 몰아서 듣…
그때는 와닿지 않는 개념들이 시간이 지나 이렇게 다시 들어보니 생각나는 부분들도 있었다. Embedded 제품 개발할 때, 최적의 성능을 위해 프로세서 클럭에 맞춰야 된다며 욕하면서 SIMD로 기존 코드 다 바꾸던 사수의 모습 등.. 지금도 잘 모르는 영역이지만 생각보다 하이레벨의 응용 소프트웨어를 개발하는데도 이러한 개념들을 알고 있으면 생각보다 실무에서도 도움이 된다는 사실. 이제와 다시 수업으로 들으니 재밌게 느껴진다.
ASCII
- 7비트를 사용하여 만들어짐 (나머지 1비트는 무슨 용도?)
- A(American)SCII
- 한글 포함 다국어 표현을 위해서는 Unicode가 사용됩니다. 다국어를 표현하는 문제는 꽤나 까다롭고 귀찮은 이슈.
음수 표현
- 1의 보수 체계는 0, 1이 각각 양과 음 두가지로 표현되는 단점
- 2의 보수 체계 : 1의 보수에서 +1
- 1 byte 표현 범위 : 2의 7승(-128) ~ 2의 7승-1(+127)
- n bit 표현 범위 : 2 n-1승 ~ 2의 n-1승-1
실수 표현
- IEEE 754 표준
프로세서별 설계 철학
CISC (Intel x86)
- 여러 동작을 한꺼번에 할 수 있는 여러가지 명령어 제공
- 명령어들의 형식과 길이가 다양, 주소지정 방식도 다양
RISC (ARM)
- 명령어의 종류가 너무 다양하고 길어서 성능 향상 측면에서 불리하여 CISC 이후에 개발된 방식
- Load/Store 방식의 메모리 접근
- 한 클록 사이클 = 하나의 명령을 실행
명령어 파이프라인
- 동시에 여러 명령어들의 서로 다른 단계를 실행한다. 어떠한 클럭 사이클에서는 최대 N개의 명령어가 동시에 수행되며, 하나의 명령어가 종료되어야 다음 명령어가 동작하는 방식에 비해 속도 측면에서 훨씬 빠르다고 볼 수 있다.
- 프로세서의 클럭 속도는 일정하지만, 메모리 접근하여 가져오는 속도는 한 클럭으로는 부족한 경우도 있어 병목현상이 발생할 가능성이 있다.
컴파일러 방식 / 인터프리터 방식
- 컴파일러 방식 : 원시코드를 컴파일러로 번역하여 실행 가능한 형태의 코드로 번역함. 번역을 실행 이전에 하기에 공들여 최적화할 수 있어 코드 실행의 효율이 높다고 볼 수 있다. (C, C++)
- 인터프리터 방식 : 소스코드를 실행할 때 번역하기에 코드를 작성하면서 실행하는 것이 가능하며, 실행하는 컴퓨터에서 코드를 작성 (basic)
컴파일러 + 인터프리터 방식의 혼용
- 가상기계를 이용한 실행 모델로 컴파일러로 원시코드를 번역해서 바이트코드(ex. Java -> .class)를 실행할 수 있는 가상 기계 환경에서 대화형 개발을 하는 것으로 볼 수 있다. (java, python)
- 장점 : 동일한 가상기계(ex. Java-JVM)환경이라면 어떠한 컴퓨터 환경에서도 실행가능하다. 프로세서 타입이 다르건, 시스템 소프트웨어(운영체제)가 다르건 관계없이 동작 가능하다.
Linker, Loader
- 컴파일러 외의 프로그램까지 실행까지 필요한 시스템 소프트웨어
- Linker : object code(libraries)들을 연결. 보통 컴파일러와 함께 실행됨. 이때 정적으로 연결하여 사용되는 라이브러리라 함은 Windows에서는 .lib 파일, Linux에서는 .a 파일
- Loader : 시스템 소프트웨어에 의해 실행파일을 실행 가능하도록 로딩하는 모듈
- 여러 어플리케이션에서 공유하여 사용할 수 있는 라이브러리로 Windows에서는 .dll 파일, Linux에서는 .so 파일을 통해 다른 어플리케이션은 이 라이브러리가 제공하는 API를 공유하여 사용할 수 있다.