나를 감동시킨 소스코드

geekforum의 이미지

프로그램을 개발하면서 기반구조부터 실제 사용자가 접하는 부분까지 모두 처음부터 개발하는 경우도 많겠지만 이미 누군가 만들어 놓은 걸 고치는 경우도 많으시겠지요. 그리고 아마 오픈소스 쪽이라면 남의 코드를 볼수있는 경우가 더욱 많을 테고요.

남이 짜놓은 코드 보다가 나도 모르게 감탄하는 경우도 꽤 많을것 같은데 그런 경험을 한번 나누어 보면 어떨까 합니다. 잘하는 프로그래머들도 처음부터 잘하지는 않았을 테고, 경험이 많을수록 남의 코드 보고 감탄한 경우도 많았을 거라고 생각됩니다. 여러분을 감동시킨 소스코드는 무엇인지요? 괜찮다면 한번 보여 주세요....

mudori_의 이미지

phpinfo(); 야 말로 대단한(?) 소스 끝장내죠..
몇자 처서 몇페이 불량이 쭈룩..
--
무료네임서버제공

무료네임서버제공

mudori_의 이미지

phpinfo(); 야 말로 대단한(?) 소스 끝장내죠..
몇자 처서 몇페이 불량이 쭈룩..
--
무료네임서버제공

무료네임서버제공

익명 사용자의 이미지

소스라고 하기에는 이상하지만...

최근에 나를 감동시킨 코드는...
http://www.w3.org/

헉...
어떻게... div 엘리먼트만으로 표를 만들지... ㅡ.ㅡ;
보면 볼수록 감동이라는...

나도 저정도로 CSS를 다룰 수 있어야 할 텐데...

http://www.w3.org/Style/
여기서도 뻑 가죠...
레이어도 없이... 떠 있는 메뉴를... ㅜ.ㅜ;
이건 환상이야...

그러다가... 그 페이지를 모질라의 컴포저에서 불러왔을 때...
헉! 편집화면에 떠있는 메뉴 모양이 그대로 뜬다...
감동의 연속이야...

익명 사용자의 이미지

CSS2 표준문서만 착실히 읽어도 위의 일은 별로 어려운일이 아닙니다. 뭐 물론 3개브라우저(IE, NS, Opera)에서 똑같이 보이게 하려면 내공이 필요하지만요.

익명 사용자의 이미지

제가 무식하여 모노가 모하는덴지 잘 모르는데.... 뭐하는데죠?

설명 좀 부탁드립니다.

Paladin의 이미지

머 이렇게 말하면 이상할런지도 모르지만, 재미있게 말하자면, 반란군아니면 선각자이죠.

그놈(GNOME or the guy, Anyway as you choose)의 개발팀이 무언가 한계를 느낄때쯤 Microsoft가 .Net을 발표하였는데, 그때 쌍수(두 손)를 들고 환영한 놈들이 그놈이죠. 그놈의 표현을 빌리자면 아주 가려곳이 몇곳있었는데, 그걸 .Net 아주 시원하게 긁어 주었다는군요. 그 가려웠던게 뭔지 알고 싶으면 자료 찾아보세요.

그래서 그놈은 내친김에 아예 .Net Platform 전체를 Linux에 포팅하기로 마음먹었는데, 그게 MONO Project입니다.

C#, JIT, CLI, ASP.Net, ADO.Net 이런건 단지 이 단어 생김새만봐도 마이크로소프트적인건데, 이런걸 리눅스에서 구현했습니다. 정말 놀라운 그놈들이죠.

Linux 바닥에 왔으면 perl같은걸 써줘야 느낌도 나도 폼도 나는건데, Linux에서도 C#이 되니, 별로 재미없다라는 생각이 듦. 머 perl.Net도 있기는 하지만서도.

PS : 혹시나 해서 그러는데, 그놈은 바로 GNOME입니다.

9th Paladin

Paladin의 이미지

가만 생각하니 Porting이라고 표현하기에는 좀 무리가 있군요.
Porting은 소스가 있고, 이것을 다른 플렛폼으로 이식하는건데, mono는 이것과는 좀 많이 다릅니다.

mono는 .Net의 객체 인터페이스 스펙대로 재작성하는 겁니다. 즉 겉모습은 같으나 구현한 코드는 전혀 다르죠. 딱히 이런걸 한마디로 표현할 단어가 떠오르지 않는군요.
FreeBSD의 경우는 MS가 .Net의 소스 코드를 주었기에 이건 포팅에 해당하는 겁니다.

구현 코드가 전혀 다르기에 MS와는 라이센스 관계가 전혀 없는 것 같지만 MS는 분명하게 MONO에 대해 .NET 규격에 대한 라이센스가 있다고 주장합니다. 게다가 그 규격도 전체를 다 허용하지 않았고, 제가 알기로는 시스템 관련 몇몇 부분은 아직 허락하지 않은걸로 압니다.

그리고 참고로 만약 윈도우용 MONO가 만들어지면 윈도우 사용자는 .Net Platform을 사용할 수도 있고, MONO도 사용할 수도 있죠. 만약 윈도우에서 MONO의 성능이 더 좋다면 MS로서는 황당할겁니다. 그러나 MS가 제일 싫어하는게 죽써서 개주는거라 대비책이 있죠.

MS는 .Net에 대해 로열티를 받지 않지만 또한 .Net을 이용한 직간접적으로 변형/발전된 저작품에 대해서 원래 마이크로소프트가 제시한 라이센스와 동등해야할 것을 라이센스에 명시해두었습니다. 이것에 대한 자세한 설명은 생락하고 잘 뒤져보면 .Net의 라이센스가 참 재미있는 구석이 많다라는걸 알 수 있으니 심심하면 찾아 보시기 바랍니다.

머 암튼 이렇습니다.

9th Paladin

익명 사용자의 이미지

예전에 IBM 4381에서 돌아가는 IRC 프로그램을 본적이 있습니다. 대형 메인 프레임에서 돌아가는 채팅 프로그램이라니! 근데 그 소스를 보는데 당시 인터넷도 잘 모르던 시절 일본X이 짠 그 소스에는 소스보다 설명이 더 많더군요. 아니 설명서 가지고 프로그램을 주석처럼 중간 중간 끼워 넣은 형국이더군요. 프로그램 소스를 읽는게 아니라 IRC 프로토콜 설명서와 IBM 4381의 특성을 정리한 문서 읽는것 같더군요.
그 소스는 손댈필요도 없었지만 손댈수 없더군요. 괜히 손대놓고 주석 안달면 야단 맞을거 같아서...
저는 지금도 주석 안답니다. ㅠㅠ

