반응형

간단 지식 65

알아두면 편한 함수

function library description get_s(dest, size) #include 문자열을 저장할 수 있는 함수 dest는 문자열을 저장할 위치 ex)배열 이름 size는 해당 위치의 크기 ex)배열 크기 offsetof() #include 메크로 함수로 Struct를 구성하는 Member 변수의 Memory Offset를 리턴한다. strcpy_s(dest, size, source) #include 문자열을 복사해서 저장할 수 있는 함수 dest는 복사할 문자열을 저장할 위치 size는 문자열의 크기로, 마지막 \0을 고려하여 +1 source는 복사할 문자열이 저장돼있는 위치 strlen(string) 문자열의 길이를 알 수 있는 함수

간단 지식/C 2020.11.04

04. Register - movq source, dest

x86-64 bit 컴퓨터의 CPU에는 아래 16개의 레지스터가 저장되어 있다. 8byte 4byte 1byte %rax %r8 %eax %r8d %al %r8b %rbx %r9 %ebx %r9d %bl %r9b %rcx %r10 %ecx %r10d %cl %r10b %rdx %r11 %edx %r11d %dl %r11b %rsi %r12 %esi %r12d %sil %r12b %rdi %r13 %edi %r13d %dil %r13b %rsp %r14 %esp %r14d %spl %r14b %rbp %r15 %ebp %r15d %bpl %r15b 기본적으로 64bit이며, 어셈블리의 특징인 '모든 데이터 타입은 정수형 1, 2, 4, 8 byte 이다'를 만족하기 위해 각각의 레지스터들을 1, 2, 4b..

03. CPU와 Memory의 관계

프로그래머의 입장에서 CPU와 Memory의 관계는 위 그림과 같다. 두 관계에서 address와 instruction은 일방, data는 쌍방으로 주고받는다. 각각을 구성하는 요소들에 대해 자세히 알아보자. CPU는 흔히 아는 intel 7세대 코어i5와 같은 컴퓨터에 내장된 칩을 말한다. 하드웨어의 영역에 포함되며 크게 3가지 요소가 저장되어 있다. PC는 Program Counter의 약자로, 지금 실행 중인 instruction이 끝난 후 실행할 instruction의 주소를 저장한다. 그런 의미에서 x84-64 bit에서는 RIP(Register Instruction Pointer)라고 불린다. 다음에 실행할 코드의 주소를 저장하기 때문에 메모리에서 instruction을 일방적으로 가져온다. ..

02. 시스템의 컴파일 과정

적정한 크기의 소스코드를 컴파일하면 수 초 안에 결과물을 볼 수 있다. 그 수 초 안에는 어떤 과정들이 담겨있는 걸까? 총 4단계로 이뤄지며 각 단계에서 산출한 파일이 순차 처리된다. 가상의 파일 hello.c가 있다고 가정해보자. 1단계, 전처리(Preprocessing) text형식의 c언어 파일(hello.c)를 받아서 modified source program(hello.i)으로 변환한다. 2단계, C언어로 어셈블리 코드 생성(Compilation) text형식의 modifed source program(hello.i)를 assembly code(hello.s)로 변환한다. 3단계, 기계어로 object파일 생성(Assembly) text형식의 assembly code(hello.s)를 reloc..

02. what is Deep Learning?

다시 한번 인공지능 기술의 포함관계와 머신러닝의 분류에 대해 복기하고 딥러닝으로 넘어가자. deep learning은 뉴런과 비슷한 인공신경망 방식으로 정보를 처리하는 기술이다. 딥 러닝이라는 단어의 어원은 neural network로, 인간의 신경을 모방한다는 점을 따왔다. 뉴럴 네트워크는 일종의 머신러닝 알고리즘으로, 사람의 두뇌가 작동하는 것을 모방하여 기계가 학습할 수 있게 해주는 기술이다. 그리고 이와 유사한 알고리즘에는 결정트리, 랜덤포레스트, KNN, SVM 등이 있다. 그렇다면 tensorflow는 무엇일까? 바로 라이브러리이다. 이와 유사한 라이브러리에는 PyTorch, Caffe2, Theano 등이 있다. 그리고 텐서플로우에서 사용하는 알고리즘이 뉴럴 네트워크이고 이를 통해 해결하려는..

01. what is Machine Learning?

