컴퓨터 내부의 언어 체계

김민우·2023년 3월 11일
0

컴퓨터구조

목록 보기
1/8
post-thumbnail

우리는 언어를 통해 상대방에게 복잡한 개념을 직접 보여주지 않고 의사소통을 할 수 있다. 컴퓨터 언어와 우리들의 언어에서 같은 의미로 사용되는 단어들을 알아보자.

비트


  • 자연어에서 문자와 동일한 의미 (a, , 등)
  • 2진법을 의미하는 바이너리(binary)와 숫자를 뜻하는 디지트(digit)의 합성어
  • 2진법을 사용하여 0 또는 1의 값들 중 하나로 표현된다.

논리 연산


비트를 사용할 때, 단순히 예(Yes) 또는 아니오(No) 중 하나가 요구되는 질문들은 하나의 비트를 사용해서 답변이 가능하다. 그러나, 구체적인 질문에는 하나의 비트만으로는 답할 수 없다.

다음 구체적인 질문에 답하기 위해선 스무고개와 같이 질문을 여러 개로 쪼개면 된다.

밖에 비가 내리고 있거나 추우면 코트를 입어라

  • 밖에 비가오는가?
  • 추운가?

이 두 개의 질문에 대한 답변에 따라 코트를 입을지 말지를 결정하면 된다.

이렇게 다른 비트들이 표현하는 내용 (밖에 비가오는가?, 추운가?)들을 통해 새로운 비트를 만들어내는 동작을 논리연산이라 한다.

불리언 대수

연산 규칙의 집합을 의미하며 다음 3가지가 존재한다.

  • NOT
    • 논리적 반대
  • AND
    • 둘 이상 비트들에 적용가능
    • 모든 비트가 참이면 참
  • OR
    • 둘 이상 비트들에 적용가능
    • 적어도 하나의 비트가 참이면 참
  • XOR
    • 위 3가지를 합성 연산하여 만든 연산자
    • 베타적 OR
    • 두 비트에서만 사용가능하며, 두 비트가 다를시 참

드모르간의 법칙

a AND b 의 연산을 NOT (NOT a OR NOT B)로 표현하는 방법

긍정적인 논리에 더해 부정적인 논리를 기술하는 명제를 사용할 때 드모르간 법칙을 ㅏㅅ용할 수 있다.

긍정적인 논리와 부정적인 논리를 위 코트 예제를 통해 알아보자.

  • 드모르간의 법칙을 알면 두 번째 표가 표현하는 논리가 '춥다 OR 비가온다'와 동등함을 알 수 있고, 훨씬 간단하게 결과를 계산할 수 있다.

논리 연산자마다 소모되는 비용이 다르므로(예를 들어 OR과 AND) 이처럼 드모르간 법칙을 적절히 사용하면 훨씬 간단하게 결과를 계산할 수 있다.

정수를 비트로 표현하는 방법


컴퓨터는 비트를 통해 숫자를 표현하기에 우리가 사용하는 10진수를 2진수로 저장한다. 10진수를 2진수로 변환하는 과정과 2진수를 10진수로 표현하는 과정을 예시로 알아보자.

  1. 5,028을 2의 거듭제곱들의 합으로 표현해보자

  1. 이에 대한 2진수의 변환결과는 다음과 같다.

이를 통해 2진수로 5,028은 총 13비트 수가 된다는 것을 알 수 있다.

비트 0 또는 1 값을 가지므로 n개를 통해 총 2^n 만큼의 값들을 표현할 수 있다.

2진수에서 양 끝 비트들을 표현하는 방식이 있다.

  • LSB : 가장 왼쪽 비트이자 제일 큰 유효 비트
  • MSB : 가장 오른쪽 비트이자 가장 작은 유효 비트

2진수 덧셈

이진수 101 (10진수로 5)와 001 (10진수로 1)을 더해보자.

  • 10진수의 덧셈을 하듯이 각 자리수끼리 고려해주면 된다.
  • 이 때, 각 자리수끼리 덧셈은 논리연산을 해주면 된다.

  • 각 자리수끼리 논리연산은 AND와 XOR을 사용하면 된다.
  • AND : 자릿수 덧셈의 합을 담당
  • XOR : 자릿수 덧셈의 올림을 담당

