728x90
반응형
SMALL

C 언어 컴파일 과정

 

test.c

 

전처리기(preprocessor) 

 

test.i

 

컴파일러(compiler)

 

test.s

 

어셈블러(assembler)

 

test.o

 

링커(linker)

 

test.exe

 

 

전처리 과정 (preprocessor)

- 본격적으로 컴파일하기 전에 처리할 작업들

- 외부에 선언된 다양한 소스 코드, 라이브러리 포함

- 프로그래밍의 편의를 위해 작성된 매크로 변환

- 컴파일할 영역 명시

 

컴파일 과정 (Compiling)

- 전처리가 완료 되어도 여전히 소스 코드

- 전처리 완료된 소스 코드를 저급 언어(어셈블리 언어)로 변환

 

어셈블 과정 (assembling)

- 어셈블리어를 기계어로 변환

- 목적 코드(object file)를 포함하는 목적 파일이 됨

 

C 언어 컴파일 과정

- 목적 파일 vs 실행 파일

  - 목적 파일과 실행 파일은 둘 다 기계어로 이루어진 파일

  - But, 목적 파일과 실행 파일은 다르다.

  - 목적 파일은 링킹(linking)을 거친 이후에야 실행 파일이 된다

 

링킹 과정 (linking)

컴파일 된 목적 파일들은 독립적으로 실행될 수 없다.

따라서 목적 파일들을 서로 연관지어서 실행파일을 만든다.

실행파일이 최종적으로 완료되면 프로그램 실행이 가능하다.

728x90
반응형
LIST
728x90
반응형
SMALL

기계어, 어셈블리어

저급 언어로 변환

 

명령어: "학생들, 다음 주까지 과제를 제출하세요."

 

 

명령어의 구조

- 연산코드: 수행할 연산

- 오퍼랜드: 연산에 사용될 데이터 혹은 연산에 사용될 데이터가 저장된 위치

 

 

오퍼랜드

- 연산에 사용될 데이터

- 연산에 사용될 데이터가 저장된 위치 (주소필드)

 

 

연산코드

- 데이터 전송

MOVE: 데이터를 옮겨라

STORE: 메모리에 저장하라

LOAD: 메모리에서 CPU로 데이터를 가져와라

PUSH: 스택에 데이터를 저장하라

POP: 스택의 최상단 데이터를 가져와라

 

- 산술/논리 연산

ADD / SUBTRACT / MULTIPLY / DIVIDE : 덧셈 / 뺄셈 / 곱셈 / 나눗셈을 수행하라

INCREMENT / DECREMENT : 오퍼랜드에 1을 더하라 / 오퍼랜드에 1을 빼라

AND / OR / NOT: AND / OR / NOT : 연산을 수행하라

COMPARE : 두 개의 숫자 또는 TRUE / FALSE 값을 비교하라

 

- 제어 흐름 변경

JUMP : 특정 주소로 실행 순서를 옮겨라

CONDITIONAL JUMP : 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라

HALT : 프로그램의 실행을 멈춰라

CALL : 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라 

RETURN : CALL을 호출할 때 저장했던 주소로 돌아가라

 

- 입출력 제어

READ(INPUT) : 특정 입출력 장치로부터 데이터를 읽어라

WRITE(OUTPUT) : 특정 입출력 장치로 데이터를 써라

START IO : 입출력 장치를 시작하라

TEST IO : 입출력 장치의 상태를 확인하라

 

 

명령어 주소 지정 방식

- 유효 주소 (effective address) : 연산에 사용할 데이터가 저장된 위치

- 명령어 주소 지정 방식 (addressing modes) : 

연산에 사용할 데이터가 저장된 위치를 찾는 방법

유효 주소를 찾는 방법

다양한 명령어 주소 지정 방식들

 

- 즉시 주소 지정 방식 (immediate addressing mode)

연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시

가장 간단한 형태의 주소 지정 방식

연산에 사용할 데이터의 크기가 작아질 수 있지만, 빠름

 

[연산 코드][연산에 사용할 데이터]

 

- 직접 주소 지정 방식 (direct addressing mode)

오퍼랜드 필드에 유효 주소 직접적으로 명시

유효 주소를 표현할 수 있는 크기가 연산 코드만큼 줄어듦

 

- 간접 주소 지정 방식 (indirect addressing mode)

