编程语言的巅峰

java8rt.jar源码-coderfun:《码农翻身》笔记 java8 rt.jar源码 coderfun 码农翻身笔记 1 计算机的世界你不懂 地址的动态重定位 多进程下为了解决内存地址覆盖的问题,需要记录每个程序的起始地址(基址寄存器),遇到与地址有关的指令,都要把地址加上基址寄存器的值,才是真实地址 分时系统 如果一个进程耗时很长,必须让出CPU去执行其他程序,CPU需要把时间分成一个个时间片,让操作系统调度处理 分块装入内存 很多程序都想进入内存,然而内存容量毕竟有限 时间局部性原理 如果访问了一个内存位置,很快还会再次访问,如果某数据被访问,很快还会再次被访问 空间局部性原理 如果访问了一个存储单元,很快附近的存储单元也可能被访问 页框 将程序分成一个个小块4KB,大部分时间只会运行几个页框 虚拟内存 可以给每个程序提供超级大的空间,只是这个空间是虚拟的,程序中的指令使用的就是这些虚拟地址,CPU的MMU再将它们映射到真实的物理内存地址,而程序本身浑然不觉,虚拟内存也要分块装入,每一块即页的大小和物理内存页框一样,方便映射 分段 每个程序都可以分为代码段,数据段,堆栈段,操作系统记录每个段的起始和结束地址,以及每个段的保护位,在段的内 立即下载

“哇塞,怎么可能这么简单!”

当C语言老头儿还是小伙子的时候,第一次见到了汇编,发出了这么一声感慨。

在C语言看来,这汇编的指令实在是太简单了,简单到了令人发指的地步,只有这么几类指令:

数据传输类:

就是把数据从一个位置复制到另外一个位置,比如从内存到寄存器,或者从寄存器到内存, 或者从寄存器到寄存器。

算术和逻辑运算类:

无非就是加减乘除,AND, OR,  左移,右移

控制类:

比较两个值,跳转到某一个位置。

汇编老头儿非常地骄傲, 他经常嚣张地说:“别看我的指令这么简单,但是配合我的寄存器和内存, 却能完成你们这些所谓的高级语言的所有功能!”

这寄存器是什么鬼? C语言脑海中只有内存和指针,根本就没有什么寄存器的概念, 实际上,这是属于CPU阿甘的,容量有限,但是速度超级快的存储部件。

640?wx_fmt=gif

640?wx_fmt=png

32位CPU寄存器

图片来源: http://pascalturbo.net/cpu-registers/

数组

C看着汇编这单薄的小身板,想到自己那优雅的if , 漂亮的while, for ,还有那极为重要的函数调用,心里不由得泛起嘀咕:我的程序怎么可能被编译成这么简单的汇编?

虽然心里有点瞧不上,但C小伙还是挺恭敬的:“前辈,在我这里有个数组的概念,编译成汇编是什么样?”

int num[10];

num[0] = 100;

num[1] = 200;

除了机器语言,那就属汇编最老,连C语言的第一个编译器都是用汇编写的,当之无愧的前辈。

汇编老头儿没想到C小伙儿连这个问题都没弄清楚,说道:“我这里只认寄存器和内存,你这所谓数组,就是内存的一段连续的空间嘛,我只要知道开始地址就可以了。”

640?wx_fmt=png640?wx_fmt=gif

C小伙儿一看,好家伙,连变量名num都不要了。 不过说得也是, 汇编老头只要记住初始地址,顺着地址就能找到所有东西。

“咦,这个什么0x000083d0不就相当于我的指针么? ”

“是啊,不过在我这里,都是地址,忘掉指针吧!”

条件分支

C小伙又想到了自己的if else,在汇编中该怎么处理?

if(x < y ){
   return y - x;
} else {
   return x -y ;
}

汇编老头儿说:“你们这些高级语言啊,就爱搞复杂化,怎么不用goto呢?”

C小伙说:“goto 被迪杰斯特拉认为是有害的,会破坏结构化,不建议使用!”

“唉,简单就是美,你们这些高级语言懂不了,我这里很简单,就是比较和跳转指令,从一个地方跳到另外一个地方执行就行了。”

