ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ETC] 컴파일과 인터프리팅
    ETC 2021. 9. 23. 16:23

    https://honggom.tistory.com/155

     

    [일기] 기술 면접에서 시원하게 뚜드려 맞은 날 ^^

    오늘 내가 지원한 회사 중 하나에서 화상으로 기술면접을 봤다. 일단 결과적으로 참담했다.. 내가 정말 아무것도 모르는 먼지 같은 존재였다는 것을 뼈저리게 깨달았다 ㅎㅎ 나름 그동안 열심히

    honggom.tistory.com

     

    위 글에서 예고한 .. 복수 일지 그 대망의 첫 번째 '컴파일과 인터프리팅' 에 대하여 알아보는 시간이다.

     

    우선 컴파일에 대하여 알아보자.

     

    컴파일이란?

    • 고급 프로그래밍 언어로 작성된 소스코드를 오브젝트 코드로 변환하는 것.

     

    우선 고급 프로그래밍 언어가 뭘까?

     

    멍청한 컴퓨터는 0과 1(기계어)밖에 이해를 못한다. 따라서 컴퓨터에게 어떤 명령을 시키려면 이진법으로 작성된 코드를 알려줘야 되는데.. 

    사람이 0과 1만을 가지고 코드를 작성하여 컴퓨터에게 명령을 시키기란 매우 쉽지 않을 일이 될 것이다..

    따라서 많은 똑똑이 개발자들이 컴퓨터에게 더 쉽게 일을 시키고자.. 인간에게 친숙한 여러 언어를 만들었다.

     

    예를들면 Java, C, Python 등등..

    이런 프로그래밍 언어들은 이진법으로 코드를 작성하는 것보다, 인간에게 보다 친숙한 언어로 코드를 작성할 수 있기 때문에 인간 친화적인 언어라고 할 수 있다.

     

    이렇듯 인간에게 더 친화적일 수록 고급 언어(High-Level Language) 라고 하고,

    컴퓨터에게 더 친화적인 언어 일수록 저급 언어 (Low-Level Language) 라고 한다.

     

    고급 언어가 더 우월하고 저급 언어가 더 저열하다는 의미가 아니고 컴퓨터에게 더 친숙하냐, 사람에게 더 친숙하냐의 차이를 나타내는 것이다.

     

    어쨋든, 사람이 더 작성하기 쉽고 사람에게 더 친화적인 언어가 고급 언어다.

     

    하지만 위에서 설명했듯이, 컴퓨터는 0과 1밖에 모른다. 따라서 개발자가 작성한 고급언어를 멍청한 컴퓨터는 알아먹지 못 한다.

     

    그렇기 때문에 컴퓨터가 이해할 수 있게 번역을 해줘야 되는데 그 중에 한 방법이 컴파일이고, 컴파일을 해주는 녀석이 컴파일러다.

     

    컴파일러의 특성

     

    1. 프로그래밍 언어를 런타임 이전에 기계어로 변환하는 작업을 한다.
    2. 런타임 이전에 어셈블리어로 변환하기 때문에 구동 시간(빌드 시간)이 오래걸리지만, 구동된 이후는 하나의 패키지로 매우 빠르게 동작한다.
    3. 구동시에 코드와 함께 시스템으로부터 메모리를 할당받으며 할당받은 메모리를 사용하게 된다.
    4. 런타임 이전에 이미 해석을 마치고 결과물이 바로 기계어로 전환되기 때문에 OS 및 빌드 환경에 종속적이다.

     

    대단한 것들이 적혀있는 것 같지만, 사실 별 거 없다.

     

    컴파일은 그냥 개발자가 작성한 코드를 한 번에 몽땅 번역해서 컴퓨터에게 알려주는 것이다.

    그렇기 때문에 처음 구동 시(빌드 시) 시간이 오래 걸리지만, 구동 된 이후에는 메모리에 올려져있어서 빠르게 동작할 수 있다. 또한 컴파일을 하는 과정 중에 소스코드를 전부 검사하기 때문에 문법 오류가 있거나, 체크드예외의 예외 처리가 돼 있나 확인하는 등의 작업으로 런타임 이전에 예외를(런타임 예외는 파악할 수 없음)파악할 수 있다.

     

     

    인터프리팅이란?

    인터프리팅은 컴파일과 다르게 소스 코드를 한 번에 읽어서 번역하지 않고, 런타임 상태에 소스코드를 한 줄 한 줄 번역하면서 프로그램을 구동하는 방식이다. 한 줄 한 줄 번역한 코드가 바로 기계어가 되는 것은 아니고 중간 코드(intermediate code)로 번역 된다. 이 중간 코드는 다른 프로그램에 의하여 기계어로 번역되어 실행된다.

     

    대표적인 언어로는 Python, Javascript 등이 있다.

     

    인터프리팅 언어는 컴파일과 다르게 런타임 상황에서 코드를 번역하기 때문에 일반적으로 컴파일 언어보다 실행시간이 느리다. 또 컴파일 언어는 런타임 이전에 예외를 확인할 수 있었으나, 인터프리팅 언어는 이와 다르게 런타임 이전 에러를 알 수는 없지만, 런타임 시 에러가 발생하면 그 이후 작성된 코드를 살펴보지 않는다는 차이점이 있다.

     

    자바가 컴파일러와 인터프리터를 동시에 사용하는 이유

    자바는 컴파일러와 인터프리터를 동시에 사용한다. 그 이유는 OS 종속에서 벗어나기 위함이다.

    컴파일은 한 번 번역 후 빠르게 구동되지만, 소스 코드가 바로 해당 OS에 맞는 기계어로 변환되기 때문에 OS에 종속적이다. 따라서 자바는 개발자가 작성한 소스 코드를 기계어로 변환하고 인터프리터가 기계어를 해당 OS에 맞게 인터프리팅을 진행하여 구동하게 된다.

     

    물론 컴파일과 인터프리터를 동시에 사용해서 컴파일의 온전한 장점(빌드 후 빠른 실행속도)만을 가져갈 수는 없다. 하지만 OS 종속에서 벗어날 수 있다는 큰 장점을 지녔고, 두 방식의 장점을 적절히 사용한 좋은 예라고 생각된다.

    'ETC' 카테고리의 다른 글

    [ETC] CDN(콘텐츠 전송 네트워크)  (0) 2022.11.15
    [ETC] Promise.all로 성능 개선하기  (0) 2022.11.10
    [ETC] Webpack 이란?  (0) 2022.07.17
    [ETC] npm, yarn의 차이는?  (0) 2022.07.17
    [ETC] ESLint, Prettier란?  (0) 2022.07.17

    댓글