반응형

C++로 컴파일러 만들어보기


https://www.yes24.com/Product/Goods/103153057

 

컴파일러 만들기 - 예스24

현대 소프트웨어는 하드웨어의 성능 발전에 힘입어 많은 부분에서 추성화된 덕택에 코딩에 입문하기도 쉬워졌고 원하는 프로그램을 만들기도 쉬워졌다. 하지만 컴퓨터를 더 잘 이해하고 싶고

www.yes24.com

 

  • "컴파일러 만들기" - 유종원 지음
  • 책을 보고 학습한 내용 정리 및 실습을 할 것이다.

 

나의 목표

  1. 책 내용 정리
  2. 나만의 프로그래밍 언어 만든 후 컴파일러 제작.
    1. Github까지 배포해보자.

 

  • 프로그래밍 언어는 한글로 만들 것이다. 
    • 책에서는 저자가 만든 Yulang이라는 형태를 사용한다.
function main() {
	printLine '123';
}
  • 대략 이런 형태임.
    • C++ 로 컴파일러를 작성하면서 작성 저 코드를 scan/parse 하다 보니까 이게 C++인지 Yulang인지 헷갈림.

 

함수 메인() {
	변수 이름 = "머윤";
	출력(1+2);
    출력줄바꿈("Hello");
    출력(이름);
}
  • 이런식으로 한글로 써서 C++과 확실히 구분되게 하겠다 (한글을 써서 좋은 점인가..?)
  • 스펙은 우선 책에 나와있는 최소 스펙으로 만들것임.
    • 변수/배열/map/함수/콘솔출력 정도

 

컴파일러란

코드를 입력받아 코드를 출력하는 프로그램이다. 

소스코드를 받아 목적코드를 만들어낸다.

출처 : https://pintokarsanda.blog.binusian.org/tag/phases-of-compiler/

이 책에서는 크게 3가지 단계를 수행한다. 

1. 어휘분석(Scanner)

2. 구분분석(Parser)

3. 코드생성(Generator)

 

자 이제 시작해보자.

728x90
반응형

SSL/TLS란?

  • HTTP를 이용하여 데이터를 전송할 때, 우리가 주고받는 데이터는 암호화 되어있지 않다.
  • HTTP 통신 방식에 암호화를 추가한 방식이 HTTPS이다.
    • HTTPS에서 사용하는 암호화를 위해 사용하는 프로토콜이 SSL/TLS이다.

SSL, TLS

SSL(Secure Sockets Layer)은 TLS(Transport Layer Security)의 전신으로 시대를 거쳐 1.0, 2.0 그리고 1996년에 3.0이 출시되었다.

이후 1999년 SSL 3.0을 기초로 한 TLS 1.0이 출시되었고 1.1, 1.2 버전을 거쳐 2018년에 TLS 1.3이 출시되었다.

SSL은 현재는 거의 사용하지 않지만, TLS와 같은 의미로 사용되고 있다.

(이하로 SSL이라고 쓰겠다.)

SSL 인증서

  • SSL은 SSL인증서가 있는 웹사이트만 실행할 수 있다.
  • SSL 인증서는 신뢰할 수 있는 기관(CA)에서 발급한다.
  • SSL인증서에는 웹사이트의 공개 키가 포함되어있다.
    • SSL인증서는 공개 키 암호화 방식(RSA)을 통해 데이터를 암호화한다.
    • 웹 서버에 비밀 키가 존재한다.

SSL 원리

  1. 서버의 공개 키/ 비밀 키를 생성한다.
  2. CA(인증된 기관)에 공개 키와 기타 정보를 전달하여 SSL인증서를 생성한다.
    • SSL인증서는 CA의 비밀 키로 암호화 된다.
  3. 서버에 인증서를 저장하고 내 서버에 접속한 클라이언트에게 인증서를 보내준다.
  4. 클라이언트(브라우저)는 인증서를 CA의 공개 키로 복호화한다.
    • 브라우저에는 CA들의 공개 키가 내장되어 있다.
    • 복호화 성공 여부를 통해 CA에서 발급한 인증서인지 확인한다.
  5. 복호화 한 인증서에 들어있는 서버의 공개 키를 이용해서 통신한다.

