일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- shrinkmatch
- Pseudo Label
- BYOL
- Meta Pseudo Labels
- GAN
- shrinkmatch paper
- dann paper
- remixmatch paper
- cifar100-c
- 딥러닝손실함수
- 최린컴퓨터구조
- tent paper
- Pix2Pix
- mme paper
- conjugate pseudo label paper
- ConMatch
- 컴퓨터구조
- CycleGAN
- WGAN
- adamatch paper
- simclrv2
- UnderstandingDeepLearning
- CGAN
- CoMatch
- Entropy Minimization
- SSL
- semi supervised learnin 가정
- mocov3
- dcgan
- 백준 알고리즘
- Today
- Total
Hello Computer Vision
비전공생의 컴퓨터구조 2주차 강의 기록 본문
지난 주말에 1주차 강의를 들었고 정신이 없어 다음날 2주차 강의를 듣지 못하고 하루 건너뛰어
강의를 듣고 지금 기록한다. 시험기간이 오기 전에 최대한 다 빨리 들을 생각이다.
2주차 강의는 기계어 즉 머신 Language에 대한 주제로 시작하였다.
자연어로 컴퓨터에게 명령하는 것이 편리하지만 기술이 부족하다.
궁극적인 목표가 컴퓨터와 우리가 자연어로 대화하는 것이며 언젠가는 그렇게 될 것이다.
Machine Language : 단위가 명령어이다. 명령어를 바로 state 시킨다.
high level Language : 단위가 statement, 바로바로 state시킨다.
interactive Language : How를 입력시킨다. 일일이 다 입력시켜주어야 한다.
Functional Language : What 을 입력시킨다.
일부 분야, 작업들에 한해 각 language들만의 장점들이 들어난다.
파이썬은 많은 부분 혼합되어 있고, 인터프리터, 컴파일을 바로 할 수 있다.
(나는 자바와 파이썬을 바로 시작해서 몰랐는데 C프로그래밍 하는 걸 보니까 코드를 짠 후에 컴파일이라는 작업을 거치더라)
우리가 코드를 짠 것은 단순히 Symbol에 불과하다.(너무나도 당연하지만 기본이다.)
그래서 이러한 Symbol들을 Machine Language(0,1의 집합들)로 translate해줘야 하는데 이것을 해주는 것이
컴파일러이다. (컴파일러라는 과목이 하나 따로 있을 정도로 중요하다고 한다)그 다음에야 실행파일이 나온다.
인터프리터는 translation과 동시에 결과물을 낸다.(그렇다면 interpreter를 쓰는 것이 이득이 아닌가? 생각이 들었다. 그래서 인터프리터와 컴파일의 장단점관련해서 추가로 서칭해볼 계획이다.)
어셈블러는 컴파일러의 일부분이다.
Machine Language와 거의 1:1로 매칭되는 symbolic Machine Language 가 어셈블리 프로그래밍 랭기지이다.
인터프리터의 대표적인 예시가 Java Virtual Machine(JVM)이다.
자바가 실행하는 단계는 다음과 같다.
자바프로그램을 자바 바이트코드로 작성한다.(자바 명령어들의 집합 > JVM이 이해할 수 있는 언어)
자바 컴파일러로 컴파일을 하고 실행코드가 된다.
JVM(인터프리터)으로 실행한다.
Program -> Compiler -> Target Program 이러한 순서로 흘러간다.
컴파일러를 어떻게 구성하냐에 따라 결과가 다르며 효율적으로 실행될 수 있다.
1. Input에 대해 동일한 결과가 나와야한다.
2. 얼마나 효율적으로 컴파일러가 작동하는가(비트로 변환하는데 얼마나 효율적으로 변환하는지)
3. 컴파일러가 얼마나 빠른지(결과를 얼마나 빠르게 나타내어주는지)
추가로 에러가 난다면 어디서 에러가 났는지 컴파일러가 알려줘야한다.
C프로그램을 컴파일하고 하면 그게 실행파일이 아니다. 하나의 Object file이다. linker를 통해 합쳐준다.
(가볍게 한번 생각해보면 우리는 많은 라이브러리, 다른 곳에 있는 변수 등을 불러오곤 하는데, 다른 파일에 있는 것들을 배제외하고는 실행파일이 될 수 없을 것 같으며 오류가 생길 거 같다. 이 부분은 다음에 또 강의해주신다고 한다.)
컴파일러의 작동순서
Lexical analyze(코드 Token화, 품사 결정) -> Syntax Analyze(Token들 모아 state로 변경) -> Intermediate code generator(의미가 맞는지 체크)
-> Code optimizer(백엔드 부분이다. 효율적으로 최적화) -> Target code generator(명령어 실행)
(이렇게 살펴보면 프로그래밍 언어도 우리가 배우는 자연어와 다를바 없다고 생각을 하였다.)
Machine State
Machine의 State 들을 정확하게 정의해줘야한다.
명령어의 역할은 메모리의 state와 레지스터를 변경하는 것이다.
레지스터란?
메모리에서부터 명령어들을 읽어오면 CPU내부에 저장할 장소가 있어야하는데 그게 레지스터이다.
하나만 있으면 불편하니 운영체제에 따라 32개 128개 등이 있다.(레지스터도 따로 서칭해서 찾아 공부할 계획이다)
컴퓨터는 단순하다.
메모리에서부터 명령어를 읽어와서 덧셈뺄셈을 하고 다시 메모리를 쓰는 것이다.
요즘은 메모리에 있는 레지스터에 읽어와서 저장되어 있는 연산을 수행한다.
우리가 Load하면 메모리로부터 레지스터를 읽는다. 그 메모리가 캐시인지, 메인메모리인지 구분하지 않는다.
프로그래머 입장에서는 가상메모리이다. DRAM만 피지컬 메모리이고 나머지는 가상의 메모리이다.
메모리에서 입출력할 수 있는 최소 단위가 Byte이며 1Byte마다 주소를 가진다.(byte addressable)
32bit운영체제에서는 2의 32승 -1 바이트로 주소를 저장할 수 있으며 이는 프로그램의 크기가 4GB를 넘을 수 없다는
것을 의미한다. 시간이 갈 수록 프로그램의 크기가 커지기 때문에 64비트 운영체제를 많이 사용하고 있다.
주소의 크기가 프로그램의 크기를 정한다.
Alignment
주소들은 데이터 크기(배수)로 다 Align되어 있다.
Instruction Type
Arithmetic, Logic : 기본 연산 ex) Add, Fadd(부동소수점 연산)
Data transfer, memory transfer
Control transfer : 프로그램의 순서를 바꾸어준다. ex) jump, call
각 타입마다 명령어들을 구성하는 타입이 다름을 알 수 있다.(재밌구만..?)
강의를 들으면서 최대한 많은 부분 따라가려고 노력했는데 틀린 점 지적해주시면 감사하겠습니다.
https://www.youtube.com/watch?v=Uc5MOjgZosE
해당 필기는 최린 교수님 강의를 듣고 필기한 것입니다.
'컴퓨터구조' 카테고리의 다른 글
비전공생의 컴퓨터 구조 4주차 강의 기록 (1) | 2022.11.06 |
---|---|
비전공생의 컴퓨터 구조 3주차 강의 기록 (0) | 2022.11.04 |
레지스터(Register)란? (0) | 2022.11.02 |
컴파일러(Compiler)와 인터프리터(Interpreter) 차이 (0) | 2022.11.02 |
비전공생의 컴퓨터구조 1주차 강의 기록 (0) | 2022.10.31 |