CS - 문자/인코딩 컴파일/인터프리트
CS
문자와 인코딩
컴퓨터가 문자를 읽기 위해서는 문자 집합(Character Set) 이 필요하다. 문자 집합에 특정 문자가 포함되어 있어야 해당 문자를 인식할 수 있으며, 문자를 0과 1의 형태로 변환하는 과정을 인코딩(Encoding) 이라고 한다.
반대로, 0과 1로 된 데이터를 문자로 변환하는 과정은 디코딩(Decoding) 이라고 한다.
아스키 코드 (ASCII)
아스키 코드는 영어 알파벳, 숫자, 특수문자 등을 포함하는 대표적인 문자 집합이다.
7비트(128개 문자) 또는 8비트(256개 문자 확장) 로 구성된다.
1바이트(8비트)로 저장되며, 확장 아스키(Extended ASCII)는 256개의 문자를 포함한다.
예:
'A'
→ 65 (01000001),'B'
→ 66 (01000010)
한글 인코딩 방식
한글은 영어보다 더 많은 문자가 필요하기 때문에 두 가지 인코딩 방식을 사용한다.
조합형 인코딩
초성, 중성, 종성을 개별 코드로 저장하여 조합해 문자를 만드는 방식.
초기 한글 컴퓨터 시스템에서 사용되었지만, 널리 채택되지 않았다.
완성형 인코딩
초성 + 중성 + 종성이 결합된 글자 하나를 고유한 코드 값으로 저장하는 방식.
단점: 모든 한글 조합을 포함하지 않음 → 새로운 글자는 표현할 수 없음.
대표적인 한글 인코딩 방식은 EUC-KR이며, 완성형 인코딩 방식을 사용한다.
유니코드 (Unicode)
유니코드는 모든 언어를 아우르는 문자 집합으로, ASCII나 EUC-KR보다 훨씬 많은 문자를 표현할 수 있다.
유니코드는 위에서 설명한 아스키 코드나 EUC-KR과는 다르게 인코딩 방식이 다르다.
유니코드 문자에 부여된 값의 범위를 확인해 표현할 바이트의 크기를 조절한다는 특징이 있는데, 아직 자세한 방식은 모르겠다.
대표적인 유니코드의 인코딩 방식이 UTP-8과 UTP-16이다.
고급 언어와 저급 언어
C++과 같은 프로그래밍 언어들은 대부분 고급 언어에 속한다. 이 고급 언어들은 인간 친화적인 언어이므로 컴퓨터가 이해하기에는 무리가 있다.
때문에 컴퓨터가 이해할 수 있는 저급 언어로 변환해야 하며 어셈블리어와 기계어가 저급 언어에 속한다.
기계어는 정말 모든 코드가 0과 1로 이루어져 있어 인간이 읽기에는 무리가 있다.
어셈블리어는 기계어에서 좀 더 인간 친화적으로 만든 언어이므로 기계어보다는 이해하기 쉽다.
물론 편하다고 말은 했어도 기계어를 좀 더 읽기 쉽게 만든 수준이기에 복잡한 수준의 코드를 짜기에는 어려움이 있다.
컴파일과 인터프리트
위에서 고급 언어를 저급 언어로 변환하는 과정에 대해 언급했다.
이 과정은 크게 컴파일 방식과 인터프리트 방식 두 갈래로 나눌 수 있다.
컴파일 방식은 소스 코드 전체가 저급 언어로 변환되어 실행되며, 하나의 에러라도 있다면 컴파일에 실패하게 된다.
인터프리트 방식은 소스 코드를 한 줄씩 저급 언어로 변환하는 방식이다.
이 차이로 컴파일 방식은 모든 소스 코드를 변환하는 시간이 필요하며, 인터프리트 방식은 그런 시간이 필요없다.
하지만 컴파일 방식보다 인터프리트 방식이 빠르다고 말 할 수 없다.
왜냐면 인터프리트 방식은 한 줄 한 줄 변환하는 과정을 거쳐야 하며, 컴파일 방식은 소스 코드를 한 번만 변환하면 바로 실행하기 때문이다.
마치 영어를 모르는 사람에게 한 줄 한 줄씩 해석해주는 방법과 변역본을 만들어 제공하는 방식이라고 생각하면 된다.