오퍼랜드 필드에 유효 주소의 주소를 명시

앞선 주소 지정 방식들에 비해 속도가 느림

 

- 레지스터 주소 지정 방식 (register addressing mode)

연산에 사용할 데이터가 저장된 레지스터 명시

메모리에 접근하는 속도보다 레지스터에 접근하는 것이 빠름

 

- 레지스터 간접 주소 지정 방식 (register indirect addressing mode)

연산에 사용할 데이터를 메모리에 저장

그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시

 

 

 

 

 

 

 

 

 

 

728x90
반응형
LIST
728x90
반응형
SMALL

https://godbolt.org

 

Compiler Explorer

 

godbolt.org

 

Compiler Explorer - 고급언어를 저급언어(어셈블리어)로 변환하는 과정 참고 웹 사이트

728x90
반응형
LIST
728x90
반응형
SMALL

개발자가 작성한 소스 코드 

 

#include <stdio.h>

 

int main() {

  printf("Hello, World!");

  return 0;

}

 

 

고급 언어와 저급 언어

             변환

고급 언어 -> 저급 언어

 

- 고급 언어: 개발자가 이해하기 쉽게 만든 언어

- 저급 언어: 컴퓨터가 이해하고 실행하는 언어 (기계어, 어셈블리어)

 

 

이진수(0과1)로 표현된 기계어

십육진수(0~9, A~F)로 표현된 기계어

 

 

기계어               어셈블리어

0101      ->       push rbp

 

 

push rbp

mov rbp, rsp

mov DWORD PTR [rbp-4], 1

 

 

컴파일 언어와 인터프리터 언어

 

고급 언어

                컴파일

컴파일 언어 -> 저급언어

                      컴파일

인터프리터 언어 -> 저급언어

 

 

- 컴파일 언어: 정리하면 컴파일 언어로 작성된 소스 코드는 컴파일러에 의해 저급 언어로 변환되고(이 과정을 컴파일이라고 합니다.) 컴파일 결과로 저급 언어인 목적 코드가 생성됩니다.

 

 

- 인터프리트 언어

인터프리터에 의해 한 줄씩 실행

소스 코드 전체가 저급 언어로 변환되기까지 기다릴 필요 없음

 

 

컴파일 언어와 인터프리어 언어로 확실하게 구분되지는 않음

 

 

컴파일  후 고급 언어가 어셈블리어로 변환되는 과정을 알아볼 수 있는 웹 사이트

https://godbolt.org

 

 

728x90
반응형
LIST
728x90
반응형
SMALL

0과 1밖에 모르는 컴퓨터가 어떻게 문자를 이해하고 표현할 수 있지?

 

이모티콘, 문자, 특수문자를 사용한다 어떻게 사용하는 것이지?

 

 

문자 집합과 인코딩

- 문자 집합(character set): 컴퓨터가 이해할 수 있는 문자의 모음

- 인코딩(encoding): 코드화하는 과정, 문자를 0과 1로 이루어진 문자 코드로 변환하는 과정

- 디코딩(decoding): 코드를 해석하는 과정, 0과 1로 표현된 문자 코드로 문자로 변환하는 과정

 

 

아스키 코드

- 초창기 문자 집합 중 하나

- 알파벳, 아라비아 숫자, 일부 특수 문자 및 제어 문자

- 7비트로 하나의 문자 표현: 8비트 중 1비트는 오류 검출을 위해 사용되는 패리티 비트(parity bit)

 

- 간단한 인코딩 

- But 한글을 포함한 다른 언어 문자, 다양한 특수 문자 표현 불가: 아스키 코드는 7비트로 하나의 문자를 표현하기에 128개보다 많은 문자를 표현할 수 없음, 8비트 확장 아스키 (extended ASCII)의 등장, 여전히 부족

 

 

한글 인코딩: 완성형 vs 조합형 인코딩

 

- 한글을 위한 인코딩이 필요

한글의 특징

알파벳을 이어 쓰면 단어가 되는 영어

초성, 중성, 종성의 조합으로 이루어진 한글

완성형 인코딩 방식과 조합형 인코딩 방식이 존재

 

 

EUC-KR

- KS X 1001 KS X 1003 문자집합 기반의 한글 인코딩 방식

- 완성형 인코딩

- 글자 하나 하나에 2바이트 크기의 코드 부여 (2바이트 == 16비트 == 4자리 십육진수로 표현)

 

