深刻理解Java中的堆和栈

 

 栈与堆都是Java用来在RAM中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

  Java的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过new、newarray、anewarray和 multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事 先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较 慢。

  栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类 型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。

  栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:

  int a = 3;

  int b = 3;

  编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。

  这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地 址。因此a值的改变不会影响到b的值。

  要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。

  String是一个特殊的包装类数据。可以用:

  String str = new String("abc");

  String str = "abc";

  两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。

  而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并 令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。

  比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上面的理论。

  String str1 = "abc";

  String str2 = "abc";

  System.out.println(str1==str2); //true

  可以看出str1和str2是指向同一个对象的。

  String str1 =new String ("abc");

  String str2 =new String  ("abc");

  System.out.println(str1==str2); // false

  用new的方式是生成不 同的对象。每一次生成一个。

  因此用第一种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。

  另一方面, 要注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的 对象。只有通过new()方法才能保证每次都创建一个新的对象。

  由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效 率。

  申请后系统的响应

  栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。

  堆: 首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲 结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句 才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

  申请大小的限制

  栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的, 在WINDOWS下,栈的大小是2M(也可能是1M,它是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此, 能从栈获得的空间较小。

  堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低 地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

  申请效率的比较:

  栈由系统自动分配,速度较快。但程序员是无法控制的。

  堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.

  另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存, 虽然用起来最不方便。但是速度快,也最灵活。

  堆和栈中的存储内容

  栈:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译 器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。

  当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。

  堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。

  存取效率的比较

  char s1[] = "aaaaaaaaaaaaaaa";

  char *s2 = "bbbbbbbbbbbbbbbbb";

  aaaaaaaaaaa是在运行时刻赋值的;

  而bbbbbbbbbbb是在编译时就确定的;

  但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。

  比如:

  void main()

  {

  char a = 1;

  char c[] =  "1234567890";

  char *p ="1234567890";

  a = c[1];

  a =  p[1];

  return;

  }

  对应的汇编代码

  10: a = c[1];

  00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]

  0040106A 88 4D FC mov byte ptr [ebp-4],cl

  11: a = p[1];

  0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]

  00401070 8A 42 01  mov al,byte ptr [edx+1]

  00401073 88 45 FC mov byte ptr [ebp-4],al

  第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据

  edx读取字符,显然慢了。

  小结:

  堆和栈的区别可以用如下的比喻来看出:

  使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作, 他的好处是快捷,但是自由度小。

程序设计语言排名

 

1 Java 20.025%
2 C 15.967% 
3 C++ 11.118% 
4 (Visual) Basic 9.332% 
5 PHP 8.871%
6 Perl 6.177% 
7 C# 3.483% 
8 Python 3.161% 
9 JavaScript 2.616% 
10 Ruby 2.132% 
11 PL/SQL 2.015% 
12 SAS 1.766% 
13 Delphi 1.573% 
14 D 1.253% 
15 Lisp/Scheme 0.669% 
16 ABAP 0.634% 
17 Ada 0.632% 
18 FoxPro/xBase 0.596% 
19 COBOL 0.593% 
20 Fortran 0.576% 
 
 

人类创造思维的语言——编程

 

“人们总是害怕改变。电被发明出来的时候他们害怕电,是不是?他们害怕煤,害怕蒸汽机车。无知无所不在,并导致恐惧。但随着时间推移,人们终究会接受最新的科技。”
 
正 如比尔盖茨曾经警告过一样,计算机已经真正成为我们的最新科技,几乎遍布我们日常生活的每一方面。所以,我们这个时代的某些最伟大的头脑开始思索起计算机 和软件对于人类的重要性来了。以下就是101条有关计算机的伟大名言,不得不说编程最能表达人类的思维的语言。
 
计算机
 
1、“计算机没什么用。他们只会告诉你答案。”——(巴勃罗·毕加索,画家)
 
2、“计算机就跟比基尼一样,省去了人们许多的胡思乱想。”——(萨姆·尤因,作家)
 
3、“他们拥有计算机,他们也还可能拥有其他的大规模杀伤性武器。”——(珍内特·雷诺,美国前女司法部长)
 
