CS/Programming Language

Language Systems

WakaraNai 2022. 11. 3. 16:24
728x90
반응형

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

1->2->

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이 있어야 하니까

왼쪽: 문법 설명, 오른쪽: c언어를 x86 용 언어로 바꿔준다는 내용
java->jVM 에서 돌리는 컴파일러와, 어느 머신에서든 돌아가게 하는 인터프리터가 있다.

+) 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)

 

 

java to exe 도 가능은 합니다 (two stage translator)

 

728x90
반응형

'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