汇编老头儿一遍感慨,一遍写道:

我们假设

%eax 寄存器保存的是y的值,

%edx 寄存器保存的是x的值。

  cmpl %eax, %edx ;  比较x和y

  jge   .L1       ;  如果x >= y,跳转到.L1处去执行

  subl  %edx,%eax ;  计算y-x,结果存到eax寄存器中

  jmp  .done      ;  跳转到.done标签处

.L1:

  subl %eax, %edx ;  计算 x-y

  movl %edx, %eax ; 把结果存到eax寄存器中

.done:            ; 计算结束,结果保存在eax寄存器中

(码农翻身注:这个例子来源于《深入理解计算机系统》)

C小伙儿看了半天,终于搞明白了这段汇编程序的含义,这所谓的jge也就是做一个判断,然后跳转到特定位置去执行,就像是if 和 goto 的结合。

汇编老头儿看到C小伙儿懂了, 问道:“你想想你的while 循环,for 循环,是不是if 和 goto 的包装而已?”

C小伙儿想了一会:“确实是这样!”

640?wx_fmt=gif

640?wx_fmt=png

“这不就结了,我的汇编看起来简单,但是却能表达你所有的流程控制语句,不管什么if else, while, for ,switch ,对吧?”

C小伙儿觉得汇编老头儿说的都是歪理:“这goto是简单,可是程序读起来就非常复杂了啊!”

汇编老头儿说:“你算是说道了点子上,所谓高级语言,主要是方便人类的编写和阅读的,是为了提升人类的效率。 在我这里,主要是让CPU阿甘执行的,那傻小子,速度飞快,什么也不懂,你只要告诉它指令就行,越简单越好。”

没想到CPU阿甘听到了对它的嘲讽,不满地说:“老伙计,又在背后说我的坏话,我执行了亿万条指令以后,早就悟出了程序的局部性原理,这你懂不懂?”

(码农翻身注:详情参见《CPU阿甘》)

函数调用

C小伙看到不能难倒汇编老头儿,想到了自己可以定义函数,精神一振,问道:“函数调用你怎么处理啊?”

int funcA(int a){
    ......
    funcB(10)
    ......
}

int funcB(int b){
    ......
    funcC();
    ......
}

看看,这funcA调用funcB, funcB又调用funcC,函数嵌套调用,你那简单的指令能处理? C小伙儿心里暗想。

汇编老头儿不慌不忙:“你可算是问了一个有价值的问题,不过这也难不倒我,我需要内存配合一下就行了。”

640?wx_fmt=gif640?wx_fmt=png

“看到里边的栈帧没有,每个栈帧都表示一个函数的调用!”

“那这栈帧中有什么东西?” C小伙儿问道。

“细节太复杂,给你画个示意图看看吧!”

640?wx_fmt=png640?wx_fmt=gif

“不对啊,你这栈帧中有输入参数,有返回值,可是没有函数代码啊?代码去哪儿了?”

“真是幼稚! 这是运行时在内存中对函数的表达,那代码肯定是在代码段啊。” 汇编老头儿嘲讽道。

代码段的指令不断被CPU阿甘执行,遇到函数调用,就建立新的栈帧,函数调用结束,栈帧就会销毁,废弃。然后返回上一个栈帧。

C小伙儿意识到自己犯了一个大错误,他老是想着代码的静态结构,而忽略了运行时的表示。

编程语言的巅峰

他急于挽回面子,赶紧给C++打电话求援:“兄弟,快过来,治一下这个汇编老头儿!”

C++了解了事情的经过,说道:“兄弟,不行啊,别看我有class, 但是最终我也得变成过程化的程序,翻译成汇编,和你是一样一样的。”

(码农翻身注: 参见《面向对象圣经》)

“那Python呢, Java 呢?”  C小伙儿有点气急败坏。

“他们更不行了,是虚拟机中的语言,他们连汇编老头儿的面儿都见不着,再说那虚拟机也是用你老兄C语言写的啊!”

C小伙呆住了,可不是,自己是很多系统级软件和编程语言的基础,已经非常贴近硬件了,自己治不了汇编老头儿,别人肯定也不行啊。


