반응형

간단 지식 65

04. tree

트리는 상위에서 하위 노드로 확장되는 계층구조를 나타내는 비선형 자료구조이다. 아래는 트리 중에서 가장 일반적인 binary tree 구조이다. 이진 트리는 결정트리, 산술식 트리, 탐색 트리 등에 사용된다. term description root 부모 노드가 없는 최초의 노드 ex) A ancestor 자식 노드가 있는 노드 ex) A, B, C, D descendent 부모 노드가 있는 노드 ex) B, C, D, E, F, G, H, I sibling 동일한 부모 노드를 가진 노드 ex) B와 C, D와 E, F와 G, H와 I subtree 루트를 제거했을 때 생기는 하위 트리, 하위 트리의 집합을 forest라고 부른다. internal node 루트를 포함하여, 부모 노드와 자식 노드를 둘 다..

04. 구조체 - 포인터, malloc, 화살표연산자, 역참조

이전 글에서 구조체의 개념과 기본 예제, 그리고 구조체 배열에 대해서 설명했다. 이전 글: 2020/11/06 - [1학년/c언어] - 03. 구조체, 공용체, 열거형 03. 구조체, 공용체, 열거형 구조체 자바에 생성자가 있어 개발의 편의성, 다양성이 향상된다면 c언어에는 구조체가 있다. 구조체란, 서로 다른 변수의 형태를 하나의 block으로 묶는 기법이다. 이로 인해 함수에 데이터를 넘 20plus3.tistory.com 이번엔 좀 더 나아가 구조체 포인터와 malloc으로 메모리를 할당하는 방법을 알아보자. 구조체 포인터는 구조체의 주소를 갖는다. 아래 예제를 보자. typedef struct _student { char name[10]; int age; char grade; }student; v..

간단 지식/C 2020.12.02

09. stack frame, register saving convention

컴파일을 하면 스택에 코드가 쌓인다는 것은 우리가 다 아는 사실이다. 그렇다면 스택의 내부는 어떻게 생겼을까? 이 질문에 대한 해답을 얻기 전에 procedure의 data flow와 메커니즘 3가지에 대해 이해할 필요가 있다. procedure의 data flow는 저장되는 argument가 어디에 어떤 식으로 저장되는지를 말한다. procedure는 레지스터에 총 6개의 argument까지 저장할 수 있다. (저장 순서: %rdi -> %rsi -> %rdx -> %rcx -> %r8 -> %r9) 그리고 별도의 return 값을 저장하는 %rax를 제외하고 나머지 argument는 스택에 저장된다. 즉 인자값이 6개를 넘어가면 7번째 인자부터는 스택에 저장된다는 의미이다. procedure의 메커니..

03. stack, queue

스택은 LIFO, 큐는 FIFO 라는 것만 알아도 다 이해했다해도 무관할 정도로 스택과 큐는 구현도, 사용도 너무나 쉬운 자료구조이다. 그만큼 자주 쓰이기도 하니 꼭 알아두자. 스택은 Last in First out 으로, 후입선출의 구조이다. 아래 그림처럼 먼저 들어간 값이 가장 아래에 쌓이기 때문이다. 이러한 구조는 웹 브라우저의 뒤로가기, 텍스트 에디터의 ctrl+z, JVM의 chain of method call(ex. recursion call) 등에 사용이 된다. 스택을 사용하기 위해서 자바에서 제공해주는 클래스 java.util.stack을 사용하여도 좋다. 스택 클래스에서 제공하는 메소드는 아래와 같다. method description boolean isEmpty() 스택이 비었는지를 확..

08. conditional expression - using branch or move

어셈블러가 c코드로부터 jle, jne와 같은 명령어들을 산출해내는 이유는 변환하는 코드에 branch instruction이 있기 때문이다. 그러나 지금 이 시간은 개발자가 아니라 시스템 입장에서 코드를 봐야한다. 잦은 branch의 사용은 파이프라인 구조에 파괴적이기 때문에 CPU 관점에서 좋지 않다. 따라서 우리는 조건식을 branch가 아니라 move 명령어를 사용해서 동일한 효과를 낼 수 있다. 한가지 예제 코드를 보자. long test(long x, long y){ long result; if(x>y) result = x-y; else result = y-x; return result; } 지난 글에도 사용했던 if-else문 예제이다. 보이다 싶이 L2로 이동하는 branch 명령어가 보인..

