这些没有可读性的代码,却又体现出程序员对语言的高度理解力
对于一个程序来说,最重要的自然是“正确性”。在保证了程序运行以及输出结果的正确性之后,我们还会对程序提出其他的要求,比如容错性,可移植性,高效性(运行速度快,使用空间小)等等。
而为了能够更好地进行维护修改、传播分享、阅读学习,我们还会希望写出来的代码具有“可读性”。也正是为了“可读性”,程序里有了那么多的注释,有代码缩进,语法高亮,甚至还有代码规范。
在编程的学习过程中,我也被反复强调要写出来可以让人类阅读的代码,而不仅仅是机器能看懂。我也被反复提醒,如果没有注释和文档,过不了几个月我再回头看一定看不懂以前自己都写了些什么东西,干嘛这么写(事实也是如此)。而及时是写注释,也要注意《 五种应该避免的代码注释 》。
不过就是有那么一些人,他们不愿意跟从常理,写出的代码完全超出正常程序员的理解能力范围。
国际模糊C代码大赛
The International Obfuscated C Code Contest 历年会评比出那些最难以阅读的C程序,但是这些程序却又是可执行的,甚至是十分有用的应用。
最新一届比赛的获胜者,是一个叫 akari.c 的代码,如果看到它的代码,我想你会说:这是在作画还是在写程序呢。
我只能欣赏画作,实在无力看出代码的含义,可能只能看看 hint 来知晓个用途了。
/* + + + + [ >i>n[t */ #include<stdio.h> /* 2w0,1m2,]_<n+a m+o>r>i>=>(['0n1'0)1; */ int /**/ main( int /**/ n, char **m){FILE*p,*q; int A,k,a,r,i /* #uinndcelfu_dset<rsitcdti_oa.nhs>i/_ */ ; char *d= " P% " " d\n%d\40%d " /**/ " \n%d\n\00wb+ " ,b[ 1024 ],y[]= " yuriyurarararayuruyuri*daijiken**akkari~n** " " /y*u*k/riin<ty(uyr)g,aur,arr[a1r2a82*y2*/u*r{uyu}riOcyurhiyua**rrar+*arayra*= " " yuruyurwiyuriyurara'rariayuruyuriyuriyu>rarararayuruy9uriyu3riyurar_aBrMaPrOaWy^? " " *]/f]`;hvroai<dp/f*i*s/<ii(f)a{tpguat<cahfaurh(+uf)a;f}vivn+tf/g*`*w/jmaa+i`ni( " /* * */ " i+k[>+b+i>++b++>l[rb " ; int /**/ u; for (i= 0 ;i< 101 ;i++)y[i* 2 ]^= " ~hktrvg~dmG*eoa+%squ#l2 " " :(wn\"1l))v?wM353{/Y;lgcGp`vedllwudvOK`cct~[|ju {stkjalor(stwvne\"gt\"yogYURUYURI " [ i] ^y[i* 2 + 1 ]^ 4 ; /* ! */ p=(n> 1 &&(m[ 1 ][ 0 ]- ' - ' ||m[ 1 ][ 1 ] != ' \0 ' ))?fopen(m[ 1 ],y+ 298 ):stdin; /* y/riynrt~(^w^)],]c+h+a+r+*+*[n>)+{>f+o<r<(-m] =<2<5<64;}-]-(m+;yry[rm*])/[* */ q=(n< 3 ||!(m[ 2 ][ 0 ]- ' - ' ||m[ 2 ][ 1 ]))?stdout /* ]{ }[ */ :fopen(m[ 2 ],d+ 14 ); if (!p|| /* "]<<*-]>y++>u>>+r >+u+++y>--u---r>++i+++" <)< ;[>-m-.>a-.-i.++n.>[(w) */ !q /**/ ) return +printf( " Can " " not\x20open\40%s\40 " "" " for\40%sing\n " ,m[!p? 1 : 2 ],!p? /* o=82]5<<+(+3+1+&.(+ m +-+1.)<)<|<|.6>4>-+(> m- &-1.9-2-)-|-|.28>-w-?-m.:>([28+ */ " read " : " writ " ); for ( a=k=u= 0 ;y[u]; u= 2 +u){y[k++ ]=y[u];} if ((a=fread(b, 1 , 1024 /* ,mY/R*Y"R */ ,p /* U */ ) /* R */ )> /* U{ */ 2 && b /* Y */ [ 0 ] /* U */ == ' P ' && 4 == /* "y*r/y)r\} */ sscanf(b,d,&k,& A,& i, &r)&& ! (k- 6 &&k - 5 )&&r== 255 ){u=A; if (n> 3 ){ /* ]&<1<6<?<m.-+1>3> +:+ .1>3+++ . -m-) -;.u+=++.1<0< <; f<o<r<(.;<([m(=)/8 */ u ++;i++;}fprintf (q, d,k, u >> 1 ,i>> 1 ,r);u = k- 5 ? 8 : 4 ;k= 3 ;} else /* ]> */ {(u)= /* { p> >u >t>-]s >++(.yryr */ +( n+ 14 > 17 )? 8 / 4 : 8 * 5 / 4 ;} for (r=i= 0 ; ;){u*= 6 ;u+= (n> 3 ? 1 : 0 ); if (y[u]& 01 )fputc( /* <g-e<t.c>h.a r -(-).)8+<1. >;+i.(<)< <)+{+i.f>([180 */ 1 * (r),q); if (y[u ]& 16 )k=A; if (y[u]& 2 )k--; if (i /* ("^w^NAMORI; { I */ ==a /* " ) */ ){ /**/ i=a=(u)* 11 & 255 ; if ( 1 && 0 >= (a= fread(b, 1 , 1024 ,p))&& " )]i>(w)-;} { /i-f-(-m--M1-0.)<{ " [ 8 ]== 59 /* */ ) break ;i= 0 ;}r=b[i++ ] ;u +=( /* *>> *..</<<<)<[[;]* */ + 8 &* (y +u))?( 10 - r? 4 : 2 ):(y[u] & 4 )?(k? 2 : 4 ): 2 ;u=y[u /* 49;7i\(w)/;} y}ru\=*ri[ ,mc]o;n}trientuu ren ( */ ]-( int ) ' ` ' ;} fclose( p);k= + fclose( q); /* ] <*.na/m*o{ri{ d;^w^;} }^_^}} " */ return k- - 1 + /* \' '-` */ ( - /* }/ */ 0x01 ); {;{ }} ; /* ^w^ */ ;}
这位作者的作品还不止这一件,你可以到 他的网站 上慢慢欣赏。
C++标准库代码
C++的 标准库 是十分常用和实用的工具,特别是里面 容器(stl container) 执行效率又高,功能简洁又方便,模板实现支持类型又广。
但是每当不小心step in标准库的模板时,心里就是阵阵悸动。各种模板套模板,一层调一层的,比 Inception 还要深入。
template<typename _Tp, typename _Alloc> typename vector <_Tp, _Alloc> ::iterator vector <_Tp, _Alloc> :: insert(iterator __position, const value_type& __x) { const size_type __n = __position - begin(); if ( this ->_M_impl._M_finish != this -> _M_impl._M_end_of_storage && __position == end()) { this ->_M_impl.construct( this -> _M_impl._M_finish, __x); ++ this -> _M_impl._M_finish; } else _M_insert_aux(__position, __x); return iterator( this ->_M_impl._M_start + __n); }
JavaScript
受到网络传输的限制,为了更好的应用资源让页面呈现得更快。网站开发人员总是会将JavaScript等文件进行压缩,去掉空格去掉空格,定义最简短的变量名。于是乎,很多时候打开一个js文件一看:尽然只有一行代码,但拖动水平滚动条,却怎么也找不到那结尾在哪里。
当前web开发中很流行的 jQuery 就是这个典型的例子。
想从 Production 版本里看出jQuery是怎么实现的,恐怕眼睛和脑袋都伤不起呢。
其他
酷壳coolshell上还有很多好玩的程序,也是叫人看得抓狂却又不惊叹厉害。
比如《 6个变态的C语言Hello World程序 》,《 如何加密/混乱C源代码 》等等。
写出这些代码的人绝对不是那些2B程序员。他们是牛逼程序员,或者套用流行的说法他们是“文艺程序员”。因为,他们更懂程序是什么,他们掌握程序的规范,他们深知程序的心。
不过这种艺术不是每个程序员都能学会的,所以我们还是好好做个普通程序员,认真追求正确性,高效性和可读性吧。
分类: IT产品 , 代码与人生Coding & Life
标签: 做人与做程序
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于这些没有可读性的代码,却又体现出程序员对语言的高度理解力的详细内容...