Source Code and Commands

컴퓨터에게 명령을 내리는 방법

  1. 컴퓨터는 2진수(0과 1)밖에 모르기 때문에, 2진수로 명령을 내려야함

  2. 사람이 2진수로 컴퓨터에게 복잡한 명령을 내리는건 너무 어려워움 사람이 이해하고 사용하기 좀 더 편한 언어를 개발

  3. 그것이 어셈블리어 (저급언어라고 함)

  4. 근데 이것도 너무 어려워서 좀 더 쉬운 개발 언어(고급언어라고함) 를 만듬, 그것이 C, JAVA 등이 있으며, 그것보다 더 쉽게 만들어진게 Python 등이 있음.

그럼 어떻게 고오급 언어로 컴퓨터에게 명령을 내림?

  1. 고오급 언어를 (전처리는 일단 생략) 컴파일하여 목적파일로(저급언어로) 만듬

    • 컴파일이란, 컴파일러라는 도구를 사용하여 고오급 언어를 저급 언어로 바꿔줌.

  2. 이제 어셈블리어를 어셈블 하여 기계어(이진수)로 바꿈, 이 파일을 오브젝트 파일이라고도 함.

    • 마찬가지, 어셈블러 라는 도구로 어셈블리어를 기계어로 바꿔줌

  3. 링킹함 -> 오브젝트 파일 + 라이브러리를 묶어 하나의 실행 파일로 만듬

    • 뭐 대충 우리가 C 로 코드 짤 때 다른 라이브러리 또는 다른 C 파일 include 해서 해당 파일의 기능 가져다 쓰지?

    • 그걸 컴퓨터가 처리 할 수 있게, 링킹 단계에서 진짜로 기계어로 된 파일들을 하나로 합치는 거임

번외1. 어셈블러로 바꾸는 방법은 컴파일말고도 인터프리터 방식이 있다.

  1. 인터프리터는 컴파일을 안함 -> 목적파일 안만듬

  2. 어셈블도 안함 -> 기계어도 안만듬

  3. 소스코드 해석 -> 필요한 만큼 즉석에서 기계어 명렁으로 실행

번외로 자바 import 는?

여러 파일의 기능을 한 파일에서 사용할 수 있게 해주는건 비슷하지만, 실제로 하나로 안합침 또 한 C는 완전 컴파일언어, Python 은 완전 인터프리터 언어인데 자바는 중간임 (근데 JIT 쓰면 완전 컴파일임)

  1. 자바는 자바 컴파일러가 바이트코드로 변환함

  2. 이걸 JVM 이 읽으면서 그때그때 필요한 클래스를 동적으로 읽어다가 기계어로 명령으로 실행 (참고로 이것도 링킹은 함) 2-1. 좀 더 설명하면 클래스A가 클래스B 를 사용 할 때, 컴파일 시점에는 각각 컴파일되며 심볼릭 레퍼런스만 기록하고 클래스A의 코드가 동작하면서 실제로 B클래스가 필요해지는 시점에 링킹(동적 링킹)함.

  3. 요즘은 JIT로 기계어로 번역 + 링킹해서 실행.

번외 자바의 실행 방법 2가지.

⚙️ 실행 방법 2가지 ① 인터프리트 (interpret) JVM이 바이트코드를 한 줄씩 읽고 그 의미를 해석 → 대응되는 기계 명령을 실행

느리지만 유연함

초창기 JVM 방식

② JIT 컴파일 (Just-In-Time) 자주 쓰이는 바이트코드를 즉석에서 기계어로 컴파일하여 캐시에 저장

다음엔 그 기계어를 바로 실행 → 빠름

요즘 JVM은 대부분 이걸 사용 (HotSpot JVM)

Last updated