SSL Handshake

  1. TCP Handshaking
    • 3-way-handshake를 한다.
    • SSL 통신을 하기위해 TCP연결이 수립 되어야 한다.
  2. SSL Handshaking
    1. Client Hello (Client → Server)
      • 클라이언트가 생성한 랜덤 데이터와 클라이언트가 사용가능한 암호화 방식을 서버로 전송한다.
      • 세션 키를 전송한다
    2. Server Hello (Server → Client)
      • 서버가 생성한 랜덤 데이터와 선택한 암호화 방식을 전송한다.
      • SSL 인증서를 전송한다.
    3. 클라이언트 확인
      • SSL 인증서를 CA의 공개 키를 이용해서 복호화한다.
      • 복호화가 성공했다면 해당 인증서는 CA에서 발급한 인증서라 신뢰할 수 있다는 뜻이다.
      • 복호화하여 서버의 공개 키를 얻을 수 있다.
    4. 대칭 키 암호화를 위한 pre master secret key 생성 (Client → Server)
      • 클라이언트가 생성한 랜덤 데이터 + 서버 랜덤 데이터를 통해 특정값 생성
      • 이 값을 서버의 공개키로 암호화
      • 서버로 전송
    5. session key 생성
      • pre master secret key를 받아 서버 비밀 키로 복호화
      • 이를 통해 session key를 생성하여 클라이언트와 공유
      • session key를 사용하여 데이터를 대칭 키 암호화 방식으로 주고받음

TLS 1.3

HTTPS 패킷 분석(TLS 1.2와 TLS 1.3)

SNI 란?

SNI 차단이 뭐야? TLS 1.3은 해결책이 될 수 있을까.

인증서 체인

ROOT CA 인증서는 무엇인가?

인증서 체인 🔗

154. [Security] SSL과 인증서 구조 이해하기 : CA (Certificate Authority) 를 중심으로

HTTPS 및 SSL을 사용한 보안 | Android 개발자 | Android Developers

728x90

'CS > 네트워크' 카테고리의 다른 글

HTTP 버전  (0) 2023.10.22
쿠키와 세션  (0) 2021.12.26
HTTP의 Stateless  (0) 2021.12.26
네트워크의 구성요소  (0) 2021.07.19
컴퓨터 네트워크 첫 걸음  (0) 2021.07.19
반응형

HTTP란?

HTTP란 TCP/IP 네트워크 아키텍처 기준으로 보면 어플리케이션 계층에서 사용되는 프로토콜이다.

클라이언트-서버 구조에서 통신할 때 사용되며, Request와 Response가 존재한다.

HTTP 구조

HTTP의 구조는 크게 Start line + Header + Body로 구성된다.

  • Request
    • Start line
      • HTTP 메소드와, 타겟 경로, HTTP 버전이 명시된다.
    • Header
      • Host, cookie, user-agent 등의 정보가 포함된다.
    • Body
      • 서버로 보낼 정보를 담는다.
      • GET / HTTP/1.1 Host: developer.mozilla.org Accept-Language: fr
  • Response
    • Start line
      • HTTP 버전, 응답 상태 정보가 명시된다.
    • Header
      • 서버 정보, 날짜, 응답에 대한 정보 등이 들어간다.
    • Body
      • 서버가 응답한 리소스가 담겨있다.
      • HTML, JSON, TEXT등 여러 형식이 올 수 있다.
      • HTTP/1.1 200 OK Date: Sat, 09 Oct 2010 14:28:02 GMT Server: Apache Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT ETag: "51142bc1-7449-479b075b2891b" Accept-Ranges: bytes Content-Length: 29769 Content-Type: text/html <!DOCTYPE html... (here comes the 29769 bytes of the requested web page)

