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

Download Report

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

1
Chapter 1 – 프로그래밍 언어 소개
Outline
1.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 사용
– 기계종속적
– 저급 수준의 추상화
– 읽고 쓰기 어려움
• 고급 수준의 추상화 요구 : 고급 언어 등장
– 프로그램 간략, 이해 용이, 이식성 증가
– 배정, 반복, 선택 개념
LDA X
ADD Y
STA Z
Z := X + Y
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
1
2
t := x ;
2
t := x ;
3
x := y ;
3
x := y ;
4
y := t ;
4
y := t ;
5
else
if (x > y) {
5
}
else {
6
x := x + y ;
6
7
y := y + l ;
7
x := x + y ;
8
y := y + l ;
8
endif ;
9
}
17
1.3 프로그래밍 언어에서의 추상화
• 제어 추상화 (4 of 5)
– 구조 추상화 (structured abstraction) 의 예
• Java와 Ada의 반복문
//Java의 예//
//Ada의 예//
1
i=0;
1
i := 0 ;
2
do
2
loop
3
4
i=i+1;
while (sentence(i) = ‘$’) ;
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);
1
PROCEDURE gcd (u,v : INTERGER) : INTEGER ;
2
BEGIN
3
VAR y, t : INTERGER
3
4
BEGIN
4
5
x := u ; y := v ;
5
6
LOOP
6
7
8
IF y <= 0 THEN
EXIT
9
END ;
10
t := y;
11
y := x MOD y;
12
x := t;
13
END;
14 END gcd;
7
8
IF v = 0 THEN
RETURN u ;
ELSE
RETURN gcd (v, u MOD v) ;
END;
END gcd;
22
1.4 계산 전형 (computational paradigms)
• 함수형 언어(functional L.) 또는 적용형 언어(applicative L.) (3 of 3)
– 절차형 언어를 사용한 함수형 프로그래밍 예
// Modula-2 (최대공약수)
// Java (최대공약수)
1
PROCEDURE gcd (u,v : INTERGER) : INTEGER ;
1
2
BEGIN
2
3
IF v = 0 THEN
4
5
RETURN u ;
ELSE
6
7
8
RETURN gcd (v, u MOD v) ;
int gcd (int u, int v) {
if ( v == 0)
3
return u ;
4
else
5
6
return gcd (v, u % v) ;
}
END;
END gcd;
– 함수형 언어를 사용한 함수형 프로그래밍 예
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
25
1
2
3
4
5
6
7
8
9
10
11
// 객체 지향 언어 (object oriented L.) 예
// Java로 작성된 최대공약수 선언부
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) ;
}
}
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 }
GcdLcm 클래스 사용 예
• GcdLcm 클래스의 객체 g1, g2 정의
GcdLcm g1, g2 ;
• g1의 기억 장소 할당
g1 = new GcdLcm (18, 27) ;
• g1이 갖는 값을 참조
a = g1.gcd ;
b = g1.lcm;
 2004 Y.H. Won, Hongik University.
All rights reserved.
26
1.5 언어 정의
• 프로그래밍 언어의 정확한 형식 정의가 필요한 이유
– 언어의 구조와 의미의 정확한 기술 없이는 프로그래밍이
불가능
– 모호함 없는 언어 구현
– 프로그래밍 과정에서 프로그램이 어떻게 동작할 것인가에
대한 문제 발생 시 유용
– 프로그램 설계 과정을 규격화하는 방법
27
1.5 언어 정의
•
언어 정의의 범주
형식 정의에는 구문(syntax) 정의와 의미(semantic) 정의가 있음
–
언어 구문 정의
• 언어 구문에 관한 정의는 형식화가 많이 되어 있음
• 대부분의 언어가 문맥 자유 문법을 만족하며 BNF로 정의
• 예 : Pascal의 if 문
<if 문> ::= if <조건> then <문> [ else <문> ]
–
언어 의미 정의
• 의미는 프로그램의 실행 시 어떤 일이 발생하는가를 기술
– 예 : if 문에서 조건문이 거짓으로 판명 되었을 때,
else 문 이하가 존재하지 않을 경우
• 언어 의미론은 형식화 미비
• 의미론의 형식적 정의 방법 : 디노테이셔녈 (denotational) 의미론,
액시어매틱 (axiomatic) 의미론