티스토리 뷰

자바의 작동원리를 공부하던 중 바이트 파일과 바이너리 파일의 개념을 숙지해야되서 관련 글을 쓰게 되었습니다. 

 

Complie과 Link

 

C언어는 컴파일러에 의해 소스파일(*.c)이 목적파일(*.obj)로 변환될 때 바이너리 파일 , 즉 0과 1로 이루어진 코드로 변환됩니다. 

목적파일은 컴퓨터가 이해할 수 있는 바이너리 코드의 형태이지만 실행될 수는 없습니다. 그 이유는 완전한 기계어가 아니기 때문입니다.

 

*소스파일 : 개발자가 작성하는 고레벨언어인 소스코드로 구성된 파일 ex. *.java, *.py

*목적파일 : 소스파일을 컴파일해서 생긴 파일 ex. 바이트코드, 바이너리 코드



컴파일러 에 의해 변환된 목적파일은 링커 에 의해 실행가능한 실행파일(*.exe)로 변환될 때 함수나 헤더 파일 등의 실제 메모리 주소를 코드에 반영하는 과정에서 일부 주소값이 변경되는데, 이러한 과정을 거쳐야 비로소 컴퓨터가 실행할 수 있는 100% 기계어가 될 수 있습니다.

 

 

*링커 : 소스코드 양이 늘어남에 따라 한 파일에 모든 소스코드를 작성할 수 없게 되어 파일들은 분리해야 했는데, 이런 여러 소스코드 파일들을 하나로 합쳐주고, 추가로 Library도 추가해주어 실행파일을 만들어주는 프로그램

결론적으로 목적파일은 바이너리 코드이지만 컴퓨터가 바로 실행할 수 있는 100% 기계어는 아닙니다. 링커를 거쳐야 컴퓨터가 실행할 수 있는 실행파일이 됩니다.

 

 

자바에서의 바이트코드?

 


자바에서의 컴파일러는 좀 특이한데 소스파일(*.java)이 목적파일(*.class)로 컴파일러에 의해 변환될 때 바이너리코드가 아닌 바이트 코드로 변환됩니다.

그렇다면 이 둘의 차이점은 무엇일까??

*바이너리 코드(이진 코드)란? 
- 컴퓨터가 인식할 수 있는 0과 1로 구성된 바이너리 코드를 의미한다.

- CPU가 이해할 수 있는 언어

 


*바이트 코드란?
- CPU가 이해할 수 있는 언어가 바이너리 코드라면 바이트 코드는 가상 머신(ex. JVM)이 이해할 수 있는 언어이다.
  즉, 가상머신이 이해 할 수 있는 0과 1로 구성된 바이너리 코드를 의미한다.
- 고레벨언어로 작성된 소스코드를 가상 머신이 이해할 수 있는 중간 코드로 컴파일한 것을 말한다.
- 자바에서 바이트 코드는 실시간 번역기(JIT, just in time) 컴파일러에 의해 바이너리 코드로 변환된다.

 

 

*기계어
- 0과 1로 이루어진 바이너리 코드로 JS가 브라우저를 제어하듯이 기계어는 CPU를 제어할 수 있다.
- CPU가 해독할 수 있는 유일한 언어다. 그 어떤 프로그래밍 언어를 넣어줘도 기계어로 해석이 되어야
  비로소 작업을 수행할 수 있다.
- 기계어는 바이너리 코드로 구성되지만 모든 바이너리 코드가 기계어인 것은 아니다.

 

맺으며..

 

자바 동작에 있어서 꼭 알고있어야 하는 개념들인것 같습니다. 자바뿐만 아니라 대부분의 프로그래밍 언어에 공통적인 개념이므로 개발자라면 알고 있어야 하는 내용이라고 생각합니다. 요즘 자바와 자바스크립트를 파고파고파고 하는데 이래서 이렇게 작동했었구나 하면서 새로운 재미를 느낍니다. 코딩 할때랑은 또 다른 재미인것 같습니다.

 

소스파일, 목적파일, 실행파일 // 컴파일러, 링커 // 바이트코드, 바이너리코드 

 

이렇게만 알아도 대략적인 프로그래밍 언어가 어떻게 인간언어(고레벨언어)에서 컴퓨터언어(저레벨언어)로 변환되는지 알 수 있습니다. 더 자세한건 자바의 동작과정에서 다루겠습니다.

 

 

읽어주셔서 감사합니다.

 

댓글
댓글쓰기 폼
공지사항
Total
208,300
Today
615
Yesterday
833
링크
«   2022/08   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
글 보관함