프로그래밍 언어(PL)

프언 ch2) 프로그래밍 언어 개념 및 평가 기준

chris3471 2025. 3. 24. 14:49
728x90
반응형

프로그래밍 언어의 분야 (Programming Domains)

1. 과학적 응용

 - floating point 연산과 배열을 많이 사용하며 Fortran이 대표적

 

2. 비지니스 응용

 - 보고서를 생성하고 10진수와 문자를 사용하는 언어로 COBOL이 사용

 

3. 인공지능

 - 기호(숫자보다) 와 연결 리스트를 사용하는 언어로 LISP가 대표적

 

4. 시스템 프로그래밍

 - 효율성이 중요한 언어로 C를 사용

 

5. 웹 소프트웨어

 - HTML과 PHP, Java 와 같은 언어를 사용

 

언어 평가 기준 (Language Evaluation Criteria)

1. 가독성 (Readability) : 프로그램이 얼마나 쉽게 읽히고 이해될 수 있는지

2. 쓰기 용이성 (Writeability) : 프로그램을 얼마나 쉽게 작성할 수 있는지 (개발자 기준)

3. 신뢰성 (Reliability) : 언어가 명세를 얼마나 잘 준수하는지

4. 비용 (Cost) : 개발과 실행에 드는 비용

 

 

1. 가독성 (Readability)

 - 단순성 : 관리 가능한 기능 세트와 최소한의 연산자 오버로딩

 - 직교성(Orthogonality) : 기본적인 구성 요서들이 적은 수의 방법으로 결합되어, 모든 가능한 조합이 합법적이어야 함

  ex) int *는 가능하지만 float* 이 불가능하면 직교성이 낮은 것

 - 데이터 유형 : 적절한 사전 정의된 데이터 유형 제공

 

2. 쓰기 용이성 (Writeability)

 - 단순성 및 직교성 : 적은 수의 기본 연산자와 규칙

 - 추상화 지원 : 복잡한 구조나 연산을 정의하고 사용하는 능력 (추상화가 좋으면 Readability가 낮아짐)

- 표현력 (Expressivity) : 연산을 지정하는 편리한 방법을 제공

  ex) ++, --, += 과 같이 표현력이 좋으면 Readability가 떨어짐

 

3. 신뢰성 (Reliability)

 - 타입 검사 : 타입 오류를 검출

 - 예외 처리 : 런타임 오류를 처리하고 수정할 수 있는 능력

 - 별칭(Aliasing) : 동일 메모리 위치를 참조하는 다양한 방식이 존재하는지 여부 (Alising은 Reliability를 떨어트림)

 - Readability & Writeability

 

4. 비용 (Cost) 

 - 언어 학습 비용 : 프로그래밍 언어를 배우는데 드는 비용

 - 프로그램 실행 비용 : 언어가 실행되는 동안 드는 비용

 - reliability가 낮으면 cost가 많이 발생함

 

5. 이외의 평가 요소

 - Portability (이식성) : 한 구현에서 다른 구현으로 쉽게 이동할 수 있는 정도

 

 - Generality (일반성) : 다양한 응용 프로그램에 적합한 정도

 

 - Well-definedness (정확한 정의) : 공식 정의가 완전하고 정밀한 정도

 

 

언어 설계의 영향 요소 (Influences on Language Design)

 1. 컴퓨터 아키텍쳐 (Computer Architecture) : 대부분의 언어는 폰 노이만 아키텍쳐를 기반으로 개발

   -명령형 언어(Imperative Languages) : 메모리에 저장된 데이터와 명령어를 처리

 

 2. 프로그램 설계 방법론 (Program Design Methodologies) 

   - 구조적 프로그래밍 : 코드의 가독성, 유지보수성을 향상시키기 위한 방법론

   - 객체지향 프로그래밍(OOP) : 데이터 추상화, 상속, 다형성을 사용하여 복잡한 프로그램을 관리

 

프로그래밍 언어 분류 (Language Categories)

 1. 명령형 언어 (Imperative)

   - C, Java, Python 등 변수, 할당문, 반복문을 중심으로 구성

 

 2. 함수형 언어 (Functional)

   - LISP, Scheme, ML 등 함수를 중심으로 계산이 이루어짐

 

 3. 논리형 언어 (Logical)

   - Prolog가 대표적인 언어로, 술어 논리를 기반으로 함 

 

