'삽질+돈되는짓/IT's Story'에 해당되는 글 1건

  1. 2010.02.18 어째서 전통적인 C에서 함수의 성공을 나타내는 되돌림이 0일까? (4)
posted by 아겔-_- 2010.02.18 13:16
최근에 스킴몬스터(여러 의미로 짐승남임...)에게 Win32, C/C++, Lua로 작성한 애플리케이션을 인수인계해줬다. 더러운 짐승처럼 루아를 보며 말했다...

스킴 같아요. 하지만 문법이 마음에 안들어요.
...괄호로 감싸지 않으면 마음에 들지 않을거라 예상했다.

다행히도 루아도 잘 적응해서 잘 쓰시고, C/C++은 물론 어영부영 Win32 코드들도 잘 이해를 하셔서 초속성으로 잘 넘겨버렸다고 생각했다.

이 글은 최근의 인수인계를 해드리면서 느꼈던점을 최대한 부각한 블로깅을 하려는 시도다.

  1. 어떤 기술을, 혹은 C/C++ 같은걸 "왜 그렇게 생겨먹었는가"를 설명하는건 단순히 "현상이나 현재의 상태가 그렇다."라고 설명하는건 부족하다고 생각했다.
  2. 그런걸 제대로 설명하려면 현재의 모습이 왜 그렇게 되었고, 어떤 이유나 역사에 의해 결정된 모습인지 설명하는게 훨씬 서로 재미있었다.
  3. 재미있게 전달하고 받아들이니 인수인계도 훨씬 수월했다.
  4. 그리고 그런것들은 IT쪽에 정말 많다. (그리고 재미있다 :-))
앞으로 그런것들에 대해서 나름 검색도 해보고 정리도 해서 생각나는 주제가 있을때마다 이 카테고리에 올릴 생각이다.


이번 이야기는 다음과 같다.

어째서, 전통적인 C언어에서 true/false은 '0이 아닌값'과 '0'인데, 대부분의 (main()을 포함하여) 함수들이 성공시 '0'(false?)을 되돌리는 컨벤션일까?

나도 별로 의식하지 않고 그렇구나라고만 생각해왔었는데 인수인계를 하면서 저런 질문을 받으니 딱히 이유나 역사를 설명해주지 못했다.

정말 생각해보니 그랬다.
  • Win32 함수들도 대부분 성공/실패 여부만 되돌릴때는 성공시 TRUE(non-zero)을 되돌린다. (MSDN: CloseHandle Function)
  • 자바에서도 그렇고
  • 파이썬도 대부분 그랬던듯
  • 세상이 거의 그런거 같은데...
  • ...어째서 전통적인 C에서만...

음 아침에 화장실에 앉아서 문득 생각이 났는데 유닉스 쉘의 '&&', '||'이 아닌가 생각했다.

  • statement1 && statement2   means, "execute statement2 if statement1 succed"

  • statement1 || statement2  means, "execute statement2 if statement1 fail"


물론, 유닉스 전통이 애플리케이션의 되돌림값(유닉스에는 애플리케이션도 정수값을 되돌린다! 잘 아시겠지만 main()의 되돌림값은 int다.)이 당연히 연관이 있으니 영향을 받았고, 나머지 함수들도 자연스럽게 따라간건 아닐까 생각해봄.

다시 자연스럽게, && 연산자를 저렇게 성공시에만 오른편까지 '평가'하게 하려면 앞이 && 연산자에 있어서 '거짓'일수밖에 없고, 결국 '성공'을 나타내려면 'false'을 이용해야 했을거라고 추측한다. ('||'은 당연히 반대)


사실 이런 short-circuit은 C언어에서도 사용하는 테크닉이었을테니까 C언어에서 유닉스로 영향을 넓혔다고 생각하는게 맞을것 같다.

ps. perl에서의 "foo() or die('foo FAIL')"을 통한 에러처리 같은것들은 대단히 전통에 부합하는짓이었군함.

ps2. 첫번째 포스트인데 좀 임팩트도 덜하고 역사적인 재미도 덜해서 좀 그랬나...
신고

티스토리 툴바