컴파일과 빌드

가언·2024년 7월 3일
post-thumbnail

✅ 컴파일러

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

컴파일러의 특징

  • 컴파일 과정 필요: 소스 코드를 기계어 또는 중간 코드로 번역하는 컴파일 과정이 필요하다.
  • 성능 최적화: 컴파일러는 코드를 최적화하여 실행 성능을 향상시킬 수 있다.
  • 강한 타입 검사: 많은 컴파일 언어는 컴파일 시점에 타입 검사를 수행하여 오류를 조기에 발견할 수 있다.
  • 인터프리터 언어보다 성능이 좋으며, 배포 용이, 에러 검출, 메모리 관리 가능
  • 개발 속도는 느리고, 디버깅이 복잡하며, 이식성에 제한이 있음(단, java는 예외적으로 JVM으로 이식성이 높음)

인터프리터의 특징

  • 즉각적인 실행: 인터프리트 언어는 코드를 작성하고 바로 실행할 수 있어 개발과 디버깅이 빠르다.
  • 플랫폼 독립성: 코드가 인터프리터를 통해 실행되기 때문에, 동일한 코드를 다양한 플랫폼에서 사용할 수 있다.
  • 디버깅 용이: 코드를 한 줄씩 실행하기 때문에 오류 발생 시 디버깅이 비교적 용이하다.
  • 개발 속도가 빠르고, 유연성, 이식성이 좋음
  • 성능은 컴파일 언어에 비해 실행 속도가 느리며, 배포할 경우 코드 보호가 어려움, 실행환경에 인터프리터가 설치되어야 하므로 의존성이 존재

자바

해리포터 원서책이 한국어로 번역한 책이 나오는것: 컴파일러
영어 잘하는 친구한테 원서책을 읽으면서 번역해달라고 하는 것: 인터프리터

로직과 프로젝트의 구조에 따라 일반적으로 코드가 클때 컴파일이 빠르고 코드가 짧을 때 인터프리터가 빠름

자바는 최적의 속도를 위해 컴파일과 인터프리트 방식을 모두 사용함

JVM

"OS에 독립적이다"

✅ 컴파일과 빌드

컴파일은 빌드에 포함인가요 아닌가요?

hint: 소스코드 / 바이트코드 / 바이너리코드


구조 정리

JVM: 소프트웨어
인터프리터는 한줄을 읽고 해석할때에는 빠르지만, 코드가 길어지면 느려짐
인터프리터의 단점을 보완하기 위해 JIT 컴파일러와 함께 존재
➡️서로의 단점을 보완하기 위해 컴파일러와 인터프리터가 세트로 존재함.

소스와 리소스 파일을 실행할 수 있도록 연결시켜주는 작업을 링킹 작업이라고 함.
그렇다면 링킹은 언제 일어날까? 링킹 후 실행? 실행 후 링킹?
➡️ 클래스 로더가 실행함. 소스들을 묶어서 JVM으로 내보냄.

빌드란?

컴파일은 고급언어를 컴퓨터가 이해할 수 있는 저급언어로 바꿔주는 과정 중 하나일뿐 전체적인 과정을 뜻하는게 아니다.
즉, 빌드라는 변환 과정의 큰 틀안에서 동작하는 하나의 과정을 컴파일이라고 하고, 여러 과정이 합쳐진것이 빌드이다.
프로젝트에서 쓰인 각각의 파일과 각종 Resource(.xml, .properties 등)를 JVM이 인식할 수 있도록 패키징하는 전체 과정

자바 빌드 과정

  1. 소스 코드 (.java) 구현
  2. 자바 컴파일러(javac)가 바이트 코드(.class)로 컴파일
  3. 바이트 코드를 JVM의 클래스로더가 끌고 들어감
  4. 클래스 로더는 바이트 코드를 "로딩" 그리고 "링킹" 하여 실행 엔진이 실행할 수 있게 준비해줌
  5. 실행 엔진은 바이트 코드를 두 가지 방식으로 실행함
    1) 인터프리터: 한줄 씩 읽어서 해석
    2) JIT컴파일러: 인터프리터 속도 보완, 바이트 코드 컴파일

✅ 빌드 도구

빌드를 (개발자 대신) 해주는 도구

Ant > Maven > Gradle

  • jar 파일: java archive-자바 프로젝트의 압축 파일
    역할: 필요한 라이브러리를 다운받는 역할, 코드 실행

1) 빌드 도구가 라이브러리를 자동으로 받아오는 거 같은데..
2) 호환되는 버전도 신경써줄까?🅾️

Maven의 특징

  • 빌드 스크립트: pom.xml (project objcet model)
  • 필요한 라이브러리 다운로드 후, 내 컴퓨터 캐시로 저장
  • Ant 빌드 스크립트 개선

Q. Maven은 어디서 라이브러리를 다운받아오는 걸까요?
https://mvnrepository.com/search?q=lombok

Gradle의 장점

  • Ant + Maven 장점 모음집
  • 빌드 스크립트: build.gradle by groovy
  • Ant, Maven 빌드 스크립트 개선
  • 필요한 라이브러리 다운로드 후, 내 컴퓨터 캐시로 저장
  • ✨ 빌드 캐시
  • ✨ 점진적 빌드(Incremental Build): 이전에 한 지점부터 빌드를 하는 것->수정한 것만 다시 빌드함.
  • ✨ 데몬 프로세스: 백그라운드에 돌아가는 os 단의 서비스, 빌드 결과물을 백그라운드 서비스에 저장하고, 다시 사용함+변경된 것 빌드 초대형 프로젝트 임에도짧은 시간 안에 빌드가 완료됨.
  • 초대형 프로젝트 vs 작은 프로젝트

maven과 같은 레파지토리에서 라이브러리를 받아옴
maven을 사용하기 편하도록 한 겹 싸고 부가적인 기능을 더한 것

profile
@gari_guri

2개의 댓글

comment-user-thumbnail
2024년 7월 3일

어머나 되게 빠르시네요 이미지 퍼갈게용 ^^

답글 달기
comment-user-thumbnail
2024년 7월 3일

꼼꼼한 글 잘 읽었어🥰

답글 달기