-
기계어 프로그램
기계어 프로그램은 이진 데이터로 표현되는 코드이다.
이진 데이터는 몇개의 바이트로 명령문을 구성한다.
기계어 프로그램은 메모리에 적재되어 있다가, 명령문 하나씩 CPU에서 해석하여 데이터를 가져오거나 계산한다. 그리고 다음 주소를 계산하는 일도 해야 하는데, 이를 명령문 페치 사이클이라고 한다.
그 결과 데이터는 레지스터와 메모리의 주소로 저장되는데 기계어 프로그램은 CPU에 의해서 바로 읽고 처리될 수 있다는 것에서 네이티브 코드라고 한다.
어셈블리코드
이진 데이터 대신 기계어 코드의 명령문에서 명령문의 종류를 사람이 알아보기 쉽도록 변경한 것이다. 어셈블리 코드는 기계어 코드와 일대일로 대응되는 관계이다.
메모리 IO 명령: load, store
수치계산 명령: add, mul, sub, div
등등등...if (a < b) a = a* 2; print( a - b);
위 언어는 아래처럼 번역된다.
load a r1 load b r2 jump A if r1 > r2 mul r1 r1 2 A: sub r3 r1 r2 print(r3)
어셈블리어를 기계어로 번역하는 일은 어셈블러 라는 프로그램이 하게 된다.
명령어를 기계어로 변경하고 레지스터번호나 주소를 대응되는 값으로 바꾼다.
그러나 어셈블리 언어조차 프로그래밍이 기계 중심적이 될 수 밖에 없었다. 각각 다른 컴퓨터들은 각각의 어셈블리어를 따로 가지고 있었고, 이에따라 사람이 기계에 맞는 어셈블리어를 사용해야 했다.
컴퓨터가 발달하면서 어셈블리어로 작성하기가 어려워 지면서 사람이 프로그램하기 쉽고 기계에 의존하지 않는 고급 언어가 등장하고, 컴파일러가 이를 어셈블리어로 바꾸어 주는 일을 하게 되었다.
흐름을 보자면
- 코드를 읽음
- 컴파일러가 이를 어셈블리어로 번역
- 어셈블러가 어셈블리어를 기계어로 번역
- CPU에서 처리
어셈블리어에서 int와 float를 구분하게 된다.
따라서 현대의 고급언어들이 타입을 구분하는 이유이다. 파이썬 같은 언어를 타입을 정하지 않는다. 따라서 파이썬이 느린 이유이다.고급 언어들은 프로그래머가 사용하기 간편하게 만들어진다. 이에따라 컴파일러가 하는 일이 점점 많아지게 된다. (기계어에 가까울수록 컴파일러가 할 일이 적이진다.)
언어의 설계
언어를 설계할 때 두가지의 관점이 있다.
프로그래머의 관점(개념적 관점)
- 알고리즘을 표현하는 수단으로의 언어
- 개념적인 명확성과 작성의 용이성
구현관점
- 컴퓨터가 할 일을 정확히 표현하는 도구
- 효율성
이 두가지의 목적이 서로 트레이드 오프 관계이다.
728x90'프로그래밍언어론' 카테고리의 다른 글
바인딩 (0) 2023.03.11 컴파일러 구조(~후단부) (0) 2023.03.11 컴파일러의 구조(~ 전단부) (0) 2023.03.08 라이브러리와 링크, 그리고 적시컴파일 (0) 2023.03.06 컴파일러와 인터프리터 (0) 2023.03.06