전체 글

개발은 좋은데 뭘로 개발할까
CS/HCI 윈도우즈프로그래밍

[OpenGL] 16. Transformation (4) - 셰이더에 행렬 변환 적용하기

이번 글에서는 셰이더에 행렬 변환을 적용해보려고 한다. 이 예제로 한번 사람의 팔과 비슷하게 동작하는 프로그램을 작성해보려고 한다. 키보드를 눌러 각도를 조작하면 팔이 회전할 수 있다. 팔의 회전은 상박따로, 하박 따로 회전한다. 기본 코드 틀 #include #include #include "Shader.h" #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" #include #include #include float vertice[] { -0.3, -0.2, 1.0, // left - bottom +0.3, -0.2, 1.0, // right - bottom -0.3, +0.0, 1.0, // left - top +0.3, +0.0, 1.0, // ri..

CS/컴퓨터 구조

[컴퓨터 구조] 12. Single Cycle MIPS - Decode

MIPS Decode 회로 지난 글에 이어 MIPS의 Decode 회로를 설계해보자. Decode 과정은 명령어를 해석하는 과정이다. 명령어를 실행하려면 크게 2가지 정보를 알아야 한다. 1. 무슨 명령어인가? ( = 연산자 정보) 2. 무엇을 가지고 실행하는가? ( = 피연산자 정보) MIPS 명령어는 포맷별로 아래와 같은 형태를 갖추고 있다. 3가지 포맷은 모두 공통적으로 6bit 크기의 opcode 필드를 갖고 있다. 이 opcode를 통해서 지금 주어진 명령어가 어떤 명령어인지 식별한다. R 포맷은 opcode 에 더해 function 필드 정보를 조합하여 실행할 명령어를 식별한다. 그리고 opcode 와 funct 를 제외한 나머지 필드가 모두 피연산자로서 활용하는 필드가 된다. 우선 J 포맷은..

CS/컴퓨터 구조

[컴퓨터 구조] 11. Single Cycle MIPS - Fetch

Fetch 회로도fetch는 명령어를 가져오는 과정이다.명령어를 가져올 때, 컴퓨터는 PC (Program Counter) 라는 특별한 레지스터를 이용한다.이 레지스터에는 현재 실행할 명령어가 메모리 어디에 담겨있는지, 그 주소값이 담겨있다.컴퓨터가 처음 실행되면, PC는 0으로 초기화되고, 메모리 0번지에 있는 명령어를 가져와 실행할 것이다.하나의 명령어를 실행한 이후에는, 다음 명령어를 실행하기 위해 PC 값을 4 증가시킨다. (32bit 시스템 기준) 이 과정이 점프나 분기가 없는, 순차적으로 실행되는 프로그램 기준 Fetch 의 과정이다.이를 회로도로 그려보자.  먼저 CPU 공간과 명령어를 가져오는 메모리 공간을 따로 그려보자.  CPU 안에는 PC 라는 특별한 레지스터가 있다. 32bit-re..

CS/프로그래밍언어론

[프로그래밍언어론] 7. Parsing Problem

파서의 목표는 소스코드를 받아서 파싱을 한 뒤, Parse Tree 를 만드는 것이다.만약 파싱하다가 실패했다면 소스코드에서 문법에 맞지 않는 부분이 있었다는 뜻이므로,파서는 syntax error 가 발생했다는 걸 알려줘야 한다. 잘 동작하는 파서는 파싱할 때 토큰 1개를 더 앞서 볼 수 있다. (look ahead, LA)그래야 알맞는 BNF 문법을 체크할 수 있다. 파서에는 2가지 카테고리가 있다.첫번째는 탑-다운 / 두번째는 바텀-업 이다.탑 - 다운 파서탑-다운 파서는 root 부터 시작해서 아래로 내려가면서 파스 트리를 만든다.탑-다운 파서는 왼쪽에서부터 파고들어 본다. (즉 pre-order 순으로 파싱트리를 만든다.)xAα 라는 sentential form 이 주어..

CS/HCI 윈도우즈프로그래밍

[OpenGL] 15. Transformation (3) - GLM 사용하기

이제 지금까지 정리한 변환을 실제 코드로 구현해보려고 한다. OpenGL 과 관련하여 행렬 연산을 간편하게 지원하는 glm 라이브러리를 사용하면 편하게 행렬을 만들고 연산할 수 있다. https://github.com/g-truc/glm GitHub - g-truc/glm: OpenGL Mathematics (GLM) OpenGL Mathematics (GLM). Contribute to g-truc/glm development by creating an account on GitHub. github.com 우선 위 깃허브에 가서 최신버전의 glm 을 다운받는다. 다운받은 glm 파일은 외부 include 디렉터리로 꼭 등록해주자. 이제 glm 을 사용하여 행렬연산을 할 수 있다. 이때는 위와 같은 헤더..

CS/컴퓨터 네트워크

[컴퓨터 네트워크] 13. Application Layer (6) : Video Streaming And CDN