이를 통해 다시 위의 예제 이진수 덧셈을 이해해보자.

  • 맨 오른쪽 자릿수는 모두 1이므로 AND = 1, XOR = 0 이다.
    • 올림이 발생하여 다음 자릿수 계산값에 1을 더해줘야 한다
  • 가운데 자릿수는 모두 0이므로 AND = 0, XOR = 0 이다.
  • 맨 왼쪽 자릿수는 0과 1이므로 AND = 0, XOR = 1 이다.
  • 따라서, 결과값은 110이다.

음수 표현

문맥에 따라 음수를 표현하는 방법은 다음 3가지 방법이 존재한다.

  • 부호와 크기
    • 기존 값에 부호(Sign)을 의미하는 하나의 비트를 추가하여 부호를 표시
    • 즉, 하나의 비트는 부호에 사용하고 나머지는 크기를 표현
    • 0을 표현하는 방법이 두 가지라 비용이 낭비되고 이를 활용하면 XOR과 AND를 사용한 덧셈 계산을 사용 불가
    • 잘 사용하지 않는다.
  • 1의 보수
    • 양수 값의 모든 비트를 뒤집는 방법을 통해 음수를 표현 (7 = 0111 면 -7 = 1000)
    • MSB 에서 올림이 발생한 경우에 LSB로 올림을 전달해야하는 순환 올림을 사용
      • 순환 올림을 사용해야하는 별도의 하드웨어 장치 추가 요구
    • 0을 표현하는 방법이 두 가지
    • 잘 사용하지 않는다.
  • 2의 보수
    • 보편적으로 널리 쓰이는 방법
    • n의 음수값 비트 패턴은 x + n = 0 이되는 비트 패턴이다.

하나의 이진수 패턴에는 문맥(부호와 크기, 1의 보수, 2의 보수)에 따라 표현하는 값이 달라질 수 있다는 것을 명심하자.

실수를 표현하는 방법


문맥에 따라 실수를 표현하는 방법은 여러가지가 있다.

  • 고정소수점 표현법
    • 이진 소수점의 위치를 임의로 정하는 방법
    • 소수점의 위치가 항상 일정하기에 고정 소수점 표현법이라 부른다.
    • 소수점 자체를 비트로 표현하기에는 메모리 비용이 너무 많이 들기때문에 다른 방법을 사용해야 한다.
  • 부동소수점 표현법
    • 2진 소수와 2의 거듭제곱 횟수를 통해 실수를 표현하는 방법
    • 지수와 가수를 분리함으로써 수를 표현할 때 필요한 0을 모두 저장하지 않아도 큰 수나 작은 수를 표현할 수 있다.
    • 0을 표현할 수 있는 방법이 매우 많아 비용을 낭비
    • 지수가 커질수록 가수의 한 패턴과 다른 패턴 사이의 값 차이가 매우 커진다.
  • IEEE 부동소수점 수 표준
    • 기존 부동소수점 표현법에 정규화(가수를 조정해서 맨 앞에 0이 없도록 만드는 것)를 적용해 정밀도를 높히는 방법
    • 크게 기본 정밀도와 2배 정밀도 부동소수점 수로 나뉜다.
    • 편향된(biased) 지수값을 사용해 지수에 대한 부호비트가 따로 존재 하지 않는다.
    • 0으로 나누는 등의 비정상적인 상황을 표현할 수 있는 여러 가지 비트 패턴(ex. NaN) 을 제공

2진수를 다루는 방법


  • 8진 표현법
  • 16진 표현법

프로그래밍 언어에서 진법 표기법

  • 8진법 : 맨 앞이 0으로 시작
  • 10진법 : 1 ~ 9 수로 시작
  • 16진법 : 맨 앞이 0x으로 시작

0은 8진수 0을 의미하나 8, 10진법 모두 0을 의미하므로 딱히 상관이없다.

비트 그룹의 이름


큰 수를 가리키기위한 표준 용어도 존재한다.

  • 킬로바이트 : 1천
  • 메가 : 100만
  • 기가 : 10억
  • 테라 : 1조

그러나, 컴퓨터 엔지니어들은 이런 용어를 빌려와서 의미를 약간 바꿔 밑이 10이 아닌 2로 표현하게 해서 바이트나 비트를 표현할 때는 다음과 같이 표현한다

  • 킬로바이트(KB) : 2^10 = 1024 byte
  • 메가바이트(MB) : 2^20
  • 기가바이트(GB) : 2^30
  • 테라바이트(TB) : 2^40

