원칙들 chapter 3 설계의dongseo.ac.kr/~dkkang/pl2009spring/ch03.pdf · 하는 능 력 •...
Post on 05-Nov-2019
1 Views
Preview:
TRANSCRIPT
Cha
pte
r 3
언어설계의원칙들
역사와설계의지표들
효율성과규칙성
다른언어설계의원칙들
케이스스터디
: C++
무엇이좋은언어인가
?
•언어의설계
–좋은언어가가지는바람직한특성은무엇인가
?
•언어가성공할지는예측하기어렵다
–Pa
scal은성공했으나
, Modul
a-2는실패
Progra
mm
ing L
angua
ges
2
–Pa
scal
, Modul
a-2
–Alg
ol6
0은성공했으나
, Alg
ol6
8는실패
–FO
RTRAN은성공했으나
, PL/
I는실패
•언어가성공하는이유는
?–실용성
: 사용의용이함
(ava
ilabili
ty), 가격
, 번역기의질
–킬러응용
: C는유닉스
, 자바는인터넷
, …–설계개념의일정함
(필요조건
)
언어의중요한특성들
•설계의목표를명심해야함
•좋은프로그래밍언어가가지는중요한특성
은 –단순성
(Nik
laus
Wirth
)–언어구성요소
(lang
uage
cons
truc
ts) (C
. A. R
.
Progra
mm
ing L
angua
ges
3
–언어구성요소
(lang
uage
cons
truc
ts) (C
. A. R
. H
oare
)–멋진기능들의모음만은아님
(Bja
rne
Stro
ustrup
)→서로상충되는대답
… 즉
,애매한문제
•따라서이장에서는
설계원리를조망해보고
프로그래밍언어의좋은예와나쁜예를리뷰함
Java는언제나
C보다쉬운가
?
•ht
tp://w
ww.b
orlan
dfo
rum
.com
/im
pboa
rd/
impboa
rd.d
ll?ac
tion=
read
&db=bcb
_qna
&no
=22
383
Progra
mm
ing L
angua
ges
4
역사와설계지표
•19
50 년대
–효율성이제일중요함
–쓰기쉬운점과읽기쉬운점은부차적인지표
•19
60년대
Progra
mm
ing L
angua
ges
5
•19
60년대
–추상화메커니즘이중요해짐
•19
60 년대
~ 1
980년대초기
–단순성과신뢰성이강조됨
•19
80 년대
~ 1
990년대
–수학적인정밀도가높아짐
효율성
•FO
RTRAN의주된목표
•C/C
++같은언어들에게는아직도중요한목
표•효율성의다양한측면
–실행코드의효율성
: 컴파일최적화와연관됨
Progra
mm
ing L
angua
ges
6
–실행코드의효율성
: 컴파일최적화와연관됨
–번역기의효율성
: 원-패스컴파일러
?–구현의어려운정도
(구현용이성
): 번역기를만드
는데의효율성
–프로그래밍효율성
: 표현의풍부함
(표현력
)–신뢰성
(rel
iabili
ty)와유지보수용이성
(mai
ntai
nabili
ty): 판독성
(rea
dab
ility
)과연관됨
C 코딩에서의최적화
•W
riting
Effic
ient
C a
nd C
Code
Optim
izat
ion
•ht
tp://w
ww.jo
inc.co
.kr/
modul
es/m
oni
wik
i/w
iki.p
hp/S
ite/C
/Docu
men
ts/C
Optim
izat
iow
iki.p
hp/S
ite/C
/Docu
men
ts/C
Optim
izat
ion
Progra
mm
ing L
angua
ges
7
규칙성
(Reg
ular
ity)
•언어의특성들이어떻게통합되어있는가
?•규칙성은다음과연관되어있음
(중요
!)–일반성
(Gen
eral
ity)
: 특별한경우를피함
(75쪽
)–직교성
(Ort
hogona
lity)
: 언어기능을사용함에
Progra
mm
ing L
angua
ges
8
–직교성
(Ort
hogona
lity)
: 언어기능을사용함에
있어문맥에독립적으로함
–일률성
(Uni
form
ity)
: 보이는바와행동하는바
가일관성있음
(외모와행동이일치
~)
일반성
(Gen
eral
ity)의예
(76쪽
)
•프로시저변수
–파스칼은프로시저매개변수는있으나
, 프로시저변수는지원하
지않음
–C 언어는함수포인터로프로시저변수지원
•가변길이배열의예
–파스칼은지원하지않으나
, C, A
da,
그리고
FORT
RAN
은지원함
Progra
mm
ing L
angua
ges
9
–파스칼은지원하지않으나
, C, A
da,
그리고
FORT
RAN
은지원함
•등가연산자의응용
–C 언어는배열의비교를지원하지않으나
, Ada는지원
•상수
(Cons
tant
)의선언
–대부분의언어들은상수의초기값에대한제한이있음
C의함수포인터
int func()
{
return 0;
} int main()
int main()
{
int (*fp1)() = &func;
(*fp1)(); // 함수포인터로함수호출
}
Progra
mm
ing L
angua
ges
10
직교성
(Ort
hogona
lity)의예
(76쪽
)
•반환형
(Ret
urn
Type)
–파스칼
: 스칼라
(sca
lar) 또는포인터
(poin
ter) 형
–C, C
++: 배열형은제외
–Ada와대부분의함수언어들
: 모든형들
(Dec
lara
tion)
(C
#
)
Progra
mm
ing L
angua
ges
11
•선언
(Dec
lara
tion)
�실습해볼것
(C# 포함
)–
C: 블록의처음
–C++: 블록의어디에서도선언가능
•매개변수전달
(Par
amet
er P
assing
)–
C에서의매개변수전달방법은배열을제외하고
는값전달
(pas
s-by-
valu
e) →
직교적이지않음
C의선언
#include <stdio.h>
int main()
{
int i = 10;
printf("i = %d\n",i);
int k = 30; // 에러
(C에서선언은블록의처음에만가능)
int k = 30; // 에러
(C에서선언은블록의처음에만가능)
// C++에서는에러아님
{
int j = 20;
printf("j = %d\n",j);
} printf("j = %d\n",j); // 에러
(범위밖)
}
Progra
mm
ing L
angua
ges
12
C에서다차원배열의매개변수전달
void func1(int *ar1, int len) { }
void func2(int (*ar2)[3], int len) { }
void func3(int (*ar3)[5][6], int len) { }
int main()
{{
int ar1[5];
int ar2[2][3];
int ar3[4][5][6];
func1(ar1,5);
func2(ar2,2);
func3(ar3,4);
}
Progra
mm
ing L
angua
ges
13
일률성
(Uni
form
ity)의예
•딜리미터
(Del
imite
rs) �실습
(C# 및자바
포함
)C++에서
–클래스정의의경우
; 으로끝나야한다
Progra
mm
ing L
angua
ges
14
–클래스정의의경우
; 으로끝나야한다
–함수의정의는
; 으로끝나면안된다
•값의반환
–파스칼에서의값반환은배정문
assignm
ent)처
럼보임
�일률적이지않음
(77쪽
)
규칙성의몇가지더할얘기들
•왜불규칙적인것들이생기는가
?–역사적인이유
: 과거의기능과의호환성
–실제적인이유
: 스택기반실행환경의한계
(8장
)
•언어설계에있어지나치게일반성또는직교성
Progra
mm
ing L
angua
ges
15
•언어설계에있어지나치게일반성또는직교성
을기대하는것은위험할수있음
(78쪽
)–어느정도의트레이드
-오프
(tra
de-
offs
) 가필요함
–트레이드
-오프란
? (c
f: 데드락
, cat
ch-2
2)
기본적인
설계목표
규칙성추구로인해
생길수있는복잡성
trade-off
단순성
(Sim
plic
ity)
(79쪽
)
•C 언어의특징중하나임
•파스칼이주된성공한이유
•단순성은규칙성이아님
–Alg
ol6
8은규칙적이지만단순
하지않음
•단순성은언어구성의개수가적다고달성되는것이아
Progra
mm
ing L
angua
ges
16
•단순성은언어구성의개수가적다고달성되는것이아
님: L
ISP은언어구성요소의개수가적으나
, 매우복잡한
실행환경을가짐
•즉
, 지나치게단순화된언어는사용하기어려움
“Eve
ryth
ing s
houl
d b
e m
ade
as s
imple
as
poss
ible
, but
no
t sim
ple
r”—
Alb
ert Ei
nste
in모든것은가능한한단순하게만들어져야하지만
, 너무단
순해서는안된다
.
단순성
•오캄의면도
날, 또는검약
의원리
(princ
iple
of
pars
imony
)•출처
: Model
•출처
: Model
Se
lect
ion
and
Mul
tim
odel
Infe
renc
eby
Burn
ham
an
d
And
erso
nPr
ogra
mm
ing L
angua
ges
17
표현력
(Exp
ress
iven
ess)
•복잡한과정이나구조를언어가얼마나쉽게
표현할수있는가를나타내는것
•단순성과상충될수있음
: Alg
ol6
8은표현력
이좋지만복잡한언어
•객체지향언어가인기있는이유
Progra
mm
ing L
angua
ges
18
•객체지향언어가인기있는이유
•표현력은간결함이라고도볼수있는데
, 간결함이지나치면가독성
(rea
dab
ility
)이떨어
짐 C 코드예
)while (*s++ = *t++); // 유명한
유명한
유명한
유명한예제이나
예제이나
예제이나
예제이나피해야
피해야
피해야
피해야함 함함함
(cf: C 언어의
언어의
언어의
언어의시퀀스
시퀀스
시퀀스
시퀀스포인트
포인트
포인트
포인트)
확장성
(Ext
ensibili
ty)
•사용자가새로운기능을언어에추가할수있게하는능
력
•새로운데이터형이나함수정의
•키워드나언어구성요소를번역기가처리할수있도록
추가
: LIS
P 에서는이러한환경의변경이가능함
Progra
mm
ing L
angua
ges
19
추가
: LIS
P 에서는이러한환경의변경이가능함
•연산자오버로딩
(Ada,
C++, C
#) �실습
C++, C
#•새로운연산자정의
(oper
ator) (H
aske
ll은가능
)•확장성이없는단순함을가진언어는무용
(無用
)함•언어의설계자는
, 언어를처음설계할때
,어떤특성이언
어의핵심으로포함되어야하는지를결정해야함
제약가능성
(Res
tric
tabili
ty)
•(가능한한간편하게
) 언어주제들을정의하는능력
�뭔
소류
?–프로그래머가그언어에대한최소한의지식과최소의구문을
사용하여프로그램을작성할수있도록함
•어떤특성이언어의기본기능으로들어가야하는가
? 아
니면라이브러리로지원되야하는가
? (자바
Thre
ad v
s. C
Progra
mm
ing L
angua
ges
20
니면라이브러리로지원되야하는가
? (자바
Thre
ad v
s. C
PT
hrea
ds)
•구문적당의
(構文的糖衣
; syn
tact
ic s
ugar
)로프로그램의
이해도를높일수있음
(C에서
for 루프는
whi
le 루프의
synt
actic
sugar
)•사용하지않는기능으로인해속도나시간같은성능의
저하가있으면안된다
이미채택된표기법과관례와의일관성
•언어는경험있는프로그래머들이배우기쉬워야한다
반례들
)–
Alg
ol6
8 에서는
“typ
e” 대신
“mode”
키워드사용
–FO
RTRAN
에서는공백무시
•D
O 9
9
I =
1.1
0 �
DO
99I = 1
.10
Progra
mm
ing L
angua
ges
21
•D
O 9
9
I =
1.1
0 �
DO
99I = 1
.10
–FO
RTRAN의키워드들은예약되어있지않다
•최소경악의법칙
(The
law
of le
ast as
toni
shm
ent)
“Thi
ngs
shoul
d n
ot ac
t or
appea
r in
a c
om
ple
tely
une
xpec
ted
way
”모든것들은완전히예상밖으로행동하거나나타나서는안됨
다른설계원칙들
•엄밀성
(Pre
cise
ness
(또는명확성
Def
inite
ness
))–정확한언어의정의가있어야한다
–Ba
ckus
Nau
r Fo
rm 또는
Exte
nded
Bac
kus
Nau
r Fo
rm (중요
! 4
장에서다룸
)
•기계독립성
Progra
mm
ing L
angua
ges
22
•기계독립성
–기계종속적인부분을명확히찾아내서고립시킴
–예
: C 언어에서
limits.h 와
float
.h
•보안–프로그래밍오류를줄이고
, 오류가발견되면보고하기쉽도록함
“Max
imiz
e th
e nu
mber
of er
rors
tha
t co
uld n
ot be
mad
e” —
C. A
. R. H
oare
, 198
1범할수없는오류의수를극대화한다
케이스스터디
: C++ (1/
3)
•배경
–Si
mul
ar67이너무비효율적이다
–C 기반의시뮬레이션에적합한새로운언어필요
•초기의설계목표
Progra
mm
ing L
angua
ges
23
•초기의설계목표
–프로그램작성이숴워야한다
–클래스와엄밀한
형체크
–효율성
: C와호환가능해야한다
–실제적인문제들
: 이식성
, 구현가능성
, 상호작용성
케이스스터디
: C++ (2/
3)
•C w
ith
Cla
sses
(10
79~80
)–
Cpre
: C++ 코드를
C 코드
로번역함
–중요한특징들이빠져있었
음
(virtu
al
•C++ (19
85): 확장된설계목표
들 –C와의호환성
–단순히가능하니까멋진기능
을추가하는
feat
urism
배제
–오버헤드를최대한줄인다
–
Progra
mm
ing L
angua
ges
24
•가상함수
(virtu
al
func
tions
)•템플릿
(tem
pla
te)
•일반적인오버로딩
–오버헤드를최대한줄인다
–“z
ero-o
verh
ead” 규칙
–다중패러다임언어
(“m
ultipa
radig
m”
)–엄밀한형체킹
–단계적으로배울수있게함
–다른언어들과의호환성
케이스스터디
: C++ (3/
3)
•성장과표준화
1985
. 저자의첫번째
C++ 책이나옴
1986
. 첫번째상업적인컴파일러등장
1987
. USE
NIX에서
C++에대한첫번째학술대회
1989
. ARM
(Ann
ota
ted R
efer
ence
Man
ual)이나옴
Progra
mm
ing L
angua
ges
25
1989
. ARM
(Ann
ota
ted R
efer
ence
Man
ual)이나옴
1994
. STL
(Sta
ndar
d T
empla
te L
ibra
ry)이추가됨
1998
. 미국표준
(AN
SI/ISO
) C++
•실수들
(mista
kes)
–비슷한일들을하는데
, 너무많은방법이있음
–표준적인라이브러리가처음부터나오지는않음
(cf. 자바
)
top related