C小伙儿又想到了应用层那复杂的业务逻辑,他们都是由Python,Java, JavaScript等高级语言编写的,还用到了什么OOD,设计模式,函数式,响应式编程...... 但是它们都是一层层的抽象,帮助程序员更好地编写程序,在最底层,还是汇编啊。

他叹了一口气,对汇编老头说:“前辈,我服了,您可真是编程语言的巅峰啊。”

“不敢当,还有一个语言比我更厉害!”

“是谁?”

“机器语言! 只有0和1!不信你看看这程序员专属的键盘。”

640?wx_fmt=png640?wx_fmt=gif

你可能会喜欢:

我是一个线程

CPU阿甘

面向对象圣经

C老头儿和Java小子的硬盘夜话

TCP/IP之大明邮差

递归那点儿事儿

2015-04_P292 软件随想录.pdf 2015-04_P292 软件随想录.pdf 1 立即下载

相关推荐

码农翻身.xmind

码农翻身,自己的xmind类型的读书笔记,大家如果需要可以自行下载。当前文件对应我博客中的读书笔记内容

码农翻身

大话编程我是一个线程我是一个Java class Javascript: 一个屌丝的逆袭 Java:一个帝国的诞生JSP:一个装配工的没落TCP/IP 之 大明王朝的邮差TCP/IP 之 大明内阁TCP/IP 之 蓟辽督师CPU 阿甘CPU 阿甘之烦恼CPU 阿甘:函数调用的秘密我是一个网卡我是一个路由器我是一个进程我是一块硬盘(上)我是一块硬盘(下)我是一个键盘张大胖的socket张大胖学递归学...

Harrytsz的博客 2612

《码农翻身》第二章 Java帝国.emmx

你最爱的Java 搞懂了这几点,你就学会了Web编程 Spring本质系列(1) -- 依赖注入 Spring本质系列(2) -- AOP 三层架构和MVC那点事儿 Java帝国之拨云见日识回调 小张的Duck Typing JDBC的诞生 JDBC后传 一个不安分的JDBC驱动 Java帝国之 Java Bean(上) Java帝国之 Java Bean(下) Java帝国之 函数式编程(上) Java帝国之 函数式编程 (下) 关于Java初学者需要知道的10件事 Junit你不知道的那些事儿 Java EE的历史 Java EE读书指南 给小白的Java

十个程序员必备的网站推荐

使用工具类、设计分享类、资讯交流类、业界良心类。

青春不老,奋斗不止! 3万+

单细胞数据导入实战:Read10X函数常见报错与解决方案

本文针对单细胞转录组分析中Read10X函数数据导入的常见问题,提供了详细的实战解决方案。重点解析了因文件路径错误、压缩文件未解压、版本命名不符及内存不足导致的报错,并给出了检查路径、正确解压、重命名文件、调整参数及优化内存等具体操作步骤,帮助用户高效完成单细胞数据导入,为后续分析奠定坚实基础。

weixin_28235513的博客 238

省一蓝桥杯嵌入式-09RTC实时时钟

