基本级别:
让我们从最简单,最基本的角度看待事物。
对于数学,我们有:
2 + 3 = 5
我很小的时候就知道了这一点。我可以看一下最基本的元素:两个对象和三个对象。大。
对于计算机编程,大多数人倾向于使用高级语言。某些高级语言甚至可以“编译”为较低的高级语言之一,例如C。然后可以将C转换为汇编语言。然后将汇编语言转换为机器代码。许多人认为复杂性到此为止,但事实并非如此:现代CPU将机器代码作为指令,然后运行“微代码”以实际执行那些指令。
这意味着,从最基本的层次(处理最简单的结构)来看,我们现在正在处理嵌入在硬件中的微代码,大多数程序员甚至不直接使用也不更新。实际上,不仅大多数程序员不触摸微代码(比微代码高0级),大多数程序员也不触摸机器代码(比微代码高1级),甚至汇编(比微代码高2级)(除了,也许是在大学期间接受了一些正规培训)。大多数程序员只会将时间花在3或更多级别上。
此外,如果我们看一下组装(这是人们通常所掌握的水平),那么每个步骤通常都是经过培训并有资源来解释该步骤的人员所理解的。从这个意义上讲,汇编语言比高级语言要简单得多。但是,组装是如此简单,以至于执行复杂的任务甚至是平庸的任务都非常繁琐。上层语言使我们摆脱了这种困境。
在关于“逆向工程”的法律中,法官宣布,即使理论上可以一次处理一个字节,现代程序也需要数百万个字节,因此必须为此专门制作某种记录(例如代码的副本)努力可行。(因此,内部开发不被认为违反了版权法的一般性“禁止复制”规则。)(我可能正在考虑制造未经授权的Sega Genesis墨盒,但可能会在Game Genie案中想到某些说法。 )
现代化:
您是否运行用于286s的代码?还是您运行64位代码?
数学使用的基础可以追溯到几千年前。有了计算机,人们通常会认为投资已有二十年之久的资源是无用的浪费。这意味着可以对数学进行更彻底的测试。
二手工具标准:
我(由一个接受过比我更正式的计算机编程培训的朋友所学到的)告诉我,没有满足C规范的无错误C编译器之类的东西。这是因为C语言基本上假定可以将无限内存用于堆栈。显然,当人们试图使可用的编译器在本质上更加有限的实际机器上工作时,就必须偏离这种不可能的要求。
在实践中,我发现使用Windows Script Host中的JScript,我已经能够完成许多使用对象的工作。(我喜欢这种环境,因为尝试新代码所需的工具集已内置在Microsoft Windows的现代版本中。)使用这种环境时,我发现有时没有关于对象如何工作的易于查找的文档。但是,使用对象是如此有益,以至于我还是这样做。因此,我要做的是编写代码,这可能是一个大黄蜂的巢,在一个很好的沙盒环境中可以看到效果,并在与之交互时了解对象的行为。
在其他情况下,有时只有在弄清对象的行为方式之后,我才发现该对象(与操作系统捆绑在一起)存在错误,并且微软已故意解决这一已知问题,将不会予以解决。 。
在这种情况下,我是否依赖于由熟练的程序员创建的OpenBSD,这些程序员定期(每年两次)按计划创建新版本,并且在过去10多年中享有“仅两个远程漏洞”的著名安全记录?(即使它们具有不太严重的问题的勘误补丁。)否,绝对不是。我不依赖于如此高质量的产品,因为我正在为一家支持为人们提供使用Microsoft Windows的机器的企业的公司工作,这就是我的代码需要进行的工作。
实用性/可用性要求我在人们认为有用的平台上工作,而这是一个众所周知的对安全性不利的平台(即使自千年之初以来取得了巨大的进步,而同一公司的产品却差得多) 。
摘要
计算机编程更容易出错的原因有很多,这被计算机用户社区所接受。实际上,大多数代码是在不能容忍无错误工作的环境中编写的。(在某些方面,例如开发安全协议,可能会在这方面付出更多的努力。)除了企业通常不希望投资更多原因以及错过人为的截止日期以使客户满意的原因外,还有以下影响:技术的进步只是表明,如果您花费太多时间,那么您将在一个过时的平台上工作,因为十年之内事情确实会发生重大变化。
简而言之,当我看到一些strlen和strcpy的源代码时,我对那些非常有用和流行的功能短短感到惊讶。例如,strlen可能类似于“ int strlen(char * x){char y = x; while((y ++)); return(yx)-1;}”
但是,典型的计算机程序要比这更长。同样,许多现代编程将使用其他代码,这些代码可能没有经过充分测试,甚至被认为是错误的。如今的系统比容易想象的要复杂得多,除了通过手工挥舞掉很多细节作为“较低层次处理的细节”之外。
这种强制性的复杂性,以及与复杂甚至错误的系统一起工作的确定性,使得计算机编程要比许多数学简化许多硬件来验证,因为数学往往会简化为许多简单的层次。
在数学上分解事物时,您会得到孩子可以理解的各个部分。大多数人相信数学;至少是基本算术(或至少是计数)。
当您真正分解计算机程序以了解幕后发生的事情时,您最终会破坏标准和代码的最终实现以电子方式执行,而物理实现仅比大多数大学训练有素的计算机科学家所采用的微代码低了一步。不敢碰(如果他们甚至意识到的话)。
我曾与一些大学或刚毕业的程序员交谈过,他们完全反对可以编写无错误代码的想法。他们已经取消了这种可能性,尽管他们承认一些令人印象深刻的示例(我已经证明了)是令人信服的论点,但他们认为此类示例是不具代表性的罕见骗子,并且仍然忽略了能够计数的可能性具有更高的标准。(与我们在数学中看到的更可信的基础相比,态度截然不同。)