익명 사용자의 이미지

모노 패치되는 코드들 감동입니다.

http://lists.ximian.com/archives/public/mono-patches/2003-January/

wkn

keizie의 이미지

GTK+ 코드를 보면 typedef로 GtkWidget 등의 개체를 구조체 선언으로 만들죠.
무심코 GtkWidget 어쩌고 하며 써오다가, 어느날 GtkWidget을 typedef대로 풀어내면 구조체 선언이 되리란 걸 깨닫고는 무척 감동했습니다.
--
from [ke'izi] : where is [r]?

webrobot의 이미지

각자의 성향과 분야 그리고 수준에 따라 감동받은 코드가 다르겠지만 사실 이곳에 오른 글을 보면서 좀 실망이 크다.
나는 사실 다른 사람들이 만들어 놓은 소스에 그다지 감동을 느끼지 못한다.
대부분 하나의 Task를 처리하기 위한 스파게티식 짜집기 소스의 범주를 넘어서지 못하기 때문이다.
물론 기업에서 수익을 목적으로 개발을 하다보면 시간에 좇기고 보이는 인터페이스 개발에 좇기어 결국에는 결과만 번듯한 엉망인 소스가 나올 수 밖에 없지만 프로그래머에게 있어서 소스코드는 하나의 예술 작품이어야 한다는 예전 위대한 컴퓨터 과학자들의 철학에는 사뭇 격세지감마저 느끼고 마는 현실에 실망할 밖에...

간혹 나를 감동시키는 소스들은 다음의 조건을 만족할 때에 그렇다.
1. 간결함
2. 융통성
3. 기술성

혹시 w3c의 libwww라는 소스를 보았는가?
HTTP상의 로봇을 개발하고자 할때에 우리는 단순히 소켓 API들을 활용하여 get방식을 이용한 webpage fetching 기능과 urlencoding 기능을 이용한 post방식의 searching 기능까지 100줄 안팎에 작성하고 그것을 기초로 로봇 개발을 하게 될 것이다.

그러나 libwww라는 소스는 개발 초기 단계에서 부터 접근 방법이 다르다.
우선 근본적으로 HTTP프로토콜만 고려하지를 않고 TCP/IP 차원에서부터 설계를 하기 시작한다.
즉 OSI 7계층으로 따진다면 Transport Layer와 Network Layer 수준에서 부터 가능한 설계를 도출한다는 것이다.
물론 그렇다고 TCP/IP stack 개발 모두를 한다는 것은 아니다.
다만 근본적으로 소켓 API가 지원하고 있는 TCP/IP 상단의 응용 프로토콜 모두를 대상으로 할 수 있도록 설계 단계부터 그것들을 고려한다는 것이고 결국 이렇게 개발된 libwww는 몇가지 Layer를 스스로 가질수 있게 된다.
예를 들어, Stream,Host,Network 들을 비롯하여 각 상위 프로토콜 HTTP,FTP,DNS,NNTP,... 들과 최상위 API 수준의 Profile,Access,... 등..
이를 비롯한 각종 유용한 개념의 모듈들이 몽땅 개발되어 실제로 웹브라우저 amaya 개발에 유용하게 사용되는 것이다.
실제로 소스를 살며보면 모든 모듈 각각에 대한 간결함과 우아함에 압도될 것이다.
더군다나 이러한 각각의 모듈들이 전체적으로 어떻게 구성되어 함께 동작하는 지를 보게 된다면 그 각각의 모듈들에 대한 융통성과 몇가지 모듈들 만으로 얼마든지 새로운 추가 기능 개발이 가능한지를 알수도 있을 것이다.
간단히 예를 들어 초기에 웹로봇 개발시 간단한 post방식 구현을 위해 열댓줄의 코딩을 통해 막 짜놓은 나의 urlencoding 모듈이 libwww 에서는 HTEscape 라는 모듈로 아름답게 구현되어 있다.
또한 HTML Parser가 필요한가?
libwww에서는 HTTP 1.1 수준의 파서를 준비하고 있으며 몇개의 모듈만 따로 떼어서 얼마든지 활용할 수 있다.

물론 나는 기존에 위대한 코드들을 활용하면서 만족하자는 얘기를 하는 것이 아니다.
이러한 위대한 코드들이 탄생하기 까지 그들이 겪은 인간적인 고뇌와 코드 자체의 아름다움에 기여하기 위한 남다른 그 열정들에 감히 머리 숙이지 않을 수 없는 것이다.
지면상에 그 위대함과 아름다움을 다 표현하지 못하는 것이 나의 한계이지만 남이 만들어 놓은 소스코드나 짜집기하고 스파게티식 소스 코드의 결과에만 만족하는 단순한 프로그래머로서 만족하지 말자는 말이다.

이왕 말나온김에 한가지 더 감동적인 소스코드를 제시한다면 MS애들이 버클리 소켓을 확장시켜 만들어 놓은 Winsock2 API를 이용하여 MFC나 VCL에서 제공해 주는 CSocket,CAsynSocket,TClientSocket,TServerSocket같은 소켓 클래스 라이브러리를 개발한 Dave Roberts의 소스 코드가 있다.
이것을 분석하면서 나는 윈도우즈 기반의 이벤트 메시지 처리에 대한 완전한 메카니즘을 이해할 수 있었다.
생각해 보라.
하나의 어싱크 소켓이 생성되어 송수신하는 과정에서 몇가지 이벤트 메시지가 생성되는데 이럴때 마다 할당된 하나의 어싱크 소켓에 관련된 이벤트 핸들러를 매번 작성해 주어야 하겠느냐는 것이다.
Dave Roberts는 모든 소켓들에 대한 이벤트 핸들러를 static으로 오직 하나에서 받아서 각각의 다른 처리가 가능한 실제 소켓들에게 연결시켜 주는 작업을 해주는 슈퍼바이저 이벤트 핸들러를 제시하고 있으며 그것을 통해 완전한 소켓 클래스 라이브러리를 제작하였다.
나는 MFC나 VCL에서 제공하고 있는 소켓 클래스 라이브러리도 이러한 방법으로부터 다르지 않다고 확신하며 이 확신의 근거는 이 소스를 통해 각자가 확인해 보기를 원한다.
필요하다면 소스와 그것을 나름대로 분석해 놓은 데이타 흐름도와 모듈 블럭도를 제공해 줄 수 있다.

webrobot@hotmail.com
http://www.webrobot.org
-------------------------------------------------
Network is the very operating system.

검은고양이의 이미지

저두 앞에서 말씀하신 소스좀 볼수있을까요??
제멜주소는 fairvard@hotmail.com입니다
정말 궁금합니다
부탁드립니다

익명 사용자의 이미지

MS의 Winsock2 소스 잘 만든거기는 하지만 MFC의 기반이 워낙 훌륭해서 이지요. MS도 무조건 메시지 펌프에 때려 넣어서는 안된다는 걸 알기에 여러가지 장치들을 많이 만들었습니다.
Winsock2는 말씀하신 슈퍼 바이저 이벤트 핸들러 같은게 결국 UNIX계열에서 select문으로 처리하는걸 상당히 고상한 방법으로 처리한겁니다. 만약 이벤트 처리 안했으면 욕을 얻어 먹을수 밖에 없죠. 그리고 각각의 소켓에 다 select를 주면 윈도우 죽습니다. 제가 한 1000개 정도의 소켓을 각각의 스레드에 달아서 띄워 보니까 네트웍이 마비가 되더군요. 리눅스는 소스를 고쳐야 그 이상으로 스레드 생성되었고 솔라리스는 가볍게 되더군요. 즉 솔라리스같은넘들은 걍 select를 써서 스레드를 무쟈게 늘려도 버티는 애들이고 윈도우의 네트웍은 그게 힘드니까 결국 가운데 한넘이 버텨 서서 각각의 소켓에 ( CAsyncSocket Object )에게 이벤트를 날리는걸로 했겠죠.
그리고 이벤트 관리는 대단히 편리한 점도 있을 뿐 아니라 어쩔수 없는 개념이기도 합니다. C에서는 당연한 socket이 handle의 개념일 뿐인데 바보 MS는 처음에 winsock이라는 개념이 없었죠. 나중에 집어 넣으면서 SOCKET이라는 ( 결국 handle일뿐이지만) 타입을 만들면서 유닉스 계열에서는 당연한 handle의 동일성이 없어서 이래 저래 꿰 맞췄죠. 결국 훌륭하게 꿰 맞췄습니다. MS의 구조에. MS코드는 늘 우아하긴 해도 너무 제한적이라서 상상력이 발휘가 안되는거 같습니다. 특히 Thread와 fork가 너무 불편하기만 해서리...

걍 딴지입니다. 스킵하시져.

익명 사용자의 이미지

먼소린지

익명 사용자의 이미지

>>필요하다면 소스와 그것을 나름대로 분석해 놓은 데이타 흐름도와 모듈 블럭도를 제공해 줄 수 있다.
제공해 주세요

익명 사용자의 이미지

흠.. 멜주소를 알아야 제공해 주죠...

익명 사용자의 이미지

기술성 -> 기술적인 가치

어렵게 쓰여진 글이 좋은 글이 아닙니다.

그냥, 실망스럽다고 하신 분의 글치고는
글이 길기만 하지, 별 메시지가 없어서 딴지를 걸었습니다.

여기 오신 분들이, 몰라서 그런 것이 아니라
알만큼 아셔서, 언급하신 부분은 당연하다고 생각하기 때문에...
오히려 장난스런 코드에 감동하는 겁니다. :)