07. condition code - 상태 레지스터, setX 명령어, jX 명령어

실행 중인 프로그램에 대한 정보(processor state)는 크게 아래 4개로 분리할 수 있다. 1. temporary data 2. location of runtime stack 3. location of current code control pointer 4. status of recent test 임시 데이터는 레지스터 %rax, %rbx 등에 저장되어있다. runtime stack의 위치는 스택포인터 %rsp에 저장된다. 현재 코드의 구조포인터는 %rip 에 저장된다. 최근 테스트에 대한 상태는 상태 레지스터를 조직하는 flag bit들에 저장된다. 이번 글에서 다룰 내용은 4번에 해당하는 상태 레지스터이다. 상태 레지스터는 status register 또는 flag register라고도 하며..

06. Arithmetic operation of register, 레지스터와 변수의 관계

이제까지 movq와 leaq 연산에 대해 알아보았는데, 가장 기본적인 산술연산도 있음을 알아두자. 아래 표는 2개의 피연산자 구조(연산자 src, dest)를 갖는 연산자이다. 연산자 연산식 addq dest = dest + src subq dest = dest - src imulq dest = dest * src salq dest = dest > src (산술) shlq dest = dest > src (논리) xorq dest = dest ^ src andq dest = dest & src orq dest = dest | src 괄호 안에 산술, 논리라고 적힌 연산자들은 연산식은 동일하지만 sign bit 처리에 대해서는 차이가 있다. 산술 연산자들은 shift 연산 후 빈 공간을 이전 수의 sign..

03. Activation - identity, softmax

머신러닝의 분류도이다. 다시한번 복기해보자. 우리가 집중해서 봐야할 부분은 지도학습의 분류와 회귀이다. 이걸 기억하고 아래를 보자. 지난 글에서 사용한 예시 코드에서 생성한 모델은 분류모델일까 회귀모델일까? import tensorflow as tf import pandas as pd 파일경로 = ' ' 데이터셋 = pd.read_csv(파일경로) 데이터셋.head() 독립 = 데이터셋[['독립변수1']] 종속 = 데이터셋[['종속변수2']] print(독립.shape, 종속.shape) X = tf.keras.layers.Input(shape=[1]) Y = tf.keras.layers.Dense(1)(X) ------------! model = tf.keras.models.Model(X, Y) mod..

05. movq와 leaq의 address 계산 방식

movq의 주소 지정 방식의 가장 일반적인 형식과 그에 따른 메모리 계산식은 다음과 같다. D(Rb, Ri, S), MEM[Reg[Rb] + S*Reg[Ri] + D] D: 일정 배수. 1, 2, 4 byte중 하나. 임의의 데이터 구조에 대해 임의의 offset을 정해주는 용도. Rb: 베이스 레지스터. %rax를 포함한 16개의 레지스터 중 하나. 명시되지 않으면 0으로, hw가 작동할 때 D, Ri, S가 무슨 값을 갖던 간에 신경쓰지 않는다. 메모리의 base 주소를 알려주는 용도. Ri: 인덱스 레지스터. %rsp를 제외한 모든 레지스터. 명시되지 않으면 0. S: scale, size를 의미. 어셈블리어를 지원하는 정수들. 1, 2, 4, 8 중 하나. 명시되지 않으면 1. 아래는 위 기본 형..

03. 구조체, 공용체, 열거형

구조체 자바에 생성자가 있어 개발의 편의성, 다양성이 향상된다면 c언어에는 구조체가 있다. 구조체란, 서로 다른 변수의 형태를 하나의 block으로 묶는 기법이다. 이로 인해 함수에 데이터를 넘길 때 구조체만 넘기면 되는 큰 이점이 생긴다. 구조체형과 변수 선언 형태는 아래와 같다. typedef struct 이름{ 멤버1 ~ n; } 별칭; 구조체별칭 변수이름; 이는 typedef을 이용한 구조체 선언 방식으로, 개발자의 편의성을 위해 구조체에 별칭을 붙일 수 있게 해준다. 변수에 값을 대입하는 형식은 다음과 같다. 변수이름.멤버 = 값; 원래 정식 선언 방식은 아래와 같다. struct 이름{ 멤버1 ~ n; } struct 구조체이름 변수이름; 차이점이 보이는가? typedef를 사용하면 변수를 선..

간단 지식/C 2020.11.06