위 그림은 인공지능, 머신러닝, 딥러닝의 관계이다. 우리가 포괄적으로 생각하는 인공지능은 인간을 대신할 수 있는 컴퓨터 기술이지만, 정확히는 머신러닝과 딥러닝을 포함해서 아우르는 기술이다. Machine Learning은 한글로 기계 학습이다. learning은 model을 만드는 과정이다. 여기서 말하는 모델은 이론과 여러 실험으로 얻은 규훈을 합친 공식이 되겠다. 즉, 좋은 학습을 통해 좋은 모델을 만드는 것이 좋은 머신러닝 기술이 되는 것이다. 좋은 학습을 위해서는 데이터가 필요하다. 복잡한 현실에서는 발견하기 어려운 정보를 단순 데이터화해서 발견하는 데이터 산업인 data science와 data engineering이 있다. data science는 데이터를 만들고 사용하는 산업이고, data ..

02. 포인터, 동적메모리할당함수, 포인터배열

포인터는 변수의 주소를 의미한다. 포인터 변수는 포인터를 저장한 변수, 즉 변수의 주소를 저장하는 변수를 말한다. 따라서 포인터 변수에 대입할 수 있는 것은 주소뿐이다. 포인터 변수 선언방식은 다음과 같다. type *포인터변수; (*은 변수 명 앞에 붙이는 간접 연산자이다.) 아래 예제를 보면 한 번에 포인터에 대해 이해할 수 있다. void main() { int a = 10; int *p;//포인터변수p 선언 p = &a;//포인터변수p에 주소 저장 printf("%d \n", p);//포인터변수p에 저장된 값(주소)을 출력한다. printf("%d \n", *p);//포인터변수p에 저장된 값이 가리키는 곳의 값을 출력한다. *p = *p + 10;//포인터 변수p에 저장된 값이 가리키는 곳의 값에..

간단 지식/C 2020.09.12

01. byte 지향 메모리 조직

컴퓨터가 2진수를 사용하는 이유 현재 컴퓨터는 2진 체계를 사용한다. 사람의 입장에선 10진수가 더 좋아 보이는데 왜 2진수를 사용하는 걸까? 그 이유는 10진수를 사용하면 전자/전기적 이행의 문제로 인해 저장,전송이 불편해지기 때문이다. 10진수는 10을 기수로 하는 기수법이기 때문에 10단계 신호를 부호화해야 한다. 따라서 높은 정밀도를 필요로 하며 연산과 같은 디지털 논리 기능 이행의 복잡함이 문제가 된다. 그래서 고안된 방법이 쌍안정 회로의 특징을 이용한 2진 체제이다. 더군다나 컴퓨터에는 최대 5V까지의 전류가 흐르도록 제한되어 있는데 0은 0.0V ~ 0.5V, 1은 2.8V ~ 3.3V까지 저장할 수 있다. 즉 0과 1을 오가며 부호화를 진행해도 아무 문제가 없다. byte 지향 메모리 조직..

01. c언어 기초 간단 정리

c언어의 시작은 포인터부터라고 생각하기 때문에 그 전까지는 간단하게 핵심만 정리해보았다. 여기까지는 자바와 거의 이론이 비슷하기 때문에 더 참고해야하는 사항이 있으면 자바 카테고리에 가면 된다. 2진수, 10진수, 16진수 2진수는 수를 0과 1로 표현한다. 10진수는 우리가 흔히 아는 자연수이다. 16진수는 수를 0~9, A~F 로 표현한다. 각 진수들은 아래처럼 서로 변환할 수 있다. 1). 2진수 -> 10진수 ex. 10101001 = 169 2) 10진수 -> 2진수 ex. 202 = 11001010 3) 16진수 -> 2진수 ex. 4F3C = 0100111100111100 16진수 2진수 16진수 2진수 0 0000 A 1010 1 0001 B 1011 2 0010 C 1100 3 0011 ..

간단 지식/C 2020.07.13

13. 추상클래스와 추상메소드

클래스는 두 부류로 나눠볼 수 있다. 1. 실체클래스 2. 추상클래스 단순하게 객체를 직접 생성할 수 있으면 실체클래스이고, 그렇지 않으면 추상클래스이다. 좀 더 정확히 말하자면 실체 클래스들의 공통적인 특성을 추출하여 만든 클래스를 추상클래스라고 한다. 즉, 이 둘은 상속관계로 묶여있다. 부모는 추상클래스, 자식은 실체클래스다. 추상클래스는 새 실체 클래스를 만들기 위해서만 사용된다. 용도가 하나밖에 없는데 왜 필요하냐고 묻는다면 이유는 2가지가 있다. 첫째, 실체 클래스들의 공통된 필드&메소드를 통일함으로써 동일한 기능을 하는 멤버가 다른 이름으로써 여럿 존재하게되는 비합리성을 줄여준다. 둘째, 실체 클래스 생성 시간을 절약해준다. 키워드는 abstract로, 선언방식은 다음과 같다. public a..

간단 지식/Java 2020.07.06