即刻App年轻人的同好社区
下载
App内打开
InterStay
5年前
“while循环和递归对比”:
递归没有任何性能优势,但是逻辑更清晰,代码更易理解;while方式每一次循环的状态都保存在代码里,而递归的每一次状态都保存在调用栈内,保存栈是有代价的。如果使用递归,可能导致调用栈很高,内存有时候会到达峰值,那如何选择呢?
1. 使用尾递归
2. 选择使用循环
“java编译器为什么不支持尾递归优化?”:因为如果要优化,就要改变调用栈,改变调用栈会让调试变困难;在高度面向对象的编程环境中,由于可以改用迭代,因此语言委员会认为不值得添加尾递归(hhhh好吧)。

突然回忆到自己对所有的计算机语言都只是有个笼统的概念:C语言是根据编译规则直接编译成机器码,这大大提高了运行效率,那么为什么java不选择根据不同编译规则和CPU指令集直接编译成对应环境的机器码呢?C语言和汇编语言又有什么区别?汇编如何实现编译成机器码的?然后开始了疯狂的循环搜索模式:

汇编语言:
“汇编语言实质上就是机器语言的助记符。”
解析:
1. CPU只能运行它所支持的指令集,而这些指令集当中的每天条指令都是一些二进制数的序列,也就是“0”和“1”的有序组合。
2. “0”和“1”的组合不便于记忆,因此有了“MOV A 0x40”等这样的助记符,在编写程序的时,用“MOV A 0x40”来代替一串“0”和“1”的序列,这样一看就知道是把“0x40”单元中的数据搬到累加器A中。而如果是用“0”和“1”的序列,毫无特征,很难被记住。 3. 汇编语言编译成CPU可执行的机器语言只做了一个翻译的动作,助记符与对应的二进制指令是一一对应的。
4. 汇编语言通常用在程序中最核心的、控制硬件的代码,一是安全,二可以提高运行速度。

C语言:
C语言将许多相关的机器指令合成为单条指令,去掉了与具体操作有关但与完成工作无关的细节,例如使用堆栈、寄存器等。
C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言;尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

java语言:
java是基于C语言开发的,所有的底层都是调用的C库,相当于站在巨人的肩膀上;java在OS与程序之间还有一层编译器和虚拟机,是半编译半解释型语言。
程序执行过程:
编译器:编译前端对代码进行词法、语法、语义分析,生成中间表达式,然后编译后端对中间表达式进行优化,生成机器码。执行javac生成的就是中间表达形式(.class)。
虚拟机:JVM在执行时,首先会逐条读取IR的指令来执行,这个过程就是解释执行的过程。当某一方法调用次数达到即时编译定义的阈值时,就会触发即时编译,这时即时编译器(JIT)会将IR进行优化,并生成这个方法的机器码,后面再调用这个方法,就会直接调用机器码执行,这个就是编译执行的过程。

现在再来回答一下java为什么不像C语言一样直接编译成机器码提高运行效率?
1. 为了扩展和通用:“write once, run anywhere”。
2. 在底层计算机元件飞速发展的今天,时间和空间的利用已经飞升了不止一个档次,资源已经没有以前那么吃紧了,也就不需要太考虑运行效率的问题(相对于C语言和汇编等),毕竟开发一个系统要考虑的不止是系统运行效率还要考虑开发和迭代效率。

总体来说:这些语言面向的领域不同,互不影响,也没有对比的必要。
java面向web,所有的设计都是服务于业务,由于需求经常变,所以代码经常变,由于代码要经常更改,所以更需要降低耦合,所以要分层、要多态、要反向代理、要IOC、要AOP、要代码复用、要根据不同场景采取更理想的设计模式,因为前后端分离、因为敏捷开发,所以要DevOps,因为业务巨大采取分布式部署,要动静分离、要远程调用、要负载均衡、要容器运行、要集群管理、需要各种分布式组件协同,这一切的一切都是服务于业务,服务于需求。
C面向操作系统,会直接“触碰硬件”,应用场景就是开发各种底层引擎,需要用到大量的复杂运算、浮点运算、非线性方程等,对运行效率要求比较高的情况,比如开发游戏引擎。
而汇编则通常被应用在底层,如硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言。
三者的领域不同,更不存在替换的可能性,比如:让C去实现个web项目看看,tm需求迭代就直接让你加班加到暗无天日也改不完;用java写个大型3D游戏的引擎,可能游戏里打几枪现实里孩子都俩岁了;用汇编写个复杂的图形界面,估计移动一下数据的地址都够写1年了,还贼容易error,找半天bug眼睛给你看瞎。

还有个题外话:为什么感觉ios比android更快?
因为安卓应用与安卓底层系统之间有一层虚拟机,安卓应用是java开发的,需要java的JRE(安卓系统基于linux内核开发,安卓应用基于java语言开发),而ios则是基于旧Objective-C或新Swift,类似于C语言。
现在两者区别最重要的其实不是OS的问题,而是安卓各大厂商对安卓系统的进一步优化不一样,而且应用的开发也参差不齐,导致适配不良;而反观ios,有足够良好的硬件,有严格的开发标准,有统一的环境,开发者只需要关注应用的实现而不需要考虑应用的适配问题,这提高了开发者的效率,也因为过硬的标准使得应用与系统良好适配,导致消费者更愿意在ios消费,这也反向保证了ios系统开发者的价值。苹果的软件相对质量较高,这归功于苹果的商业模式以及用户养成的良好的付费习惯,开发者们更愿意花时间优化用户体验。并且苹果的审核机制也功不可没。
没有谁优谁劣,闭源有闭源的优势,开源有开源的自由,优胜劣汰,既然俩都能走到今天,说明经受住了时代的考验。

以上仅代表个人观点,内容涉及到的概念复制参考自:
www.zhihu.com

www.zhihu.com

wenwen.sogou.com

www.zhihu.com

www.zhihu.com

www.zhihu.com

www.zhihu.com
mp.weixin.qq.com

wenwen.sogou.com

www.zhihu.com

mp.weixin.qq.com
00

来自圈子

圈子图片

JitHub程序员

389207人已经加入