4、“跟计算机工作酷就酷在这里,它们不会生气,能记住所有东西,还有,它们不会喝光你的啤酒。”——(保罗·利里,吉他手)
 
5、“如果汽车能赶上计算机的发展周期的话,一辆今天的劳斯莱斯仅值100美元,每加仑要跑100万英里,每年还得爆炸一次,把里面的人杀个精光。”——(Robert X. Cringely,技术作家)
 
计算机智能
 
6、“计算机总是越来越智能的。科学家告诉我们说不久它们就能跟我们对话了。(这里的“它们”,我指的是“计算机”。我怀疑科学家永远都不能跟我们对话。)”——(Dave Barry,幽默作家)
 
7、“我最近注意到,在共同文化中,那种对计算机变得智能化并最终掌控世界的妄想恐惧症几乎彻底消失了。据我所知,这跟MS-DOS的发布基本是同步的。”——(Larry DeLuca)
 
8、“计算机会不会思考这个问题就像问潜水艇会不会游泳一样。”——(Edsger W. Dijkstra,图灵奖获得者)
 
9、“活了一百年却只能记住30M字节是荒谬的。你知道,这比一张压缩盘还要少。人类境况正在变得日趋退化。”——(Marvin Minsky,人工智能研究的奠基人)
 
信任
 
10、“这座城市的中央计算机告诉你的?R2D2,你不该相信一台陌生的计算机!”——(C3PO,星球大战中的翻译机器人)
 
11、“永远不要相信一台不能扔掉一扇窗户*的计算机”——(斯蒂夫·沃兹尼亚克,苹果联合创始人) *译者:暗指微软的wINDOWS操作系统
 
硬件
 
12、“硬件:计算机系统中可被踢的部分。”——(Jeff Pesis)
 
软件
 
13、“今天大部分的软件都很像上百万块砖堆叠在一起组成的埃及金字塔,缺乏结构完整性,只能靠强力和成千上万的奴隶完成。”——(阿伦·凯,图灵奖获得者,面向对象创始人)
 
14、“我终于明白‘向上兼容性’是怎么回事了。这是指我们得保留所有原有错误。”——(Dennie van Tassel)
 
操作系统
 
15、“有两样重要产品出自伯克利:LSD和BSD*。我们不相信这是个巧合。”——(Jeremy S. Anderson)
 
*译者:LSD是一种药力至强的迷幻剂,BSD-BSD(Berkeley Software Distribution,伯克利软件套件)是Unix的衍生系统
 
16、“2038年1月19日,凌晨3点14分07秒”——(UNIX中的世界末日*–1970年1月1号之后的2^32秒)
 
*译者:word跟world同音,UNIX用4个字节(WORD)表示时间,所以最多只能计时2^32秒
 
17、“每个操作系统都差不多… 我们都一样的烂。”——(微软的高级副总裁布莱恩·瓦伦蒂尼这样描述操作系统的安全状况,2003)
 
18、“微软有出了个新版本,Windows XP,据大家说是‘有史以来最稳定的Windows‘, 对我而言, 这就好像是在说芦笋是‘有史以来发音最清脆的蔬菜一样‘ “——(Dave Barry)
 
互联网
 
19、“互联网?那个东西还在吗?” ——(Homer Simpson)
 
20、“网络就像是个母夜叉。我每转到一处都会看见小个的按钮命令我提交。”——(Nytwind)
 
*译者注:Submit:提交,另一层意思是要求屈服
 
21、“想想看吧,已经有一百万只猴子坐在一百万台打字机旁,可Usenet就是比不上莎士比亚。”——(Blair Houghton)
 
软件产业
 
22、“计算机软件产业最为惊人的成就,是其持续不断地放弃硬件产业的惊人成果和稳定性。”——(Henry Petroski)
 
23、“真正的创新经常来自于那些贴近市场、但无力拥有市场的的小型初创公司。”——(Timm Martin)
 
24、“人们常说,伟大的科学学科就像是站在其它巨人肩膀上的巨人。人们也说过,软件产业正如站在其他侏儒脚上的侏儒。”——(Alan Cooper,交互设计之父)
 
25、“这无关比特、字节和协议,而关乎利润和损益。”——(郭士纳,IBM前CEO)
 
26、“我们是微软。反抗是徒劳的。你会被同化的。”——(保险杠贴纸)
 
