공부해봅시당
[CS 기초] 정적 언어(Static Language) vs 동적 언어(Dynamic Language) 본문
동적 언어와 정적 언어는 각자 만의 특징과 장단점이 있음
이에 대해 알아보자
정적 언어 예) Java, C, C++ 등
동적 언어 예) Python, Ruby, JavaScript, Perl, PHP, Groovy 등
들어가기 전
컴파일 과정
소스코드를 작성하고 빌드를 하게되면 일반적으로 다음과 같은 과정을 통해 실행파일이 만들어짐
소스코드(Input) -> 전처리기 -> 컴파일러 -> 어셈블러 -> 링커 -> 실행파일(Output)
1. 전처리기: 소스코드 자체에 대한 수정 담당
2. 컴파일러: 소스코드를 어셈블리 코드로 번역
3. 어셈블러: 어셈블리 코드를 목적코드로 번역
4. 링커: 생성된 목적코드들을 링킹하여 실행파일을 만듦
컴파일타임 vs 런타임
컴파일타임: 전체 컴파일 과정과 그 이후 과정 중, 실행파일이 만들어지는 순간까지
런타임: 실행파일이 실행된 후의 시간대
소스코드(Input) -> 전처리기 -> 컴파일러 -> 어셈블러 -> 링커 -> 실행파일(Output) -> 실행
컴파일타임 런타임
정적 언어 VS 동적언어
❖ 정적 언어(Static Language)란?
정적 언어 예) Java, C, C++ 등
프로그램의 변수, 함수 등의 타입이 컴파일 시간에 결정되는 언어
실행 전에 코드의 구조와 타입에 관한 정보가 확정 -> 프로그램 실행 도중에 변경되지 않음
- 특징
1) 정적 타이밍(Static Typing)
변수나 함수의 타입은 컴파일 시간에 결정됨
변수 선언 시 그 타입을 명시해야 하는 경우가 많음
2) 컴파일 시간에 타입 검사
컴파일 과정에서 타입 불일치나 일부 다른 종류의 오류 발견 및 수정 가능
3) 컴파일러 기반
대부분의 정적 언어는 소스 코드를 실행하기 전에 기계 코드나 중간 코드로 컴파일하는 컴파일러 사용
- 장점
1) 성능
컴파일된 코드는 인터프리터를 사용하는 코드보다 일반적으로 빠르게 실행됨
2) 오류 발견
컴파일 시간에 오류를 감지할 수 있으므로, 런타임에서의 예기치 않은 오류 발생 확률이 줄어듦
3) 최적화
컴파일러는 실행 전에 코드를 분석하고 최적화하기 때문에, 실행 시간의 성능 향상 가능
- 단점
1) 유연성 부족
타입과 구조가 미리 결정되기 때문에, 런타임 중에 구조나 타입을 동적으로 변경하는 것이 어려움
2) 개발 속도
모든 타입과 구조가 컴파일 시간에 결정되어야 하므로, 개발 및 테스트 과정이 길어질 수 있음
코드 수정 후에는 다시 컴파일하는 과정이 필요
3) 복잡성
타입을 명시적으로 선언하고 관리해야 하기 때문에, 코드가 다소 복잡해질 수 있음
❖ 동적 언어(Dynamic Language)란?
동적 언어 예) Python, Ruby, JavaScript, Perl, PHP, Groovy 등
주로 프로그램 실행 시점(runtime)에서 많은 작업들을 수행하는 프로그래밍 언어
주로 변수의 타입 결정, 오브젝트의 속성 할당 등의 작업을 런타임(실행 시간)에 수행하기 때문에 "동적"이라고 불림
- 특징
1) 동적 타이핑(Dynamic Typing)
변수의 타입이 실행 시간에 결정됨 == 컴파일 시간에 미리 결정되지 않음
변수 선언 시 타입 지정할 필요 없음
동일한 변수에 다양한 타입의 값 할당 가능
2) 런타임 시의 오브젝트 조작
동적 언어에서는 프로그램 실행 중에 오브젝트 속성이나 메소드 추가, 변경, 제거 등의 작업 수행 가능
3) 인터프리터 기반
대부분의 동적 언어는 인터프리터(interpreter) 사용해 코드 실행
코드를 라인 별로 읽고 실행하는 방식
컴파일러를 사용하는 언어와는 달리 별도의 컴파일 과정이 없거나 최소화되어 있음
- 장점
1) 유연성
코드 작성이 간결, 다양한 데이터 쉽게 다루기 가능
2) 빠른 프로토타이밍
변경 사항 즉시 확인 가능
빠르게 프로토타입 만들거나 실행 가능
3) 메타프로그래밍
코드 자체를 데이터로 다루거나 런타임 중에 코드의 구조나 동작 변경에 유리
- 단점
1) 성능
컴파일 언어보다 느린 실행 속도를 가질 수 있음
2) 오류 발견
타입 관련 오류나 다른 일부 오류들은 런타임에서만 발견될 수 있어, 초기 단계에서의 오류 발견이 어려울 수 있음
추가
동적타입언어/정적타입언어와 강타입언어/약타입언어는 다른 개념
C, C++의 캐스팅이 런타임에 수행된다고 생각하는 경우가 많은데, 이는 타입을 실제로 변환하는 작업이 아님
단지 그 변수의 메모리를 어떻게 해석할건지에 대한 정의를 미리 내리는 것일 뿐
https://algorfati.tistory.com/112
[CS 기초] 정적타입 언어 vs 동적타입 언어
컴파일 과정 소스코드를 작성하고 빌드를 하게되면 일반적으로 다음과 같은 과정을 통해 실행파일이 만들어진다. 소스코드(Input) -> 전처리기 -> 컴파일러 -> 어셈블러 -> 링커 -> 실행파일(Output)
algorfati.tistory.com
'STUDY > CS' 카테고리의 다른 글
[CS 기초] 스코프(Scope) (0) | 2023.11.06 |
---|---|
[CS기초] 렉시컬(lexical) 환경 (1) | 2023.11.03 |
[CS 기초] DSL(Domain-Specific Language) vs GPL(General Purpose Language) (0) | 2023.11.03 |
[CS 기초] 스크립트 언어(Scripting Language) vs 컴파일 언어(Compile Language) (1) | 2023.11.01 |
[프로그래밍 패러다임] 절차적 프로그래밍 (0) | 2023.06.10 |