1
Chapter 1 – 프로그래밍 언어 소개
Outline1.1 프로그래밍 언어란 무엇인가1.2 프로그래밍 언어를 배워야 하는 이유1.3 프로그래밍 언어에서의 추상화1.4 계산 전형1.5 언어정의
2
1. 프로그래밍 언어 소개
• 의사 소통하는 방식 ( 언어 ) 생각하는 방법 ( 사고 )
• 프로그래밍 언어 컴퓨터에 대한 이해와 활용• 컴퓨터 발전 컴퓨터에 대한 생각 프로그래밍 언어의 변화
영향
프로그래밍 방법 컴퓨터에 대한 생각
프로그래밍 언어
3
1. 프로그래밍 언어 소개
• 프로그래밍 언어 변화 요구
• 프로그래밍 언어 설계
– 아직도 완벽하게 이해되지 못한 면 존재– 기본 법칙이나 개념 : 전산학의 근본– 설계에 대한 지식 컴퓨터와 의사 소통 , 컴퓨터 이해
• 교과 내용
– 특정 언어 중심 아님– 언어의 밑바탕을 이루는 일반적인 개념 중심
4
1.1 프로그래밍 언어란 무엇인가
• 프로그래밍 언어의 정의– 컴퓨터와 의사 소통하기 위한 표현법 ( 약간 부적절한 면 존재 )– 1940 년대 이전 : 프로그래밍이 전선 연결 ( 프로그래밍 언어 ?)– 1940 년대 Von Neumann 방식 (Program stored computer)
• CPU 가 처리할 작업을 명령 코드로 작성
• 프로그래밍 개념 시작
• 어셈블리 언어 탄생 : symbol 사용– 기계종속적
– 저급 수준의 추상화
– 읽고 쓰기 어려움
• 고급 수준의 추상화 요구 : 고급 언어 등장– 프로그램 간략 , 이해 용이 , 이식성 증가
– 배정 , 반복 , 선택 개념
Z := X + YLDA XADD YSTA Z
5
1.1 프로그래밍 언어란 무엇인가 ?
프로그래밍 언어 정의
“ 프로그래밍 언어는 기계가 읽을 수 있고 사람이 읽을 수
있는 형식으로 계산을 기술하는 표현 체계이다 .”
6
1.1 프로그래밍 언어란 무엇인가 ?
• 계산 (computation) 이란 ?– 수학적으로 형식적인 정의 가능 ( 튜링 머신등 )
– 컴퓨터가 처리할 수 있는 작업을 의미 ( 일반적 )
• 기계가 읽을 수 있는 (machine-readable)– 효과적인 번역 가능 ( 간결한 구조의 언어 요구 )
– 단순 번역 알고리즘 존재
– 제한된 시간 내에 번역 가능 ( 프로그램 크기 단순 비례 이상적 임 )
– 문맥 자유 언어 (context free language) 위 조건들 만족
• 사람이 읽을 수 있는 (human-readable)– 기계 독립적인 추상성 제공 자연어 형태
– 프로그램 대형화 판독성은 새로운 국면 지역성 요구
– 프로그래밍 언어 소프트웨어 개발 환경에 포함되는 경향
7
1.2 프로그래밍 언어를 배워야 하는 이유
• 프로그래밍 언어 고찰
– 언어의 특징들 (features) 에 대한 기본 개념
– 특징들의 구현과 이 때 발생하는 문제점
– 특징들의 설계에 대한 기본 개념
– 실제 언어의 도입 예 : 비교 분석
8
1.2 프로그래밍 언어를 배워야 하는 이유
• 프로그래밍 언어를 고찰함으로써 얻는 장점 (1 of 2)
– 사용하고 있는 언어의 이해와 효율적인 알고리즘 작성• 일부 특징 및 특성은 거의 사용 안되며 이해를 못함
– 이들이 어떻게 수행되고 구현되는지 표현 안 됨 ( 지침서 )– 프로그래머 시행 착오에 의존하여 이해
• 특징들 사용의 효율성과 비효율성 이해– 예 : recursion , 동적 기억 장소 할당 (PL/I 등 ), 병행성
• 효율적 알고리즘 작성 가능
– 유용한 프로그래밍 구사 능력• 언어 사고• 다양한 언어 구조 알고리즘 작성 시 어휘 구사력 증가
• 어휘를 적재적소 사용• 특징 구현 기술 실제 적용 능력 제공 (coroutine 등 )• 좋은 알고리즘 작성
9
1.2 프로그래밍 언어를 배워야 하는 이유
• 프로그래밍 언어를 고찰함으로써 얻는 장점 (2 of 2)
– 프로그래밍 언어 선택 능력• 언어에 대한 다양한 지식 문제 해결에 적절한 언어 선택
– 예 : 문자 처리에 유용한 Snobol 4, 상업용 Cobol, 시스템 내장 프로그램 Ada, Modula-2
– 새로운 프로그래밍 언어의 학습 능력• 여러 외국어 능통 학자 새 외국어 쉽게 배움• 다양한 언어의 특징 이해 새 언어 쉽게 배움• 새 언어 : 기존의 여러 특징들의 선택 조합
– 새로운 프로그래밍 언어 설계 능력• 언어 설계 기존의 여러 특징들의 선택 조합• 개발 시스템 사용 방법 제공 일종의 언어 제공
10
1.3 프로그래밍 언어에서의 추상화
• 추상화 (abstraction) 의 개념– 주어진 작업이나 객체를 속성들의 일부분을 가지고 필요한
만큼 묘사할 수 있는 방법을 지원하는 것– 필수적인 속성만으로 주어진 것을 묘사하므로 나머지
속성들은 추상화 , 은닉 , 또는 삭제됨
• 추상화의 범주– 자료 추상화
• 문자열 , 수 , 트리와 같은 계산 될 자료의 특성을 추상화
– 제어 추상화 ( 알고리즘 추상화 )• 실행 순서를 제어하는 특성을 추상화• 제어 추상화의 예 : 반복문 , 조건문 , 프로시저 호출 등
11
1.3 프로그래밍 언어에서의 추상화
• 추상화에 포함된 정보의 양에 따른 분류
– 기본 추상화 (basic abstraction)• 가장 지역적인 기계정보에 대한 추상화
– 구조 추상화 (structured abstraction)• 보다 전역적인 정보인 프로그램의 구조에 대한 추상화
– 단위 추상화 (unit abstraction)• 단위 프로그램 전체에 대한 정보의 추상화
12
1.3 프로그래밍 언어에서의 추상화
• 자료 추상화 (1 of 2)
– 기본 추상화 (basic abstraction)• 컴퓨터 내부 자료 표현 추상화• 예 )
– 기억 장치의 장소 변수로 추상화int x; float y;
– 자료의 값 (2 진수 ) 수를 십진 자료형으로 추상화x = 5.7;
– 구조 추상화 (structured abstraction)• 관련된 자료의 집합을 추상화• 전형적인 구조 추상화 예 : 배열 , 레코드 ( 구조형 자료 )• 구조형에 새 이름 부여 기능 ( 새 차원의 추상화 )
– type student = record …..
13
1.3 프로그래밍 언어에서의 추상화
• 자료 추상화 (2 of 2)
– 단위 추상화 (unit abstraction)• 자료의 생성과 사용에 대한 정보를 한 장소에 모아두고 ,
자료의 세부사항에 대한 접근을 제한하는 도구
자료형의 구조 변경이 프로그램 전체에 영향을 주지 않으
며 ,
자료 구조의 세부사항 무시 함
• 자료 캡슐화 또는 자료 추상화 (10 장 )
• 예 : C++, Java 의 class, Modula-2 의 module, Ada 의 package
14
1.3 프로그래밍 언어에서의 추상화
• 제어 추상화 (1 of 5)
– 기본 추상화 (basic abstraction)• 몇 개의 기계 명령어를 모아 이해하기 쉬운 추상 구문화
• 대표적 예
– 배정문 : 계산과 값의 저장을 추상화한 것
x := x + y
– [ 조건 ] 분기문 (FORTRAN 의 GOTO 문이나 IF 문 등 )
IF (A .GT. B) GOTO 10
15
1.3 프로그래밍 언어에서의 추상화
• 제어 추상화 (2 of 5)
– 구조 추상화 (structured abstraction)• ( 검사 값에 따라 ) 분할된 명령어 그룹 수행
예 1 : 택일문
if 문과 같은 택일문 , Pascal 의 case 문 , C 언어의 switch문 등
예 2 : 구조화 반복문
for, repeat, while, loop-exit
예 3 : 강력한 구조 제어 : 부프로그램 ( 프로시저 추상화 )
procedure def, procedure invocation ( 새 활성화 환경 )
16
1.3 프로그래밍 언어에서의 추상화
• 제어 추상화 (3 of 5)– 구조 추상화 (structured abstraction) 의 예 - Ada 의 if 문 - Java 의 if 문
1 if x > y then
2 t := x ;
3 x := y ;
4 y := t ;
5 else
6 x := x + y ;
7 y := y + l ;
8 endif ;
1 if (x > y) {
2 t := x ;
3 x := y ;
4 y := t ;
5 }
6 else {
7 x := x + y ;
8 y := y + l ;
9 }
17
1.3 프로그래밍 언어에서의 추상화
• 제어 추상화 (4 of 5)– 구조 추상화 (structured abstraction) 의 예
• Java 와 Ada 의 반복문
//Java 의 예 //
1 i = 0 ;
2 do
3 i = i + 1 ;
4 while (sentence(i) = ‘$’) ;
//Ada 의 예 //
1 i := 0 ;
2 loop
3 i := i + 1 ;
4 exit when sentence(i) /= ‘$’ ;
5 endloop ;
18
1.3 프로그래밍 언어에서의 추상화
• 제어 추상화 (5 of 5)
– 단위 추상화 (unit abstraction)
• 프로시저의 집합을 추상화 ( 관련된 프로시저 그룹 추상화 )
• 자료 관리 프로그램에서 평균 , 표준편차 등 통계 작업 프로그램들을
모아서 하나의 단위 프로그램화
• 지원 도구 (library 형태 지원 )
– Ada 의 package, Modula-2 의 module, C++ 와 Java 의 class
– 기타 제어 추상화
• 병행 프로그래밍 (동기화 , 통신 개념 지원 ) : coroutine, task, process
★ 추상화란 : readability 증가 목적
19
1.4 계산 전형 (computational paradigms)
• 명령형 언어 (imperative L.) 또는 절차적 언어 (procedural L.)
– 특징• 명령의 순차적 실행
• 변수 사용
• 배정문 사용
– 문제점• 폰 노이만 병목현상 발생 ( 순차 실행 )
• 많은 자료의 동시 계산 , 비결정적 계산 , 순서에 의존하지 않는 계산 등에 비효율적
• 대표적 예 : C, Ada, Pascal, Fortran, Basic 등 대부분 언어
• 비 절차적 언어 : 함수형 언어 , 논리형 언어
20
1.4 계산 전형 (computational paradigms)
• 함수형 언어 (functional L.) 또는 적용형 언어 (applicative L.) (1 of
3)
– 함수의 평가와 함수 적용을 기본으로 함
– 특징
• 함수의 평가 및 호출 방법을 제공
• 변수 , 배정문이 없음
• 반복 연산은 재귀적 함수 이론에 의해 기술됨
21
1.4 계산 전형 (computational paradigms)
• 함수형 언어 (functional L.) 또는 적용형 언어 (applicative L.) (2 of 3)– 절차형 프로그래밍과 함수형 프로그래밍 예 (Modula-2)
1 PROCEDURE gcd (u,v : INTERGER;
2 VAR x : INTERGER);
3 VAR y, t : INTERGER
4 BEGIN
5 x := u ; y := v ;
6 LOOP
7 IF y <= 0 THEN
8 EXIT
9 END ;
10 t := y;
11 y := x MOD y;
12 x := t;
13 END;
14 END gcd;
1 PROCEDURE gcd (u,v : INTERGER) : INTEGER ;
2 BEGIN
3 IF v = 0 THEN
4 RETURN u ;
5 ELSE
6 RETURN gcd (v, u MOD v) ;
7 END;
8 END gcd;
22
1.4 계산 전형 (computational paradigms)
• 함수형 언어 (functional L.) 또는 적용형 언어 (applicative L.) (3 of 3)– 절차형 언어를 사용한 함수형 프로그래밍 예
– 함수형 언어를 사용한 함수형 프로그래밍 예
// Modula-2 (최대공약수 )
1 PROCEDURE gcd (u,v : INTERGER) : INTEGER ;
2 BEGIN
3 IF v = 0 THEN
4 RETURN u ;
5 ELSE
6 RETURN gcd (v, u MOD v) ;
7 END;
8 END gcd;
// Java (최대공약수 )
1 int gcd (int u, int v) {
2 if ( v == 0)
3 return u ;
4 else
5 return gcd (v, u % v) ;
6 }
1 define (gcd u v) (if ( = v 0) u (gcd v (remainder u v ))))
23
1.4 계산 전형 (computational paradigms)
• 논리형 언어 (logical L.) 혹은 선언적 언어 (declarative L.)– 특징
• 기호 논리학에 근거
• 계산의 실행 순서 (how) 대신 무엇을 하려고 하는가 (what) 를 선언
• 반복이나 선택 개념 불필요
– 최대 공약수 (gcd) 에 대한 논리적 기술• v = 0 이면 u 와 v 의 gcd 는 u 이다 .
• v > 0 이면 u 와 v 의 gcd 는 v 와 u mod v 의 gcd 와 같다 .
– 논리적 기술에 대한 Prolog 프로그램
1 gcd(U,V,U) :- V=0.
2 gcd(U,V,X) :- V>0,
3 Y is U mod V,
4 gcd(V,Y,X).
24
1.4 계산 전형 (computational paradigms)
• 객체 지향 언어 (object-oriented L.)– 객체에 기반을 둔 언어
– 객체란 상태를 의미하는 기억 장소와 상태를 변경할 수 있는 연산의
집합
– 객체는 클래스로 그룹화
– 클래스 선언
• C 나 Pascal 에서 구조형 자료를 선언하는 방법과 유사
– 클래스의 인스턴스
• 선언된 객체의 실제 예
– 객체 지향의 방법을 처음 소개한 언어 : Simula 67
2004 Y.H. Won, Hongik University.All rights reserved.
25
1 // 객체 지향 언어 (object oriented L.) 예2 // Java 로 작성된 최대공약수 선언부3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class Main { // 클래스 GcdLcm 테스트 프로그램20 public static void main (String[] args) {21 GcdLcm g1, g2 = new GcdLcm (1000, 100) ;22 g1 = new GcdLcm (18, 27) ;23 System.out.println (“g1.gcd :” + g1.gcd +
“g1.lcm :” + g1.lcm) ; 24 System.out.println (“g2.gcd :” + g2.gcd +
“g2.lcm :” + g2.lcm) ;25 }26 }
class GcdLcm { // 클래스 GcdLcm 선언 public int gcd, lcm ; int x, y ; GcdLcm (int num1, int num2) { x = num1 ; y = num2; gcd = gcdf (x, y) ; lcm = x * y / gcd ; } int gcdf (int a, int b) { if (b == 0) return a; else return gcdf (b, a % b) ; } }
• GcdLcm 클래스의 객체 g1, g2 정의
GcdLcm g1, g2 ;
• g1 의 기억 장소 할당
g1 = new GcdLcm (18, 27) ;
• g1 이 갖는 값을 참조
a = g1.gcd ;
b = g1.lcm;
GcdLcm 클래스 사용 예
26
1.5 언어 정의
• 프로그래밍 언어의 정확한 형식 정의가 필요한 이유
– 언어의 구조와 의미의 정확한 기술 없이는 프로그래밍이
불가능
– 모호함 없는 언어 구현
– 프로그래밍 과정에서 프로그램이 어떻게 동작할 것인가에
대한 문제 발생 시 유용
– 프로그램 설계 과정을 규격화하는 방법
27
1.5 언어 정의
• 언어 정의의 범주형식 정의에는 구문 (syntax) 정의와 의미 (semantic) 정의가 있음
– 언어 구문 정의• 언어 구문에 관한 정의는 형식화가 많이 되어 있음
• 대부분의 언어가 문맥 자유 문법을 만족하며 BNF 로 정의
• 예 : Pascal 의 if 문
<if 문 > ::= if < 조건 > then < 문 > [ else < 문 > ]
– 언어 의미 정의• 의미는 프로그램의 실행 시 어떤 일이 발생하는가를 기술
– 예 : if 문에서 조건문이 거짓으로 판명 되었을 때 ,
else 문 이하가 존재하지 않을 경우
• 언어 의미론은 형식화 미비
• 의미론의 형식적 정의 방법 : 디노테이셔녈 (denotational) 의미론 ,
액시어매틱 (axiomatic) 의미론