Transcript
Page 1: Chapter 1 –  프로그래밍 언어 소개

1

Chapter 1 – 프로그래밍 언어 소개

Outline1.1 프로그래밍 언어란 무엇인가1.2 프로그래밍 언어를 배워야 하는 이유1.3 프로그래밍 언어에서의 추상화1.4 계산 전형1.5 언어정의

Page 2: Chapter 1 –  프로그래밍 언어 소개

2

1. 프로그래밍 언어 소개

• 의사 소통하는 방식 ( 언어 ) 생각하는 방법 ( 사고 )

• 프로그래밍 언어 컴퓨터에 대한 이해와 활용• 컴퓨터 발전 컴퓨터에 대한 생각 프로그래밍 언어의 변화

영향

프로그래밍 방법 컴퓨터에 대한 생각

프로그래밍 언어

Page 3: Chapter 1 –  프로그래밍 언어 소개

3

1. 프로그래밍 언어 소개

• 프로그래밍 언어 변화 요구

• 프로그래밍 언어 설계

– 아직도 완벽하게 이해되지 못한 면 존재– 기본 법칙이나 개념 : 전산학의 근본– 설계에 대한 지식 컴퓨터와 의사 소통 , 컴퓨터 이해

• 교과 내용

– 특정 언어 중심 아님– 언어의 밑바탕을 이루는 일반적인 개념 중심

Page 4: Chapter 1 –  프로그래밍 언어 소개

4

1.1 프로그래밍 언어란 무엇인가

• 프로그래밍 언어의 정의– 컴퓨터와 의사 소통하기 위한 표현법 ( 약간 부적절한 면 존재 )– 1940 년대 이전 : 프로그래밍이 전선 연결 ( 프로그래밍 언어 ?)– 1940 년대 Von Neumann 방식 (Program stored computer)

• CPU 가 처리할 작업을 명령 코드로 작성

• 프로그래밍 개념 시작

• 어셈블리 언어 탄생 : symbol 사용– 기계종속적

– 저급 수준의 추상화

– 읽고 쓰기 어려움

• 고급 수준의 추상화 요구 : 고급 언어 등장– 프로그램 간략 , 이해 용이 , 이식성 증가

– 배정 , 반복 , 선택 개념

Z := X + YLDA XADD YSTA Z

Page 5: Chapter 1 –  프로그래밍 언어 소개

5

1.1 프로그래밍 언어란 무엇인가 ?

프로그래밍 언어 정의

“ 프로그래밍 언어는 기계가 읽을 수 있고 사람이 읽을 수

있는 형식으로 계산을 기술하는 표현 체계이다 .”

Page 6: Chapter 1 –  프로그래밍 언어 소개

6

1.1 프로그래밍 언어란 무엇인가 ?

• 계산 (computation) 이란 ?– 수학적으로 형식적인 정의 가능 ( 튜링 머신등 )

– 컴퓨터가 처리할 수 있는 작업을 의미 ( 일반적 )

• 기계가 읽을 수 있는 (machine-readable)– 효과적인 번역 가능 ( 간결한 구조의 언어 요구 )

– 단순 번역 알고리즘 존재

– 제한된 시간 내에 번역 가능 ( 프로그램 크기 단순 비례 이상적 임 )

– 문맥 자유 언어 (context free language) 위 조건들 만족

• 사람이 읽을 수 있는 (human-readable)– 기계 독립적인 추상성 제공 자연어 형태

– 프로그램 대형화 판독성은 새로운 국면 지역성 요구

– 프로그래밍 언어 소프트웨어 개발 환경에 포함되는 경향

Page 7: Chapter 1 –  프로그래밍 언어 소개

7

1.2 프로그래밍 언어를 배워야 하는 이유

• 프로그래밍 언어 고찰

– 언어의 특징들 (features) 에 대한 기본 개념

– 특징들의 구현과 이 때 발생하는 문제점

– 특징들의 설계에 대한 기본 개념

– 실제 언어의 도입 예 : 비교 분석

Page 8: Chapter 1 –  프로그래밍 언어 소개

8

1.2 프로그래밍 언어를 배워야 하는 이유

• 프로그래밍 언어를 고찰함으로써 얻는 장점 (1 of 2)

– 사용하고 있는 언어의 이해와 효율적인 알고리즘 작성• 일부 특징 및 특성은 거의 사용 안되며 이해를 못함

– 이들이 어떻게 수행되고 구현되는지 표현 안 됨 ( 지침서 )– 프로그래머 시행 착오에 의존하여 이해