软件演示
 
27、“不管演示在彩排的时候有多好,一旦在观众面前展示时,演示不出错的几率与观众人数成反比,与投入的金钱总额成正比。”——(Mark Gibbs)
 
软件专利
 
28、“专利大多数都是垃圾。浪费时间去阅读这些专利是愚蠢的。只有专利持有人才会这么干,还得强迫自己才会看。”——(Linus Torvalds,LINUX创始人)
 
复杂性
 
29、“控制复杂性是计算机编程的本质。”——(Brian Kernigan)
 
30、“复杂性杀死一切。它把程序员的生活给搞砸了,它令产品难以规划、创建和测试,带来了安全挑战,并导致最终用户和管理员沮丧不已。”——(Ray Ozzie)
 
31、“进行软件设计有两种方式。一种是让它尽量简单,让人看不出明显的不足。另一种是弄得尽量复杂,让人看不出明显的缺陷。”——(C.A.R. Hoare)
 
32、“好的软件的作用是让复杂的东西看起来简单。” ——(Grady Booch,UML创始人之一)
 
易用性
 
33、“不管那些计算机书籍如何宣称,只需记住,你并非‘傀儡’。真正的傀儡是那些无法设计出易于使用的硬件和软件的那些人,尽管他们是技术专家,因为这是普通消费者赖以生活的东西。”——(Walter Mossberg,科技专栏记者)
 
34、“软件供应商在努力尝试让他们的软件更‘易于操作’… 迄今为止,他们最好的办法就是翻出所有的老手册,然后在封面盖上‘易于操作’这几个字。”——(比尔·盖茨)
 
35、“有个老套的故事说有人希望他的计算机能像他的电话机一样好用。他的愿望实现了,因为我已经不知道该如何使用自己的电话了。”——(Bjarne Stroustrup,C++之父)
 
用户
 
36、“任何一个傻瓜都会用电脑。很多都会。”——(Ted Nelson)
 
37、“只有两个行业把客户称为‘用户’*。”——(Edward Tufte,信息设计大师)
 
*译者注:一个是计算机设计,另一个是毒品交易,computer design and drug dealing
 
程序员
 
38、“程序员在跟宇宙赛跑,他们在努力开发出更大更好的傻瓜程序,而宇宙则努力培养出更大更好的白痴。到目前为止,宇宙领先。”——(Rich Cook)
 
39、“你们当中很多人都知道程序员的美德。当然啦,有三种:那就是懒惰、急躁以及傲慢。”——(Larry Wall,Perl发明者)
 
40、“程序员的问题是你无法预料他在做什么,直到为时已晚。”——(Seymour Cray,超级计算机之父)
 
41、“那就是这些自认为痛恨计算机的人的真实面目。他们实际上真正痛恨的是糟糕的程序员。”——(拉瑞·尼文,科幻作家)
 
42、 “很长时间以来我一直困惑不已,为什么一些又贵又先进的东西会一点用都没有。直到我突然想起,计算机不就是一台愚蠢之至却拥有难以置信的做聪明事能力的机 器嘛,而程序员不就是聪明绝顶却拥有难以置信的干蠢事的能力的人嘛。一句话,他们简直就是天生绝配。”——(比尔·布莱森,旅游文学作家)
 
43、“不像学学涂涂画画也能让某人成为专家级画家,计算机科学教育不会让任何人成为一名编程大师。”——(埃里克·雷蒙,开源运动领袖)
 
44、 “一个程序员是经历以下事情后仍能证明自己是严格的专家的人:他可以历经数不清的捶打,可取材于无关紧要的文档,用上面的争议数据作出模糊假设,并以此计 算出测微精度的无数片面理解的答案,并由一个不可靠、脑袋充满质疑、公开宣称要让一个倒霉透顶、没有指望、毫无防备,要求第一时间获得信息的部门狼狈不 堪、令人生厌的人使用一台准确度有问题的仪器去实施。”——(IEEE网格新闻杂志)
 
45、“运气好的黑客能用几个月的时间 – 生产出一个小规模的开发团体(比如说,7-8人)历尽艰辛一起工作了一年多才能做出来的东西。IBM经常报告说某些程序员的生产力要比其它工人高百倍,甚至更多。”——(Peter Seebach,黑客)
 
