计算机被发明出来时,仅仅只是用来处理数字计算的工具,计算是第一功能,数据管理处于次要位置,特别为计算方便,设计的指令大部分都是计算型指令。后来由于多任务,程序开发、操作系统设计需要才加入各种管理程序任务(指令片段)的指令,但对数据的管理还是不太重视。
如为管理动态数据的程序堆栈空间,与管理程序函数调用的功能混在一起,造成很多不便,大量病毒、木马就是利用管理程序函数调用的栈空间把伪装指令地址的数据加载到栈空间上,程序函数返回又不得不利用栈空间取回返回地址。这种涉及机制只能是对数据空间、指令空间不太重视的后果,管理程序调用的重要数据为何不能另外涉及一个空间来容纳?为何要与函数动态数据混杂在一起?一切都是为程序指令运行而不顾数据的重要性采取的措施,这个错误设计产生的不良后果已经大大超出他带来的微小效益。
堆栈空间的设计不止带来空间溢出这种弊端外,影响了程序设计。栈空间是为容纳函数运行时的动态数据设计的,只有函数运行时才存在,当函数不运行时,所有的栈空间数据就消失了,因此为保存一些有用的动态数据,就必须采用申请其他内存空间的做法。一般都是在程序堆空间上申请,那么这种做法就会造成各种函数申请的堆空间都是同一个空间,程序没有办法为函数分配不同的堆空间,函数没有能力保护其动态数据的能力,随时都可能被其他函数破坏,这对可重入而设计的函数是一个灾难。
但人类不会因为一个蹩脚的设计而去重新设计的,只好用一个更蹩脚的设计来代替,为了应付多任务运行,不得不在函数调用的基础上发展出诸如像线程的机制。
但是线程虽然可以暂时解决多任务运行时的一些弊端,如保护私有数据,但对于一些小的多任务来说,线程太庞大了,如对象。按道理各种对象应独立运行在自己的对象空间中,但是因为指令设计的原因,各种对象也只是一堆积聚在一起的函数和数据,本质上都没有真正分开。这种设计的后果就是,对象不能真正单独存在,它必须在程序在精巧设计下,一步一步运行才能起作用。如要同时对大量对象发送消息,也必须通过循环才能做到。