- 2300여개의 한글 표현 가능

- 여전히 모든 한글을 표현하기에는 부족한 수 

- 쀏, 뙠, 휔 같은 한글은 표현 불가능

 

더군다나 이렇게 언어별 인코딩을 국가마다 하게 되면

다국어를 지원하는 프로그램을 개발할 때엔

언어별 인코딩 방식을 모두 이해해야 한다.

 

 

유니코드 문자 집합과 utf-8

 

- 유니코드

통일된 문자 집합

한글, 영어, 화살표와 같은 특수 문자, 심지어 이모티콘까지

현대 문자 표현에 있어 매우 중요한 위치

 

- 유니코드의 인코딩 방식

utf-8, utf-16, utf-32 ...

 

 

UTF-8 인코딩

- UTF(Unicode Transformation Format) == 유니코드 인코딩 방법

- 가변 길이 인코딩: 인코딩 결과가 1바이트 ~ 4바이트

- 인코딩 결과가 몇 바이트가 될지는 유니코드에 부여된 값에 따라 다름

 

 

글자가 깨져요?

- 인코딩 호환이 안 되는 것은 아닌지

- 컴퓨터가 이해하는 문자집합에 속하지 않는 문자이지는 않는지

 

728x90
반응형
LIST
728x90
반응형
SMALL

컴퓨터는 0과 1밖에 모른다.

 

어떻게 3+4를 할까?

 

 

정보 단위

 

비트(bit): 0과 1을 표현하는 가장 작은 정보 단위 (전구로 따지자면 꺼짐, 켜짐)

 

총 4가지가 가능 

 

00

 

01

 

10

 

11

 

 

* 3비트로는 8개가 가능

 

 

n 비트로는 2n승 가지의 정보 표현 가능

 

프로그램의 수많은 비트로 이루어져 있음

 

다만, 평소 "이 파일은 8,920,120 비트야" 라고 표현하진 않음

 

비트보다 더 큰 단위를 사용 

 

- 바이트, 킬로바이트, 메가 바이트, 기가 바이트, 테라 바이트 ...

 

 

1바이트 - 8비트

1킬로바이트 - 1000바이트

1메가바이트 - 1000킬로바이트

1기가바이트 - 1000메가바이트

1테라바이트 - 1000기가바이트

 

 

워드

- CPU가 한 번에 처리할 수 있는 정보의 크기 단위

- 하프 워드 : 워드의 절반 크기

- 풀 워드 : 워드 크기

- 더블 워드 : 워드의 두 배 크기

 

 

이진법 : 0과 1로 숫자 표현하기

 

이진법 (binary)

- 0과 1로 수를 표현하는 방법

- 숫자가 1을 넘어가는 시점에 자리올림

- 우리가 일상적으로 사용하는 진법은 숫자가 9를 넘어갈 때 자리올림하는 십진법 (decimal)

 

 

십진수.    이진수.

1                       1

2                       10

3                       11

4                       100

5                       101

6                       110

7                       111

8                       1000

 

보통 이진수를 표현할 때는 1000(2) 또는 0b1000 

 

 

0과 1로 음수 표현하기: 2의 보수

- 어떤 수를 그보다 큰 2n에서 뺀 값

 

11(2) 보다 큰 2n = 100(2)

11(2)를 음수로 표현한 값 01(2)

 

- 모든 0과 1을 뒤집고 1 더한 값 

11(2)를 음수(2의 보수)로 표현하기

<11>

 

모든 0과 1 뒤집기

<00>

 

1 더하기

<01>

 

 

음수 두 번 구해보기

<1011>

<0101> 2의 보수로 표현

<1011> 다시 2의 보수로 표현

 

 

플래그(flag)

 

양수 0101(2) -> 5구나

음수 0101(2) -> 1011(2)의 음수구나

 

레지스터에 양수/음수를 구분하는 플래그가 있다. -> 플래그 레지스터

 

 

십육진법

- 이진법으로는 숫자의 길이가 너무 길어진다

- 십진수 32 == 이진수 100000

 

- 그래서 컴퓨터의 데이터를 표현할 때 십육진법도 많이 사용

- 수가 15를 넘어가는 시점에 자리올림

 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 

0 1 2 3 4 5 6 7 8 9  A  B  C  D   E   F  10

 