46、“最好的程序员跟好的程序员相比可不止好那么一点点。这种好不是一个数量级的,取决于标准怎么定:概念创造性、速度、设计的独创性或者解决问题的能力。”——(兰德尔·E·斯特劳斯,科技作家)
 
47、“伟大的车工值得给他几倍于普通车工的薪水,但一个伟大的软件代码作家,其价值则要等同于一个普通的软件写手的价格的1万倍。”——(比尔·盖茨)
 
编程
 
48、“就算它工作不正常也别担心。如果一切正常,你早该失业了。” ——(Mosher的软件工程定律)
 
49、“靠代码行数来衡量开发进程就好比用重量来衡量飞机制造的进度。”——(比尔·盖茨)
 
50、“写代码的社会地位比盗墓的高,比管理的低。”——(杰拉尔·德温伯格,软件与系统思想家)
 
51、“首先学习计算机科学及理论。接着形成自己编程的风格。然后把这一切都忘掉,尽管改程序就是了。”——(George Carrette,杰出软件工程师,开源推广者)
 
52、“先解决问题再写代码。”——(John Johnson)
 
53、“乐观主义是编程行业的职业病;用户反馈则是治疗方法。”——(Kent Beck)
 
54、“迭代者为人,递归者为神。”——(L. Peter Deutsch)
 
55、“布尔值最好的一点是,就算你错了,也顶多错了一位而已。”——(无名氏)
 
56、“数组的下标是从0开始好还是从1开始好呢?我的0.5的折衷方案,以我之见,没有经过适当考虑就被否决掉了。”——(Stan Kelly-Bootle)
 
编程语言
 
57、“只有两种编程语言:一种是天天挨骂的,另一种是没人用的。”——(Bjarne Stroustrup,C++之父)
 
58、“PHP是不合格的业余爱好者创建的,他们犯做了个小恶;Perl是娴熟而堕落的专家创建的,他们犯了阴险狡诈的大恶。”——(Jon Ribbens)
 
59、“COBOL的使用摧残大脑;其教育应被视为刑事犯罪。”——(E.W. Dijkstra)
 
60、“把良好的编程风格教给那些之前曾经接触过BASIC的学生几乎是不可能的。作为可能的程序员,他们已精神残废,无重塑的可能了。”——(E. W. Dijkstra)
 
61、“我想微软之所以把它叫做.Net,是因为这样它就不会在Unix的目录里显示出来了。”——(Oktal)
 
62、“没有一种编程语言能阻止程序员写出糟糕的程序来,不管这种语言结构有多良好。”——(Larry Flon)
 
63、“计算机语言设计犹如在公园里漫步。我是说侏罗纪公园。”——(Larry Wall)
 
C/C++
 
64、“搞了50年的编程语言的研究,我们难道就以C++告终啦?”——(Richard A. O’Keefe)
 
65、“写C或者C++就像是在用一把卸掉所有安全防护装置的链锯。”——(Bob Gray)
 
66、“在C++里你想搬起石头砸自己的脚更为困难了,不过一旦你真的做了,整条腿都要报销。”——(Bjarne Stroustrup)
 
67、“C++ : 友人可造访你的私有成员之地也。”——(Gavin Russell Baker)
 
译 者:Friends:C++的友元,是一种定义在类外部的普通函数,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字 friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数 可以访问类的私有成员。
 
68、“罗马帝国灭亡的其中一个主要原因是他们没有0 – 这样他们就没法给自己的C程序指明成功退出的路径了。”——(Robert Firth)
 
Java
 
69、“Java从许多方面来说就是C++–。”——(Michael Feldman)
 
70、“说Java好就好在运行于多个操作系统之上,就好像说肛交好就好在不管男女都行。”——(Alanna)
 
71、“好吧,Java也许是编程语言的好榜样。但Java应用则是应用程序的坏榜样。”——(pixadel)
 
72、“要是Java真的有垃圾回收的话,大部分程序在执行的时候就会把自己干掉了。”——(Robert Sewell)
 
开源
 
73、“软件就像性事:免费/自由更好。”——(Linus Torvalds)
 