• 특징들 사용의 효율성과 비효율성 이해– 예 : recursion , 동적 기억 장소 할당 (PL/I 등 ), 병행성

• 효율적 알고리즘 작성 가능

– 유용한 프로그래밍 구사 능력• 언어 사고• 다양한 언어 구조 알고리즘 작성 시 어휘 구사력 증가

• 어휘를 적재적소 사용• 특징 구현 기술 실제 적용 능력 제공 (coroutine 등 )• 좋은 알고리즘 작성

Page 9: Chapter 1 –  프로그래밍 언어 소개

9

1.2 프로그래밍 언어를 배워야 하는 이유

• 프로그래밍 언어를 고찰함으로써 얻는 장점 (2 of 2)

– 프로그래밍 언어 선택 능력• 언어에 대한 다양한 지식 문제 해결에 적절한 언어 선택

– 예 : 문자 처리에 유용한 Snobol 4, 상업용 Cobol, 시스템 내장 프로그램 Ada, Modula-2

– 새로운 프로그래밍 언어의 학습 능력• 여러 외국어 능통 학자 새 외국어 쉽게 배움• 다양한 언어의 특징 이해 새 언어 쉽게 배움• 새 언어 : 기존의 여러 특징들의 선택 조합

– 새로운 프로그래밍 언어 설계 능력• 언어 설계 기존의 여러 특징들의 선택 조합• 개발 시스템 사용 방법 제공 일종의 언어 제공

Page 10: Chapter 1 –  프로그래밍 언어 소개

10

1.3 프로그래밍 언어에서의 추상화

• 추상화 (abstraction) 의 개념– 주어진 작업이나 객체를 속성들의 일부분을 가지고 필요한

만큼 묘사할 수 있는 방법을 지원하는 것– 필수적인 속성만으로 주어진 것을 묘사하므로 나머지

속성들은 추상화 , 은닉 , 또는 삭제됨

• 추상화의 범주– 자료 추상화

• 문자열 , 수 , 트리와 같은 계산 될 자료의 특성을 추상화

– 제어 추상화 ( 알고리즘 추상화 )• 실행 순서를 제어하는 특성을 추상화• 제어 추상화의 예 : 반복문 , 조건문 , 프로시저 호출 등

Page 11: Chapter 1 –  프로그래밍 언어 소개

11

1.3 프로그래밍 언어에서의 추상화

• 추상화에 포함된 정보의 양에 따른 분류

– 기본 추상화 (basic abstraction)• 가장 지역적인 기계정보에 대한 추상화

– 구조 추상화 (structured abstraction)• 보다 전역적인 정보인 프로그램의 구조에 대한 추상화

– 단위 추상화 (unit abstraction)• 단위 프로그램 전체에 대한 정보의 추상화

Page 12: Chapter 1 –  프로그래밍 언어 소개

12

1.3 프로그래밍 언어에서의 추상화

• 자료 추상화 (1 of 2)

– 기본 추상화 (basic abstraction)• 컴퓨터 내부 자료 표현 추상화• 예 )

– 기억 장치의 장소 변수로 추상화int x; float y;

– 자료의 값 (2 진수 ) 수를 십진 자료형으로 추상화x = 5.7;

– 구조 추상화 (structured abstraction)• 관련된 자료의 집합을 추상화• 전형적인 구조 추상화 예 : 배열 , 레코드 ( 구조형 자료 )• 구조형에 새 이름 부여 기능 ( 새 차원의 추상화 )

– type student = record …..

Page 13: Chapter 1 –  프로그래밍 언어 소개

13

1.3 프로그래밍 언어에서의 추상화

• 자료 추상화 (2 of 2)

– 단위 추상화 (unit abstraction)• 자료의 생성과 사용에 대한 정보를 한 장소에 모아두고 ,

자료의 세부사항에 대한 접근을 제한하는 도구

자료형의 구조 변경이 프로그램 전체에 영향을 주지 않으

며 ,

자료 구조의 세부사항 무시 함

• 자료 캡슐화 또는 자료 추상화 (10 장 )

• 예 : C++, Java 의 class, Modula-2 의 module, Ada 의 package

Page 14: Chapter 1 –  프로그래밍 언어 소개

14

1.3 프로그래밍 언어에서의 추상화

• 제어 추상화 (1 of 5)

– 기본 추상화 (basic abstraction)• 몇 개의 기계 명령어를 모아 이해하기 쉬운 추상 구문화

• 대표적 예

– 배정문 : 계산과 값의 저장을 추상화한 것

x := x + y

– [ 조건 ] 분기문 (FORTRAN 의 GOTO 문이나 IF 문 등 )

