Language Systems
사람이 이해하는 언어 : high-level language
기계가 이해하는 언어 : low-level language
어떤 프로그램이 언어가 동작하기 위해서 그 시스템을 어떻게 구현할 지 그려져야 하는데
어떻게 동작하는지에 대한 내용을 보려고 함
Specification + Implementation
java의 경우
syntax는 specification, jvm은 implementation
Implementation
어떻게 써야 좋은 코드인지, 그 스타일을 명시해주는 역할
Part of COMPUTER
- CPU + Heatsink
- RAM : random access memory (short-term) FAST
- STORAGE HardDrive: Long-term storage, Solid-state drive
- Expansion Slots : video card, wireless card,
- power supply unit
폰 노이만 구조
각 I/O device 간 속도 차이를 고려한 설계 방식
- central processing unit (process)
- control unit
- arithmetic/Logic Unit
- memory unit : hard disk(작성한 코드, 데이터) (fetch store)
Classical Sequence
중요 다 암기 (최종은 binary/기계어)
object file은 binary
(java 돌리면 .java -> .class)
(python은 이런 중간 파일이 없다)
load는 CPU에 올리는 작업을 칭함
모두 컴퓨터에서 돌아가는 소프트웨어
1. Compiler Translate to assembly language
interm. code generation
2. Assembling
3. Linking
fred 단어는 linking에서 Library를 가져와서 인식한다.
각 단계마다 어디에 어떤 데이터 형태로 저장되어 있는지 알아야 한다.
(지금까지는 하드디스크에)
CPU 올려두기 전에 합치는 역할
lib : (static) library
dll : dynamic library
4. Loading
Executable file로의 변환을 위해
각 위치 주소를 표시하여 CPU에 올라감
이제야 하드디스크 탈출
4. Running - Optimization
저기서 기계어에 대한 Opimizer가 알아서 작동한다
optimization은 같은 결과를 출력하더라도 더 빨리 또는 계산량이 낮게 구현하자는 것
변수 삭제, 코드 추가 등등 여러 방법이 있음
Variation classicial sequence : Interpreter VS Compiler
Variation 1. Hiding the Steps
Variation 2. IDE : Integrated Development Environments
Variation 3. Interpreters
파이썬은 인터프리터 기반 언어로
어셈블리어로 변환하는 것이 아닌 소스코드를 그대로 해석하는 언어를 칭함
한 줄 씩 번역하는 동안 컴퓨터가 기다려야 하기에 느리다.
Variation 4. Virtual Machine : Interpretive Compilers
컴파일러는 기계 종류마다 object file이 모두 달라진다.
이는 인터넷 환경처럼 다양한 기계에 동작할 수가 없음 (platform independent)
다음은 Java VM.
일반적인 binary code를 생성해서 각 기계에서 interpreter로 해석
+) Tombstone Diagram ( 잘 봐 두 기)
네모는 조립이 잘 되도록 그린 것. source가 있다면 target이 있어야 하니까
+) Intermediate Language Spectrum
1. pure interpreter (python)
- Intermediate language = High-level language
2. tokenizing interpreter
- Intermediate language = token stream
3. intermediate-code compiler ( interpretive compiler ) (java)
- Intermediate language = virtual machine language
4. Native-code compiler
- Intermediate language = physical machine language
Variation 5. Delayed Linking == Dynamic linking
Static Linking VS Dynamic Linking
static linking : linking 시점에 모든 라이브러리를 올려두지만
dynamic linking : 나중에 load, run할 때 나머지 라이브러리를 올려준다
여러 프로그램에서 동시에 쓰는 경우 다시 올릴 필요 없이 share하면 되기에 delay를 한다
(.dll 파일 - 하드디스크에 있음 - 필요할 때 가져다가 쓰는 방식)
런타임에서 필요할 때만 들고 오는 상황은 다음과 같다.
라이브러리 100개 중 5개는 항상 호출되고 나머지는 예외 상황에만 필요한 경우 올릴 필요가 없음
이런 파일들은 운영체제마다 확장명이 다르다
(Window -dll, Unix -so)
Variation 6. Profiling
classical sequence를 2번 돌린다
처음에는 많이 그리고 빈번히 실행된 부분에 대한 통계 자료를 수집한다.
두 번째에는 코드가 더 나아질 수 있도록 그 정보를 바탕으로 컴파일한다.
Variation 7. Dynamic Compilation == Just-in-time compilation (JIT) == Dynamic translation
- 호출된 곳만 컴파일하기
- 인터프린터로 시작해서 오직 자주 호출된 곳만 컴파일 함
- 처음에는 대충 컴파일 한다. 자주 실행된 부분에 시간을 더 투자하여 native code로 컴파일 한다.
- (physical machine code == native code)
'CS > Programming Language' 카테고리의 다른 글
ML: Higher-order Functions (0) | 2022.11.11 |
---|---|
ML: Semantics - "Types", Polymorphism, Scope (0) | 2022.11.10 |
모호성 (0) | 2022.10.31 |
Programming Syntax 2 (0) | 2022.10.30 |
Programming Syntax (0) | 2022.10.30 |