함수형 언어

기본 모델 : 수학적 함수 모델에 기반하여 프로그램을 정의하고, 재귀 호출을 통해 반복 작업을 처리

 

특징 : 자기 호출 - 반복문 대신 재귀를 사용하여 문제를 해결 (루프가 없음)

          변수는 없음 (변수를 메모리를 가리켜야 함)

 

논리형 언어

기본 모델 : 술어 논리를 기반으로 하며, 문제를 해결하는 방법을 기술하는 것보다 문제의 무엇인지를 논리적으로 표현

특징 : 제어 추상화(루프나 선택문 등) 가 없으며, 제어 해석기에 의해 제공

 

 

언어 설계 시의 트레이드 오프 (Trade-Offs)

1. Reliability vs cost of execution (신뢰성 vs 실행 비용)

 ex) Java는 배열 인덱스를 확인하는 추가 작업으로 인해 실행 비용이 증가하지만 신뢰성을 보장

 

2. Readability vs Writability (가독성 vs 쓰기 용이성)

 ex) APL은 많은 연산자와 기호를 제공하지만 가독성이 떨어질 수 있음

 

3. Writability vs Reliability (쓰기 용이성 vs 신뢰성)

 ex) C++에서 포인터는 매우 유연하지만, 잘못 사용하면 신뢰성이 떨어질 수 있음

 

프로그래밍 언어의 구현 방법 (Implementation Methods)

1. 컴파일 (Compilation)

 - 고급 언어 프로그램을 기계어로 번역하는 과정. 

 - 실행은 빠르지만 번역은 시간이 걸림

 - ex) c, c++

 

2. 순수 해석 (Pure Interpretation)

 - 프로그램을 즉시 해석하여 실행 (No translation)

 - 실행 속도는 느리지만 디버깅이 용이

 - 프로그램을 쉽게 수행 (run-time errors가 쉽게 발생하고 즉시 발생한다)

 - ex) Python

 

3. 혼합 구현 시스템 (Hybrid Implementation System)

 - 컴파일러와 순수 해석기의 장점을 결합하여 사용

 - 프로그램은 고급 언어로 작성된 후, 중간 언어로 번역 (이 중간 언어는 해석이 용이하고, 최종적으로 실행)

 - 순수 인터프리터보다 빠름 (컴파일로된 코드로 변환되지 않지만, 중간 언어를 해석하는 방식이 보다 효율적)

 - ex) Java

 

컴파일러 과정 (Compilation Process)

중요!!!

 

1. 어휘 분석 (Lexical analysis) - 소스 프로그램을 어휘 단위로 분리

2. 구문 분석 (Syntax analysis) - 어휘 단위를 문법에 맞게 구조화

   ex) Context-free grammer in BNF (Backus-Naur Form)

3. 의미 분석 (Semantics analysis) - 중간 코드를 생성

4. 코드 생성 (Code generation) - 최종적으로 기계어 코드를 생성

컴파일 과정

 

심볼 테이블 예시

이름 타입 위치 기타
x int 5 메모리 주소 A 지역 변수
y float 3.14 메모리 주소 B 지역 변수
add function - - 함수
sum int 0 메모리 주소 C 전역 변수

 

 

Pure Interpretation 과정

 

- 기계어를 활용해서 실행

 

 

Hybrid Implementation 과정

 

 

Preprocessors

1. Preprocessors Macros (매크로)

   - 매크로는 프리프로세서에서 사용되는 명령어로, 다른 파일에서 코드를 포함시키거나 코드를 변환하는데 사용

   - ex) C언어에서 #include, #define 등의 지시문이 여기에 해당

 

2. Preprocessors의 역할

   - 컴파일 직전에 프로그램을 처리하여 코드 내에 포함된 매크로를 확장

   - ex) #define PI 3.14 라는 매크로 정의가 있을 경우, 코드 내의 PI는 컴파일 전에 3.14로 변환

 

 

컴파일러와 인터프리터의 내부 구조

728x90
반응형