컴퓨터는 바보입니다. 

 

0 1 밖에 몰라요.

원리를 제대로 알려면 완전 기초부터 컴퓨터 구조론까지 배워야 하지만 간단히 설명하면 아래와 같습니다.

 

+ - 연산을 잘하는 매우 빠른 놈이 있는데 이 놈이 2진수밖에 모른다네요.

좀 이용을 해야지 생각합니다.

 

일단 숫자 10을 표현하자니 1010(2) 로 표현이 되는군요.

또 가만히 살펴보니 이 놈의 생각 저장 창고가 8bit (8칸 으로 된 2진수 로 되어 있네요)

 

즉, 저장 창고도 2진수인데 8개가 한 묶음이랍니다. 

2가지 정보를 저장할 수 있는 1bit 가 8 개 묶음, 8bit 를 1Byte 로 부르기로 합니다.

 

다시 돌아가서 1 bit 는 2가지의 경우의 수를 표현이 가능합니다.

0 또는 1 이니깐 2가지 표현이 가능하네요.

그럼 2 bit 는 00(2) 01(2) 10(2) 11(2) 아하 4가지가 표현이 가능하군요.

즉, bit 가 하나씩 증가할 때 마다 2의 승수개수로 표현이 가능한 종류가 늘어납니다.

그럼 1byte = 8 bit 는 2^8 승 즉 256가지의 종류를 표현할 수가 있겠군요.

계속 생각하면 2^10 은 1024byte 가 되고 이는 1KBye 로 부른다네요 .

 

아하 1KByte != 1000Byte 가 아니군요!

 

다시 1 byte 로 돌아가면 , 1byte 방이 옆으로 연결되서 쭉쭉 있는겁니다. 그 방에 호수도 있네요. 101호 102호...

아까도 말했지만 컴퓨터는 단순 연산만 한다는 거지요. 그 메모리 방에서 값을 꺼내서 더하기 빼기 옮기기 만 한다고 생각하시면 되요.

 

그리고 컴퓨터는 어셈블리라는 언어만 이해를 하는 절대 외국어를 안배우는 1개국어 사용자인데

( 어 그럼 C 나 java 는 뭐지?  -> 모든 언어가 결국 어셈블리로 변환되어 실행됩니다)

하나 예를 들면 mov a,b 하면

a 방에 있는 값을 b 방으로 옮겨라 는 뜻입니다. 근데 한번에 안 옮겨저요. 바보라서.

 

위 한줄을 읽고 (1클럭) , 일단 명령을 읽어야지요

그 한줄을 해석하고 (1클럭) , 어떤건지 실행 준비해야지요.

실행하고 (1클럭) ,  a 에 값을 빼와야지요

저장하고(1클럭) , b 에 쑤셔 넣어야지요.

 

흠 그러면 이명령은 CPU 가 1MHz 클럭 로 동작한다면 1 clock 이 1us 니깐 4us 만에 실행이 되겠군요.

아이고 느리네..하나 옮기는데 이정도면...

 

여기서 파이프라인 설명하려다 ..아차 여기는 초보용...이라 생략합니다.

OK . OK 여기까지...

 

정리하면

뭔가 이 바보 상자는 2진수로된 방에서 값을 꺼내서 계산하는데 

명령을 시키는 것은 asm 만 이해를 하고 

이것도 몇단계로 나누어서 실제 실행을 하는군.

 

좋아 숫자는 이해했어. 근데 지금 보는 이글자는 뭐야

hello world 나오는거 해봤는데, 그거는 어떻게 표현하는거지?

 

네 맞습니다. 컴퓨터는 'h' 인지 'e' 인지를 몰라요.  언급한 것처럼 단순히 0-255 개 를 1방안에 표현할 뿐이지요.

 

자 그럼 화면에 나오는 'A'  값은 어떻게 하는거지 , 숫자밖에 안들어가는데 'A' 는 뭔가 다르게 들어가나?

 

컴퓨터는 처음에 말했지만 바보 상자입니다.

 

