교재
Concepts of Programming Languages 11th
11pg) 감사의 말
Acknowledgment
통신
Sender가 보낸 것을 Reciver가 받았는지 확인해야 하기 때문에
Ark, 즉 Arknowledgment(답신)를 보낸다.
책에서 Acknowledgment는 감사의 말을 전할 사람들의 목록을 적는다.
18pg) 목차
자연어 vs PL
자연어 ㅡ> 'Sentence.'의 집합
프로그래밍 언어 ㅡ> 'Statement;'의 집합
프로그램을 짜는 도구
배정문 (Assignment Statement)
ㅡ> 변수의 값을 바꾼다
e.g.) a = b + c;
우측의 식을 expression이라고 한다.
cpu에서 연산해서 값을 변수에 넣는다.
제어문 (Control Statement)
ㅡ> PC의 값을 바꾼다
ㅡ> (프로그램의 흐름을 바꾼다)
1) Loop
ㅡ> for
ㅡ> while
2) Selection
ㅡ> if
ㅡ> switch
(1.1) PL공부의 장점
(1.1) PL공부의 장점
- 아이디어 표현 능력 ↑
- 상황에 따라 적절한 언어를 선택하는 능력 ↑
- 새로운 언어 학습 능력 ↑
기반기술, 핵심기술 알고 있으면 새로운 것을 금방 쫓아간다.
(1.2) Programing Domains
(1.2) 새로운 PL이 생기는 이유
새로운 도메인 ㅡ> 기존PL을 사용하면 불편 ㅡ> 새로운 PL 만듬
(1.3) 언어 평가 기준
(1.3) 언어 평가 기준
1. 읽기 쉬운 정도 (Readability)
2. 쓰기 쉬운 정도 (Writability)
3. 신뢰성 (Reliability)
직교성 (Orthogonality)
직교성 (Orthogonality)
ㅡ> 독립적인 요소로 쪼개지는 것
e.g.) CISC RISC
RISC : 기본적인 Instruction만 제공해서 그것들을 레고처럼 조합.
CISC : 더 많은 Instruction을 제공
RISC가 더 직교성 있다.
RISC 하드웨어가 더 간단하다.
ㅡ> Instruction set이 적기 때문
CISC가 더 빠르다.
ㅡ> 복잡한 Instruction을 여러가지 Instruction으로 처리하는 것보다, 하나로 처리하는게 빠르기 때문
신뢰성 (Reliability)
ㅡ> 쓰기, 읽기는 언어니까 당연한데, 신뢰성은 무엇일까?
ㅡ> 언어에 제약이 많을 수록 안정성이 높아지고 실수할 확률이 적어지는 것
(1.4) Influences on Language Design
(1.4.1) 컴퓨터 구조 (Computer Architecture)
CPU, Memory
- 목적파일 메모리에 저장
- 메모리에서 CPU로 명령어 Fetch
- Control Unit에서 명령어 Decode
- 명령어 Execute
- PC : 명령어 주소를 저장하는 레지스터
CPU 속도단위
- Hz
- MIPS (초당 백만개 Intruction 수행)
컴파일러
배정문
ㅡ> 변수 값 수정
ㅡ> CPU 레지스터에 값 넣고 연산 (load, add, store)
ㅡ> 어셈블리어는 사람보라고 쓰여진거고, 기계어는 '0101001'등의 이진수
ㅡ> a=b+c;의 한 문장의 기계어 4문장으로 컴파일 된 상황
제어문
ㅡ> PC값 수정 (jump)
Instruction cycle
(1.5) Language Categories
(1.5) Language Categories
- 명령형 언어 Imperative
- 함수형 언어 Functional (15장)
- 논리형 언어 Logic (16장)
- 객체지향 언어 Object-Oriented
ㅡ> 이 책에서 배우는 주요한 것은 Imperative
ㅡ> 1번에서 발전한게 4번
ㅡ> 함수언어, 논리언어는 배정문이 없음
ㅡ> script언어 : HTML문서를 다룸
객체지향은 명령형 언어를 기반으로 한다
C언어 ㅡ> C++, JAVA
Web
HTML
ㅡ> Hypertext Markup Language
ㅡ> Hypertext 이전의 text는, 아스키코드
아스키코드 ASCII
ㅡ> 터미널과 컴퓨터의 커뮤니케이션을 위해, Char에 코드를 부여
ㅡ> 8-bit : 자판 256개 커버
이미지
공간당 샘플링 x 색
ㅡ> 이미지를 점(pixel)의 집합으로ㅡ> 공간당 샘플링 많이할 수록 원본과 비슷
ㅡ> 각 점에 color값을 부여
ㅡ> 8-bit : 256가지 색
ㅡ> 16-bit : 65536가지 색
동영상 용량
pixel = 1M
color = 8-bit
프레임 = 30fps
P : 고화질 영상 통신용량 큼
S : 영상압축
소리
시간당 샘플링 x 음역대
ㅡ> 시간에 따라 흘러감 (파형)
ㅡ> 시간당 점을 찍는다 (시간당 샘플링)
ㅡ> 주파수의 2배정도를 샘플링하면 손실없이 재생
ㅡ>ㅡ> 사람목소리 : 초당 8000번 정도ㅡ> 점에 값을 부여 (음역)
ㅡ>ㅡ> 사람목소리 : 8-bit
Trade-Off
샘플링을 많이하면 원본에 가까워지지만저장공간과 통신비용에서 손해를 봄
마크업
이것까지 다 합친 문서를 edited하기 위해 생긴 언어가 마크업
ㅡ> 마크해 놓는 것
e.g.)
/ctr/1.intro
ㅡ> ' 1.intro'를 센터링 하기 위해 마크해놈
/inventation 5/~~
ㅡ> '~~'를 5글자 뒤에 찍어라
브라우저
이 디지털화된 문서를 가지고와서 우리에게 보여주는 것
(1.7) 실행 방법 (Implementation Methods)
High Level Language Program 실행방법
1. 컴파일러 ㅡ> 실행전에 번역, 번역을 미리해놔서 실행때는 빠름
2. 인터프리터 ㅡ> 실행중에 한줄씩 번역, 실시간 번역이라 실행이 느림
3. 하이브리드
(1.7.1) Compilation (컴파일러)
Hilgh Level Language ㅡ> (컴파일) ㅡ> 기계어
최초의 HLL : FORTRAN
최초의 컴퓨터 응용분야 : 계산, FORTRAN도 계산을 위해 쓰임
e.g.) 영어번역
한글자씩 읽어들인다
(Lexeme)
단어(어휘)를 찾는다
언어마다 어휘가 있다
(Syntax analysis)
문법 검사
언어마다 문법이 있다
1단계를 통과 못하면 2단계 안감
(P) 병목현상
병목현상 : Excution이 Fetch보다 빠르다
ㅡ> Von Neumann bottleneck
(S1) 캐쉬 메모리
ㅡ> 빠름, 비쌈
(S2) 메인 메모리↑ ㅡ> 속도↑
ㅡ> 이유는 나중에
하드웨어의 목적
1. 빠르게
2. 작게
(1.7.2) Pure Interpretation
Pure Interpretation : 컴파일x, 소스코드를 기계어로 바꾸지 않고, 소스코드 자체 그대로 읽어서 실행 (인터프리터 자체는 기계어임)
인터프리터 (Interpreter)
HLL을 기계어로 번역(translation)하지 않고
인터프리터라는 소프트웨어 소스코드를 읽어들여서 한문장씩 해석(interpret)한다.
컴파일 하지 않고도 프로그램을 실행 시킬 수 있으므로 버츄얼 머신이라 부름
e.g.) 자바 가상 머신
장점
- 이식성이 좋음 (potability)
(컴파일하게 되면, 기계어가 CPU나 OS에 의존적이라 다른 시스템에서 작동 안할 수도 있음)
단점
- 속도가 느림
- 메모리를 많이먹음 (기계어 대신 소스코드가 올라와 있어서)
ㅡ> 속도가 느려서 큰 프로그램을 짤 때 좋지 않아 도태가 됐었음
ㅡ> 그러나 최근엔 script언어 같은 언어들은 인터프리터 방식으로 처리가 됨
(1.7.3) Hybrid Implementation Systems
(그림 F1.5)
일단 한 단계 컴파일을 거친다
ㅡ> intermediate code 생성
(자바의 경우 byte code라고 부른다)
(byte code는 어셈블리어 코드랑 같은 수준이라고 보면 된다)
intermediate code를 인터프리터가 실행
ㅡ> Pure Interpretation보다는 속도가 빠름
ㅡ> 기계어보다는 느림
자바
자바에서는 JVM으로 byte code를 실행
근데 여전히 느려서
요즘엔 byte code를 기계어로 바꾸고
그 기계어를 실행시킨다 (JIT)
JIT : Just In Time
자바 이식성 (Potability)
byte code는 JVM이나 CPU나 OS에 상관없이 portable하다.
호환성 문제는 굉장히 어려운 문제다.
CPU나 OS가 발전하는데 계속 돌아가게 하려면, 버전관리가 필요하다.
Java는 byte code는 그냥 두고
JVM만 바꾸는 전략을 쓴다. (장점)
(1.7.4) 전처리기 (Preprocessors)
(P) 확장된 C언어가 있다고 치면
이것은 C컴파일러가 바로 못돌린다.
(S) '확장된 C언어'를 'C언어'로 바꾸는 전처리 과정을 거친다
#include 처럼 헤더파일을 가져와서 컴파일해야 되는 경우도 있고
언어를 확장해서 프로그램을 짠다음에 그것을 일반c로 미리 바꿔준다음에 컴파일을 해야 되는 경우도 있다.
이런것을 하는걸 통칭해서 전처리라 부름
(1.8) 개발환경
프로그램을 잘 짜는 것
ㅡ> 언어, 알고리즘 짜는 것도 중요하지만,
ㅡ> 그 못지 않게 개발환경을 잘 활용하는게 중요하다.
e.g.)
파일시스템 라이브러리 에디터 컴파일러 디버거 링커 등등
Unix, Linux
JBuilder ㅡ> Java
최소한 한개정도는 익숙해져야 한다
어떤 회사, 어떤 일을 하고싶은가에 따라서 정보를 알아보고 공부
'CS > 프로그래밍 언어론' 카테고리의 다른 글
[양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 |
[양PL] 3장 Syntax와 Semantics (0) | 2024.03.28 |
[양PL] 2장 언어의 진화 (0) | 2024.03.18 |