텍스트 표현


아스키 코드

컴퓨터는 비트를 사용해 수를 표현했다. 아스키 코드는 수와 마찬가지로 문자나 키보드에 있는 다른 기호등을 수를 사용해 표현하는 방법이다.

  • 알고보면 아스키 문자 코드에서는 역사적인 이유로 8진수가 여전히 쓰이고 있다.
  • 이 중 몇가지 코드들은 출력에 쓰이지 않고 장치를 제어하는 데 쓰이는 제어 문자가 있다.

  • 이 중 상당수는 통신 제어를 위한 문자이다.

그런, 아스키 코드는 영어를 표현하는 모든 문자를 포함하고 있지만 시간이 지남에 따라 그 밖의 언어들을 지원해야 할 필요가 생겼다. 국제 표준화 기구(ISO)에서 ISO-646과 ISO-8859를 도입하여 유럽 언에에 필요한 액센트 기호나 발음 구별 기호를 추가했다.

이렇게 각기 다른 표준이 존재하는 이유는 예전에는 비트의 비용이 비쌌기에 문자를 7 ~ 8 비트에 욱여넣었다. 비트 가격이 떨어짐에 따라 유니 코드라는 새로운 표준이 생겼고 문자에 16비트 코드를 부여했다. 이후 유니코드는 21비트까지 확장되었다.

유니코드 변환 형식 8비트

모든 문자를 아스키 코드를 통해 8비트로 표현이 가능했고, 과거엔 비트의 사용 비용이 비쌌기에 굳이 16비트를 사용해서 문자를 표현하지 않았다. 유니코드는 문자 코드에 따라 각기 다른 인코딩을 사용해 이러한 문제를 해결한다.

인코딩
다른 비트 패턴을 표현하기 위해 사용하는 비트 패턴

그 중 유니코드 변환 형식 8비트(UTF-8)이 현재까지도 하위 호환성과 효율성 때문에 가장 널리 쓰이고 있다. UTF-8은 모든 아스키 문자를 8비트로 표현하기 때문에 아스키 데이터를 인코딩할 때 추가 공간이 필요하지 않다. 이 외에 아스키가 아닌 문자들은 아스키를 받아서 처리하는 프로그램이 깨지지 않는 방법으로 문자를 인코딩한다.

문자를 사용한 수 표현


컴퓨터와 컴퓨터 사이에서 2진 데이터를 직접 보내어 송수신을 할 수 있다.

색을 표현하는 방법

컴퓨터 그래픽스 : 전자 모눈종이에 해당하는 것에 색을 표현하는 점을 찍어 그림을 만드는 과정
픽셀 : 모눈의 각 격자에 찍는 점

컴퓨터 모니터는 빨간색(R), 녹색(G), 파란색(B) 광선을 섞어서 색을 만들어내며 이를 RGB 색 모델이라 한다. 색은 컬러 큐브라는 것으로 표현할 수 있다.

아무 빛도 없으면 (0, 0, 0) 검은색이고, 모든 빛을 최대로 켜면(1, 1, 1) 흰색이다. 이런 식으로 빛을 혼합해 색을 표현하는 방법을 가산 색 시스템이라고 한다.

현대 컴퓨터들은 색을 표현하는데 24비트를 사용해 10,000,000에 가까운 2의 제곱수에 해당하는 색을 표현할 수 있다. 이들은 세 가지의 8비트 필드로 나뉘며 각 필드는 세 가지 주요 색(RGB)을 표현(0 ~ 255)한다.

색 인코딩

웹 페이지는 주로 사람이 읽을 수 있는 UTF-8 문자의 시퀀스로 이뤄지는 텍스트를 표현하기에 텍스트를 통해 색을 표현할 방법이 필요하다.

URL 인코딩과 비슷한 방싱그로 색을 인코딩한다. 웹에서는 색을 16진 트린플렛으로 표현한다. # 뒤에 여러가지 16진 숫자를 추가해 #rrggbb 처럼 표현하는 방식이다. 여기서 r은 빨간색, g는 초록색, b는 파란색을 의미하며 각 값들은 0(없음) 또는 f(가득)로 채운다. (ex. #000000 : 검은색, #ffffff : 흰색, #fff000 : 노란색)

각각의 8비트 색값을 두 자리 문자로 된 16진 표기로 바꾼다.

0개의 댓글