익명 사용자의 이미지

#define SIZEOF(A) ((word) (sizeof(((item_type *) 0)-> ##A)))

익명 사용자의 이미지

ortu

익명 사용자의 이미지

jabber.org

엄청난 코드라고 생각합니다.

익명 사용자의 이미지

아.. "The C Programming Language"
이 얇은 책안에 있는 소스코드는 정말이지 아름답습니다...

윤여중의 이미지

님 브라이언 커닝핸이 혼자 쓴거 말씀하시는 건가요??

totoro_의 이미지

저도 동감입니다 ^^; dennis m.ritchie 의 "the c programming language"
초보자한테는 좀 어려울지는 몰라도 .. 저도 일하면서 가끔씩 보곤하죠.

익명 사용자의 이미지

Matlab에서 아래와 같은 프로그래밍이 가능 하다는 것을 알았을 때.

[file_handle,msg] = feval('fopen', filename, 'r', filemode);

여기서 filename, filemode는 fopen의 매개변수로 사용자 입력이 가능. 또다른 하나는,
AU=(D'*D)^-1*D'*Z
AU, Z는 C로 말하면 일차원 배열이고, D는 2차원 배열에 해당합니다. 이걸 C로 구현 할려면 머리 빠지죠.
D' : Transepose of D
D^-1 : inverse of D

한줄로 할 것을 만약 C나 포트란으로 한다면 ...
물론 C++의 연산자 오버로딩 기능을 이용 할 수도 있겠지만 그걸 구현하는게 쉽진 않겠죠.

익명 사용자의 이미지

밑에 코드 컴파일 하보세요.
놀라실겁니다.
바이러스같은거 아닙니다.
아직 결과가 왜 이런지 모르겠네요.
누가 설명해주시면 안될까요?

#include
main(t,_,a)
char *a;
{return!0 main(-86, 0, a+1 )+a)):1,t<_?main(t+1, _, a ):3,main ( -94, -27+t, a
)&&t == 2 ?_<13 ?main ( 2, _+1, "%s %d %d\n" ):9:16:t<0?t<-72?main(_,
t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+\
,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/\
+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){n\
l]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#\
n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \
;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;\
#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
:t<-50?_==*a ?putchar(a[31]):main(-65,_,a+1):main((*a == '/')+t,_,a\
+1 ):0 i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}

고물의 이미지

걍 좀 정리해봤습니다.
그런데 gcc로 컴파일이 안되네요.. ㅠ.ㅠ 왜그런쥐..