그래서 정의를 해주었어요. 만약 이 방안에 값이 0x41(hex / 16진수 입니다) 이 값은 65란 값이기도 하고 

2진수로 0100 0001 입니다. 물리적인 셀공간에는 정말 0100 0001 로 저장되어 있겠지요.

그냥 전구 8개가 끄고 켜고 끄고 끄고 끄고 끄고 끄고 켜고 그렇게 있다고 생각하시면 되요.

 

자 그럼 'A' 값은 어떻게 표현하느냐!

 

이 0x41 값이 들어있으면 'A' 로 치자입니다.

 

이게 무슨 뚱딴지 같은 소리냐? 개소리 하지 마세요! 라고 할 수 있는데 이게 다입니다.

 

그럼 65 하고 'A' 하고 어떻게 구분해? 라고 하신다면 

계속 제가 이야기했지요. 컴퓨터는 바보 상자라구요..구분 못합니다. 그냥 저장된 65란 값이지요.

 

문자를 표현하기 위해서 ascii code 표라는 테이블을 만들고 그냥 정의해놓은겁니다.

'B' 는 다행스럽게도 하는 더해서 66 이군요. 고맙게도 순서대로 정의를 해놓았답니다.

 

다시 원래 질문!

65 하고 'A ' 는 컴퓨터 자체는 구분을 못합니다.

다만 사람이 사용하기에 따라서 'A' 로 사용하기도 65 란 값으로 사용하기도 하는겁니다.

 

이상하지요.

 

이상 바보 컴퓨터에 대한 설명이었습니다~~


거의 저의 경험이긴 한데 많은 도움이 되실겁니다.
아시는 분은 당연하지만 초보자들은 아마 헷갈리거나 모르시는 분들이 많을 거예요.

혹시나 제가 실수할 수도 있으니 잘못된 부분있으면 조언도 같이 부탁드려요~~

1. string 에서 마지막은 NULL 이고 실체가 있는 공간이다.
char buf[16];
sprintf(buf,"%s","hello");
여기에서 strlen(buf) 은 5이겠지요. 하지만 buf 를 차지하고 있는 공간은 6바이트입니다.
스트링에서 마지막에 항상 NULL 이 붙지요.