HTTP 특징

HTTP/HTTPS 차이

  • HTTP는 암호화 되지 않은 데이터를 전송한다.
  • HTTP에 SSL, TLS을 결합 한 것이 HTTPS이다.
  • HTTPS 웹사이트는 인증된 기관에서 발급한 SSL/TLS 인증서를 획득해야한다.
    • SSL/TLS이란?
      • TLS는 SSL의 업그레이드 버전이다.
      • RSA암호화를 사용한다.

인증과정

  1. HTTPS 웹 사이트를 방문한다.
  2. 브라우저는 서버의 SSL 인증서를 요청한다.
  3. 서버는 public 키가 포함된 SSL 인증서를 보내준다.
  4. 브라우저가 CA의 인증서인지 검증하고, public 키를 이용해서 request를 암호화 한다.
  5. 서버에서 private key를 이용하여 메세지를 해독한다. 그리고 세션키를 암호화해서 브라우저에 전송한다.
  6. 브라우저에서 세션키를 사용해서 서버와 통신한다.

HTTP 버전

HTTP 1.0 / 1.1

  • HTTP의 초기버전(0.9라고 부름)은 한 줄로만 구성되어 있었다.
    • 리소스 요청에 대한 응답만 할 수 있다. (GET 메소드만 존재)
    • ```
    • Request
      GET /target.html
    • Response```
  • HTTP 1.0
    • 헤더가 추가되었다.
    • 버전정보와 메소드 정보를 전송한다.
      • GET, HEAD, POST 메소드
    • 상태 코드(200, 302, 404..)를 응답으로 보내줘 요청에 대한 성공/실패를 알 수 있다.
    • 헤더에 Content-Type을 명시해 HTML 이외에 데이터도 전송할 수 있음
    • 요청 하나당 커넥션을 생성하기 때문에 매번 3-way-handshake을 해야한다.
      • HTTP도 TCP 프로토콜 위에서 동작하므로, 통신을 하려면 3-way-handshake과정을 거쳐야함.
  • HTTP 1.1
    • Persistent connection 추가
      • 지정한 timeout동안 커넥션을 닫지 않는다.
      • HTTP 1.0 단점 개선
    • Pipelining 추가
      • 앞의 요청의 응답을 기다리지 않고 다음 요청을 보냄
      • 응답은 요청을 보낸 순서대로 온다.
    • Head Of Line Blocking (HOLB)
      • 앞의 요청이 너무 오래걸리면 뒤의 요청은 블럭킹 되는 문제가 있다.
    • 헤더 중복 문제

HTTP 2.0

  • HTTP 1.1 의 확장이며 성능개선을 한 프로토콜이다.
  1. 전송 방식 전환
    • HTTP 1.1 에서는 일반 텍스트에 개행문자로 헤더와 바디를 구분했지만 2.0에서는 바이너리 프레임으로 분할해서 전송한다.
    • 바이너리 형식이 전송속도와 파싱속도가 빠르고 오류 발생 가능성이 낮다.
  2. Multiplexed Streams
    • 요청의 프레임이 각 스트림을 통해 전달되고 응답을 받는다.
    • 한 커넥션 안에 여러 스트림이 존재하며, 이전 요청의 응답 여부와 상관없이 동시에 여러 요청을 처리할 수 있다.
  3. Server Push
    • 서버가 클라이언트가 요청하지 않은 리소스를 보내줄 수 있다.
      • *클라이언트에게 필요한
  4. Header Compression
    • 이전에 전송된 Header 를 table로 만들어 저장
    • 이전 Header에 포함된 내용을 제외한 새로운 내용을 허프만 인코딩으로 압축해서 전송
  • HTTP단의 HOLB는 없지만 TCP단의 HOLB는 존재

