CS

[컴퓨터 구조 기초] 컴퓨터와 명령어

dev-ohdam 2024. 6. 3. 00:22

컴퓨터가 이해하는 정보

컴퓨터는 크게 데이터와 명령어 이 두 가지 정보를 이해한다.

데이터는 이미지, 텍스트, 미디어 등의 정적인 정보들이다. 
그리고 컴퓨터가 어떤 실질적인 동작을 수행 할 수 있도록 알려주는 정보가 명령어이다.
이 두 데이터는 모두 0과 1로만 이루어져 있으며, 컴퓨터는 이 정보를 이해하고 목적에 맞게 처리한다.

 

 

 이때 컴퓨터를 통해 실행되는 프로그램 또한 개발자들이 작성한 명령어들의 집합체다.
우리는 프로그램을 개발할 때는 C++/C# 과 같은 프로그래밍 언어를 사용해 소스 코드를 작성하고
이를 실행 파일로 만든다.

 

그런데 0과 1의 정보만 이해할 수 있는 컴퓨터는 어떻게 우리가 작성한 소스 코드를 이해할까? 

 

 

고급 언어 VS 저급 언어

 결론만 말하자면 컴퓨터는 소스 코드를 이해할 수 없다.
컴퓨터는 0과 1의 정보만을 이해할 수 있다. 하지만 일반적인 사람들이 0과 1만을 사용해 어떤 데이터나 명령어를
구현하기란 굉장히 어려운 작업이다.

그렇기 때문에 우리가 쉽게 프로그램을 개발할 수 있도록 등장한 것이 프로그래밍 언어이다. 
우리가 소스 코드를 작성하며 사용하는 프로그래밍 언어는 굉장히 인간친화적인 언어다. 
영어를 기반으로 구성되어 있으며, 이 언어의 문법만 익힌다면 모두가 해석할 수 있다.

이런 언어들을 고급 언어라고 한다.

 

반면 실질적으로 컴퓨터가 이해할 수 있는 언어를 저급 언어라고 한다.
저급 언어는 어셈블리어기계어로 분류할 수 있다.

 

고급 언어는 저급 언어로 변화하는 과정을 거처야 비로소 컴퓨터가 이해할 수 있게 된다.
그리고 고급 언어를 저급 언어로 변환하는 방식에 따라 컴파일 언어와 인터프리터 언어로 나눌 수 있다.

 

어셈블리어 VS 기계어

기계어

기계어는 0과 1로 이루어진 명령어이다.

어셈블리어와 어셈블러

 어셈블리어는 기계어의 직전 단계의 형태라고 볼 수 잇다.
기계어를 보면 알겠지만 사람이 이해하기 힘든 괴랄한 모습을 하고 있다.

 그래서 기계어를 인간이 좀 더 쉽게 이해할 수 있게 등장한 저급 언어가 바로 어셈블리어이다.
어셈블리어는 기계어에서 유의미한 부분을 니모닉 심볼을 이용해 표현한 것을 말한다.

어셈블리어는 어셈블러를 통해 기계어로 변환할 수 있다.

 

컴파일 언어 VS 인터프리터 언어

 컴파일 언어는 컴파일 방식을 통해 저급 언어로 변환된다.
컴파일 방식은 다음과 같은 특징을 가진다. 

C++ 등이 이에 해당한다.
  • 컴파일러에 의해 소스코드 전체가 한번에 기계어로 변환된다. (컴파일)
  • 컴파일은 단 한 번만 수행된다. 실행 속도가 빠르다.
  • 컴파일 과정에서 오류가 있는 코드 발견 시, 컴파일이 실패한다.
  • 컴파일 결과로 바이트 코드(파일) 혹은 목적 코드(파일)이 생성된다.
 인터프리터 언어는 인터프리트 방식을 통해 저급 언어로 변환된다.
인터프리터 언어는 다음과 같은 특징을 가진다.

Python 등이 이에 해당한다.
  • 소스 코드 전체가 한번에 바뀌는 것이 아니라 한줄 한줄 차례대로 변환되고 실행된다.
  • 인터프리트 과정을 한줄 한줄 반복하다 보니 컴파일 언어보다 실행 속도가 느리다.
  • 플랫폼 이식성이 좋다.
  • 오류가 있는 코드가 있더라도 그 이전까지는 변환 작업이 실행된다.
특이하게도 JAVA는 두 방식을 모두 채택한 언어이다.

 

 

번외) 바이트 코드, 목적 코드 VS 기계어

 

최종 도표

 컴파일러와 관련해 공부할 때 꽤나 헷갈렷던 내용이다.
우리가 어떤 소스 코드를 컴파일하면, 바이트 코드(= 파일)와 목적 코드 등이 생성된다.

 목적 코드를 링킹하면 실행 파일이 생성되고, 컴퓨터는 이를 이해하고 실행할 수 있다.
바이트 코드를 인터프리트 하면 기계어로 변환되고, 컴퓨터는 이를 이해하고 실행할 수 있다.

그럼 바이트 코드랑 목적 코드는 기계어인가..? 도대체 뭐지? 이런 생각이 들 것이다.
이 친구들은 어셈블리 코드(어셈블리어로 제작된 코드 or 파일)와 비슷하다고 생각하면 좋다.

 이 친구들은 기계어와 완벽하게 대응하는 코드들은 아니지만, 그 직전 단계에 위치한 친구라고 볼 수 있다.
목적 코드, 바이트 코드들을 정확하게 까지 이해할 필요는 없지만, 이해하기 쉽게 하나의 도표로 만들어 표현해보았으니 참고하면 좋을 것 같다.