내 실패 1호이다. 디지털 스톱워치를 만들려고 했다. 마이크로프로세스 숙제 였다. 이걸 완성시키지 못했다. TTL 칩을 이용해서, 스위치를 눌려 작동하고 FND에 그 시간이 보여지는 방식이다. 저 사진에는 TTL, FND 같은 것은 뽑아 버렸다. 그게 좀 비싸서, 다른데 활용하려고..



정말 고생해서 만들었는데, 완성을 못 시켰다. 그래서, 너무너무 화가 나서 저걸 한 번 바닥에 집어 던졌다.



저, 뒤어는 엄청난 선으로 봅잡하다.





저 선도 많이 뽑힌 상태이다. 저걸 하려고 얼마나 고생을 했던지, 거의 납에 중독될 정도 였다.



그 때의 추억이 아련히 떠오른다.



어떤 사람들은 저렇게 큰게 스톱워치나고 반문할 지도 모른다. TTL 이라는 칩이 좀 크다. 그래서, 스톱워치를 만들면 저렇게 커진다. 그래서, CMOS로 하나의 칩에 카운트기능이 달린 소자를 이용하던지, 아니면, ARM process 를 이용해, 임베디드 프로그래밍 하는게 더 작고, 돈이 적게 들 것 같다.



그러나, 저게 디지털회로에 대한 기초 지식을 얻기에 좋다. 저걸 만들면서 많은 디지털 회로에 대한 지식을 얻었다. 난, 그 때 까지 회로에 대해서는 완전 무식이었다. 저 것후, 그나마 디지털 회로에 대한 지식을 쌓을 수 있었다. 그러나. 아날로그는 회로, 이론 모두 꽝이다.



나는 저거 실패했다. 그럴 만한 이유가 있었다. 우선, 너무 준비가 부족했다. 진짜 맨땅에 헤딩을 했다. 어느 정도 알아보고 했어야 했다. 저, 설계부터가 잘못되었다. 더 적은 칩을 이용해서 만들 수 있었는데, 내가 너무 지식이 없었다. 책을 잘 읽어 보고 했어야 했다.



그리고, 쉽게 만들지 않았다. 쉽게 만들 수 있었다. 저 것은 어떻게 든 2개의 누르는 버튼으로 만들려고 했다. 3개의 스위치를 이용해 만들면 더 쉬었다. 그러나, 난 그전의 스톱워치의 원리와 다르다고 거부했다. 너무 모르면, 용감하다고 할까. 결국, 너무 어려워서 고생을 심하게 했다. 배우는 사람으로써 자세가 아니었다. 배우는 사람은 쉽게 할 수 있으면, 쉽게 하는게 좋은 것 같다. 저걸 완성하는데 더 의미가 크니까..

얼마전에 지식in 에서 올라 올 글 중에 C언어를 mip 전용 어셈코드로 변환할 수 있는지 물어보는 글이 있었다. 그게 가능한지는 모르겠지만, C 언어를 어셈코드로 변환하는 것은 gcc 나 visual c 로 충분히 가능하다. 우선 gcc 에서는 컴파일 옵션 -S (대문자) 하나 붙여준면 된다.

ctest.c 라는 파일이 있을 때,

gcc -S ctest.c 라고 하면 확장자 s 라는 파일을 만들어 주면서 어셈블리어로 변환해 준다. 이 것은 내가 Dev-Cpp 안에 있던 컴파일로 실험해 본 결과 이다. 리눅스에서도 충분히 가능하리가 본다. visual c 에서는

visaul C 에서도 이럴 것을 할 수 있다. Visaul C 를 기본으로 깔았다면 C:Program FilesMicrosoft Visual StudioVC98Bin 로 설치될 것이다. ( 나는 Visual C++ 6.0을 쓰고 있습니다. 다음 버전에서도 가능하리라고 봅니다..)

그 폴더안에 cl 이라는 파일이 있다. 이게 gcc 와 하는 일이 유사하다.
컴파일 할 때 "C:Program FilesMicrosoft Visual StudioVC98BinCL.EXE
" /FA test.c 이런 식으로 해주면 확장자 asm 파일을 보여준다. 물론 debug 할 때 어셈블리어를 볼 수 있는 방법으로도 가능하다. (아직 큰 차이는 모르겠다. 내가 설명한 방식이 릴리스 모드의 어셈코드인지는 확신이 가지 않는다...)
내가 지금 하려는 말은 "C언어가 BCPL 이라는 언어에서 부터 유래했다"하고 시작하는 C 언어가 만들어진 배경에 대해 설명하려는 것은 아니다. 내가 하고 싶은 말을 더 자세히 설명하면 C언어 표준의 역사에 대해 말하려고 한다.

우리는 평소에 ANSI C 라는 말을 많이 듣는다. ANSI 는 많은 사람이 알다시피 American National Standards Institute (미국 규격 협회) 이다. ANSI C는 그 협에서 제정된 C 표준 규격 같은 것이다. 이 표준은 1898년에 제정되어 ANSI C 또는 C89 라고 부르기도 합니다. 이 규정은 ISO(International Organization for Standardization) 에서 거의 그대로 받아 들어 국제 표준이 되었습니다. 이 걸을 ISO C 라고 부릅니다. 그래서 ANSI C 와 ISO C 는 거의 구분하지 않습니다.

1994년 ANSI C 에 C 언어가 가지고 있는 버그를 고치고, 1995년에 다국어 지원을 첨가하여 C95가 나오게 되었습니다. (이 때 wchar.h 라는 헤더파일이 덧붙여 집니다. C 컴파일러 가지고 있는 사람이 이 헤더파일 있는지 찾아보세요. 제 생각에는 visual C6.0 도움말에 1994-1998 이라고 적힌 것을 보면, visual c6.0 은 C95 까지 지원하는 것 같습니다. )


1999 년 또 한 번의 변경이 있었는데 이를 C99라고 합니다. (Visaul C7.0 에서는 이를 지원하는 것 같습니다. 제가 그 버전 컴파일러가 없어 확실히 모르겠습니다. 요즘 나오는 gcc 도 이 버전을 지원하겠죠. 더군다나 gcc 는 표준을 잘 지킬테니..)


기본 흐름은 ANSI C(ISO C, C89,C99) -> C95 -> C99 정도로 변했습니다.

이 중간중간에 C9x (C99의 기본이 되는 버전) 같은것도 끼어 있었고...


당신의 컴파일러는 어디까지 지원하나요. 해당연도를 보고 어느정도 유추를 하실 수 있을 것 같군요. 어쩌면 ANSI C 로 지원하지 않는 환경에서 꿋꿋이 프로그래밍 하는 사람도 있을 수 있겠고. (임베디드 쪽이나 마이크로프로세스를 직접 다루는 쪽에서는 그럴 수도 있겠죠. 그렇더라도 gcc 크로스 컴파일러를 이용해서 그런 열악한 상황은 빠져 나오는게 좋아보입니다.)

난, 그런 환경에서 일 하는 일이 없기를...


더 자세한 내용은 http://www.woong.org/

이 사이트에서 찾아보세요. 저도 그 사이트 가기 전에는 C 언어에 표준도 변화는 지 전혀 알지 못했던 사람이니까..