Home > Archive > CS_archive > 💾 [CS] 소스코드와 명령어

💾 [CS] 소스코드와 명령어
CS

소스코드와 명령어.

  • ‘컴퓨터는 명령어를 처리하는 기계’
  • 명령어는 컴퓨터를 실질적으로 작동시키는 매우 중요한 정보
  • 모든 소스 코드(C, C++, Java, Python 과 같은 프로그래밍 언어로 만든 소스 코드)는 컴퓨터 내부에서 명령어로 변환됩니다.

고급 언어와 저급 언어

  • 프로그램을 만들 때 사용하는 프로그래밍 언어, 컴퓨터가 이해하는 언어가 아닌 사람이 이해하고 작성하기 쉽게 만들어진 언어
    • 이렇게 ‘사람을 위한 언어’를 고급 언어(high-level programming language) 라고 합니다.
  • 컴퓨터가 직접 이해하고 실행할 수 있는 언어
    • 저급 언어(low-level programming language) 하고 합니다.
  • 컴퓨터가 이해하고 실행할 수 있는 언어는 오직 저급 언어뿐입니다.
    • 그래서 고급 언어로 작성된 소스 코드가 실행되려면 반드시 저급 언어, 즉 명령어로 변환되어야 합니다.
  • 저급 언어에는 두 가지 종류가 있습니다.
    • 기계어
      • 0과 1의 명령어 비트로 이루어진 언어입니다.
      • 다시 말해 0과 1로 이루어진 명령어 모음입니다.
    • 어셈블리어
      • 0과 1로 표현된 명령어(기계어)를 읽기 편한 형태로 번역한 언어

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

  • 고급 언어는 저급 언어로 변환되는 방식으로는 크게 두 가지 방식이 있습니다.
    • 컴파일 방식
      • 컴파일 방식으로 작동하는 프로그래밍 언어를 컴파일 언어
    • 인터프리트 방식
      • 인터프리트 방식으로 작동하는 프로그래밍 언어를 인터프리터 언어

컴파일 언어

  • 컴파일 언어
    • 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어입니다.
  • 컴파일(Compile)
    • 컴파일 언어로 작성된 소스 ㅋ코드는 전체가 저급 언어로 변환되는 과정을 거치는데 이 과정을 “컴파일”이라고 합니다.
  • 컴파일러(Compiler)
    • 컴파일을 수행해 주는 도구
    • 개발자가 작성한 소스 코드 전체를 쭉 훑어보며 소스 코드에 문법적인 오류는 없는지, 실행 가능한 코드인지, 실행 가능한 코드인지, 실행하는 데 불필요한 코드는 없는지 등을 따지며 소스 코드를 처음부터 끝까지 저급 언어로 컴파일합니다.
      • 이때 컴파일러가 소스 코드 내에서 오류를 하나라도 발견하면 해당 소스 코드는 컴파일에 실패합니다.
  • 목적 코드(Object Code)
    • 컴파일이 성공적으로 수행되면 개발자가 작성한 소스 코드는 컴퓨터가 이해할 수 있는 저급 언어로 변환됩니다.
      • 이렇게 컴파일러를 통해 저급 언어로 변환된 코드를 목적 코드(Object code) 라고 합니다.

인터프리어 언어

  • 인터프리터 언어
    • 인터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급 언어입니다
      • 대표적인 인터프리터 언어로 Python이 있습니다.
  • 인터프리터
    • 소스 코드를 한 줄씩 저급 언어로 변환하여 실행해 주는 도구
  • 인터프리터 언어는 컴퓨터와 대화하듯 소스 코드를 한 줄씩 실행하기 때문에 소스 코드 전체를 저급 언어로 변환하는 시간을 기다릴 필요가 없습니다.
    • 소스 코드 내에 오류가 하나라도 있으면 컴파일이 불가능했던 컴파일 언어와는 달리, 인터프리터 언어는 소스 코드를 한 줄씩 실행하기 때문에 소스 코드 N번째 줄에 문법 오류가 있더라도 N-1번째 줄까지는 올바르게 수행됩니다.
  • 일반적으로 인터프리터 언어는 컴파일 언어보다 느립니다.
    • 컴파일을 통해 나온 결과물, 즉 목적 코드는 컴퓨터가 이해하고 실행할 수 있는 저급 언어인 반면, 인터프리터 언어는 소스코드 마지막에 이를 때까지 한 줄 한 줄씩 저급언어로 실행해야 하기 때문입니다.