십육진법 표기

15(16) - 수학적 표기 방식

ox15 - 코드상 표기 방식

 

 

직접 코드에 써넣는 사례도 많다.

 

offest = (offest & 0x00ffffff) << 2

 

 

팁: 이진수 -> 십육진수 변환

 

2진수와 16진수간의 변환이 쉽다 아주 간편하다 

 

그래서 16진수가 많이 쓰인다.

 

 

 

 

 

 

728x90
반응형
LIST
728x90
반응형
SMALL

컴퓨터 구조 

- 컴퓨터가 이해하는 정보 - 데이터, 명령어

- 컴퓨터의 네 가지 핵심 부품 - CPU, 메모리(RAM, ROM), 보조기억장치, 입출력장치

 

데이터

- 숫자, 문자, 이미지, 동영상과 같은 정적인 정보

- 컴퓨터와 주고 받는/내부에 저장된 정보를 데이터라 통칭 하기도

- 0과 1로 숫자를 표현하는 방법

- 0과 1로 문자를 표현하는 방법

 

컴퓨터는 결국 명령어를 처리하는 기계

명령어

- 컴퓨터를 실질적으로 움직이는 정보

- 데이터는 명령어를 위한 일종의 재료

명령어의 생김새와 동작 방식

 

1과 2를 더하라

- 1과 2는 데이터

- 1과 2를 더하라는 명령어

 

'안녕하세요'를 출력하라

- '안녕하세요'는 데이터

 

컴퓨터의 네 가지 핵심 부품

- 작은 컴퓨터 - 라즈베리파이, 아두이노

- 스마트폰

- 노트북

- 서버 컴퓨터

 

메모리는 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품입니다.

 

현재 실행되는 프로그램을 프로세스라고 합니다.

 

CPU는 메모리에 저장된 명령어를 읽어 들이고, 해석하고, 실행하는 부품입니다.

 

ALU는 산술연산장치 (계산기), 계산을 위한 회로 모음, 산술과 논리의 연산

 

레지스터: CPU 내부의 작은 저장장치

 

제어장치는 제어 신호를 내보내고, 명령어를 해석하는 장치, 일종의 전기 신호를 내보냄, 컴퓨터 부품들을 관리하고 작동시키기 위한 전기 신호

 

CPU가 메모리에 저장된 값을 읽고 싶을 땐 메모리를 향해 메모리 읽기라는 제어 신호를 보낸다.

CPU가 메모리에 어떤 값을 저장하고 싶을 땐 메모리를 향해 메모리 쓰기라는 제어 신호를 보낸다.

 

보조기억장치는 전원이 꺼져도 보관될 프로그램을 저장하는 부품입니다.

 

메모리를 실행할 정보를 저정하고

보조기억장치는 보관할 정보를 저장한다.

 

입출력장치는 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환할 수 있는 부품입니다.

 

 

시스템 버스 (내부 구성)

- 주소 버스 : 주소를 주고받는 통로

- 데이터 버스 : 명령어와 데이터를 주고받는 통로

- 제어 버스 : 제어 신호를 주고받는 통로

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
LIST
728x90
반응형
SMALL

"프로그래밍 언어의 문법과 함께 컴퓨터 구조와 운영체제를 알아야 한다"

 

첫 번째 이유는 문제해결 능력을 기를 수 있다.

 

두 번째 이유는 성능/비용을 고려한 개발을 할 수 있다.

 

 

컴퓨터를 두려움 없이 볼 수 있는 능력이 필요

 

컴퓨터의 대상을 미지의 대상으로 보기 때문

 

분석의 대상으로 보아야 한다

 

 

컴퓨터를 관조할 수 있는 능력 배양 

 

컴퓨터를 내려다보며 문제를 해결할 수 있는 개발자 

 

 

성능, 용량, 비용을 계산하여 프로그래밍을 할 수 있다.

 

서버 컴퓨터 -> 무조건 저렴한 컴퓨터, 무조건 최신 컴퓨터? 클라우드 서비스? 

 

클라우드 서비스를 이요하더라도 CPU, 메모리, 저장 용량을 직접 선택해야 한다.

 

비용이 달라진다.

 

 

"컴퓨터 구조는 결국 성능, 용량, 비용에 대한 이야기"

 

 

 

 

 

 

728x90
반응형
LIST

+ Recent posts