74、“唯一对免费软件感到害怕的人,是自己的产品还要不值钱的人。”——(David Emery)
 
代码
 
75、“好代码本身就是最好的文档。”——(Steve McConnell)
 
76、“你自己的代码如果超过6个月不看,再看的时候也一样像是别人写的。”——(伊格尔森定律)
 
77、“前面90%的代码要占用开发时间的前90%。剩下的10%的代码要占用开发时间的另一90%。”——(Tom Cargill)
 
软件开发
 
78、“好的程序员会用脑,但是好的向导救我们于样样都要想到。”——(Francis Glassborow)
 
79、“在软件里面,我们鲜有有意义的需求。就算有,衡量成功的唯一尺度也取决于我们的解决方案是否解决了客户对问题是什么的观念的转变。”——(Jeff Atwood)
 
80、“想想我们计算机程序的糟糕现状吧,很显然软件开发仍是黑箱艺术,还不能称之为工程学科。”——(Bill Clinton,前美国总统)
 
81、“没有伟大的团队就没有伟大的软件,可大部分的软件团队举止就像是支离破碎的家庭。”——(吉姆·麦卡锡,微软VC++总监)
 
调试
 
82、“一旦我们开始编程,就会惊讶地发现让程序正常没想象中那么简单。调试不可避免。那一刻我认记忆犹新,当时我就意识到,从今往后我生活的大部分时间都要花在寻找自己程序的错误上面了。”——(莫里斯·威尔克斯 调试探索, 1949)
 
83、“调试难度本来就是写代码的两倍。因此,如果你写代码的时候聪明用尽,根据定义,你就没有能耐去调试它了。”——(Brian Kernighan)
 
84、“如果调试是除虫的过程,那么编程就一定是把臭虫放进来的过程。”——(Edsger W. Dijkstra)
 
质量
 
85、“我才不管它能不能在你的机器上运行呢!我们又没装到你的机器上!”——(Vidiu Platon,罗马尼亚的微软最佳学生合作伙伴MSP)
 
86、“编程就像性一样:一时犯错,终生维护。”——(Michael Sinz)
 
87、“有两种写出无错程序的办法;只有第三种有用。”——(Alan J. Perlis)
 
88、“软件质量与指针算法不可兼得。”——(Bertrand Meyer)
 
89、“如果麦当劳像软件公司那样运作的话,每一百个巨无霸就会有一个令你食物中毒,而他们的回应是,‘真对不起,这是一张额外附送两个的赠券。’ “——(Mark Minasi)
 
90、“永远要这样写代码,好像最终维护你代码的人是个狂暴的、知道你住在哪里的精神病患者。”——(Martin Golding)
 
91、“是人都会犯错,不过要想把事情彻底搞砸还得请电脑出马。”——(Paul Ehrlich)
 
92、“计算机比人类历史上的任何发明都更快速地导致你犯更多的错误–可能除了手枪和龙舌兰酒是例外。”——(Mitch Radcliffe)
 
预测
 
93、“能发明的东西都发明出来了。”——(查尔斯·杜埃尔, 美国专利局局长,1899年)
 
94、“我认为全球市场约需5台计算机。”——(托马斯·沃森, IBM董事长, 约1948年)
 
95、“看上去我们已经到达了利用计算机技术可能获得的极限了,尽管下这样的结论得小心,因为不出五年这听起来就会相当愚蠢。” ——(约翰·冯·诺伊曼,约1949年)
 
96、“但这又有什么好处呢?”——(IBM先进计算机系统部的工程师对微芯片的评论, 1968年)
 
97、“我们没有理由让每一个人在家都拥有一台电脑。”——(肯·奥尔森,数据设备公司(DEC)总裁,1977年)
 
98、“640K对每一个人来说都已足够。”——(比尔·盖茨,1981年)
 
99、“Windows NT的RAM寻址空间可达2G,这比任何应用程序所需都要多。” ——(微软, 谈及Windows NT的开发时所言, 1992年)
 
100、“我们永远也无法真正成为无纸化社会,直到掌上电脑一族发布擦我1.0*(WipeMe 1.0)为止。”——(安迪?皮尔逊,商界领袖)
 
*译者注:意思是说难道你大便不用纸吗?
 
