저급언어, 고급언어
· 14 min read
Intro
최근 이부분에 대해 정리하고 싶기도 했고,
최근에 애플은 왜 인텔 대신 ARM을 선택했나? 10분 순삭 해당 영상을 재밌게 봐서 한번 쭉 정리 한다.
여러 레퍼런스들이 이진코드와 기계어를 혼용해서 사용하는 느낌이다.
저급 언어(Low-Level Language)
- 기계 중심의 언어
- 실행 속도가 빠름
- 이 부분은 사람이 작성한 코드가 컴파일러의 각종 최적화를 이겼을때나 가능...
기계어(Machine Language)
기계어는 2진법으로 구성된, 컴퓨터가 직접 해독하고 실행 할 수 있는 명령어 세트 프로그램을 나타내는 가장 낮은 단계의 언어 CPU에 따라 기계어가 다르다(각 기계마다 규약된 숫자들의 규칙 조합)
결국 프로그램이란 0과 1로 된, 컴퓨터에게 어떤 동작을 실행하라는 명령어들의 집합이고, 모든 언어들은 기계어로 변환된다.
- 이 프로그램이란 것을 실행시키게 되면
- 프로그램이라 불리는 명령어들이 메인 메모리(RAM 램)에 배치된다. 이 상태를 프로세스라고 부른다.
- 이 배치된 명령어들을 하나씩 순서대로, 혹은 지정된 주소에 있는 명령어들을 읽어와서 CPU에서 계산 및 처리를 하게 되고
- 명령어에 따라 CPU가 다른 컴퓨터 자원들의 동작, 수행을 명령한다.
바이너리 코드란?(Binary code)
- 바이너리 코드는 컴퓨터가 인식할 수 있는 0과 1로 구성된
이진코드
를 의미 - 기계어는 0과 1로 이루어진 바이너리 코드이다.
- 기계어가 이진코드로 이루어졌을 뿐이지 모든 이진코드가 기계어인 것은 아니다.(바이너리 코드 != 기계어)
바이트 코드란?(Byte Code)
- CPU가 이해할 수 있는 언어가
기계어
라면바이트 코드
는가상 머신
에서 이해할 수 있는이진 코드
- 하드웨어가 아닌 소프트웨어에 의해 처리되기 때문에, 보통
기계어
보다 더추상적
이다. - 역사적으로 바이트코드는 대부분의 명령 집합이 0개 이상의 매개 변수를 갖는 1byte 크기의 명령 코드(opcode)였기 때문에 바이트코드라 불리게 되었다.
- 바이트코드는 특정 하드웨어에 대한 의존성을 줄이고, 인터프리팅도 쉬운 결과물을 생성하고자 하는 프로그래밍 언어에 의해, 출력 코드의 한 형태로 사용된다.
컴파일
되어 만들어진바이트코드
는 특정 하드웨어의 기계 코드를 만드 는 컴파일러의 입력으로 사용되거나, 가상 머신에서 바로 실행된다.
링크(Link)
- Compile로 생성된 기계어 코드만으로 바로 실행되지는 않는 편
- 대부분의 애플리케이션 로직에는 사용자가 직접 작성한 소스 코드 + 상당히 많은 라이브러리를 이용 혹은 만들어 활용 한다.
- 이러한 라이브러리를 Application과 연결해 주는 작업 == 링크(link)
링크(link)
는 여러 개의 오브젝트파일을 하나의 실행파일로 묶어주는 것이라고 보면 된다.- 운영체제에 관한 부분도 링크가 처리해준다.
- 링크를 실행해주는 프로그램으로 링커(Linker)가 있다.
- 정적링크(static link)
- 컴파일된 소스파일을 연결해서 실행가능한 파일을 만드는 것
- 동적링크(dynamic link)
- 프로그램 실행 도중 외부에 존재하는 코드를 찾아서 연결
- 정적링크(static link)
빌드(Build) = 컴파일(Compile) + 링크(Link)
빌드(Build): 컴파일(Compile)된 소스코드에 필요한 파일을 링크(Link) 시켜주는 것이다.
어셈블리어(Assembly language)
- CPU 에는 해당 프로세서에 명령을 내리기 위해
고유의 명령어 세트
가 마련되어 있는데 이 명령어 세트를기계어