제 3장 프로그래밍 언어 설계 3.1 설계 기준의 역사적 변천 3.2 효율성 3.3 일반성, 직교성, 획일성 3.4 프로그래밍 언어의 기타 설계 원칙 3.5 문제점과 해결책들
주요 언어 설계 목적 FORTRAN 실행의 효율성 COBOL 프로그램 판독성(영어 비슷) ALGOL 60 프로그래밍 언어 설계 주요 언어 설계 목적 FORTRAN 실행의 효율성 COBOL 프로그램 판독성(영어 비슷) ALGOL 60 블록 구조 : 알고리즘 작성 PASCAL 간단 명료 : 하향식 설계 증진
3.1 설계 기준의 역사적 변천 1950년대 실행의 효율성 중시 : FORTRAN 점차로 일반적 원칙 중시 프로그래밍 언어 설계 3.1 설계 기준의 역사적 변천 1950년대 실행의 효율성 중시 : FORTRAN 점차로 일반적 원칙 중시 ALGOL 60 : 블럭구조, 재귀적 용법 제공 COBOL : 프로그램 판독성 증가
1960년대 프로그램 복잡 증대 복잡성 제어 인식 추상화 기법 : 언어 규칙 제한 감소 필요성 프로그래밍 언어 설계 1960년대 프로그램 복잡 증대 복잡성 제어 인식 추상화 기법 : 언어 규칙 제한 감소 필요성 Simular 67 : 추상화 기법 제공 ALGOL 68 : 일반성, 직교성 제공
1970∼80년대 간결성, 추상화 강조 PASCAL, C, Modula-2, Ada 수학적 정의 도입 신뢰성 증진 1980년대 프로그래밍 언어 설계 1970∼80년대 간결성, 추상화 강조 PASCAL, C, Modula-2, Ada 수학적 정의 도입 신뢰성 증진 1980년대 논리 수학 개념 삽입 증진 함수형 언어 관심 증대 ML Scheme 객체 지향 언어 관심 증대 C++
언어 설계의 기본 원칙 효율성 (efficiency) 일반성 (generality) 직교성 (orthogonality) 프로그래밍 언어 설계 언어 설계의 기본 원칙 효율성 (efficiency) 일반성 (generality) 직교성 (orthogonality) 획일성 (uniformity)
3.2 효율성 효율성의 기준에 따른 분류 목적 코드에 따른 분류 번역기의 효율적 실행 코드 생성 최적화 프로그래밍 언어 설계 3.2 효율성 효율성의 기준에 따른 분류 목적 코드에 따른 분류 번역기의 효율적 실행 코드 생성 최적화 정적 자료형 변수 : 효율적 코드 생성 PASCAL의 상수 식별자 사용
번역의 효율성 원시 코드의 효율적으로 번역 알맞은 크기의 번역기로 빠르게 번역 언어 번역의 단계 구성 문제 프로그래밍 언어 설계 번역의 효율성 원시 코드의 효율적으로 번역 알맞은 크기의 번역기로 빠르게 번역 언어 번역의 단계 구성 문제 PASCAL : 단일 패스 Modula-2 : 2 패스 구현성 번역기의 효율적 구현 문제 번역기 작성의 어려움 언어실패요인 (ALGOL 60) 번역 수행 알고리즘 이해 부족
프로그래밍의 효율성 프로그램 작성의 단순성, 용이성 문제 언어의 표현성, 추상화 관련 이상적 언어 LISP PROLOG 프로그래밍 언어 설계 프로그래밍의 효율성 프로그램 작성의 단순성, 용이성 문제 언어의 표현성, 추상화 관련 이상적 언어 LISP PROLOG
3.3 일반성, 직교성, 획일성 일반성 여러 개념들을 일반적으로 하나의 개념을 통합하여 얻는 성질 일반성이 부족한 예 프로그래밍 언어 설계 3.3 일반성, 직교성, 획일성 일반성 여러 개념들을 일반적으로 하나의 개념을 통합하여 얻는 성질 일반성이 부족한 예 PASCAL : 가변 배열 불허 FORTRAN : call by reference만 허용 FORTRAN : 상수 이름 부재
C언어의 pointer : 일반성 -> 문제점 제기 PASCAL : pointer 제한 사용 프로그래밍 언어 설계 일반성의 문제점 언어의 간결성 저하 언어의 판독성 저하 언어의 신뢰성 저하 C언어의 pointer : 일반성 -> 문제점 제기 PASCAL : pointer 제한 사용
call by value-result 허용 프로그래밍 언어 설계 직교성 수학 개념 : 직각 또는 완전히 독립적인 방향 각각 의미 가진 채 결합하는 성질 Ada : 모든 자료형 (직교성 보장) call by value call by result call by value-result 허용 ALGOL 68 주요 설계 쟁점
획일성 언어 구조 외모와 행동 조화 중점 유사한 것은 유사하게 상이한 것은 서로 다르게 행동하는 성질 프로그래밍 언어 설계 획일성 언어 구조 외모와 행동 조화 중점 유사한 것은 유사하게 상이한 것은 서로 다르게 행동하는 성질 PASCAL 비 획일성 (; 사용) Procedure p ; (* teminator *) var x : integer ; (* separator *) y : real ; (* teminator *) begin x := 0 ; (* separator *) y := 1.0 end ; (* terminator *)
3.4 프로그래밍 언어의 기타 설계 원칙 간결성 (Simplicity) PASCAL : 간결성 프로그래밍 언어 설계 3.4 프로그래밍 언어의 기타 설계 원칙 간결성 (Simplicity) PASCAL : 간결성 구성자의 수와 비례 안함 : LISP, PROLOG 과다한 단순성도 문제
표현력 (Expressiveness) 복잡한 과정이나 구조 표현의 용이함 되부름 프로그램 프로그래밍 언어 설계 표현력 (Expressiveness) 복잡한 과정이나 구조 표현의 용이함 되부름 프로그램 표현력이 강하면서도 단순한 언어 : C 언어 while (incr < 20) { while (sum <= 100) { sum += incr; } loop1 : if (incr >= 20) goto out : loop2: if (sum > 100) goto next : sum + = incr; goto loop2; next : incr++; goto loop1 : out : 정확성 (Preciseness) 언어에 대한 정확한 정의 언어의 신뢰도, 번역기의 신뢰도 영향
기계독립성 (machine independence) 프로그래밍 언어 설계 기계독립성 (machine independence) 호환성 제공 기계 구조와 별개의 자료형 사용 안전성(security) 오류발생을 줄이고 발견 용이한 언어 목표 언어 설계시 자료형, 형 검사, 변수 선언 도입
기존 표기나 관습과의 일치성 표준화된 특성, 개념 일치 언어의 간결성 저하 확장성 (Extensibility) 프로그래밍 언어 설계 기존 표기나 관습과의 일치성 표준화된 특성, 개념 일치 언어의 간결성 저하 확장성 (Extensibility) 새로운 특징 첨가 의미 추상화 개념 : 확장성 지원
제약성 (Restrictability), 부분성 (Subset) 프로그래밍 언어 설계 제약성 (Restrictability), 부분성 (Subset) 언어의 일부 지식으로 효과적 프로그램 작성 언어의 부분 선택 구현 작성 SP/1, SP/2 … SP/k : PL/I의 부분 언어
3.5 문제점과 해결책들 성공적인 언어 설계를 위한 제언 신뢰성 : 집단 컴파일러 사용 프로그래밍 언어 설계 3.5 문제점과 해결책들 성공적인 언어 설계를 위한 제언 신뢰성 : 집단 컴파일러 사용 효율적인 번역 : 분리, 통합 컴파일 사용 코드 최적화 적절한 간결성