RTC(Real-Time Clock)实时时钟,是一个独立的定时器RTC模块拥有一组连续的计数的计数器,在响应软件配置下,可提供时钟、日历、闹钟功能RTC能提供年月日时分秒等信息(可设置)在系统复位或从待机模式唤醒后,RTC的设置时间维持不变(这个我没实现,复位后时间也重置了,有能力的可以自己研究一下)持续时间跟踪:在主系统断电后或处于低功耗模式时,RTC仍继续工作,原理是有额外的电池为其供电(蓝桥杯板子没有这个备用电源,该功能无效。

qq_46392331的博客 1729

码农翻身 各章节链接

大话编程 我是一个线程 我是一个Java class Javascript: 一个屌丝的逆袭 Java:一个帝国的诞生 JSP:一个装配工的没落 TCP/IP 之 大明王朝的邮差 TCP/IP 之 大明内阁 TCP/IP 之 蓟辽督师 CPU 阿甘 CPU 阿甘之烦恼 CPU 阿甘:函数调用的秘密 我是一个网卡 我是一个路由器 我是一个进程 我是一块硬盘(上) 我是...

wudinaniya的博客 4万+

BOM 数据模型设计

字段名数据类型必填说明物料编码 (Part Number)字符串是唯一标识,主键。建议包含分类前缀(如STD-GEN-CUS-物料名称 (Part Name)字符串是版本 (Revision)字符串是如AB1.0,与编码组合构成唯一实例。状态 (Status)枚举是设计中(Draft)已发布(Released)已归档(Archived)已作废(Obsoleted)类型 (Type)枚举是专用件(Custom)借用件(Borrowed)通用件(Generic)标准件(Standard)

Davina_yu的博客 1756

码农翻身精华文章

大话编程我是一个线程我是一个Java classJavascript: 一个屌丝的逆袭Java:一个帝国的诞生JSP:一个装配工的没落TCP/IP 之 大明王朝的邮差TCP/IP 之 大明内阁TCP/IP 之 蓟辽督师CPU 阿甘CPU 阿甘之烦恼CPU 阿甘:函数调用的秘密我是一个网卡我是一个路由器我是一个进程我是一块硬盘(上)我是一块硬盘(下)我是一个键盘张大胖的socket张大胖学递归学习面...

hello world! 1524

告别密码明文传输:手把手带你用Python实现SRP-6协议(附完整代码)

本文详细介绍了如何使用Python实现SRP-6协议,确保密码安全传输和存储。通过零知识证明与密钥交换技术,SRP协议在不传输明文密码的情况下完成认证,适用于金融App等高安全需求场景。文章包含完整代码示例和实战技巧,帮助开发者规避常见安全陷阱。

weixin_30689307的博客 412

Visual SLAM算法笔记

最近在学习SLAM算法,这里作为阅读笔记记录和总结一下。对经典的单目SLAM/VO算法做了摘要和总结,比如Nister VO、MonoSLAM、PTAM、ORB-SLAM、LSD-SLAM、SVO、DSO等,对几个单目和IMU的融合算法也做了简单总结,比如MSCKF、OKVIS、IMU-Preintegration等。

MulinB的技术博客 3万+

程序员10大推荐网站

gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub。 gitHub于2008年4月10日正式上线,除了git代码仓库托管及基本的 Web管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。 目前,其注册用户已经超过350万,托管版本数量也是非常之多,其中不乏知名开源项...

Programer0的博客 2866

fdtd(时域有限差分)仿真

基础入门阶段采用 Step by step 的教学方式带着做具体的案例,在案例中学习 FDTD 应用的。的痛难点,将 FDTD 仿真引入实验当中,通过软件可视化处理有效直观的展示仿真的流程,与实验数。图像传感器,OLED 和液晶,表面计量,表面等离子体,石墨烯,太阳能电池,集成光子组件,超材。料,衍射光学和光子晶体。波,场极化,磁场,周期性结构,半球功率积分等设计解决方案,提供时域有限差分分析函数,时域。子光学传感器、热电子光探测器的光学特性研究、光学微腔宽带吸收器等多个方向的研究方法。

y2715163545的博客 5445

编程语言c 汇编,编程语言的巅峰

原标题:编程语言的巅峰猿 份“哇塞,怎么可能这么简单!”当C语言老头儿还是小伙子的时候,第一次见到了汇编,发出了这么一声感慨。在C语言看来,这汇编的指令实在是太简单了,简单到了令人发指的地步,只有这么几类指令:数据传输类:就是把数据从一个位置复制到另外一个位置,比如从内存到寄存器,或者从寄存器到内存, 或者从寄存器到寄存器。算术和逻辑运算类:无非就是加减乘除,AND, OR, 左移,右移控制类:比...

weixin_33445134的博客 182

500多种目标检测数据集下载地址汇总(YOLO、VOC)

【目标检测】红外物体检测-人、自行车、公交、小车、摩托车、骑行者、动物等15000张YOLO+VOC(含部分截取增强图).zip。【目标检测】医用个人防护装备检测数据集981张5类别(口罩、工作服、护目镜、手套、面罩检测数据集)VOC+YOLO格式.zip。【目标检测】车辆分类数据集1880张7类VOC+YOLO(含摩托车、救护车、消防车、警车、警用摩托车、轿车、大车).zip。【目标检测】隐翅虫数据集386张VOC+YOLO【目标检测】隐翅虫数据集386张VOC+YOLO【目标检测】隐翅虫数据集。

2401_85863780的博客 9156

适配adv7280m相机到rk3588的安卓平台

Kernel-5.10/arch/arm64/configs/firefly_defconfig里面增加配置CONFIG_VIDEO_ADV7180=y。出现一次开不了机器的情况,接调试口发现,在set_fmt里面用s_ctrl对mipi的频率进行设置会出现异常。设备树修改kernel-5.10/arch/arm64/boot/dts/rockchip/13.dts。把MEDIA_ENT_F_ATV_DECODER改回MEDIA_ENT_F_CAM_SENSOR。第二次编译,仅仅刷新boot.img。

chenyq14的专栏 2449

码农翻身之编程语言的巅峰

“哇塞,怎么可能这么简单!” 当C语言老头儿还是小伙子的时候,第一次见到了汇编,发出了这么一声感慨。 在C语言看来,这汇编的指令实在是太简单了,简单到了令人发指的地步,只有这么几类指令: 数据传输类: 就是把数据从一个位置复制到另外一个位置,比如从内存到寄存器,或者从寄存器到内存, 或者从寄存器到寄存器。 算术和逻辑运算类: 无非就是加减乘除,AND, OR, 左移,右移 ...

优快云资讯 6617

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

移动编程语言的巅峰

MATLAB介绍 MATLAB是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑

angelatan2012的专栏 859

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

2013年1月编程语言排行榜:移动编程语言的巅峰

声明:本文非原创,为了让大家看到最新资讯,所以改为原创。 原文地址:http://www.cnbeta.com/articles/221005.htm     2013年编程语言排行榜应有什么样的动作呢?首先,随着手机应用程序市场的继续增长占着主导的地位,预计Java(Android)和C++/C#(Windows Phone)也将会重获民心,而Objective-C也会继续增长。其次

DBA@Robin 2647

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

编程语言的巅峰(嚯哈哈哈哈)

文章来源:码农翻身 “哇塞,怎么可能这么简单!” 当C语言老头儿还是小伙子的时候,第一次见到了汇编,发出了这么一声感慨。 在C语言看来,这汇编的指令实在是太简单了,简单到了令人发指的地步,只有这么几类指令: 数据传输类: 就是把数据从一个位置复制到另外一个位置,比如从内存到寄存器,或者从寄存器到内存, 或者从寄存器到寄存器。 算术和逻辑运算类: 无非就是加减乘除,AND, OR, 左移,右移...

Bzwanghao的博客 258

最强编程语言 Java 和最受欢迎之 Python 的巅峰对决

作为程序员们的看家利器之编程语言,倘若技术开发者对其掌握得越深则对自身职业生涯越有益处,然随着技术的更新变革,我们在日常使用不单单只会用到一门编程语言,那么究竟该如何选择一门新的语言来上手?本文中,将以主流 Java 和 Python 为例,为大家详细地解析两者的优缺点以及应用场景。 作者 |Darshit Sharma 译者 | 弯月 责编 | 屠敏 出品 | 优快云(ID:...

优快云资讯 1万+

五大编程语言巅峰对决:从Python到Go,谁是你的开发利器?

Python是数据科学的首选Java构建了企业应用的基石JavaScript统治着Web世界**C#**是微软生态的核心Go正在云原生领域开疆拓土根据项目核心需求选择主要语言考虑团队现有技能和学习成本不要局限于单一语言,掌握多语言协作保持学习,关注新兴语言的发展思考题:你当前主要使用哪种语言?遇到过哪些让你想换语言的痛点?如果开始一个新项目,你会选择哪种技术栈?欢迎在评论区分享你的语言使用体验!

专注于编程、AI、人工智能等多个领域内容研究和分析 1305

【拿捏编程语言&&走上人生巅峰】

小白如何快速上手编程语言

m0_62218247的博客 3351
上一篇: 张大胖:我作为男主角,还得不到一本签名版?!
下一篇: 中国云计算的十年江湖
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值