101、“长此以往,除了按键的手指外,人类的肢体将全部退化。”——(弗兰克?劳埃德?赖特,建筑师)

黑客该学什么程序语言

 

1、web page script languages 
    就是网页代码,比如Html、javascript、Css、Asp、Php、Xml都应该属于此类(照蔡的意思,Html不应该属于anguages的,可能他觉得太简单了吧,不过我觉得Html也应该算的,大家爱听谁的就听谁的好了,这个不重要) 
  2、Interpreted Languages(解释型语言) 
    包括Perl、Python、REBOL、Ruby等(后面三个听豆没听过),也常被称作Script语言,通常被用于和底下的操作系统沟通。照蔡的意思,每个人至少应该学会一套这类的语言。这类语言的缺点是效率差、源代码外露——所以不适合用来开发软件产品,一般用于网页服务器。 
  3、Hybrid Laguages(混合型语言) 
    代表是JAVA和C#。介于解释型和编译型之间。蔡认为C#是.NET最重要的语言,值得期待其后续发展;至于JAVA,蔡叫看他的《Sleepless in Java》——我倒! 
  4、COMPILING Languages(编译型语言) 
    C/C++,JAVA都是编译型语言。蔡说C++很复杂,要成为高手没三五年是不行的(就凭这句话,我决定向JAVA投降),虽然如此,但真正要成为高手的都应该懂C/C++。 
    关于Delphi,蔡说如果想要跨Linux和Windows平台的语言,则Delphi似乎是最好的选择。 
  5、Assembly Languages(汇编语言) 
    汇编语言是最接近于硬件的语言,不过现在几乎没多少人用了。 
  程序语言学习顺序建议 
    如果完全没有程序经验,可照这个顺序:javascript——解释型语言——混合型语言——编译型语言——汇编(如果需要的话) 
    用业界流行一句话做结尾“真正的程序员用C++,聪明的程序员用Delphi”,那么,什么样的程序员用JAVA呢? 
  虚怀若谷题外话 
    看在我这么晚了还这么辛苦的敲字的面子上,看到这篇帖子的朋友给点掌声吧,虽然没什么自己的思想。 
    另外,本文完全据蔡学镛先生同名文章精简,所以如果这篇文章给你的程序员生涯有什么不好的作用,那我不介意你去扁他。当然如果这篇文章对你有什么积极影响,我很高兴你能请我吃大餐。 
如果您想学习编程,却又不知从何入手,那么您不妨看看下面的几种学习方案,可能会给您一些启示吧! 
    方案一 Basic语言 & Visual Basic 
    优点 
    (1)Basic 简单易学,很容易上手。 
    (2)Visual Basic 提供了强大的可视化编程能力,可以让你轻松地做出漂亮的程序。 
    (3)众多的控件让编程变得象垒积木一样简单。 
    (4)Visual Basic 的全部汉化让我们这些见了English就头大的人喜不自禁。 
    缺点 
    (1)Visual Basic 不是真正的面向对象的开发文具。 
    (2)Visual Basic 的数据类型太少,而且不支持指针,这使得它的表达能力很有限。 
    (3)Visual Basic 不是真正的编译型语言,它产生的最终代码不是可执行的,是一种伪代码。它需要一个动态链接库去解释执行,这使得Visual Basic 的编译速度大大变慢。 
    综述:方案一适合初涉编程的朋友,它对学习者的要求不高,几乎每个人都可以在一个比较短的时间里学会vB编程,并用VB 做出自己的作品。对于那些把编程当做游戏的朋友来说,VB 是您最佳的选择。 
    方案二 Pascal语言 & Delphi 
    优点 
    (1)Pascal语言结构严谨,可以很好地培养一个人的编程思想。 
    (2)Delphi是一门真正的面向对象的开发工具,并且是完全的可视化。 
    (3)Delphi使用了真编译,可以让你的代码编译成为可执行的文件,而且编译速度非常快。 
    (4)Delphi具有强大的数据库开发能力,可以让你轻松地开发数据库。 
    缺点 
    Delphi几乎可以说是完美的,只是Pascal语言的过于严谨让人感觉有点烦。 
    综述: 方案二比较适合那些具有一定编程基础并且学过Pascal语言的朋友。 
    方案三 C语言 & Visual C++ 
    优点 
    (1)C语言灵活性好,效率高,可以接触到软件开发比较底层的东西。 
    (2)微软的MFC库博大精深,学会它可以让随心所欲地进行编程。 
    (3)VC是微软制作的产品,与操作系统的结合更加紧密。 
    缺点 
    对使用者的要求比较高,既要具备丰富的C语言编程经验,又要具有一定的WINDOWS编程基础,它的过于专业使得一般的编程爱好者学习起来会有不小的困难。 
    综述: VC是程序员用的东西。如果你是一个永不满足的人,而且可以在编程上投入很大的精力和时间,那么学习VC你一定不会后悔的。 
    方案四 C++语言 & C++ Builder 
    优点 
    (1)C++语言的优点全部得以继承。 
    (2)完全的可是化。 
    (3)极强的兼容性,支持OWL、VCL和MFC三大类库。 
    (4)编译速度非常快。 
    缺点 
    由于推出的时间太短,关于它的各种资料还不太多。 
     综述:我认为C++ Builder 是最好的编程工具。它既保持了C++语言编程的优点,又做到了完全的可视化。 
    方案五 SQL语言 & Power Builder 
    对于一些传统的数据开发人员来说,Foxpro系列也许让他们感到更加熟悉。但是对于初学者来说,PowerBuilder也许是最好的数据库开发工具。各种各样的控件,功能强大的PowerBuilder语言都会帮助你开发出自己的数据库应用程序。 
