(7.1) 서론
식과 배정문
PL에서 가장 기본적인 문장
ㅡ> 배정문
ㅡ> 연산의 결과값을 왼쪽(변수)에 담아두는게 배정문
컴퓨터가 할 수 있는 것은 식에대한 연산
배정문의 오른쪽이 식(expression)
ㅡ> 수학의 식
(7.2) Arithmetic Expressions
Unary, Binary, Ternary Operator
ㅡ> 피연산자 1개, 2개, 3개인 연산자
ㅡ> 함수로치면 파라미터 개수
infix, prefix
ㅡ> 연산자의 위치
ㅡ> 일상에서 사용하는건 infix
(7.2.1) Operator Evaluation Order
하나의 식 안에서 여러개의 연산자가 나타날 때 우선순위
ㅡ> Precedence
ㅡ> Associativity
(7.2.1.1) Precedence
곱하기를 더하기보다 먼저한다 등
(7.2.1.2) Associativity
= 결합법칙
같은 우선순위의 연산자가 여러개일 때
ㅡ> 좌결합 or 우결합
ㅡ> 대부분 좌결합
ㅡ>
좌결합
ㅡ> a+b+c+d
ㅡ> ((a+b)+c)+d
우결합
ㅡ> 2**3**7
ㅡ> 2**(3**7)
(7.2.1.3) Parentheses
괄호는 가장 우선순위가 높다.
ㅡ> 가장 우선 처리
(7.2.1.4) Ruby Expressions
순수 객체지향 언어 (pure o.o._
ㅡ> smaltalk
ㅡ> ruby
pure에서는 모든 변수를 전부 object로 본다.
ex) int a, int b
ㅡ> int가 클래스, a가 object
ㅡ> a+b하면, a가 b에 메세지를 보내서 더하기연산 해달라고 호출
ㅡ> b는 int 클래스의 인스턴스니까, int에서 제공하는 메소드인 (+)를 활용
ㅡ> 속도가 엄청나게 느리다
(7.2.1.5) Expressions in Lisp
함수언어
괄호열고로 시작 '('
그다음 연산자 (prefix)
term이 expression
(7.2.2) Operand Evaluation Order
(7.2.2.1) Side Effects
부작용
함수를 수행하면서 자기것 이외의 변수를 건드림
ㅡ> 자기것 : local 변수
ㅡ> global변수나 호출자의 변수(call by reference)를 건드림
ㅡ> 모듈간의 카풀링이 생김 (서로 영향받음)
ㅡ> 그래서 만든 개념이 객체지향
(그림 12-2pdf)
함수들을 쭉 나열했을 때 (절차지향)
모듈들의 결합이 생기면
그걸 찾는게 어렵고, 하나를 수정하면 다른것도 영향을 받아버린다.
그래서 데이터가 있으면 클래스를 만들어서 못건드리게 만든다.
사용자가 클래스의 자료를 직접 건드리는게 아니라, 클래스한테 요청해서 메소드로 자료를 건드림.
(클래스 : 자료 + 메소드)
(7.3) Overloaded Operators
Overloaded function
ㅡ> 같은 이름의 함수가 여러개
ㅡ> polymorphism을 위함
ㅡ> 실제로 여러개 존재하지만, 사용자 입장에선 하나있는 것처럼 편리성
ㅡ> actual parameter로 구분
Overloaded operation
ㅡ> '+'기호를, int 덧셈에도 쓰고, float 덧셈에도 쓰고, string 덧셈(concatenation)에도 쓰고...
ㅡ> 하나의 기호를 여러종류로 쓴다.
(7.4) Type Conversions
ㅡ> coercion
ㅡ> cast
(7.4.2) Coercion in Expressions
coercion
ㅡ> implicit type conversion (묵시적인)
ㅡ> 컴파일러나 runtime system이 해준다.
ㅡ> strong type checking하는 언어에서는 이것을 권장안함
ㅡ> 일반적으로, 받는쪽이 큰 type이면 coercion을 해줌.
ㅡ> 큰type의 의미 : 정보의 손실이 없는 쪽
ㅡ> int를 float에 넣으면 손실x (widening)
ㅡ> float를 int에 넣으면 손실o (narrowing)
ex) x=a+b;
x와 a,b의 type이 다를 때
error로 칠것이냐, 적당히 처리할 것이냐.
적당히 처리 ㅡ> x타입에 맞춤 (결국 결과는 x니까)
(7.4.2) Explicit Type Conversion
cast
ㅡ> explicit type conversion (명시적)
ㅡ> strong type checking
ㅡ> 프로그래머가 명시적으로 타입변환
ex) x=a+b;
(int)a = int(b);
(7.4.3) Errors in Expressions
계산중에 발생하는 Exception
ㅡ> Overflow
ㅡ> Underflow
Java에서는
ㅡ> Arithmetic Exception로 분류
ㅡ> run-time Exception (프로그램 실해중 발생)
(7.5) Relational and Boolean Expressions
결과가 True/False
if문, whlie문 등
(7.6) Short-Circuit Evaluation
(합선 그림)
Short-Circuit (합선)
ㅡ> 전기회로에 쓰이는 말
ㅡ> 회 : 돌아올 회
ㅡ> 더 짧은 회로로 전기가 흐르는게 합선
그래프 Circuit
ㅡ> 자기한테 돌아오는 길이 있으면 circuit
ㅡ> = cycle
ㅡ> 해밀튼 circuit
a*b*c*d
ㅡ> a=0이면 뒤에는 계산할 필요가 없다
ㅡ> 그러한 의미로 short-circuit
ㅡ> 우리는 관심없지만, 포트란같이 계산 많이하는 곳에서 실행시간 단축하는 요소
'CS > 프로그래밍 언어론' 카테고리의 다른 글
과제 (0) | 2024.06.08 |
---|---|
9장 Subprograms (함수) (0) | 2024.06.04 |
[양PL] 6장 Data Type (0) | 2024.04.30 |
[양PL] 5장 Names, Bindings, and Scopes (0) | 2024.04.25 |
[양PL] 4장 Laxical and Syntax Analysis (0) | 2024.04.04 |