#include
main(t,_,a)
◇◇char *a;
{
◇◇return !0 ◇◇◇◇◇◇◇◇t<3?\
◇◇◇◇◇◇◇◇◇◇main(-79,-13,a+main(-87,1-_,main(-86, 0, a+1 )+a))\
◇◇◇◇◇◇◇◇◇◇:1,t<_?\
◇◇◇◇◇◇◇◇◇◇◇◇main(t+1, _, a )\
◇◇◇◇◇◇◇◇◇◇◇◇:3, main ( -94, -27+t, a )&&t == 2 ?\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇_<13 ?\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇main ( 2, _+1, "%s %d %d\n" )\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇:9\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇:16\
◇◇◇◇◇◇◇◇:t<0?\
◇◇◇◇◇◇◇◇◇◇t<-72?\
◇◇◇◇◇◇◇◇◇◇◇◇main(_, t,";@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+"\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇",/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/"\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇"+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){n"\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇"l]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#"\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇"n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c "\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇";;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;"\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇"#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")\
◇◇◇◇◇◇◇◇◇◇◇◇:t<-50?\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇_==*a ?\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇putchar(a[31])\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇:main(-65,_,a+1)\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇:main((*a == '/')+t,_,a +1 )\
◇◇◇◇◇◇◇◇◇◇:0 ◇◇◇◇◇◇◇◇◇◇◇◇main ( 2, 2 , "%s")\
◇◇◇◇◇◇◇◇◇◇◇◇:*a=='/'||main(0,main(-61,*a, "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);
}

main(t,_,a)
◇◇char *a;
{
◇◇return !0 ◇◇◇◇◇◇◇◇t<3?\
◇◇◇◇◇◇◇◇◇◇main(-79,-13,a+main(-87,1-_,main(-86, 0, a+1 )+a))\
◇◇◇◇◇◇◇◇◇◇:1,t<_?\
◇◇◇◇◇◇◇◇◇◇◇◇main(t+1, _, a )\
◇◇◇◇◇◇◇◇◇◇◇◇:3, main ( -94, -27+t, a )&&t == 2 ?\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇_<13 ?\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇main ( 2, _+1, "%s %d %d\n" )\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇:9\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇:16\
◇◇◇◇◇◇◇◇:t<0?\
◇◇◇◇◇◇◇◇◇◇t<-72?\
◇◇◇◇◇◇◇◇◇◇◇◇main(_, t,";@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+"\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇",/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/"\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇"+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){n"\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇"l]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#"\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇"n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c "\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇";;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;"\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇"#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")\
◇◇◇◇◇◇◇◇◇◇◇◇:t<-50?\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇_==*a ?\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇putchar(a[31])\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇:main(-65,_,a+1)\
◇◇◇◇◇◇◇◇◇◇◇◇◇◇:main((*a == '/')+t,_,a +1 )\
◇◇◇◇◇◇◇◇◇◇:0 ◇◇◇◇◇◇◇◇◇◇◇◇main ( 2, 2 , "%s")\
◇◇◇◇◇◇◇◇◇◇◇◇:*a=='/'||main(0,main(-61,*a, "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);
}

익명 사용자의 이미지

죄송합니다. 위에 올린게 Warning이 있네요.
이걸로 해보세요. gcc로 컴파일해서 워닝하고 에러 하나도 없습니다.
파일이름.c 로해서 컴파일 해보세요.

#include
main(t,_,a)
char *a;
{return!0 main(-86, 0, a+1 )+a)):1,t<_?main(t+1, _, a ):3,main ( -94, -27+t, a
)&&t == 2 ?_<13 ?main ( 2, _+1, "%s %d %d\n" ):9:16:t<0?t<-72?main(_,
t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+\
,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/\
+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){n\
l]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#\
n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \
;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;\
#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
:t<-50?_==*a ?putchar(a[31]):main(-65,_,a+1):main((*a == '/')+t,_,a\
+1 ):0 i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}

익명 사용자의 이미지

참고로 각줄 끝에 스페이스가 붙으면 경고가 뜹니다..
(과연 1등할만 하군요....)

익명 사용자의 이미지

출력결과:
lOn the first day of Christmas my true love gave to me
a partridge in a pear tree.

lOn the second day of Christmas my true love gave to me
two turtle doves
and a partridge in a pear tree.

lOn the third day of Christmas my true love gave to me
three french hens, two turtle doves
and a partridge in a pear tree.

lOn the fourth day of Christmas my true love gave to me
four clling birds, three french hens, two turtle doves
and a partridge in a pear tree.

lOn the fifth day of Christmas my true love gave to me
five gold rings;
four clling birds, three french hens, two turtle doves
and a partridge in a pear tree.

lOn the sixth day of Christmas my true love gave to me
six geese a-laying, five gold rings;
four clling birds, three french hens, two turtle doves
and a partridge in a pear tree.

lOn the seventh day of Christmas my true love gave to me
seven swans a-swimming,
six geese a-laying, five gold rings;
four clling birds, three french hens, two turtle doves
and a partridge in a pear tree.

lOn the eighth day of Christmas my true love gave to me
eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four clling birds, three french hens, two turtle doves
and a partridge in a pear tree.

lOn the nintah day of Christmas my true love gave to me
nine ladies dancing, eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four clling birds, three french hens, two turtle doves
and a partridge in a pear tree.

lOn the tenth day of Christmas my true love gave to me
ten lords a-leapinag,
nine ladies dancing, eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four clling birds, three french hens, two turtle doves
and a partridge in a pear tree.

lOn the eleventh day of Christmas my true love gave to me
eleven pipers piping, ten lords a-leapinag,
nine ladies dancing, eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four clling birds, three french hens, two turtle doves
and a partridge in a pear tree.

lOn the twelfth day of Christmas my true love gave to me
twelve drummers drumming, eleven pipers piping, ten lords a-leapinag,
nine ladies dancing, eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four clling birds, three french hens, two turtle doves
and a partridge in a pear tree.

익명 사용자의 이미지

음 상당히 지저분한 소스군요 -_-

익명 사용자의 이미지

맞습니다.

제가 알기로 지저분한 C소스대회에서 1위를 차지한 바로 그 소스입니다.

하지만 C의 어두운면(잘쓰이지 않는 표현?)등을 많이 사용했고

한번 분석해 볼만하다고 생각합니다.

익명 사용자의 이미지

main(t,_,a)라..
3개 인자를 받는다고 해놓고 선언은 1개?
음... 리턴 코드 한개 내는 문이로군요.. 대신에 재귀 비스무리하게 가는데..
입력한 명령의 인자를 가공하는거네요..

귀찮아서 더 보기는 싫네요.. ( 게으름? )

익명 사용자의 이미지

main이 재귀로 호출되는 것과 3개인자 받는 것 맞습니다.
문제는 나머지입니다.

익명 사용자의 이미지

전 에러만 5개 나는데용..ㅡㅡ; VC로 돌려서그런가?? 죄성..
testtemp.cpp(7) : error C2065: 't' : undeclared identifier
testtemp.cpp(7) : error C2065: '_' : undeclared identifier
testtemp.cpp(7) : error C2065: 'a' : undeclared identifier
testtemp.cpp(7) : error C2448: '' : function-style initializer appears to be a function definition
testtemp.cpp(7) : fatal error C1004: unexpected end of file found

cdpark의 이미지

C++ 프로그램이 아니라 C 프로그램입니다.

.cpp 파일을 .c 로 이름을 바꾼 다음에 컴파일해보세요.

익명 사용자의 이미지

gcc 로 돌리시면됩니다.

익명 사용자의 이미지

C++에서 OOP의 유연성을 발견했을때...

익명 사용자의 이미지

본 주제 등록일이 2002년 2월 26일 이네요? -.- 읽다보니 제가 예전에 썻던 글이 보여서..

익명 사용자의 이미지

설계를 잘해야합니다.

익명 사용자의 이미지

최근엔 haskell로 lazy evaluation(철자맞나?-_-) 사용해서 Sieve of Eratosthenes구하는거 봤을때.
(뭐-_- 다른 분들은 '뭐 그런거 갖고 그래?'라고 하실지라도-_-;;;)

익명 사용자의 이미지

두번 올라갔네염;;; 죄송

익명 사용자의 이미지

최근엔 haskell로 lazy evaluation(철자맞나?-_-) 사용해서 Sieve of Eratosthenes구하는거 봤을때.
(뭐-_- 다른 분들은 '뭐 그런거 갖고 그래?'라고 하실지라도-_-;;;)

익명 사용자의 이미지

파이썬 코드 입니다 ㅡ.ㅡ; 제가 짠 코드에 뻑갔어요 ㅋㅋ넝담~

print reduce(lambda x,y: x+y,range(1,1000))

1부터 1000 까지 더하는검다
함수형 프로그래밍 기법이지요

익명 사용자의 이미지

it has an off-by-one bug;
it adds up to 999, not 1000.

import operator
print reduce(operator.add, range(1, 1001)

익명 사용자의 이미지

재귀는 아닙니다
X = {1,2,3,4,....1000} 까지의 숫자중 x1 과 x2 를 꺼내서 x1 + x2 한다음
변수에 저장하고 머 이런식으로 하니 재귀가 될수 없죠..

익명 사용자의 이미지

이거 리커시브입니까? 파이썬을 몰라서-_-;

그럼 그다지 좋다고 할수 없다고 없지 않는지..

익명 사용자의 이미지

으음 저도 역시 파이썬을 개인적으로 매우 좋아합니다. ^^;

딴지는 아니지만... 이런 것은 어떨까요 ?

print (999+1000)/2

익명 사용자의 이미지

1 + 2 + .............. + 999 + 1000
+
1000 + 999 + .............. + 2 + 1
=
1001 + 1001 + ....... + 1001 + 1001

1001 * ( 1000 - 1 + 1) / 2 = 1001 * 1000 / 2 = 1001000 / 2 = 500200 ?

tloen의 이미지

두 분 모두 착각하신듯 하네요.

print (1+1000) * 1000 / 2

수학자 가우스가 초등학교 때 저렇게 풀었다는데, 알고리즘 적으론 볼 게 없지만, 성능은 죽이겠죠. -_-; 컴퓨터는 기계적으로 이런 걸 생각해 낼 수 없죠.

익명 사용자의 이미지

오타나신거 같네요.

원래는

print (999*1000)/2

이렇게 쓰실려고 했죠 ? :->

익명 사용자의 이미지

result is 999 -_-;;

익명 사용자의 이미지

c언어 나 어셈블리어 를 어느 정도 하던시절에 친구가 보여준 충격 적인 코드
바로 스몰토크의 .....
1000factorial 정말 충격 그 자체 였다....
아직 세상 에는 배울께 많구나 하는 생각이
들더군요....

익명 사용자의 이미지

처음 PC를 갖게되었을때였습니다.
상자에서 꺼내자 SPC-800 이란 마크와 함께...
설명서가 있더군여...
그런데 모니터가 없어서... 오래된 낡은 티비에 연결하였습니다... 이때는 원래 그렇게 쓰는걸로 알았거든여...
설명서와 또한권의 책에 5줄가량의 basic 코드가 있었는데... 이걸 치는데 5시간이 조금넘게 걸렸습니다... 이걸 다치고 run을 치면서 상당한 감동과 희열을 느꼈습니다... 그런데... 실행이 안되더군여...
무슨 에러메세지만 뜨고... 근데 그게 신텍스 에러 메세지였다는걸 그후로 알았습니다... 숫자 0 과 알파벳 O를 구분못해갖고.... 그 순간이 컴퓨터와 끈끈한 인연을 맺게되는 순간이었죠....

익명 사용자의 이미지

필터링프로그램이 신기하죠.
계층적설계를잘해야되ㄴ는뎅

ihavnoid의 이미지

내가 짠 코드를 보고 있을때....

잘 짜서 그렇기보다는...
'아 나도 이런 꽁수를 써먹을 수 있게 되는구나.. 우하하하..'
하는 생각....

qmail 소스처럼 function생성하는 걸 어디 딴데서 보고 나서...
저도 그걸 따라해서 해봤었습니다..... 함수생성 매크로...

뭐 항상 그런 건 아니지만... -_-;;

Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls?
Luke 12:24

익명 사용자의 이미지

글쓴이 : ㅡㅡ;;

제가본 최고의 예술적인 소스..

main( void )
{
printf( "Hello~!" );
}

이얼마나 완벽한가.....
더이상 누가여기에 트집을 잡으리.....

익명 사용자의 이미지

최고의 오픈 소스라고 할수 있죠^^

gajet_의 이미지

심플한 코드이지만, 묵시적으로 인정되는 코드를 사용하는 것은 잠재적으로 취약성을 내포하고 있다는 의미가 되죠..
좀 더 안전하게 코드를 작성한다면 다음과 같은 형태는 어떨까요..

#include

int main(void)
{
char *str = "Hello~!";
int len = 0;
int i = 0;

len = strlen(str);

for (i = 0; i < len; i++) {
if (NULL != *str) {
printf("%c", *str++);
}
else {
return -1;
}
}

return 1;
}

익명 사용자의 이미지

#include

int main()
{
printf( "%s\n", "Hello~!" );
return 0;
}

익명 사용자의 이미지

트집1. main() 함수에 복귀형이 없다.
트집2. printf() 함수에 대한 원형이 정의되지 않았다.

tloen의 이미지

꽤 오래된 유머지만 다시 봐도 웃기는...

http://www.gnu.org/fun/jokes/helloworld.html

익명 사용자의 이미지

음... guru hacker 젤 멋지군요.
guru의 경지에 오른 사람들은 한줄에 몰아쓰는 사람이 많다던데 -.-;;
전 여지껏 printf()에 반환값이 있다는 생각도 못했었네요.

Paladin의 이미지

오래된 C 언어에서는

main(){}

처럼 리턴값뿐만아니라 파라미터도 없어도 됩니다.
게다가 어떤 C 컴파일러는 include안해도 적당히 잘 알려진 함수들은 지 스스로 찾습니다. 믿거나 말거나.

9th Paladin

익명 사용자의 이미지

리턴값의 type이 정해지지 않으면 int type으로 간주됩니다.
int type으로 간주하고 컴파일 한 다음
link time에 해당 함수가 int type이 아니라고 판명되면 에러가 나죠.

그리고, 물론 알고 계시겠지만
이왕이면 아무 C 컴파일러에서나 잘 돌아가도록 짜는게 좋겠죠.

musiphil의 이미지

적당히 잘 알려진 함수들은 지 스스로 찾는 것이 아니라, 무조건 int형의 함수로 가정하고 넘어간다는 것으로 알고 있는데.. 아닌가요?

Paladin의 이미지

다시보니 지 스스로 찾는다라는건 좀 무리가 가는 말이군요.
그 이상한 컴파일러가 지 스스로 뭘 찾지는 않을 것 같습니다.

그러나 또한 "무조건 int형 함수로 가정한다"라는 것도 뭔가 핵심을 비켜가는것같군요. 단지 void가 선언되지 않은 함수 정의에 대해 기본적으로 int라고 가정한다라고 말씀하는거라면 이것은 맞는 말이 됩니다만, 그 이외의 경우, 예를들어 Beware(1,"Shrek");라는 함수가 사용되고 있으나 소스의 그 어디에서도 함수 정의가 되어 있지 않은 경우, 이것이 컴파일이 된다면 이건 문제가 되는 것입니다.

함수 정의를 안해주었는데도 컴파일 되는 일이 임의의 함수에 대해 그런 건 아니고, printf처럼 잘 알려진 것에 대해서만 그런 것 같으니 분명 내부적으로 뭔 일을 하기는 하는 것 같습니다. 사실 뭔 일은 한다기보다는 그냥 컴파일러 버그라고 보는게 더 정확할지도.

어떻든 내부적으로 어떻게 처리를 어떻게 하는지는 저도 모릅니다.
다만, 중요한건, 그건 예측이 가능하지 않는 비표준적인 행태라는거겠죠.

9th Paladin

musiphil의 이미지

C99에서는 미리 선언되지 않은 함수는 사용할 수 없는 것이 맞습니다.

하지만 C90에서는 선언되지 않은 이름이 함수 호출식에서 사용될 경우 무조건 int형 함수로 가정하는 것이 맞습니다. (물론 권장되는 형태는 아닙니다만.)

ANSI/ISO 9899:1990 6.3.2.2 (“Function calls”):

If the expression that precedes the parenthesized argument list in a function call consists solely of an identifier, and if no declaration is visible for this identifier, the identifier is implicitly declared exactly as if, in the innermost block containing the function call, the declaration

  extern int identifier();

appeared. (註: That is, an identifier with block scope declared to have external linkage with type function without parameter information and returning an int. If in fact it is not defined as having type “function returning int,” the behavior is undefined.)

그리고 실제로 함수 정의가 없는 것은 링크시에는 문제가 될 수 있지만 컴파일시에는 단지 선언이 있느냐의 여부만 중요합니다.

Paladin의 이미지

C90에서는 선언되지 않은 함수에 대해 암시적으로(implicitly) extern int identifier();가 선언이 되는군요. 가만 생각하니 아주 오래전에 습득한 지식같기는 하군요. (이래서 가끔은 표준 Spec을 보아줄 필요가 있는듯)

파라미터(the parenthesized argument list) 정보는 다 날려버리겠지만 어차피 C 언어는 함수 Call할때 파라미터 수를 체크도 안하는 언어이니까 결국은 Library Linking시켜 운좋게 그 라이브러리 안에 identifier가 있으면 별무리없이 Call은 되겠군요.

IDE를 쓰건 make 쓰건 컴파일과 Linking을 한방에 하기에 저런 문제가 정작 Linking의 문제라는데 대해 주의를 집중하지 않은 것 같습니다. 관심을 보여줄 필요는 없는 것이지만.

뭐 어쨌던 C 언어가 아주 원시적이다라는데 대해 새삼 감개무량하군요. 사실은 이런 요소가 타언어 사용자가 C 언어를 비난하는 주요 이유중 하나이기는 하지만.

9th Paladin

익명 사용자의 이미지

variadic function 은 비원형 선언이 보이는 상태에서 정상적으로 호출된다는 보장이 없기 때문에 printf() 를 implicit declaration 에 의존해 호출하는 것은 정의된 행동을 보장받지 못합니다. 그리고 C99 는 implicit declaration 을 제거해 버렸기 때문에 C99 에서는 더 이상 논의할 가치가 없는 이야기입니다. 정상적인 상황 (원형 선언의 지배를 받는 상황) 이라면 고정 인자부에 대한 검사가 이루어지기 때문에, 매개변수에 대한 정보를 날려 검사를 하지 않는 언어라는 말씀은 1980년대나 들을 수 있던 이야기입니다. geekforum 이기에 그냥 지나가려 했지만 정확성이 생명인 기술적인 내용에 대한 왜곡이 보여 말씀드립니다.

Paladin의 이미지

왠 왜곡?

1980년대나 들을 수(또는 볼 수) 있었던 내용은 파라미터를 변수 선언하듯 넘기는 모습이죠. 전 그런 코드를 직접 보았습니다.

C90은 90에서 드러나듯 90년도 만들어져 있고, 함수 콜에 대한 내용은 그전과는 별로 달라진바도 없죠. 그전이라는건 사실 좀 애매한데, 커니건은 요즘처럼 표준 언어 스펙을 만들지는 않았습니다. 그냥 소위 그의 저서에서 드러난 C언어에 대한 내용이 전부죠. 물론 이것이 표준으로 통하는거겠지만. 90년대 초반에 경험한 여러 C 컴파일러들은 똑같은 소스에 대해 다른 결과를 산출하는게 다반사였죠. C90이라는게 있어도 정작 컴파일러는 만드는 사람 마음대로였습니다. 예를들면, 단항 연산자가 여러개 나오는 구문(예, ++i+=j++-=++k+i;)에 대한 표준은 여전히 의문입니다. 표준이 있기나 한건지.

저기 위에서 김승범씨가 C90에서 해당 스펙을 구체적으로 보여 주었으니 함수 콜에 대한 표준에 대해서는 달리 왈가왈부할 필요는 없겠습니다.

물론 C99에서는 이런 것에 대해 언급할 필요는 없겠죠. 그런데 과거의 C 언어 이야기하는데 갑자기 C99 언급하면 이상하죠. 차라리 저기 김승범씨처럼 스펙을 보여주면서 C99에서는 이렇게 진화했다고 한마디 하는거라면 좋았을 겁니다.

게다가 스펙이 99년도에 나왔으면 컴파일러에 반영되기까지는 어느정도 시간이 걸리고 컴파일러가 완전히 C99를 따른다고 해도 겨우 2~3년쯤 된건데, 만약 과거 30년간의 C 언어를 C99에서부터 바뀌었으니 과거의 일은 없던 일로 하자라고 말한다면 참 우스운 모양새가 되겠죠. 눈가린다고 얼굴이 안보여지는 것도 아니고.

완전한 C++ 컴파일러가 나온 것도 아주 근래의 일입니다. 초창기에는 C 컴파일러를 개조한 가짜 C++ 컴파일러가 난무했죠. 대표적인 경우로 Visual C/C++이 그렇죠. MS에서 완전하게 C++ 스펙을 따르는건 컴파일러를 만든건 Visual C/C++.Net 처음입니다. 그러나 99%는 그런듯하지만 100%인지는 여전히 의문이 듦, 어쨌거나 이제 1년 되었군요.

그리고 하나 주의할 것은 C 언어가 Type Check를 철저히 하지 않는 이유는 언어가 허접(물론 이런 요소가 전혀 없는 것은 아니고)해서 그런게 아니라 언어 철학이 자유지향적이기 때문이지요. 뭐 이런게 인정되는 시대는 이제 가버렸지만.

9th Paladin

익명 사용자의 이미지

C 에 대한 대표적인 오해들이 집합되어 있군요. geekforum 에서 기술적인 내용으로 세세하게 지적하는 모양이 별로 보기 좋지 않으니 계속 논의를 원하신다면 hclc 로 포스팅해 주시거나 개인 메일 주시기 바랍니다. 제 메일 주소는 mycoboco@hanmail.net 입니다.

조금만 더 정확히 알아보시고 주장을 펼치셨으면 좋았으리라는 아쉬움이 남습니다.

Paladin의 이미지

그것 참 대체 뭘 말하고 싶은건지.

본인도 저 짧은 글에서 말하고 싶은바를 0.00001%도 말못하였으니 쓸데없는 추측을 하는 거라면 당장 그만두고, 문제가 있다 싶은게 있으면 핵심만 말하면 되겠습니다.

보아하니 뭐 좀 알긴 아는 것 같은데, 저도 하나를 말하면 열을 알아 들으니, 쓸데없이 길게 주저리주저리 설명할 필요는 없습니다.

그럼 한번 기대 해봅니다.

공개적으로 말하기에는 뭐 좀 쪽팔린다 싶으면 제 개인 메일로 보내면 되겠군요.

9th Paladin

익명 사용자의 이미지

아닙니다. 다 지당하신 말씀이십니다. 일도 많고 요즘 들어 기분 좋게 살고 있는데 쓸데없는 일로 불쾌해지고 싶지 않습니다. 그럼, 하루 잘 마감하시기 바랍니다. ^^

익명 사용자의 이미지

뭐 지나가다 한 말씀임이다만, knight님의 include안해도 적당히 잘 알려진 함수들은 지 스스로 찾는다는 문장을 볼때 하나를 말하면 열을 알 것 같진 않군요. int형으로 추정한다는 건 상식이었었는데... 아니면 내가 너무 늙은걸까?

Paladin의 이미지

음,,, 오랜만에 들렀더니,, 또 한마디를...

뭐 좀 아시면 뭔가 통할거같지만, 님은 그렇지 않은 것인가요? 아님 나이가 많이 들었거나. 제 생각을 제대로 이해하는 분은 김승범씨가 가장 근접해있고(완전하지 않은 이유는 김승범씨도 처음에는 님처럼 생각을 했던것 같기에, 게다가 두번째 답변은 제가 분명하게 듣고 싶은거였으나 김승범씨는 제 의도를 알고 그런 답변을 했는지도 그것도 조금 궁금함, 결과적으로 그것이 정답이었기는 하지만), 다른 사람은 솔직히 배제...

함수는 void로 선언하든 아님아무 것도 선언하지 않든간에, int로 하나의 return자리를 마련한다는걸 그리 강조할 필요는 없습니다. 이건 알만한 사람은 다 아는건데, 게다가 이것에 대해서는 저기 위에서 주저리주저리 여러 글도 있잖아요. 제가 그것도 모르는 사람처럼 보였다면 그건 제 탓이 아니라 자기의 수준을 벗어나지 못하는 자의 한계입니다.

알아서 찾는다라는 말은 머 좀 생각하면 알아서 바인딩 정확히는 Linking한다라는 말인데(전 기본 함수가 들어 있는 해더를 디폴트로 include하는걸로 생각했음, 확실치가 않아서 알아서 한다라고 표현한 것임.), 그럴려면 적어도 뭔가 과정이 필요한데, 제가 깜박했던건 정의(해더 파일에 정의되어 있고 이것을 대개는 include를 하죠)는 커녕 선언도 되지 않은 함수가 선언이 되지 않으면 디폴트로 원초적인 형태의 extern int identifier()로서 "선언"된다라는걸 깜박한거죠.

한마디 더 하자면, 저의 처음부터 지금까지의 이슈는 extern int id();이지 void, int라던가 기타 등등의 것은 답변하는 사람이 지 맘대로 상상하고 지맘대로 답변한 것에 불과하오. 유치한거라서 언급을 안했더니 계속 그리로 몰고 가는 부류도 있군요.

어떻든간에 이렇게 설명해도 그 차이를 모르겠으면 Email로 연락주시면 365일 언제라도 답변을 해드리겠습니다.

9th Paladin

익명 사용자의 이미지

int main(void) {
  printf("Hello.\n");

  return 0;
}

vacancy의 이미지

저 아래도 적으신 분이 계시지만,
Nachos 소스는 정말 예술이었던듯요.
전체적인 소스 구조가 정말 깔끔하더라는 ...

그리고 ioccc에 있을진 모르겠는데,
어떤 일본 사람이 만든 소스가 있었거든요.
첫번째 소스를 컴파일하면
두번째 소스가 나오고,
그걸 컴파일하면 세번째 소스가 나오고 ...
그런 식이었는데 ...
소스 모양이 각각 그림이나 글자들이었어요.
루로우니 켄신을 모티브로 한거였는데,
지금 링크가 없네요. 정말 멋있었는데 ... -_-

익명 사용자의 이미지

Nachos 소스는 치즈가 짱이오.

vacancy의 이미지

찾아보니 ...

http://www0.us.ioccc.org/years.html#2000_dhyang
여기 링크되어있는, ...
http://www0.us.ioccc.org/2000/dhyang.c

이게 아닐까 싶네요, 얼핏 보기엔 ...
컴파일 안해봐서 장담은 못하겠습니다만 ... -_-;

vacancy의 이미지

ecomist의 이미지

자바에서 인터페이스를 죽이게 구현하는 경우에 뻑가죠..

클래스로 구현하는 경우가 많은데.. 이보다 가볍고.. 빠릅니당..

아래주소로 가보시면 RMS라고 자바의 MIDlet에서 쓰이는 Mobile용 DB구현에서 쓰이는 코드입니당..

이 코드에서 멋진넘이 Enumeration을 구현하는데..

인터페이스를 사용하여 필터링 한다는 점입니당..

함보시면 역쉬 이거야 느끼실 거에요^^

http://wireless.java.sun.com/midp/ttips/recordstores/
--
=========================================
늘 깨어 있습니다.
장 선 진 드림

http://jangsunjin.java2game.com
Mail : jangsunjin@korea.com
Phone : 017 - 679 - 2615
=========================================

익명 사용자의 이미지

David R. Hanson 이라는 분이쓴 'C Interfaces and Implementations'라는 책이 있습니다.

이 책에서는 수많은 C Library들이 나오는데 하나같이 주옥같습니다.

예를 들면 malloc을 못 믿겠다하고 새로운 함수를 만들어서 사용합니다. 또, C에서 Exception구현하고, 무한 precision을 구현하고... 하여간 기가 막힙니다.

이책 공부하면서 한학기 내내 감동의 도가니였죠.

C로 프로그램을 주로하시는 분이라면 일독을 권해드립니다.

스카리의 이미지

C Interfaces and Implementations ... 저도 재미있게 봤습니다.
내용도 내용이지만 저는 국내에서 이 책을 구할수가 없어서
미국으로 출장을 나간 선배를 통해 아마존의 used 제품을 구입했는데,
아마도 전 주인이었던 Pat Morrison 이라는 사람이 자기 명함에다가

- May your interfaces and implementations go smoothly!

라고 적어서 책속에 넣어둔걸 발견하고
야릇면서도 흐뭇한 감정을 받았던 기억이 있네요.

익명 사용자의 이미지

freeamp 소스를 분석할때...

원래 C만 너무 오래짜와서 C++에 대한 약간의
개념정도만 있을 때 C++로 된 FreeAmp 소스를

분석했을때 이렇게 프로그램도 짜는구나하고
너무 감탄을 했었습니다.

물론, C++에 대한 개념등을 많이 공부할 수
있었지만, 그것보다 C프로그래머에게도
엄청난 도움이 될 수 있었습니다.

요즘은 프로젝트가 없어져서...이름이 바뀐거
같은데...Zinf라고...

나중에 mp3나ogg player를 만드실 분들은 한번봐보세요.....

감탄 그자체입니다.

보다보면 OS랑 비슷한 개념을 발견할 수 있을겁니다. 하나의 유기체같이 만들어 놨습니다.

knight2000_의 이미지

자바...에서...

클래스로 시작해서 클래스로 끝난다는 것을 보여준... 소스...

연산자와 변수를 전통적인 스타일이 아닌 java 스타일(클래스 스타일)로 정의한 소스...

자바에서는... 변수의 선언에 2가지 방법이 있습니다.
하나는 전통적인 스타일의 var를 사용하는 것이며,
다른 하나는 클래스를 사용하는 것입니다. ㅡ,ㅡ
물론... 누가 클래스 스타일을 사용하겠습니까마는... 그게 가장 충격이었죠. 지금은 전혀 기억나지도 않지만...

익명 사용자의 이미지

내용을 보니...

자바가 아니라 자바스크립트를 말씀하시는 것이 아닌지..^^

자바 스트립트에서도 클래스를 많이 사용합니다.

팝업 창 띄우는 식의 간단한 스크립트가 아니라면

클래스를 사용하는 쪽이 작업이 수월합니다.

예를 들면 폴딩되는 트리 구조의 메뉴 같은걸 만들려면

클래스를 사용하는 쪽이 편하죠. 그렇지 않으면..

스크립트짜기에 머리가 아픕니다...^^

knight2000_의 이미지

C에서 함수 선언에서 시작하여 함수 종료로 끝나듯이...
자바는 클래스 생성에서 시작하여 클래스의 파괴로 끝이 납니다.
그 사이에서 모든 이벤트와 사용자 지정 작업이 이루어지죠.

그렇지 않나요?

그리고, 자바스크립트에서 클래스를 생성할 수 있던가요?
자바스크립트는 클래스를 이용할 뿐이라고 알고 있습니다만... 제가 잘못 알았던가요?

익명 사용자의 이미지

한마디로 말하면 클래스를 만들수 있다고볼 수 있죠.
(자바스크립트에서 말입니다.)

자바에서와같이 class라는 연산자를 통해서 만드는것이 아니라

그러한 역할을 하는 생성자만을 만들어서

클래스를 만들 수 있다고 볼 수 있습니다..

익명 사용자의 이미지

Qmail에서 define으로 함수를 정의한 것을 보았을 때..

예제)gen_allocdefs.h


#define GEN_ALLOC_ready(ta,type,field,len,a,i,n,x,base,ta_ready) \
int ta_ready(x,n) register ta *x; register unsigned int n; \
{ register unsigned int i; \
if (x->field) { \
i = x->a; \
if (n > i) { \
x->a = base + n + (n >> 3); \
if (alloc_re(&x->field,i * sizeof(type),x->a * sizeof(type))) return 1; \
x->a = i; return 0; } \
return 1; } \
x->len = 0; \
return !!(x->field = (type *) alloc((x->a = n) * sizeof(type))); }

익명 사용자의 이미지

아래 소스들.. 넘 어렵다..
이제까지 살아오면서 감동 받았던 코드는 많이 있었는데 딱히 기억나는 것은 없네요.

요즘은 C++를 배우고 있는데, STL 개념이 참 좋은거 같아요.
아직은 잘 모르지만 열심히 배워 여러분들처럼 기억에 남는 감동을 느껴보고 싶습니다. 참 STL을 잘 모르시는 분은 한 번 꼭 배워보시기 바랍니다.

추천서 : Effective STL(역: 곽용제, 저: 스콧 메이어스)

페이지