如果现在只能用汇编和Goto编程......

C++中的goto陷阱 尽管程序设计中不提倡使用goto语句,但是有的时候为了简化代码,难免会使用到goto。下面我要讨论的这个陷阱C语言程序中不会遇到,反而C++中稍不注意就会引起问题。 直接看以下代码: int _tmain(int argc, _TCHAR* argv[]) { int t1 = 1; if (t1 >0) { goto __next; } int t2 = 5; 阅读详情

上世纪五六十年代,高级语言还没普及,很多人用汇编写程序,汇编代码运行效率高,但是有个致命的缺点:不容易看懂,维护困难。

程序设计是少数聪明人干的事情,他们智力超群, 写代码也不讲什么规则,可以随意使用灵活而又强大的Goto,写出只有自己能懂的代码。

但是到了六十年代中后期,事情就慢慢不对了,计算机的计算能力提升速度远远超过程序员,软件规模和数量随之急剧上升, 出现了一堆问题:项目预算超支,项目难以管理,代码质量很低,软件不符合需求,这该怎么办?

01

北约会议

1968年,“北约软件工程大会”在风景如画的德国小镇Garmisch召开(我很奇怪为什么这个会议以北约的名义牵头,有知情的同学请告知。)

会议指出:软件的复杂度已经变得人脑无法掌控,我们已经处于严重的软件危机当中!

会议强调:软件的生产有必要建立在某些理论基础和实践指导之上!

会议要求:各单位要切实加强对其他学科的学习,实施软件软件工程的办法,努力提高程序设计的效率和质量。

可是理论基础和实践指导在哪里呢?

02

1968年的Dijkstra

每当危机到来,总会有大神出手相救,这一次是Dijkstra。

学编程的同学肯定知道他,《数据结构和算法》中有他的Dijkstra算法,《操作系统》中有他的信号量,银行家算法,他还在程序设计,分布式计算,并行计算,编译器等很多领域做出了开创性贡献,于1972年获得计算机界最高奖:图灵奖。

Dijkstra大神经过研究,于1968年在ACM上发表了一篇论文,名字叫做《Go to 语句有害论》,要求废除Go to 语句!

这篇战斗檄文一下子就使编程界炸了锅,支持Goto 语句的人觉得他们的权益受到了极大的侵犯:没有Go to 语句,程序流程怎么跳来跳去,以后怎么写代码?

Dijkstra准备充分,他本人在50年代就用机器代码编写了大量程序,清楚地知道Go to 语句的危害, 但是为了以理服人, 他搬出了一个著名的、被证明的理论:

无论是什么程序,不管多么复杂,都可以用三种基本的结构来表达:顺序,分支,循环。

所以,你们不用再瞎BB了, 不用go to 语句也能写程序。

03

结构化编程

更进一步,Dijkstra创造了一个词:结构化编程,它包括这些元素:

控制结构:顺序, 分支,循环,还有著名的递归

子程序:也叫过程,方法,函数,可以封装一系列语句让别人调用。

代码块:如if...fi,Begin...END , {....}

这几乎就是现代编程语言最基本的元素了,软件工程这座大厦的地基终于打好, 结构化编程掀起了一场革命:

自顶向下分析问题

模块化设计

高内聚、低耦合

瀑布式开发方法

......

结构化编程大大降低了编程的复杂性, 必须感谢这些大神,让我等资质平庸的人也能投身于软件编程的伟大事业当中,如果把我扔到五六十年代的Go to洪流中,我可能活不过三集。

对Go to 的争论一直没有停歇,包括高纳德这样的大神也卷入进来,发表文章《Structured Programming with go to Statements》,他分析了许多常见编程任务,然后发现其中的一些使用Go to 将得到最理想的结构。例如:跳出嵌套循环,多个分支的跳出等,所以现在很多编程语言依然保留着goto这个关键字。

04

致命问题

随后几年,结构化编程运动如火如荼,人们写的程序越来越复杂,结构化编程的两个致命问题逐渐暴露:

1.  维护全局变量变成噩梦

子程序(函数)虽然封装了相同的代码逻辑,成为黑盒子,但是多个子程序(函数)需要共享信息的时候,就需要全局变量,全局变量一旦变多,维护就变成噩梦。

2. 子程序(函数)的复用性太差

函数是一个有输入、输出的简单的逻辑单元,其他程序可以通过调用公用函数来实现复用,但是这种复用的层次太低。

比如:我们想定义一个这样的主程序:

里边包含一些逻辑,但是有些步骤是虚线,表示希望在运行时能动态的替换成用户自己的东西(没错,这其实就是一个框架了!) ,结构化编程就有点儿着急了。

也就是说,我们无法复用这个主程序的结构。

C语言可能会跳出来:用函数指针来做啊。没错,函数指针能实现,但是属于高级技巧,不是普罗大众程序员能玩的, 何况有些语言还不支持。

05

1967年的Simula

时间倒退一年到1967年,挪威的两名科学家Ole-Johan Dahl 和Kristen Nygaard发明了一个叫做Simula 67的语言,这个语言和当时流行的Fortran, COBOL, Basic 全然不同, 它不但支持类,还支持继承,多态这些新鲜的概念。

不过由于当时的计算机硬件性能低下,而这些概念又过先进,所以在很长时间内都没人注意到。

随着结构化编程缺陷的暴露,人们发现Simula 67 这门语言的特征正好可以解决上面的两个问题:

1. 类可以把函数和成员变量组织在一起,消除全局变量

使用权限控制,可以使得实例变量对外不可见。

2. 通过多态,可以实现对主程序的复用

主程序只调用接口或者缺省类,使用者提供实现类,两者结合起来,完成业务功能。

大神程序员可以集中精力搞定那些最基础,最重要的东西,创建出通用的框架和类库让程序员使用。我等普通人只需要专注业务逻辑即可, 又可以快乐地搬砖了!

使用面向对象的技术,代码的复用层级从简单的函数进化到类和框架,不仅如此,还有些程序员从框架和类库中抽取出了可以重用的思想:模式。

面向对象技术从60年代的Simula 67起源,70年代出现了Smalltalk,80年代出现了C++, 到了90年代,Java横空出世,面向对象编程终于成为主流。

2001年,图灵奖姗姗来迟,颁给了发明Simula 67 的Ole-Johan Dahl 和Kristen Nygaard。

06

尾声

1967年和1968年真是神奇的两年, 面向对象技术发明, 结构化编程运动开启。

表面看,这两项技术没什么大不了的,但是它们都降低了软件开发的复杂度,使得普通人也能参与到搬砖的伟大事业当中,这才造就了繁荣的软件编程行业和互联网。

请大家切记,使用某种更高级的技术,不能代表你就能开发出高级的程序,关键在于人。 用面向对象的语言,写着面向过程的程序,这样的人大有人在。

所以,如果有人再宣称

OOP大法好

设计模式大法好

函数式编程大法好

XXX框架大法好

XXX大法好

你不用多费口舌,只需要问他一个直击灵魂的问题:你用这个技术,是不是降低了你所在领域的复杂度呢?是不是提高了可维护性和重用性?看看他怎么回答吧!

后记:本文是受到《面向对象是怎样工作的》一书的启发所写,这本书比较深入地讲述了面向对象的技术,推荐。

架构师劝退指南

Java每次遇难,总会有大神拯救

你们这些偷代码的程序员!

程序员的宿命

芯片战争70年,真正的王者即将现身!

干掉软件开发的最大怪兽:狼人!

宇宙第一IDE到底是谁?

HTTP Server :一个差生的逆袭

如何降低程序员的工资?

程序员,你得选准跑路的时间!

两年,我学会了所有的编程语言!

Javascript: 一个屌丝的逆袭

我是一个线程

TCP/IP之大明邮差

一个故事讲完Https

CPU 阿甘

漫画线性代数 漫画线性代数,纯中文,为方便机器学习开发而上传,带漫画 立即下载

相关推荐

陶哲轩线性代数讲义

陶哲轩线性代数讲义,全英文,共十周,清晰明了,适合自学

线性代数入门

使用课程 链接:https://pan.baidu.com/s/1FOXy7SzrSKJgKW4pVWvDdA 密码:7csk 整理了一下mit官网上的exam、assignments、教材和答案的pdf文档

BLOG 2177

线性代数入门习题解答1

1. 线性映射和矩阵 1. g, h 都是满射, 则 f 也是满射. 2. g, h 都是单射, 则 f 也是单射. 3. h 不是满射, 则 f 可能是满射.

书单 | 10本世界顶级数学大师教材著作,全是0基础自学神器!

春节假期结束,你今年的小目标有了吗?开年推荐10部适合自学的世界顶级大师教材。有了好教材,自学数理逻辑不是梦。01《普林斯顿微积分读本(修订版)》作者:【美】阿德里安·班纳译者:杨爽 赵晓婷 高璞★ 多年用于教学,深受学生喜欢!包含475个例题,且均有详细解答!普林斯顿读本三剑客之微积分!本书阐述了求解微积分的技巧,详细讲解了微积分基础、极限、连续、微分、导数的应用、积分、无穷级数、泰勒级数与幂级...

图灵教育 5571

zemax混合式非序列模拟

注意不要点击左侧的非序列模式,那个时纯粹的非序列,会清除序列模式的数据。第2、4、6透镜材质为空气,是为了让光线进入到多重透镜内部。这时普通的优化方式会失败。平行光束经过多焦透镜时,会汇聚在不同焦距处。所以还需要控制能量的大小,进行优化。接下来用非序列模式设计一个多焦透镜。像面的孔径为圆形通光孔:0-1.2。透镜不同位置处有不同的聚焦位置。透镜的z轴位置相同,重合。

fendoudecheng的博客 3067

从涡流求解器到瞬态场:Maxwell 3D里无线充电仿真,选对求解器能省一半计算时间

本文深入探讨了Maxwell 3D在无线充电仿真中涡流求解器与瞬态求解器的选择策略,帮助工程师优化计算效率与精度。通过对比分析两种求解器的适用场景、性能差异及实战技巧,揭示如何根据频率特性、材料非线性和动态过程需求做出精准选择,可节省高达50%的计算时间。特别针对3D线圈模型的无线充电系统设计提供了专业建议。

weixin_26861329的博客 231

为什么不给用goto_如果现在只能用汇编和Goto编程......

上世纪五六十年代,高级语言还没普及,很多人用汇编写程序,汇编代码运行效率高,但是有个致命的缺点:不容易看懂,维护困难。程序设计是少数聪明人干的事情,他们智力超群, 写代码也不讲什么规则,可以随意使用灵活而又强大的Goto,写出只有自己能懂的代码。但是到了六十年代中后期,事情就慢慢不对了,计算机的计算能力提升速度远远超过程序员,软件规模和数量随之急剧上升, 出现了一堆问题:项目预算超支,项...

weixin_39686192的博客 318

HSPICE用户必看:用Sigrity Broadband SPICE解决复杂封装建模的3个技巧

本文为HSPICE用户分享了三个使用Sigrity Broadband SPICE解决复杂封装建模难题的实战技巧。通过将宽频带S参数高效转换为时域SPICE模型,能显著提升仿真速度、保障收敛性,并精准分析谐振、返回路径不连续及超多端口PDN等关键问题,助力实现高效稳定的系统级信号与电源完整性分析。

metal的博客 601

如果现在只能用汇编和 Goto 编程......

上世纪五六十年代,高级语言还没普及,很多人用汇编写程序,汇编代码运行效率高,但是有个致命的缺点:不容易看懂,维护困难。程序设计是少数聪明人干的事情,他们智力超群, 写代码也不讲什么规则,...

图灵教育 298

银河麒麟V10离线安装VLC播放器:依赖处理与3.0.9.2版本实操指南

在国产化操作系统日益普及的背景下,软件安装方式成为政企内网用户关注的重点。离线安装作为一种不依赖公网源的部署手段,常用于解决内网环境下的软件获取问题。其核心在于理解Linux包管理机制,如dpkg与apt对依赖关系的处理逻辑。掌握这一原理,不仅能应对多媒体软件的部署,也能提升系统维护效率。VLC作为跨平台多媒体播放器,凭借强大的解码能力与协议支持,广泛应用于本地视频播放、RTSP拉流及监控大屏等场景。本文从离线安装的通用概念出发,结合银河麒麟V10桌面版的实际环境,详细梳理了VLC 3.0.9.2离线包的获

weixin_32247165的博客 370

告别‘Duang’的一声:手把手解决RK3588开发板PCIe初始化卡死问题(DTS修改实战)

本文详细介绍了解决RK3588开发板PCIe初始化卡死问题的完整过程,包括问题诊断、DTS文件修改及编译烧写步骤。通过禁用未使用的PCIe硬件资源,有效解决了启动卡死问题,为嵌入式开发者提供了实用的调试方法和经验总结。

weixin_30753873的博客 216

为什么不给用goto_如果现在只能用汇编和 Goto 编程......

上世纪五六十年代,高级语言还没普及,很多人用汇编写程序,汇编代码运行效率高,但是有个致命的缺点:不容易看懂,维护困难。程序设计是少数聪明人干的事情,他们智力超群, 写代码也不讲什么规则,可以随意使用灵活而又强大的 Goto,写出只有自己能懂的代码。但是到了六十年代中后期,事情就慢慢不对了,计算机的计算能力提升速度远远超过程序员,软件规模和数量随之急剧上升, 出现了一堆问题:项目预算超支,...

weixin_39843431的博客 219

计算机组成原理(第三版)唐朔飞-第五章输入输出系统-课后习题

计算机组成原理(第三版)唐朔飞-第五章输入输出系统-课后习题

weixin_45735391的博客 6万+

【汇编 C】循环语句goto、while、dowhile、for

在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件。循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序被称为循环体。循环语句是由循环体及循环的终止条件两部分组成的。例子:(这里就拿汇编举例吧)首先401210位置的jmp会跳到401230的位置,然后将1,2,3,4分别放到对应的寄存器中之后再一次使用jmp跳到401210的位置。

qq_52572621的博客 4454

KEPServerEX 6 之 EX 6.11.718.0 发布说明

KEPServerEX 6.11.718.0 发布说明

-雲飛兄-博客 2882

【部署】Kimi 接入OpenClaw完整步骤及关键注意事项

本文详细介绍了如何将Kimi AI接入OpenClaw系统的完整步骤。首先需确保环境满足OpenClaw版本要求和系统支持,然后通过配置向导完成本地网关设置和Kimi模型接入,包括API密钥配置。文章提供了详细的命令操作和界面截图指导,并重点说明了安全警告处理、服务状态检查、API密钥有效性验证等关键注意事项。最后还展示了Kimi流量消耗明细和问题排查方法,帮助用户顺利完成接入并解决常见问题。整个流程清晰明了,涵盖了从环境准备到最终验证的全部环节。

海兰 7185

万恶的goto关键字

提到goto, 大家一定能想到迪杰斯特拉发表的著名论文goto有害论(Go To Statement Considered Harmful)。正是它推动了结构化程序设计语言的发展。公正地说,goto并非那么可怕,机器码/汇编码本身支持跳转,就是goto的底层形态。计算机程序中条件选择、循环等语句最终依然依靠跳转指令完成,只是高级编程语言不建议用goto, 会造成程序员的困扰。但,机器从来都没困扰过,CPU根据jmp或j*指令的地址改写RIP地址并执行,丝滑无比,从未抱怨过。

编程语言开发、框架原理、编程思想、最佳实践技巧经验分享。致力于各种编程技术的技巧经验干货分享,讲解开发避坑技巧,追踪开发前沿技术,实战展开解决难题。 程序员小迷助您在编程路上越走越好! 1021

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java中goto用法

本文主要介绍break和continue借用标签机制,实现跳出循环嵌套的实现方法。

呆呆papa的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

GOTO 语句有害论 | 反对 GOTO 语句的理由

……

u013669912的博客 1877

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

“扩展asm”——用C表示操作数的汇编程序指令

“扩展asm”——用C表示操作数的汇编程序指令

我的博客 2307

在Lua中实现汇编中的跳转语句Goto

当脚本只是一系列简单命令序列的时候,一个Goto语句用起来会非常方便,比如可以这样写 --开始Print("这是1");Print("这是2");Goto("开始"); 这是个无限循环,可以随时跳转,很方便,看起来也很清晰。 我基于LuaPlus实现了一个,代码如下: /* *    /file    CmdScript.h *    /brie

shangguanwaner的专栏 7671

关于goto和switch的一些思考

昨晚在实验室回寝室前,和队友们谈到关于goto的问题,于是不禁想到了《CODE COMPLETE Ⅱ》中举的一个巧妙例子: if(statusOK) { if(dataAvailable) { importantVariable = x; goto MID_LOOP; } } else { importantVariable = GetValue(); MID_LOOP:

Cration_523的专栏 2121

goto

一:前言 goto是循环的本质,对应汇编中的jmp跳转,c中的while,do while 和for在程序编译时,都要拆解为汇编的jmp. goto语句--无条件跳转语句,使用方法为 goto 语句标号 语句标号的命名规则和C语言的变量命名规则一样,例如goto lable_ 合法 goto 123 不合法 goto的使用场景最主要分为如下两种 向上跳转,实现循环 向下跳转,实现中间...

马赛克的博客 965

c语言还有没有goto语句,C语言goto语句如何使用?

goto语句使用:1、C#语言中using System;using static System.Console;class Program{public static Int32 Main(String[]args){int n=0;WriteLine("input a string:\n");loop:if(Read()!='\r'){n++;goto loop;}WriteLine("{0}...

weixin_29871897的博客 530

计算机语言goto,goto语句

goto语句也称为无条件转移语句,其一般格式如:goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加半角冒号“:”。语句标号起标识语句的作用,与 goto 语句配合使用。中文名无条件转移外文名goto领域作用编写程序goto语句举例编辑语音goto语句也称为无条件转移语句,其一般格式如下:goto 语句标号;其中语句标号是按标识符规定书写的符...

weixin_31227315的博客 1600

java由goto_在java中goto的目的

本问题已经有最佳答案,请猛点这里访问。我知道EDCOX1 0是Java中的关键字。另外,从wiki,我可以摘录到,"它没有被使用,也没有任何功能"。我想知道,如果goto没有用处,也没有在任何地方使用,为什么它被声明为关键字?在Java程序中是否有人使用EDCOX1 0?在Java编程中是否有类似GOTO声明的其他关键字,但隐喻没有用。我们在日常编程中使用goto的地方,或者很少在什么时候使用go...

weixin_34377666的博客 115
上一篇: 假如有人把支付宝所有存储服务器炸了,我们在里边的钱是不是都丢了?
下一篇: 它抢不走程序员的饭碗,但是会让一部分人瑟瑟发抖
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值