Source Code and Commands
컴퓨터에게 명령을 내리는 방법
컴퓨터는 2진수(0과 1)밖에 모르기 때문에, 2진수로 명령을 내려야함
사람이 2진수로 컴퓨터에게 복잡한 명령을 내리는건 너무 어려워움 사람이 이해하고 사용하기 좀 더 편한 언어를 개발
그것이 어셈블리어 (저급언어라고 함)
근데 이것도 너무 어려워서 좀 더 쉬운 개발 언어(고급언어라고함) 를 만듬, 그것이 C, JAVA 등이 있으며, 그것보다 더 쉽게 만들어진게 Python 등이 있음.
그럼 어떻게 고오급 언어로 컴퓨터에게 명령을 내림?
고오급 언어를 (전처리는 일단 생략) 컴파일하여 목적파일로(저급언어로) 만듬
컴파일이란, 컴파일러라는 도구를 사용하여 고오급 언어를 저급 언어로 바꿔줌.
이제 어셈블리어를 어셈블 하여 기계어(이진수)로 바꿈, 이 파일을 오브젝트 파일이라고도 함.
마찬가지, 어셈블러 라는 도구로 어셈블리어를 기계어로 바꿔줌
링킹함 -> 오브젝트 파일 + 라이브러리를 묶어 하나의 실행 파일로 만듬
뭐 대충 우리가 C 로 코드 짤 때 다른 라이브러리 또는 다른 C 파일 include 해서 해당 파일의 기능 가져다 쓰지?
그걸 컴퓨터가 처리 할 수 있게, 링킹 단계에서 진짜로 기계어로 된 파일들을 하나로 합치는 거임
번외1. 어셈블러로 바꾸는 방법은 컴파일말고도 인터프리터 방식이 있다.
인터프리터는 컴파일을 안함 -> 목적파일 안만듬
어셈블도 안함 -> 기계어도 안만듬
소스코드 해석 -> 필요한 만큼 즉석에서 기계어 명렁으로 실행
번외로 자바 import 는?
여러 파일의 기능을 한 파일에서 사용할 수 있게 해주는건 비슷하지만, 실제로 하나로 안합침 또 한 C는 완전 컴파일언어, Python 은 완전 인터프리터 언어인데 자바는 중간임 (근데 JIT 쓰면 완전 컴파일임)
자바는 자바 컴파일러가 바이트코드로 변환함
이걸 JVM 이 읽으면서 그때그때 필요한 클래스를 동적으로 읽어다가 기계어로 명령으로 실행 (참고로 이것도 링킹은 함) 2-1. 좀 더 설명하면 클래스A가 클래스B 를 사용 할 때, 컴파일 시점에는 각각 컴파일되며 심볼릭 레퍼런스만 기록하고 클래스A의 코드가 동작하면서 실제로 B클래스가 필요해지는 시점에 링킹(동적 링킹)함.
요즘은 JIT로 기계어로 번역 + 링킹해서 실행.
번외 자바의 실행 방법 2가지.
⚙️ 실행 방법 2가지 ① 인터프리트 (interpret) JVM이 바이트코드를 한 줄씩 읽고 그 의미를 해석 → 대응되는 기계 명령을 실행
느리지만 유연함
초창기 JVM 방식
② JIT 컴파일 (Just-In-Time) 자주 쓰이는 바이트코드를 즉석에서 기계어로 컴파일하여 캐시에 저장
다음엔 그 기계어를 바로 실행 → 빠름
요즘 JVM은 대부분 이걸 사용 (HotSpot JVM)
Last updated