1장 기본적인 사항(2) 2016. 3. 7 순천향대학교 컴퓨터공학부 하 상 호
1장 기본적인 사항 프로그래밍 언어론을 왜 배우는가? 프로그래밍 영역 언어 평가기준 언어 설계 절충 언어 설계에 미친 영향 언어 부류 구현 방법 프로그래밍 환경
언어 평가기준 소프트웨어 개발, 유지보수에 언어가 미치는 영향에 기준하여 언어의 특징들을 평가 평가기준 언어의 특징 평가 판독성, 작성력, 신뢰성, 비용 언어의 특징 평가 단순성, 직교성, 데이터 타입, 구문 추상화지원, 표현력 타입 검사, 예외처리, 제한된 별칭 등
언어 평가기준 평가기준 언어특성 판독성 작성력 신뢰성 단순성 * * * 직교성 * * * 데이터의 타입 * * * 언어특성 판독성 작성력 신뢰성 단순성 * * * 직교성 * * * 데이터의 타입 * * * 구문 설계 * * * 추상화 지원 * * 표현력 * * 타입 검사 * 예외 처리 * 제한된 별칭 *
판독성 프로그램을 얼마나 쉽게 이해할 수 있는지의 정도 판독성에 기여하는 언어 특징 프로그램과 프로그래밍 언어의 대한 중요한 척도 소프트웨어 유지보수의 용이성 문제 영역의 문맥 고려 판독성에 기여하는 언어 특징 단순성 직교성 데이터 타입 구문 설계
판독성: 단순성 전반적인 단순성(overall simplicity) 언어 규모가 크면 언어의 일부분만을 배우는 경향 프로그램 작성자와 판독자가 알고 있는 부분이 서로 다르면? 언어의 특징 다중성(feature multiplicity) 특정 연산이 한 가지 이상의 방법으로 수행 가능한 특징 Ex: count = count + 1; count++; 연산자 중복(operator overloading) 연산자 기호가 두 개 이상의 의미를 가질 때 분별력 있게 사용되지 않으면? Ex: A + B = ∑ai + ∑bi (여기서 A, B는 일차원 배열) 언어가 지나치게 단순하면? Ex: 어셈블리어
판독성: 직교성 직교성(orthogonality) 선형대수의 orthogonal vector에서 유래 독립된 기본 구조들이 조합되어 제어나 데이터 구조를 생성할 수 있는 능력 적은 개수의 기본 구조와 적은 개수의 방법으로 조합 Ex. 데이터 타입: 정수, 실수, 배정도 실수, 문자 타입 연산자: 배열, 포인터 타입 연산자를 (타입 연산자, 데이터 타입)에 적용하여 데이터 구조를 정의: 정수 * 배열 => 정수 배열
판독성: 직교성 직교성(orthogonality) 직교성은 언어 기본 요소들간의 관계 대칭성을 의미 직교성이 결여되면 언어 규칙에서 예외사항 초래 => 직교성이 높으면 언어를 배우고, 판독하고, 이해하기 용이 Ex. C 언어는 직교적인가? 모든 구조화 데이터 타입들이 반환 가능한가? 구조체의 멤버 타입은 임의 타입일 수 있는가? struct charList { char data; struct charList next; }
판독성: 직교성 직교성이 너무 지나치게 높으면? Ex: ALGOL 68의 모든 언어 구조는 타입을 가지며, 이런 타입에 대한 제약이 없고, 대부분의 구조는 값을 생성 식이 문장의 문맥에 나타날 수 있고, 문장 구조가 식에 포함될 수 있다. =>극단적인 직교성은 폭발적 조합으로 인한 불필요한 복잡성 초래 begin a := if b < c then d else e; a := begin f(b); g(c) end; g(d); 2 + 3 end
판독성: 직교성 함수형 언어는 단순하고 직교적 계산은 주어진 매개변수에 함수를 적용하여 이루어짐 함수 호출의 단일 구조로 모든 것을 표현 그러나 비효율적
판독성: 데이터 타입 데이터 타입 언어가 데이터 타입과 데이터 구조를 정의할 수 있는 충분한 장치를 제공하는가? 불리안 타입이 제공되지 않으면? timeOut = 1 timeOut = true
판독성: 구문 설계 특수어 형식과 의미 복합문을 표현하는 방법 특수어가 변수 이름으로 사용될 수 있는가? 복합문 끝 표시 구문이 그 유형을 나타내는가? Ex: end, } vs. end if, end loop 특수어가 변수 이름으로 사용될 수 있는가? 형식과 의미 문장의 형태가 그 의미를 나타낼 수 있게. 형태는 동일하나 문맥에 따라 그 의미가 다르면? Ex. C의 static
작성력 프로그램 생성에 언어가 쉽게 사용될 수 있는 정도 판독성에 영향을 미치는 언어 특징은 작성력에도 영향을 미침 문제 영역에 종속 GUI를 포함하는 프로그램 작성할 때 Visual Basic vs C 작성력에 영향을 미치는 언어 특징들 단순성과 직교성 추상화의 지원 표현력
작성력: 단순성과 직교성 언어가 복잡하여 모두 알고 있지 않으면? 직교성이 너무 높으면? 알고 있지 않은 특징을 우연히 사용하여 오용 초래 가능 더 우아하거나 더 효율적인 특징들이 사용되지 않을 가능성 직교성이 너무 높으면? 기본구조들에 대한 조합이 거의 적법하여 오류가 탐지되지 않을 수 있다
작성력: 추상화의 지원 추상화(abstraction)란? 컴퓨터의 데이터, 연산, 명령어 등을 추상화 많은 세부사항이 무시될 수 있는 방식으로 복잡한 데이터구조나 연산을 정의하여 사용할 수 있는 능력 오늘날 프로그래밍 언어 설계에서 매우 중요한 개념 컴퓨터의 데이터, 연산, 명령어 등을 추상화 프로세스(제어) 추상화 배정문, if, for, while 함수 등 데이터 추상화 변수, 배열, 구조체, 이진 트리 등 추상 데이터 타입 데이터와 관련 연산들을 통합하여 표현
작성력: 표현력 표현력 언어가 계산을 명세하는데 있어서 상대적으로 편리한 방식을 제공 APL은 상당한 양의 계산을 매우 작은 프로그램으로 표현 가능하게 하는 강력한 연산자를 제공 Ex. C++ vs. count = count + 1 for vs. while
신뢰성 프로그램은 모든 조건하에서 주어진 명세에 따라 수행한다면 신뢰적이라 함 언어 특징 타입 검사 예외 처리 별칭 판독성과 작성력
신뢰성 타입 검사(type checking) 예외 처리(exception handling) 컴파일시나 실행중에 프로그램의 타입 오류 검사 Ex: 원본 C 언어(실매개변수와 형식 매개변수간의 타입 검사를 하지 않음) Java? 예외 처리(exception handling) 프로그램의 실행시간 오류를 올바르게 수정하고 계속 실행할 수 있는 능력 Ex. C, Fortran vs C++, Java, C#
신뢰성 별칭(aliasing) 판독성과 작성력 동일한 기억장소에 대해서 2개 이상의 다른 접근 방법을 갖는 것 프로그래밍 언어에서 위험한 특징 Ex: 동일한 변수를 가리키는 2개의 포인터 존재시 판독성과 작성력 프로그램이 쉽게 작성되면, 올바를 가능성이 많다. 판독하기 어려운 프로그램은 작성하고 수정하기 어렵다.
비용 프로그램 언어 비용은 다음 사항으로 결정 프로그래머 교육 비용 프로그램 작성 비용 프로그램 컴파일 비용 최적화(optimization) 여부 프로그램 실행 비용 컴파일 비용과의 절충 고려 언어 구현 시스템의 비용 신뢰성 부족에 따른 비용 프로그램 유지보수 비용
비용 언어 비용의 가장 중요한 요소는? 프로그램 개발, 유지보수, 신뢰성 연관된 언어 평가기준은?
다른 평가 기준 이식성(protability) 일반성(generality) 분명성(well-definedness) 프로그램을 언어의 한 구현으로부터 다른 구현으로 쉽게 이동시킬 수 있는 척도 언어의 표준화와 연관 일반성(generality) 광범위한 응용 분야에 대한 적용성 분명성(well-definedness) 언어의 공식 정의 문서의 완전성과 정밀성
언어 설계 절충 언어 평가기준은 언어 설계에 대한 프레임워크 제공 이러한 프레임워크는 자체 내부에서 상충 언어 설계시 타협과 절충이 필요
언어 설계 절충 언어 설계 절충 예 신뢰성과 실행비용 판독성과 작성력 작성력과 신뢰성 배열원소 첨자범위 검사 유무 (C vs Java) 판독성과 작성력 APL은 다양한 배열 연산자를 위한 상당히 많은 새로운 기호 제공 작성력이 좋으나 판독성은 매우 낮음 작성력과 신뢰성 C의 포인터는 강력하고 융통적, 그러나 비신뢰적