기계어 프로그램
기계어 프로그램은 이진 데이터로 표현되는 코드입니다.
이진 데이터는 명령을 형성하는 몇 바이트로 구성됩니다.
기계어 프로그램이 메모리에 로드되고 각 명령은 데이터를 검색하거나 계산하기 위해 CPU에 의해 해석됩니다.
그리고 가장 가까운 주소도 계산해야 하는데, 이것을 명령 인출 주기라고 합니다.
결과적으로 데이터는 레지스터와 메모리 주소로 저장되며, 기계어 프로그램은 CPU에서 직접 읽고 처리할 수 있기 때문에 네이티브 코드라고 합니다.
어셈블리 코드
바이너리 데이터 대신 기계 코드의 명령에서 명령의 특성 사람들이 쉽게 이해할 수 있도록 변경되었습니다.
어셈블리 코드는 기계 코드와 일대일로 대응합니다.
메모리 IO 명령: 로드, 저장
수치 산술 명령: 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를 구별합니다.
이것이 현대 고급 언어가 유형을 구별하는 이유입니다.
Python과 같은 언어는 유형이 지정되지 않습니다.
그래서 파이썬이 너무 느립니다.
고급 언어는 프로그래머가 이해하기 쉽게 만들어졌습니다.
결과적으로 컴파일러는 더 많은 작업을 수행해야 합니다.
(기계 코드에 가까울수록 컴파일러가 할 일이 줄어듭니다.
)
언어의 디자인
언어를 설계할 때 두 가지 관점이 있습니다.
프로그래머의 관점(개념적 관점)
- 알고리즘 표현 수단으로서의 언어
- 개념 명확성과 쓰기 용이성
구현 관점
- 컴퓨터가 수행할 작업을 정확하게 표현하는 도구
- 능률
이 두 목표는 서로 연관되어 있습니다.