IF (A .GT. B) GOTO 10

Page 15: Chapter 1 –  프로그래밍 언어 소개

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 ( 새 활성화 환경 )

Page 16: Chapter 1 –  프로그래밍 언어 소개

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 }

Page 17: Chapter 1 –  프로그래밍 언어 소개

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 ;

Page 18: Chapter 1 –  프로그래밍 언어 소개

18

1.3 프로그래밍 언어에서의 추상화

• 제어 추상화 (5 of 5)

– 단위 추상화 (unit abstraction)

• 프로시저의 집합을 추상화 ( 관련된 프로시저 그룹 추상화 )

• 자료 관리 프로그램에서 평균 , 표준편차 등 통계 작업 프로그램들을

모아서 하나의 단위 프로그램화

• 지원 도구 (library 형태 지원 )

– Ada 의 package, Modula-2 의 module, C++ 와 Java 의 class

– 기타 제어 추상화

• 병행 프로그래밍 (동기화 , 통신 개념 지원 ) : coroutine, task, process

★ 추상화란 : readability 증가 목적

Page 19: Chapter 1 –  프로그래밍 언어 소개

19

1.4 계산 전형 (computational paradigms)

• 명령형 언어 (imperative L.) 또는 절차적 언어 (procedural L.)

– 특징• 명령의 순차적 실행

• 변수 사용

• 배정문 사용

– 문제점• 폰 노이만 병목현상 발생 ( 순차 실행 )

• 많은 자료의 동시 계산 , 비결정적 계산 , 순서에 의존하지 않는 계산 등에 비효율적

• 대표적 예 : C, Ada, Pascal, Fortran, Basic 등 대부분 언어

• 비 절차적 언어 : 함수형 언어 , 논리형 언어

Page 20: Chapter 1 –  프로그래밍 언어 소개

20

1.4 계산 전형 (computational paradigms)

• 함수형 언어 (functional L.) 또는 적용형 언어 (applicative L.) (1 of

3)

– 함수의 평가와 함수 적용을 기본으로 함

– 특징

• 함수의 평가 및 호출 방법을 제공

• 변수 , 배정문이 없음

• 반복 연산은 재귀적 함수 이론에 의해 기술됨

Page 21: Chapter 1 –  프로그래밍 언어 소개

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;

Page 22: Chapter 1 –  프로그래밍 언어 소개

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 ))))

Page 23: Chapter 1 –  프로그래밍 언어 소개

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).

Page 24: Chapter 1 –  프로그래밍 언어 소개

24

1.4 계산 전형 (computational paradigms)

• 객체 지향 언어 (object-oriented L.)– 객체에 기반을 둔 언어

– 객체란 상태를 의미하는 기억 장소와 상태를 변경할 수 있는 연산의

집합

– 객체는 클래스로 그룹화

– 클래스 선언

• C 나 Pascal 에서 구조형 자료를 선언하는 방법과 유사

– 클래스의 인스턴스

• 선언된 객체의 실제 예

– 객체 지향의 방법을 처음 소개한 언어 : Simula 67

Page 25: Chapter 1 –  프로그래밍 언어 소개

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 클래스 사용 예

Page 26: Chapter 1 –  프로그래밍 언어 소개

26

1.5 언어 정의

• 프로그래밍 언어의 정확한 형식 정의가 필요한 이유

– 언어의 구조와 의미의 정확한 기술 없이는 프로그래밍이

불가능

– 모호함 없는 언어 구현

– 프로그래밍 과정에서 프로그램이 어떻게 동작할 것인가에

대한 문제 발생 시 유용

– 프로그램 설계 과정을 규격화하는 방법

Page 27: Chapter 1 –  프로그래밍 언어 소개

27

1.5 언어 정의

• 언어 정의의 범주형식 정의에는 구문 (syntax) 정의와 의미 (semantic) 정의가 있음

– 언어 구문 정의• 언어 구문에 관한 정의는 형식화가 많이 되어 있음

• 대부분의 언어가 문맥 자유 문법을 만족하며 BNF 로 정의

• 예 : Pascal 의 if 문

<if 문 > ::= if < 조건 > then < 문 > [ else < 문 > ]

– 언어 의미 정의• 의미는 프로그램의 실행 시 어떤 일이 발생하는가를 기술

– 예 : if 문에서 조건문이 거짓으로 판명 되었을 때 ,

else 문 이하가 존재하지 않을 경우

• 언어 의미론은 형식화 미비

• 의미론의 형식적 정의 방법 : 디노테이셔녈 (denotational) 의미론 ,

액시어매틱 (axiomatic) 의미론


Recommended