当前位置: 首页 > 科技观察

Java对我来说足够了吗?

时间:2023-03-18 21:15:03 科技观察

Java对我来说够用吗?面向对象很好组织程序,但是我用C,我用C++。函数式编程很好。关我什么事?动态语言的特性很好,可惜我用的是Java。。。如果你这么想,那说明你被自己抓了,看家能力有限,这种思维方式会让你即使你也束手无策学到更多好东西。编程语言之间的区别不是那么明显。只有多学几种语言,才能打破语言限制,让设计更好的落地。大家可以根据项目的特点选择合适的语言,也可以借鉴其他语言的一些优秀的地方。AndrewHunt和DavidThomas在《程序员修炼之道》(ThePragmaticProgrammer)中给程序员一个重要的建议:每年至少学习一门新语言。语言那么多,难道我要一门一门学吗?你学语言是为了什么?编程语言本身也是一个软件,它还包括模型、接口和实现。学习一门编程语言主要是学习该编程语言提供的编程模型,如:不同的程序组织方式、不同的控制结构等。不同的编程模型会给你带来不同的思维方式。1编程语言发展简史所有的编程语言都是图灵完备的:语言规定的数据操作规则可以实现图灵机的所有功能。图灵机是所有编程语言的底层模型。编程语言都是在这个基础上发展起来的,包括用0和1编码的计算机。计算机可以识别0和1,但是用0和1写代码太麻烦了。所以在计算机诞生之初,汇编语言就是为了把那些0101运算符变成更容易记住的ADD、MOV等指令而产生的。后来发现用汇编写程序也是很痛苦的。懂计算机才能写好汇编。即使精通一台电脑的汇编语言,换到另一台电脑也得从头学起。高级编程语言介绍。Fortran,第一种高级编程语言,奠定了编程语言发展的基础。数据开始具有类型(类型是一种解释内存中数据的方式)。人们逐渐意识到高级编程语言可以提高开发效率。早期编程语言探索的集大成者是C,它为计算机提供了最合适的抽象,屏蔽了计算机硬件的诸多细节。随着高级程序设计语言的发展,门槛逐渐降低,可以开发的程序规模不断扩大。搭上C语言的便车,将面向对象的编程风格带入了主流,即C++。各种高级编程语言屏蔽了很多细节,但是内存管理一直没有很好的解决。长期以来,人们一直在尝试各种屏蔽内存管理的方法,但由于早期计算机硬件的性能有限,没有一种成为业界的主流。后来计算机硬件能力有了很大的提高,让一堆旧论文中的技术有了新的生命力。这一阶段的赢家,Java,一方面支持面向对象编程;还有一种垃圾回收机制——内存管理的一种方式。Java的道路也是坎坷的,因为它早期在个人电脑上的尝试并不算成功。后来选择了企业级发展的轨道,才有机会展现自己的优势。因为企业级服务器的性能优于个人电脑,对Java的容忍度更高,所以有机会不断优化自己。当硬件不再是编程语言发展的障碍时,编程语言该如何发展?从以往的历史不难看出,编程语言的发展是一个“逐渐远离计算机硬件,接近所要解决的问题”的过程。因此,编程语言下一步的发展方向就是探索如何更好地解决问题。以上只是编程语言发展的主流路径。还有一种不太主流的路径一直在发展,就是函数式编程的编程语言,这方面的代表就是LISP。在这条路上,一开始很多人都是抱着学院派的风格,关心解决方案是否优雅,也就是如何解决问题,如何一层层抽象。也探索更多的可能性,垃圾回收机制就出自这里。但也受限于当时硬件的性能,这条路上的探索很长一段时间都只是小众游戏。当硬件的性能不再是障碍,如何解决问题变得越来越重要时,函数式编程终于与编程语言发展的主流接轨。推动函数式编程的还有一个硬件因素引起了广泛关注:多核。多核的出现本身就是IT行业应对CPU发展瓶颈期的一种解决方案,但它打破了很多程序员只习惯于使用一个CPU来编写程序的传统方式。为了发挥多核的优势,人们探索了各种解决方案,从那时起,诸如今天看到的各种并发模型、异步模型等方案得到了蓬勃发展。函数式编程在这方面的探索就是用自己的声明式表达来屏蔽硬件差异。正是大名鼎鼎的MapReduce让人们注意到了函数式编程的价值。函数式编程的兴起导致了函数式编程社区中那些探索的兴起,比如声明式编程、DSL、元编程等等。后来出现的一些编程语言开始将面向对象和函数式编程结合起来,比如Scala。而像Java和C++这样的“老战士”也在逐渐为该语言添加对函数式编程的支持。与这些“正规军”相比,还有一股力量从边缘逐渐走上舞台。这就是动态语言,代表语言有Perl、Python、Ruby、PHP等。过去,人们更喜欢用“脚本语言”来称呼这种编程语言。这个名字表明它似乎只是为了解决一些特定的问题。所以,在人们心目中,他们显得不那么正式。但它们的简洁轻便却有效降低了入门门槛,赢得了一大批拥趸。语言的发展是一个相互学习和借鉴的过程。以前动态语言的弱点是不适合比较大型的项目。近年来,随着动态语言用户的增多,配套工具也逐渐增多,动态语言项目规模逐渐增大。主频道的编程语言也借鉴了动态语言,尽量简化编码难度。比如Java和C++都开始支持类型推断(TypeInference),目的是为了让程序员不用敲几个字符。把一门编程语言看成一个软件,它的发展过程就是一个逐渐加入新模型的过程,它发展的结果就是今天的开发门槛越来越低,可开发的程序规模越来越大越来越大。2语法是语法糖。C语言为汇编指令提供了直接封装。C++首先提供了面向对象,后来提供了泛型编程。Java免除了开发者的内存管理,后面引入的Annotation使得声明式编程成为可能。Ruby提供动态类型,以及RubyonRails引入的DSL风格。Scala和Clojure提供函数式编程。Rust提供了一种新的内存管理方式,Libra提供的Move语言将其进一步抽象为资源的概念。既然学习一门新的编程语言就是学习一种新的编程模型,那么也可以说不提供新的编程模型的语言是不值得刻意去学习的。如果你已经学习过一两种编程语言,学习一门新语言并不难,因为每种语言提供的新模型都是有限的,基本元素相似,只是使用的关键字不同。因此,学习一门新的语言只是在做增量学习,思考的负担并没有那么重。一旦你对编程语言模型有了新的认识,你就能明白一件事:所有语法都是语法糖。句法糖是英国计算机科学家彼得兰丁创造的一个术语,指的是程序员为了方便而使用的语法,对语言的功能没有影响。知道了语法糖的原理,如果想更好地理解编程语言,一个好的方法就是打开语法糖,了解语法是如何实现的:类型是一种解释记忆的方式。class/struct是一种将相关数据存储在一起的数据组织方式。JVM上的新语言如Groovy、Scala、Kotlin和Clojure提供了一种不同于Java的封装JVM的方式。......3小结语言的发展不是一蹴而就的,而是一个循序渐进的发展过程。一些不为人知的地方总会出现一些新的尝试,语言之间也是互相借鉴。如果你每年都能学习一门新语言,首先,你可以了解不同的编程模型。当你积累足够多的时候,学习这门语言就是在跟踪编程语言的最新发展。当你手中的“武器”足够多的时候,你就可以打开思路,用不同的方法解决问题,甚至可以把其他语言的好东西借用到你使用的语言中。学习不同的编程语言可以帮助我们更好地设计,也可以让我们从不同的语言中学习优秀的方面。我们已经简要了解了编程语言的发展历史。从最初的机器模型封装,到如今开发门槛更低,编程语言的进化从未停止过。我们还看到各种编程风格在最初独立开发后开始融合。了解编程语言的发展可以帮助我们明白一件事:所有语法都是语法糖。为了简化代码的编写,通常会不断地将新语法添加到现有结构中。《程序员修炼之道》鼓励程序员每年至少学习一门新的语言,主要是让我们学习新的编程模型,不提供新的编程模型的语言不值得刻意学习。但是,这需要您对编程语言有更深入的了解。本文转载自微信?「JavaEdge」,作者「JavaEdge」,可通过以下二维码关注。转载本文请联系“JavaEdge”公众号。