본문 바로가기
면접 준비

CS공부 ) 컴파일러

by jennyiscoding 2025. 3. 25.

컴파일러와 인터프리터의 차이점은?

인터프리터는 소스 코드를 실시간으로 해석하여 실행하고, 이로 인해 느린 실행 속도를 보이며, 하드웨어 리소스를 더 자주 소모합니다.

  컴파일러 인터프리터
작동 방식 전체 소스 코드를 한 번에 기계어로 변환 후 실행 소스 코드를 한 줄씩 읽고 바로 실행
출력 형태 실행 파일 (기계어 코드) 실행 결과를 즉시 출력하며 실행 파일을 생성하지 않음
실행 속도 실행 속도가 빠르다 (컴파일 후 실행) 실행 속도가 느리다 (매번 번역하면서 실행)
오류 처리 컴파일 시 오류를 모두 잡고, 오류가 없으면 실행 가능 실행 중에 오류가 발생하면 즉시 오류를 보고함
디버깅 컴파일 후 실행되므로 오류가 발생할 때까지 디버깅이 어렵다 코드 실행 중 오류를 즉시 발견하고 수정할 수 있어 디버깅이 용이
예시 언어 C, C++, Java , Go Python, JavaScript, Ruby 
파일 크기 실행 파일을 따로 생성하므로 실행 파일 크기가 있음 실행 파일이 없고, 인터프리터가 필요
메모리 사용 컴파일된 코드가 메모리에 적재되어 실행되므로 메모리 사용량이 일정함 매번 해석하며 실행되므로 실행 시 메모리 소비가 발생함
속도 빠름 (컴파일 후 실행) 느림 (매번 소스 코드 해석 후 실행)
  컴파일 언어에서는 소스 코드가 한 번에 기계어로 컴파일된 후 실행되기 때문에, 메모리 사용은 주로 기계어 코드와 실행 중 필요한 데이터를 관리하는 데 집중됩니 인터프리터가 읽은 코드가 기계어로 변환되어 CPU에 의해 실행되고, 실행 결과는 다시 메모리나 출력 장치로 전달됩니다. 중간 표현 실행 상태를 모두 메모리에 보유하고 있어야 하므로, 메모리 사용량이 상대적으로 많을 수 있습니다. 또한, 코드가 한 줄씩 실행되기 때문에, 코드가 길거나 복잡할수록 메모리에서 중간 데이터를 계속 유지해야 합니다.



스택과 힙이 뭔지?

각각의 메모리 영역은 프로그램이 실행될 때 운영 체제에 의해 분리되어 할당됩니다. 이 두 영역은 서로 독립적이고, 서로 다른 방식으로 메모리를 관리합니다. 

  스텍
할당되는 변수 기본 데이터 타입: 정수, 문자, bool은 스택에 저장
a = 12와 같은 지역 변수 스택 메모리에 쌓임.
함수도 호출될 때 스텍에 자동으로 쌓인다.
동적 메모리 할당을 위한 메모리 영역으로, 리스트, 배열, 딕셔너리, 객체가 저장됨
선출 순서 후입선출 (LIFO, Last In First Out) 방식으로, 가장 나중에 쌓인 데이터 가장 먼저 나감. 데이터가 임의의 순서로 할당되고 관리됨. 쌓이는 순서와 빠져나가는 순서 정해져 있지 않습니다. 

 

 

코드 최적화(Code Optimization)란 무엇이며, 그 중요성에 대해 설명해 주세요.

주어진 작업을 수행하는 프로그램 코드의 성능을 향상시키기 위해 효율적인 알고리즘과 데이터 구조를 사용하거나 불필요한 자원 소비를 줄이기 위한 작업을 의미합니다. 최적화의 목표는 코드의 속도, 메모리 사용량, 전력 소비, 그리고 때로는 유지보수 용이성을 개선하는 것이다. 

 

코드 최적화의 예시:

  1. 알고리즘 최적화:
    • 더 효율적인 알고리즘을 사용하여 코드 성능을 향상시킵니다. 예를 들어, 정렬 알고리즘에서 버블 정렬퀵 정렬로 바꾸는 것처럼 성능 차이가 매우 큰 알고리즘을 선택하는 것입니다.
  2. 메모리 최적화:
    • 필요한 데이터만 메모리에 올리고, 불필요한 데이터는 가비지 컬렉션을 통해 정리합니다.
    • 데이터 구조를 최적화하여 메모리 공간을 효율적으로 사용할 수 있습니다. 예를 들어, 리스트나 배열 대신 해시맵을 사용할 때 더 빠른 검색 속도를 얻을 수 있습니다.
  3. 반복문 최적화:
    • 중복된 계산을 줄이기 위해 반복문을 최적화합니다. 예를 들어, 중복된 루프하나의 루프로 합치거나 불필요한 계산을 미리 계산하여 반복문 내에서 호출되지 않도록 할 수 있습니다.
  4. I/O 최적화:
    • 파일이나 네트워크 통신에서의 입출력(I/O) 최적화를 통해 성능을 향상시킵니다. 예를 들어, 파일을 한 번에 읽기보다는 데이터를 버퍼링하여 읽기가 성능을 높일 수 있습니다.
# 재귀를 사용하는 피보나치 수열
def fibonacci(n):
    if n <= 1:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))

 

# 반복문을 사용하여 피보나치 수열 계산
def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a

print(fibonacci(10))

 

최적화 설명: 재귀 함수는 함수 호출이 깊어질수록 스택 메모리를 많이 사용하므로, 반복문을 사용하여 메모리와 성능을 최적화할 수 있습니다. 반복문은 **O(n)**의 시간 복잡도를 가지며, 재귀 호출에 비해 메모리 사용이 더 효율적입니다.

'면접 준비' 카테고리의 다른 글

CS공부 ) 컴퓨터 아키텍처  (0) 2025.03.25
CS공부 ) 데이터베이스 설계  (0) 2025.03.25
CS공부 ) 네트워크  (0) 2025.03.25
CS공부 ) 운영체제  (0) 2025.03.24
CS공부 ) 데이터베이스  (0) 2025.03.24