HTTP 3.0

  • QUIC(Quick UDP Internet Connection)를 기반으로 나온 HTTP의 새로운 버전
  • QUIC
    • UDP 기반의 전송 프로토콜
    • TCP의 단점을 극복하기위해 고안됨

RESTful API

출처

https://velog.io/@neity16/HTTP-HTTP-버전-별-특징#http-10

https://aws.amazon.com/ko/compare/the-difference-between-https-and-http/

https://developer.mozilla.org/ko/docs/Web/HTTP/Overview#http_기반_api

728x90

'CS > 네트워크' 카테고리의 다른 글

SSL/TLS란? SNI, Intermediate-Chain  (1) 2023.10.22
쿠키와 세션  (0) 2021.12.26
HTTP의 Stateless  (0) 2021.12.26
네트워크의 구성요소  (0) 2021.07.19
컴퓨터 네트워크 첫 걸음  (0) 2021.07.19
반응형

CPU의 구조

  • 명령어 사이클
    1. Instruction Fetch
      • CPU가 다음에 실행될 명령어를 가지고 오는 것이다.
      • IP(Instruction Pointer; PC(Program Counter)라고도 함)에서 다음에 실행될 명령어의 주소를 가지고 있다.
      • ex) Add 3, 5 라는 명령어를 가져온다.
    2. Instruction Decode
      • 명령어의 Operation code를 해독하는 단계이다.
      • ex) Add 를 해독하여 더하기 명령이라는 것을 알아낸다
    3. Operand Fetch
      • 피연산자를 가져오는 단계이다.
      • ex) 3, 5를 가져온다.
    4. Execution
      • CPU가 연산을 수행한다.
  • Instruction FetchInstruction DecodeOperand FetchExecution
  • CPU의 연산 과정
    • CPU에는 3가지 주요 Unit이 있다.
    1. Memory(Storage) Unit
      • 이 유닛은 명령어, 데이터, 중간 결과 등을 저장할 수 있다.
      • 다른 유닛으로 정보를 전송할 때도 쓰인다.
      • 레지스터, 캐시등 크기와 속도가 다른 여러 종류가 있다.
      • 모든 입력데이터와 출력데이터가 메모리 유닛을 통해 전송된다.
    2. Control Unit
      • 다음에 실행될 명령을 Memory Unit으로 부터 가져오고, 해독하여 신호를 ALU로 보내준다.
        • Control Unit은 CPU의 클럭 신호를 입력받아 적절한 명령 신호를 보내준다.
        • ALU가 아니더라도 메모리나 입출력 장치로 신호를 보내는 역할도 한다.
    3. Arithmetic Logic Unit
      •  
      • ALU는 실제로 연산을 수행하는 장치이다.
      • 사칙연산, Shift, 논리연산등을 수행한다.
      • Operation code와 Operand를 받는다.
      • 이렇게 받은 값들을 내부의 가산기, 보수기, 시프터, 오버플로우 검출기를 이용해 계산한다.
        • 가산기(Adder) : 2진수의 덧셈 연산을 수행한다.
        • 보수기 : 보수를 구한다. NOT 논리연산이다.
          • 가산기와 보수기를 사용하여 뺄셈 연산을 수행한다.
        • 시프터 : 시프트 연산을 수행한다.
        • 오버플로우 검출기 : 오버플로우를 검출한다.

컴퓨터가 화면을 보여주는 원리

  1. 그래픽 데이터를 만든다. (이미지, 동영상 등)
  2. 이미지(JPEG, PNG, BMP, GIF 등)를 픽셀 단위로 나누고, 3바이트(2^8 = 0~255, RGB)에 픽셀의 색을 저장한다.
  3. GPU가 이미지 데이터를 처리하고 모니터에 표시할 수 있는 디지털 신호(RGB 신호)로 변환한다.

https://velog.io/@ckstn0777/컴퓨터구조-9htxi9jo

728x90

'CS > 컴퓨터구조' 카테고리의 다른 글

컴퓨터의 언어 - 비트  (0) 2021.12.27

+ Recent posts