컴퓨터구조와 운영체제

5. 소스 코드와 명령어

waterclean101 2023. 11. 6. 09:23

소스 코드와 명령어

 

소스 코드와 명령어

프로그램을 개발하기 위해 작성하는 소스 코드가 어떻게 컴퓨터를 동작시키는 명령어로 변환되는지에 관한 이야기.

개발자가 작성한 소스코드를 컴퓨터는 대부분의 경우 바로 이해를 할 수 없다. Java나 python 같은 프로그래밍 언어들은 고급 언어라고 하는데. 고급 언어들은 개발자가 읽고 쓰기 편하게 만들어진 언어다. 그리고 이러한 고급 언어로 작성된 소스 코드가 컴퓨터 내부에서 실행될 때는 저급 언어로 변환되어 실행된다.

  • 고급 언어: 개발자가 읽고 쓰기 편하게 만들어진 언어
  • 저급 언어: 컴퓨터가 이해하고 실행하는 언어

 

저급 언어(기계어와 어셈블리어)

저급 언어는 성능 최적화와 하드웨어 제어가 필요한 시스템 프로그래밍, 임베디드 시스템, 드라이버 개발 등에 주로 사용된다. 저급 언어에는 크게 기계어와 어셈블리어, 두 가지 종류가 있다.

  • 기계어(Machine Language):
    • 가장 저급의 프로그래밍 언어로 컴퓨터의 중앙처리장치(CPU)가 직접 이해하고 실행할 수 있는 0과 1로 구성된 이진 코드다.
    • 하드웨어에 따라 서로 다른 기계어가 존재한다.
    • 프로그래머가 직접 기계어로 코드를 작성하는 일은 거의 없으며, 대신 어셈블리 언어나 고급 언어로 작성한 코드를 컴파일러나 어셈블러가 기계어로 변환한다.
  • 어셈블리 언어(Assembly Language):
    • 기계어에 조금 더 가까운 사람이 읽을 수 있는 표현을 사용하는 언어로 명령어들은 기계어의 이진 코드 대신 'mnemonics'라는 약어로 표현된다(ADD, SUB, MOV 등).
    • 어셈블리 언어는 특정 CPU 아키텍처에 종속적이다. 예를 들어, x86, ARM, MIPS 등 다양한 아키텍처에 따라 다른 어셈블리 언어가 존재한다.
    • 어셈블러라는 프로그램을 사용하여 기계어로 변환되며 메모리 관리, 프로세서의 레지스터 관리 등 하드웨어에 대한 직접적인 제어가 필요할 때 주로 사용된다.

 

고급 언어

고급 프로그래밍 언어(High-level Programming Languages)는 기계어나 어셈블리 언어와 같은 저급 언어에 비해 사람이 이해하고 사용하기 훨씬 쉽도록 설계되었다. 프로그래밍 언어들은 소스 코드를 실행 가능한 코드로 변환하는 방법에 따라 크게 두 가지 범주로 나눌 수 있다. 컴파일 방식인터프리트 방식.

  • 컴파일 언어는 소스코드 중간에 오류가 하나라도 있으면 컴파일 자체가 되지 않고 인터프리트 언어는 한 줄씩 한 줄씩 저급 언어로 변환을 하기 때문에 소스코드 중간에 오류가 있다라고 할지라도 그 직전까지의 코드가 올바르게 작성이 되었다면 그 직전까지의 코드는 올바르게 실행된다.
  • 이 세상에 있는 모든 고급 언어 즉 모든 프로그램밍 언어들이 컴파일 언어 아니면 인터프리트 언어 이렇게 딱 잘라 양분되지는 않는다. 이 둘의 경계가 아주 애매한 경우도 있다.

 

컴파일 방식 (Compiled Languages)

컴파일러는 프로그램의 전체 소스 코드를 먼저 기계어로 변환한 다음, 실행 파일을 생성한다. 이 과정에서 발생하는 실행 파일은 CPU가 직접 실행할 수 있는 기계어로 이루어져 있다. 이 실행 파일은 다른 프로그램이나 컴파일러의 도움 없이 독립적으로 실행할 수 있다. C, C++, Go, Rust 등이 있다.

  • 장점:
    • 소스 코드가 실행 전에 이미 기계어로 변환되어 있어 프로그램 실행 속도가 빠르다.
    • 실행 파일이 독립적이며, 실행에 컴파일러가 필요하지 않다.
  • 단점:
    • 개발 과정에서 코드를 변경할 때마다 컴파일 과정을 거쳐야 한다. 큰 프로젝트에서는 이 과정이 시간을 많이 소모할 수 있다.
    • 플랫폼에 종속적일 수 있다. 다른 CPU나 운영 체제에서 실행하려면 해당 플랫폼용으로 다시 컴파일해야 한다.

 

인터프리트 방식 (Interpreted Languages)

인터프리터는 프로그램의 소스 코드를 한 줄씩 읽으면서 즉석에서 기계어로 변환하고 실행한다. 이 방식은 소스 코드를 별도의 실행 파일로 변환하지 않는다. Python, Ruby, PHP, JavaScript(전통적으로 인터프리트 방식이지만 현대에는 JIT 컴파일을 사용하는 경우도 많다) 등이 있다.

  • 장점:
    • 플랫폼 독립적이다. 인터프리터가 설치된 모든 플랫폼에서 동일한 소스 코드를 실행할 수 있다.
    • 개발 사이클이 빠르다. 소스 코드를 바로 실행할 수 있어, 변경 사항을 빠르게 테스트하고 결과를 볼 수 있다.
    • 최적화가 가능하다. 컴파일러는 소스 코드를 분석하고 최적화하여 더 빠르거나 메모리 사용을 줄일 수 있는 기계어를 생성할 수 있다.
  • 단점:
    • 코드가 실행될 때마다 실시간으로 변환되기 때문에 일반적으로 컴파일 언어보다 실행 속도가 느리다.
    • 실행 중에 전체 프로그램 구조를 알 수 없으므로, 컴파일 방식만큼의 최적화가 어렵다.