그래서 이런 실수를 합니다.
char buf[4];
char value = 5;
sprintf(buf,"%s","abcd”);
printf(“%d”, value);

이걸하고 나면 아마도 value 값이 0 이 됩니다. 이걸 처음본 뉴비들은 메모리 고장났다면서 컴퓨터에 대한 신뢰가
확 떨어지게 되지요. 하지만 당연한 일이기도 합니다.

제가 프로그램시 제일 좋아하는 격언이지요.

"아니 땐 굴뚝에 연기나랴"

만약, 아니땐 굴뚝에 연기가 난다면, 새벽에 굴뚝안에 맺혀진 이슬로 인해 낮에 온도가 오르면서 수증기로 변해서
불을 때지 않는데도 굴뚝에 연기가 나는 것으로 오인할 수 있는 것처럼 모든 일에는 원인이 확실히 있습니다.


2. memcpy 와 memmove 차이점 사용법 이해
- 메모리 간 복사를 위해서는 memcpy 사용하는데 단 하나의 제약이 있다면 자신으로 복사를 못한다는 겁니다.
더 정확히 말하면 의도치 않은 결과가 나옵니다. 대신에 memmove 를 사용해야지요.
- 아래는 컴파일시 에러가 없지요. 하지만 결과는 예상과 다르게 나옵니다.
char buf[24];
memcpy(buf+4, buf, 16);
--> memmove(buf+4, buf, 16);


- memcpy 구현 소스를 보신다면 왜 잘 못동작할지 이해가 될껍니다. memmove 소스랑 비교해보세요.
void *memcpy (void *dest, const void *src, size_t len)
{
char *d = dest;
const char *s = src;
while (len--)
*d++ = *s++;
return dest;
}
void *memmove (void *dest, const void *src, size_t len)
{
char *d = dest;
const char *s = src;
if (d < s)
while (len--)
*d++ = *s++;
else
{
char *lasts = s + (len-1);
char *lastd = d + (len-1);
while (len--)
*lastd-- = *lasts--;
}
return dest;
}

- 참고로 단순하게 모든 memcpy 대신에 안전하게 mommove 를 사용해도 됩니다만 그렇게 되면 발생하는 문제가 있지요. 이건 숙제!

- 한개더 memcpy 는 자기 자신을 복사못한다고만 알고있으면 안됩니다. 아래를 보세요. 이거는 잘동작해요.
memcpy(buf, buf+4, 16);


3. struct 를 sizeof 시 길이는 내부의 변수의 합과 다르다.
아래 참조.
https://www.geeksforgeeks.org/is-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member/
생각대로 1바이트 단위로 묶는 방법도 있다. 숙제!

4. C 에도 버전이 있고 문법이 다르다. 하지만 매우 큰차이는 없다.
ansi, c89 , c90 , c99, c11
애플의 swift 2,3,4,5 처럼 예전 코드가 컴파일 안되고 그러는 무지막지한 변화는 아니지만 차이는 알고 있어야 한다.
C 도 하위 호환이 안되는 문법을 사용하면 당연히 컴파일 에러가 발생한다.
그래서 이식성을 극도로 추구한다면 ansi 문법으로 작성해야 한다.

5. CPU 의 메모리 저장방식에는 little endian 과 big endian 이 있으며 , 메모리 복사시에 주의하여야 한다.
이것도 정확히 알고 넘어가야 하는 부분입니다. 이게 있는것 조차 모르시는 분들도 있더라구요.

요기까지 하겠습니다~~

https://en.wikipedia.org/wiki/Rubber_duck_debugging

 

Rubber duck debugging - Wikipedia

Code debugging method In software engineering, rubber duck debugging is a method of debugging code by articulating a problem in spoken or written natural language. The name is a reference to a story in the book The Pragmatic Programmer in which a programme

en.wikipedia.org

 

이 블로그 제목이 덕코딩인데, 러버덕코딩을 말하는 것 입니다.

 

제 책상위에 조그만 오리가 떡 하니 올려져 있지요.

 

이게 프로그램이랑 무슨 관계인가 하시겠지만 나름 증명된 코딩 기법이긴 합니다.

한마디로 코딩관련하여 혼잣말을 고무 오리에게 하는 겁니다.

 

아 이게 해결안되는데 오리야...이 변수가 말이지 내가 volatile 로 선언을 했거든.

그런데 inline 함수안에 들어가보니깐 말이지.

아차차. 이게 그랬구나..

 

이런 과정으로 해결되는 겁니다.

 

옆에 있는 사람 괴롭하지 말고 오리를 괴롭힙시다!

 

안녕하세요.
 
더 바빠지기 전에 생각나는 부분을 한번 대략 정리해야 될거 같아서 글을 올립니다.
 
보통 프로그램을 잘 짜려면 문법을 알아야 하고
코딩을 잘해야 하고 그러는데 코딩을 잘한다는게 어떤건지 명확히 모를때가 많습니다.
-> 원래는 "공학적으로 사고하는 법" 이 글을 적는다고 하다가 엉뚱한 데로 빠져서 제목을 바꿉니다.
 
그냥 저의 과거를 돌아보면 이랬던 것 같습니다.
 
초보때는 미션이 주어지면 아래 순서로 작업하였습니다.
0. 뭘 해보라고 듣고 온다.
1. 에디터 창을 연다.
2. 무언가 생각나는 데로 코드를 써본다.
3. 뭔가 계속 꼬이고 생각이 안난다.
4. 문법을 몰라 인터넷 뒤져 본다.
5. 어디서 소스 주워서 복붙했는데 컴파일 오류가 나거나 잘 안된다.
6. 투덜거리며 다시 다른 소스 주워온다.
7. 몇번 하다가 안되면 다 지우고 내가 짜고 말지 하며 다시 혼자 짜기 시작한다.
8. 컴파일 오류로 한참 헤멘다.
9. 어찌 컴파일은 되었는데 출력은 원하는 결과가 아니다.
10. 중간마다 디버그 걸어서 어디서 문제인지 확인한다. (뒤부터 앞으로)
11. 당연히 맞다고 생각되었던 부분이 이상하게 오류였다. 스스로 꿀밤한번때리고
12. 이게 돌아깔까 하는 불안감과 누더기 소스를 물어볼데도 없이 혼자 릴리즈한다.
13. 신기하게도 현장에 돌아가는데 며칠 또는 몇달 뒤 큰 사고와 함께 1,번 부터 반복한다.
 
20년이 지나고는 이렇게 바뀌었습니다.
1. 한국말로 미션이 주어진다.
2. 짧은 한국말을 조건이 달린 긴 한국말로 바꾸어 되물어본다.
   - 이러이러해서 이런 조건에 이런 출력이 나오는 기능 말인가요?
3. 처음 미션이 바뀐다. 요청자도 자신의 요구사항을 정확히 모르는 상황이 발생함.
4. 1-2 과정을 반복해서 간단한 요구사항 문서를 만든다.
  - 컨펌하러 보내놓고 설계시작
5. 알고리즘을 말로 풀어서 종이에 써본다.
  - 조건 별로 나누어 본다.
6. UML 미스무리하게 나름데로 다이어그램 그려서 설계해본다.
7. 코딩 시작
9. 종이보고 코딩 , 종이보고 코딩, 한번 쓴 코드는 왠만해서는 다시 지울 필요가 없다.
11. 그동안 짜놓은 라이브러리가 많아서 그냥 복붙이다.
   - CTRL-c,v 만 반복하고 있는 내가 한심해지기 시작한다.
10. 필요함 함수가 생겨서 github 뒤져본다.
11. 제일 많이 사용되는 라이브러리 갖와서 복붙
  - 라이브러리 복사 전 별도 샘플 검증 테스트 (테스트 로직 작성)
12. 완성된 함수를 이용한 테스트 로직 작성하여 검증.
  - 입출력 데이터가 많다면 엑셀이든 db 든 데이터로 정리.
13. 검증된 함수 부분을 메인 함수에 복붙
14. 머신에 다운후 최종 테스트
15. 현장 릴리즈 후 아무 이상 없음에 약간 불안해 하며 무소식이 희소식이라고 생각하고 다음 미션을 한다.
16. 정말 전화 한통없다. 그래도 불안하다.
 
그냥 한번 생각나는데로 적어보았습니다.
ㅎㅎ
 
즐거운 주말 되세요~~
저는 다음주에 빠듯한 해외 출장으로 몸과 정신을 혹사하러 잠시 다녀오겠습니다. T.T
[초보]
머리를 끙끙 싸매여
컴파일 오류로 코드를 썻다 지웠다를 반복하여 한달.
코딩 다하니 문서만들라네.
이런 내가 짠 코드를 내가 다시 보고 다이어그램 다시 그리는데 1주일
 
[고참]
설계 다이어그램 3일.
코딩 3일
설계 문서랑 보고서는 당연히 달라고 할 줄 알았지.
doxygen 으로 30초만에 완성. 끝
 
 
새싹시리즈 말고 노땅 시리즈 입니다.
나름 오래된 사람들(이렇게 말하는 저도 슬픕니다만)만 참고요~~

 

 
1. 시간이 갈수록 내가 쥐고 있던 라이브러리는 의미가 없어지고 오픈 소스가 더 믿음직스럽다.
2. 마이컴에도 C++ 시대가 왔다. C++ 모르는자 점차 먹고 살기 어려워 진다.
   문법이 아닌 개념이해 필수! 폴리모옵티즘,유서빌러티,인헤리턴스.
3. 코드 제네레이션에 대한 반감은 집어치우고 신봉하자.
   나도 그런식으로 짤 수 있지만 내가 짠거는 허접하고 칩제조사에 만든거는 위대하다.
   공부는 집에서 결과는 회사에서.
4. CPU 하나 선택하면 평생 먹고 살았는데 지금은 CPU 가리면 노땅된다.
   오늘은 ST , 내일은 느네사스, 모레는 PIC, 글피는 NXP .  다 거기서 거기다.
   양산시 모든점 고려해서 10원이라도 싸면 CPU 바꾸자. 요새는 별거 아니다.
5. 슈퍼개발자 소용없다. 아무리 답답해도 후배 키우자. 결국 나한테 도움이 된다.
   너무 잘 가르쳐주어도, 너무 안 가르쳐 주어도 문제지만, 둘중 하나라면 너무 잘 가르치는 걸 선택하자.
6. 크로스 플랫폼은 당연하다. 맥도 가오가 아니라 필요하면 쓴다.
7. 최신 개발방법론도 도입해보자 (기존에 우리들이 하던거에 멋드러진 이론만 입혔을 뿐 거기서 거기다)
8. 자바, 파이썬도 하면 된다. 영어 잘하면 다른 언어 배우기 쉽듯 거기서 거기다.
9. 모든 기술은 나를 편하게 하기 위한 도구일 뿐 내 영역을 침범하는 적이 아니다.
   마치 인공지능 시대를 거부하는 일자리는 잃어버리지 않도록 몸부림치는 사람이 아니길.
10. IT를 모르는 평범하고 다양한 사람들 많이 더 만나 볼 것.
 

 

지금 안적으면 다시 까먹을 것 같기도 해서 한번 적어봅니다.

순전히 개인적인 의견이므로 이런 견해도 있구나 생각하시길..(너무 진지하게 받아들이지는 마세요.)

 

참고로 저는 전자공학 전공에 20년차 펌웨어 개발하고 있습니다.
 
원래 질문자는 컴공 4학년이었습니다. 그 기준에서 한번 적어봅니다.

 

 
1. C 공부 열심히.
2. 리버스 엔지니어링도 좋고 asm 공부도 좋고 컴공이면 크랙파일 한번 만들어봄도 좋음.
3. 컴퓨터 구조론 및 OS 과목 수강 (저는 전자공학과였는데 학부제로 바뀌면서
    4학년때 졸업못할 각오하고 컴공 전공 C++ 수업 이수)
4. 전자공학 과목 중 기초 회로 소자 쪽 청강 혹은 독학
5. MOOC 사이트 가서 임베디드 관련 과목 수강 (요즘 관심있는 중학생도 이정도는 합니다)
6. 아두이노 제외 임베디드 저속 보드 하나 리눅스 기반 보드 하나 사서 유튜브 보고 따라하기
7. CPU 하나는 선정해서 (STM 추천) 해당 보드로 각 주변기기기능 하나씩 구현
   (오늘은 ADC, 내일은 UART 이런식으로)
8. 독신으로 살거나 마음이 매우 넓은 여성과 결혼 (한다면 되도록 빨리)
   이유는 설명하기가 길어서 생략.
9. 어정쩡한 대기업 취업보다 기술있는 중소기업 찾기. (대기업 잘못가면 사람 압박하는 기술을 배웁니다)
10. 운동 열심히 (한국에서는 체력이 약하면 프로그램하다 죽을 수도 있음)
11. 영어공부 열심히. 그래서 한국 탈출. 죽지 않으려면! (약간 과장이니 이해 바람)
12. Github 는 나의 친구
13. Git 는 내 애인

14. 디버깅시 아니 땐 굴뚝에 연기나랴. 모든 일에는 이유가 있다라는 확신.

15. 프로그램하다가 오늘 요일을 잘못안적이 있다면 자질이 조금 있는 겁니다. 무서운 집중력 필요.
   (혹 산만한 성격이면 다른 일을 추천드립니다.) 
16. 소설 많이 읽기. 인간에 대한 인문적인 이해력 함양. 고급 엔지니어로 가기 위한 필수 덕목입니다.
    프로그램을 사용하는 것은 사람이니깐요.
 

 

밤이라서 급하게 적어서 생각나는 건 대략 이정도입니다.

참고가 되었으면 합니다.

+ Recent posts