补充:关于网页后台语言和其他语言的关系,一般认为: 
C语言学的好,那么学习PHP会有事半功倍的效果 
VC学的好,那么学习ASP会有事半功倍的效果 
JAVA学的好,那么学习JSP、JAVASCRIPT会有事半功倍的效果 
关于网页后台语言和数据库,通常来说: 
PHP与MYSQL是黄金搭档 
ASP小型网站用ACCESS,大型用SQL 
JSP我就不知道了 
关于电子商务流行的语言,目前 
当当、卓越、6688、igo5、雅宝使用的是asp语言 
易趣、淘宝使用的是php语言 
贝塔斯曼使用的是jsp语言 
4、至少学会以下的其中两种: 
一、网站服务器程序ASP、PHP、CGI、JSP 
我个人认为CGI是最难学的其中一种。 
二、程序语言:C语言、C++、VB、JAVA、PERL、DELPHI、汇编语言 
不过我认为C语言的通用性最好,可以跨平台(操作系统)使用。 
还要试着自己写程序、开发软件等工作。 
三、数据库管理软件:MYSQL、SQL、FOXPRO……等。 
四、几种常用的操作系统:WIN98、WIN2000、WINNT、WINXP、UNIX、LINUX、要是能学到UNIX那是最好不过的了。最最基本的WIN2K、WINNT也要学会吧。 
如果以上的你都会了,那么你已经是个高手了。 

LISP

 

 

链表处理语言

   LISP(全名LISt Processor,即链表处理语言),由约翰·麦卡锡在1960年左右创造的一种基于λ演算的函数式编程语言。

 

  LISP有很多种方言,各个实现中的语言不完全一样。各种LISP方言的长处在于操作符号性的数据和复杂的数据结构。1980年代Guy L. Steele编写了Common Lisp试图进行标准化,这个标准被大多数解释器编译器所接受。在Unix/Linux系统中,还有一种和Emacs一起的Emacs Lisp(而Emacs正是用Lisp编写的)非常流行,并建立了自己的标准。

 

  LISP的祖先是1950年代Carnegie-Mellon大学的Newell、Shaw、Simon开发的IPL语言。

 

  LISP语言的主要现代版本包括Common Lisp和Scheme

 

  lisp拥有理论上最高的运算能力

 

  lisp在cad绘图软件上的应用非常广泛,普通用户均可以用lisp编写出各种定制的绘图命令。