비디오 스트리밍 서비스의 기술적 어려움 넷플릭스, 유튜브와 같은 비디오 스트리밍 서비스의 트래픽은 인터넷에서 많은 부분을 차지하는 트래픽이다. 그래서 이런 비디오 스트리밍 서비스가 갖는 기술적 어려움이 몇 가지 있다. 1. scalability (확장성) 10억명이 넘는 유저들이 안정적인 서비스를 제공받으려면 정말 크고 안정적인 네트워크를 갖고 있어야 한다. 2. heterogeneity (이질, 개인화 정도로 이해했다.) 유저마다 자신이 살고있는 곳의 네트워크 환경이 다양할 것이다. 우리나라는 광대역이 잘 깔려있어서 500Mbps 네트워크를 갖는 경우도 많지만 외국은 100Mbps 대역폭을 쓰는 곳도 굉장히 많다. 또 어떤 사람은 이동중에 스트리밍 서비스를 이용하고, 어떤 사람은 유선 네트워크를 이용해..

CS/HCI 윈도우즈프로그래밍

[OpenGL] 14. Transformation (2) - 복합 변환

지난 글에서 OpenGL 에서 사용하는 전체 변환의 과정과 함께, 그 변환 하나하나에 사용되는 기본 변환인 이동, 회전, 크기조절 3가지를 정리하였다. 이번 글에서는 각각의 기본 변환이 연속적으로 일어나 하나의 행렬곱 형태로 묶인 복합 변환에 대해 정리한다. 용어 복합 행렬 (Composite Matrix) 는 연속된 변환 행렬을 모두 곱한 하나의 행렬이다. 복합 변환 (composite Transformation) : 복합 행렬로 표현되는 일련의 연속된 변환이다. 만약 어떤 물체 P 에 대해 크기조절 변환 S1 을 가하고, 회전 R1 을 가한 뒤, 다시 크기를 S2로 조절했다고 하면 이 물체를 구성하는 새로운 정점 P' = S2 * R1 * S1 * P 로 표현할 수 있다. 기존 물체 왼쪽에 변환 행렬..

CS/컴퓨터 구조

[컴퓨터 구조] 10. Single Cycle MIPS - 개요

Microarchitecture 컴퓨터 시스템은 위와 같은 계층으로 구성된다. 지금까지는 MIPS 명령어 체계를 정리하면서 3번째에 있는 Architecture 계층에 대해 고민했었다. 이제는 그보다 한단계 아래로 내려가서 마이크로 아키텍쳐를 보려고한다. 마이크로 아키텍쳐라는 말은 기계어로 된 명령어를 이해하고, 실행할 수 있는 CPU의 내부 하드웨어 구조를 의미한다. MIPS의 ISA를 구현하는 마이크로아키텍쳐는 다양하게 있다. 같은 ISA여도 구현은 얼마든지 바뀔 수 있다. (마치 x86을 구현한 AMD 와 Intel 의 CPU가 다른 것처럼) 대표적인 구현 방법으로 한 사이클에 하나의 명령어를 처리하는 Single Cycle 방식이 있다. 하나의 명령어를 실행하고, 그 명령어의 실행이 끝나면 그 다..

CS/컴퓨터 네트워크

[컴퓨터 네트워크] 12. Application Layer (5) : DNS

DNS Domain Name System 인터넷 상에서 컴퓨터(호스트) 를 식별할 때 IP Address 를 이용한다. (정확히는 포트까지 이용한다.) 현재 가장 널리 쓰이는 체계는 32bit 주소 체계인 IPv4 이다. IP주소는 dotted decimal (점으로 구분한 십진수 4개) 으로서 사용되기 때문에 사람들이 이를 직접 기억하기 힘들다. 그래서 사람들이 기억하기 쉽게 문자열로 된 도메인 네임을 부여하였다. 하지만 실제 컴퓨터가 네트워크 상에서 통신을 하려면 결국 숫자로 된 IP주소를 이용해 통신해야해서, 이 도메인 네임을 아이피 주소로 변환할 필요가 있다. DNS 는 도메인 이름을 IP주소로 변환해주는 서비스를 일컫는다. (경우에 따라 그 반대를 할 수도 있다.) 그래서 결국 DNS는 도메인주..

CS/프로그래밍언어론

[프로그래밍언어론] 6. C언어의 BNF 문법과 파싱 예제

BNF 따라가기 BNF 문법은 나중에 YACC 라는 프로그램에 들어가 Parser 를 만든다. (야크는 파서 제너레이터이다.) 이번 글에서는 BNF 문법을 보고 주어진 C 코드를 파서가 어떻게 파싱하게 될 지 파싱트리를 그리는 과정을 직접해보고자 한다. 이 과정을 수행하려면 우선 lexical analyzer 에 의해 소스코드가 각각의 렉시컬 토큰 조각들로 구분이 되어있어야 한다. 소스코드에서 렉시컬 토큰을 추출하는 과정은 아래의 lex 코드를 참고하자. // 강의록에서 ANSI C grammer, Lex specification.pdf 에 있는 코드입니다. D [0-9] L [a-zA-Z_] H [a-fA-F0-9] E [Ee][+-]?{D}+ FS (f|F|l|L) IS (u|U|l|L)* %{ #i..

에버듀
Blog. 에버듀