강의노트 13. compiler, interpreter

|

패스트캠퍼스 컴퓨터공학 입문 수업을 듣고 중요한 내용을 정리했습니다. 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.

compiler / interpreter 차이

  • 컴파일언어와 인터프린터 언어의 가장 큰 차이점은 컴파일 시점 이다. (런타임 전에 컴파일을 하는지 안하는지)
  • Java는 런타임 이전 컴파일을 통해 기계어가 아닌 바이트어로 변경되지만 컴파일 시점 때문에 컴파일 언어라고 부른다.

컴파일 언어 (Compiled Language)

  • 예 : C, C++, Java
  • 컴파일 언어는 런타임 이전에 기계어 (혹은 Java의 경우 바이트코드) 로 변환되는 언어이다.
  • 어셈블리어는 cpu에 의존적이기 때문에, 컴파일된 코드들은 여러종류의 프로세서를 자유롭게 옮겨다니며 사용될 수 없다. (.exe, .dmg)
  • 컴파일 이전의 소스코드도 운영체제별 특징이 있어 각각의 라이브러리를 요구한다.

컴파일 예시 (C)

`C 코드` --(컴파일러)-->> `어셈블리어` --(어셈블러)-->> `기계어` --(링커)-->> `실행파일` -->> `런타임` 시작
  • 컴파일러와 어셈블러를 함쳐서 컴파일이라고 부르며, 코드가 기계어로 변환되는 과정을 컴파일 타임이라고 부른다.
  • 어셈블리어와 기계어는 1:1 매칭이다.
  • 기계어에서 어셈블리어로 변환시키는 것을 disassemble이라고 한다.
  • 기계어 한줄 한줄을 instruction이라고 부른다. (instruction : 명령, 지시)
  • 레지스터 단위로 들어가 성능테스트를 할 때 어셈블리어가 유용하다.
  • 링커는 라이브러리를 가져다가 붙인다. os의존적이라 나오는 실행파일 extension가 다르다.
  • 인터프린터 언어는 런타임 중에 컴파일(해석)을 한다. 따라서 컴파일 언어에 비해서 비교적 느린 편이다.
  • 자바는 런타임 전에 기계어가 아닌 바이트코드로 컴파일 되며, 런타임중에 기계어로 바뀐다. 하지만 컴파일 시점이 런타임 이전이기 때문에 컴파일언어에 속한다.

인터프린터 언어 (Interpreted Language)

  • 런타임중에 프로그램 한줄한줄을 해석하며 실행한다.
  • 파이썬의 경우 런타임중의 컴파일 과정에 렉서(lexer), 파서(parser) 를 거쳐서 바이트 코드를 만들어낸다. (렉서 : 요소를 하나하나 쪼갠다. / 파서 : abstract syntax tree, 구문분석)
python 코드 --> 실행 & 런타임 시작 --> (컴파일) --> 바이트코드 --> VM --> 기계어
  • 어셈블리어는 cpu에 의존적이나, (예: 인텔 계열의 어셈블리어) 바이트코드는 그렇지 않다.
  • 바이트코드는 가상머신(virtual machine) 위에서 돌아가기 때문에 어떤 cpu 위에서도 돌아갈 수 있다.
  • 파이썬 초기 설치시 window용, mac용, linux용을 따로 받는 이유는 바이트코드에서 어떤 기계어로 바꿀지를 결정하기 위해서이다.
  • Java, python 모두 바이트코드를 사용하기 때문에 vm(virtual machine)이 필요하다.

    인터프리티드 언어는 특별한 플랫폼 의존성을 가질 필요가 없다. 실행중에 ‘interpreted’ 되므로, 적절한 interpreter만 있다면 어떤 기종에서도 잘 실행될 수 있는 것이다. 이런 이유로 인터프리티드 언어는 보다 더 크로스플랫폼적 성격을 갖게 된다.