名址分离网络协议

  注意:LISP在近几年也指一种名址分离网络协议,即 Location-ID Separation Protocol。

 

  在Internet的不断发展和壮大的同时,也呈现出了更多的弊端以及面临着诸多方面的挑战,包括全局路由表的持续不断的增长、缺乏对multi-homing和业务量工程以及移动性和安全性很好的支持等多方面的因素。

 

  为了彻底地解决上述问题,众多研究者都提到名址分离这一想法,如LISP\HIP等。在LISP中,原有的网络IP地址被分成EID(end-identifier)和RLOC(routing locator)。其中,EID用于标志主机,不具备全局路由功能;RLOC用于全网路由。名址分离网络自然会引入名与址的映射,即LISP中EID-to-RLOC的映射。众所周知,分级结构有着非常明显的优点,如结构简单、查询效率高等;已有方案中HRA、HAIR、RANGI、HiiMap、Lisp_CONS都提到采用分级结构进行映射系统的设计。

Scheme语言

 

Scheme 语言是 Lisp 的一个现代变种、方言,诞生于1975年,由 MIT 的 Gerald J. Sussman and Guy L. Steele Jr. 完成。与其他lisp不同的是,scheme是可以编译成机器码的。

 
  Lisp 语言的历史很久,几乎与 Fortran 一样长。二十世纪五十年代,计算机科学家先是发明了针对数字计算的 Fortran 语言,后来针对符号计算,由MIT 的John McCarthy于1960年开发出了Lisp(List processing)语言。该语言原来是为表处理而设计的编程语言,后来广泛用于处理人工智能问题。Lisp 程序中充满了一对对嵌套的小括号,这些嵌套的符号表达式体现着递归。递归是数学上的基本概念之一,从递归理论出发,一切可以计算的函数最终都可以划归为几种基本的递归函数的种种组合。
 
  1994年时众多 Lisp 版本又得到了相当的统一,统一之后的版本称为Common LISP。Common Lisp 含有非常丰富的库,仅仅语言的规范就长达千页以上,包括面向对象的 CLOS。
 
  Scheme语言的规范很短,总共只有50页,甚至连Common Lisp 规范的索引的长度都不到,但是却被称为是现代编程语言王国的皇后。它与以前和以后的 Lisp 实现版本都存在一些差异,但是却易学易用。
 
  Scheme的一个主要特性是可以像操作数据一样操作函数调用。Scheme 是 MIT 在70年代创造出来,其的主要目的是训练人的机器化思维。以其简洁的语言环境和大量的脑力思考而著称。
 
  正由于lisp语言的历史悠久,所以最初接触scheme的语法,我们常会感到一头雾水。但是这种语言自有它独特的魅力

为学

 

为学,需入乎其里 出乎其外。入乎其里才能明白知识中的道理,出乎其外,才能外延到实际应用和于其他知识的联系方能拓展和创新!

10 个最酷的 Linux 单行命令

 

 

  1. sudo !!

    以 root 帐户执行上一条命令。

  2. python -m SimpleHTTPServer

    利用 Python 搭建一个简单的 Web 服务器,可通过 http://$HOSTNAME:8000 访问。

  3. :w !sudo tee %

    在 Vim 中无需权限保存编辑的文件。

  4. cd -

    更改到上一次访问的目录。

  5. ^foo^bar

    将上一条命令中的 foo 替换为 bar,并执行。

  6. cp filename{,.bak}

    快速备份或复制文件。

  7. mtr google.com

    traceroute + ping。

  8. !whatever:p

    搜索命令历史,但不执行。

  9. $ssh-copy-id user@host

    将 ssh keys 复制到 user@host 以启用无密码 SSH 登录。

  10. ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpg

    把 Linux 桌面录制为视频

C和汇编嵌入

 

这是个简单例子:
/* C语言程序:a1.c */
  extern asub();
  main()
  { asub(); /* 调用汇编语言子程序 */
  }
  csub(char * str) /* C语言函数,str是地址参数 */ { printf("%s\n",str);
  }
  ; 汇编语言程序:a1s.asm
  .model small,c
  extern csub:near
  .data
  astring db ’OK, Assembly !’,0dh,0ah,’$’
  cstring db ’Good, Turbo C 2.0 !’,0
  .code
  PUBLIC asub
  asub proc
  mov dx,offset astring ;汇编语言子程序显示信息
  mov ah,09h
  int 21h
  mov ax,offset cstring ;得到字符串的偏移地址
  push ax ;压入调用参数
  call csub ;调用C函数
  add sp,2 ;平衡堆栈
  ret
  asub endp
  end