목적 파일 vs 실행 파일

  • 목적 파일
    • 목적 코드로 이루어진 파일입니다.
  • 실행 파일
    • 윈도우의 .exe 확장자를 가진 파일이 대표적인 실행 파일입니다.
  • 목적 코드가 실행 파일이 되기 위해서는 링킹이라는 작업을 거쳐야 합니다.
  • 링킹
    • 여러 개의 오브젝트 파일이나 라이브러리를 하나의 실행 파일로 결합하는 과정을 의미합니다. 컴파일러가 소스 코드를 기계어로 번역한 후 링커(Linker)가 이러한 기계어 코드들을 모아 실행 가능한 프로그램을 만듭니다.

키워드로 정리하는 핵심 포인트

  • 고급 언어는 사람이 이해하고 작성하기 쉽게 만들어진 언어입니다.
  • 저급 언어는 컴퓨터가 직접 이해하고 실행할 수 있는 언어입니다.
  • 저급 언어는 0과 1로 이루어진 명령어로 구성된 기계어와 기계어를 사람이 읽기 편한 형태로 번역한 어셈블리어가 있습니다.
  • 컴파일 언어는 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 언어입니다.
  • 인터프리터 언어는 인터프리터에 의해 소스 코드가 한 줄씩 저급 언어로 변환되어 실행되는 언어 입니다.

Q1. Swift는 일반적으로 고급 언어로 분류됩니다. Swift의 어떤 특징이 개발자에게 고급 언어의 장점을 제공한다고 생각하나요?

Swift는 고급 언어의 특징으로 높은 수준의 추상화, 강력한 타입 시스템, 메모리 안전성, 그리고 빠른 개발 시간을 제공합니다. Swift의 옵셔널 타입과 같은 기능은 안전한 코드 작성을 돕고, ARC는 메모리 관리를 단순화합니다.

Q2. 고급 언어와 저급 언어의 차이점은 무엇이라고 생각하나요?

고급 언어는 인간이 이해하기 쉬운 형태로 추상화된 언어로, 복잡한 작업을 간단하게 표현할 수 있게 해줍니다. Java와 같은 고급 언어는 메모리 관리, 객체 지향 프로그래밍, 에러 처리 등 복잡한 컴퓨팅 개념을 추상화하여 개발자가 더 쉽게 소프트웨어를 개발할 수 있도록 돕습니다.

저급 언어는 컴퓨터가 직접 이해할 수 있는 더 낮은 수준의 명령어로 구성됩니다. 이에 해당하는 언어는 어셈블리 언어나 기계어로, 이들은 하드웨어와 밀접한 작업을 수행하는 데 사용됩니다. 저급 언어를 사용하면 성능 최적화와 메모리 관리를 더 세밀하게 제어할 수 있지만, 개발과 디버깅 과정이 복잡해집니다.

Q3. Java는 고급 언어 중 하나로 간주됩니다. Java에서 저급 언어의 특성을 활용할 수 있는 방법에는 어떤 것이 있나요?

Java는 기본적으로 고급 언어의 특성을 많이 가지고 있지만, JNI(Java Native Interface)를 통해 저급 언어 코드와 상호 작용할 수 있습니다. JNI는 Java 애플리케이션 내에서 C나 C++과 같은 저급 언어로 작성된 코드를 호출하고 사용할 수 있는 방법을 제공합니다. 이를 통해 개발자는 특정 작업을 위해 시스템 호출이나 하드웨어 직접 제어와 같은 저급 언어의 성능과 효율성을 Java 애플리케이션에 통합할 수 있습니다. 또한, 고성능을 요구하는 애플리케이션의 특정 부분에서 성능을 최적화할 수 있습니다.

Q4. Java에서 고급 언어의 특성이 백엔드 개발에 어떤 장점을 제공하나요?

Java의 고급 언어 특성은 백엔드 개발에서 여러 가지 장점을 제공합니다. 첫째, 강력한 객체 지향 프로그래밍(OOP) 지원으로 코드의 재사용성, 확장성, 유지 보수성이 향상됩니다. 둘째, 자동 메모리 관리와 가비지 컬렉션으로 메모리 누수와 같은 문제를 방지하며 개발자가 메모리 관리에 덜 신경 쓰고 로직 개발에 더 집중할 수 있게 합니다. 셋째, 다양한 라이브러리와 프레임워크, 그리고 강력한 개발 도구와 커뮤니티 지원으로 개발 속도와 효율성이 증가합니다. 마지막으로, Java는 플랫폼 독립적인 특성을 가지고 있어, 다양한 운영 체제에서 실행될 수 있는 애플리케이션을 개발할 수 있습니다.