质因数分解算法示例:不同编程语言之间有什么区别?如何选择起始语言?
不同的编程语言有各种差异,但本质上都是一样的。它们都有流程控制语句和循环、加减乘除运算等,并且都采用批处理的方式来完成重复性的工作。好的语言应该是人性化的、易于使用的、不易出错的、编写的代码应该易于维护和扩展的、并且运行得足够快。这个世界上没有完美的语言,不同的语言在不同的环境下有不同的优势。我们通过一个算法例子来了解不同语言之间的差异。 ![]()
算法示例:素因子分解算法
我们通过这个算法示例来理解语言之间的差异。以下是部分实现代码。更详细的代码请参见源文件。
首先什么是素因数分解算法?也就是说,任何合数都可以分解为几个素数相乘。
例如:20 = 2 * 2 * 5; 45 = 3 * 3 * 5; 210 = 2 * 3 * 5 * 7
根据数学运算:垂直表达式或左右分解,找到最小的可整除数以素数为除数,不断除整数得到新的数,最后将所有除数连接起来最终的数字。 ![]()
素因数分解图
代码实现思路:
- 首先设置一个除数,从最小的素数开始,即2;
- 被当前除数整除时,除数为因数,原除数为数,设置为整除结果;
- 继续将新结果除以除数,不断循环;
- 无法整除时,增加新的除数,继续步骤2;
- 直到除数的平方大于要分解的值,结束循环。最后得到所有除数和剩余数都大于1的分解结果。
不同编程语言的比较:
1。 C语言
C语言是一种面向过程的静态编译语言,是所有高级语言的鼻祖。可以说,当今流行的语言几乎都有C语言的影子。 C语言在底层开发中有着不可替代的作用,包括操作系统、驱动、中间件、图形库、数据库、网络库等的开发。
C语言的寿命也是最长的。它已经流行了近50年,仍然处于开发排名前3位。 C语言足够简洁、清晰。它没有那么多概念或 API,而且性能非常出色。它是所有程序员都应该掌握的语言,可以作为计算机基础来学习。
C语言代码实现如下。因式分解可以返回分解的矩阵。从代码中可以看出,必须首先申请一个内存位置长度为len的动态数组结果。该数组用于存储分解数。每分解一个数字,就会将其添加到矩阵中,同时矩阵下标也会递增。最后,当分解完成时,返回分解数数组。 ![]()
代码逻辑:
- 建立双循环,从最小素数2开始不断增量遍历。
- 的外层循环是是否继续分解的条件。当i的幂小于或等于要分解的数时,表示仍然可以分解。 i继续增加,直到i的平方大于num。
- 的内循环继续使用num来除以除数,看是否能被整除。如果能整除,则将得到的数作为新的数继续分解,并将之前的除数i添加到分解结果中。当i不能被分成num时,表示当前i跳出内循环。
- 循环终止时,如果最终分解数小于i的平方,则无法继续分解。如果i大于1,则剩下的num就是最后的分解数。
2。 C++语言
C++语言是C语言的超集。它扩展并改进了C语言。增加了类的概念,引入了运算符重载、引用、虚函数等。没有对象和类,C++ 就什么也做不了。其核心思想是多态、继承和封装。 C++的语法和C几乎一样,基本上C代码都可以在C++下运行。然而,C++比C语言更复杂、更难掌握。相对而言,C更清晰,更容易理解。
由于C语言相对简单和程序化,很难开发大型复杂系统或大型软件接口,因此创建了C++。事实上,我不认为C++比C更好或更强大。大型系统可以通过组织自己的代码来获得良好的结构。还有很多独立的C语言UI库。
C++也很重要。它几乎是许多中大型系统、游戏、桌面软件、服务器、网络通信等的首选语言,在开发排名上仍处于前5名。
这里的C++代码实现符合C语言。因为没有使用面向对象,所以没有区别。其他差异可以从 GitHub 存储库中看到。 ![]()
3。 Java语言
Java语言发明于20世纪90年代,由Sun推出,后来被Oracle收购。 Java是一种面向对象的编程语言,吸收了C++的各种优点,但留下了C++中难以理解的多重继承、指针等概念。同时,它提供了自动收集垃圾的能力,让程序员不再需要手动释放内存。
Java的语法与C基本相同,只是增加了类和集合相关的概念。Java的主要领域是后端开发、中间件开发、Android开发、大数据开发等,目前Java在编程排名中排名第一。它非常流行,是入门级学习的良好语言。但由于过于严格和死板的设计,显得有些臃肿,已经有衰落的迹象。后起之秀 Go、Kotlin、NodeJS 和 Dart 都在蚕食 Java 的领地。
我相信Java作为开发排名领先者的地位在不久的将来将面临重大挑战。与Java非常相似的是它的老对手C#。这种语言在Windows环境下是绝对的领先者,但遗憾的是,在Linux、Mac、iOS、Android等系统下,几乎没有人关心C#。 Java的地位岌岌可危,但C#发展良好,前景良好,这里不再赘述。
这里Java版本使用ArrayList,它是一个变长列表,比C语言中使用数组更方便。代码基本是一样的。如果也使用int数组,代码几乎是一样的。 Java中的一切都是基于类的。所有内容必须放置在类中。方法(函数)和属性(变量)不能独立于外部。 ![]()
4。 JavaScript语言
JavaScript是Netscape在20世纪90年代偶然发明的一门语言,最初是为了解决浏览器中的交互问题。最初的名字是LiveScript,但当时Java刚刚推出。因为它在语法上也参考了Java,所以这个名字就借用了Java,改成了JavaScript。但实际上语言本质更接近Self和Scheme。 JavaScript 是一种基于对象的函数式动态编程语言。它非常灵活,语法也越来越完善,而且看起来很简单,但真正理解原理却并不容易。
中国有句俗话叫“箭不入影”,这句话用在 JavaScript 上再合适不过了。 JavaScript博采众长,吸收了Self、Scheme、Java、C等语言的优点。它现已发展成为世界上使用最广泛的编程语言,并且在开发排名中稳步上升。
JavaScript 是一种弱类型语言。数组类型不限,无需指定长度。它非常简单且易于使用。整个代码的编写方式和Java很相似,但是简单很多。
除了专属浏览器编程之外,JavaScript还被应用于后端开发、移动开发、桌面开发、嵌入式开发等领域。可以说,未来不可限量。甚至有人说,所有能用JavaScript实现的应用最终都会用JavaScript实现。 ![]()
5。 TypeScript 语言
Typescript 是微软于 2012 年推出的基于 JavaScript 的变体或超集语言。它与 JavaScript 完全兼容,最终会被编译为 JS 执行。它主要增加了强类型并改进了面向对象,集成了接口和类型等概念。写法和JS几乎一样,有点类似C++对C的感觉。
TypeScript也发展得很好。在使用大型项目时,强类型和面向对象有一些优势。随着前端项目越来越大,TypeScript 变得越来越流行。只不过TypeScript是微软开发的,JS来自国际标准化组织ECMA。
而且JavaScript在不断的进化和变化,TS的语法糖也在不断的添加。有可能将来有一天JS会和TS非常接近,甚至完全一致。届时,TS可能面临退出节目舞台。但JS不一定会这样进化,因为它违背了灵活动态的理念。
因此,TypeScript 不适合作为入门语言。熟悉 JavaScript 之后再学习 TypeScript 会更好。 ![]()
6。 Python语言
Python是一种解释性编程语言,支持面向对象、面向过程以及函数式编程。从语法风格上来说也属于C语言家族。但它与其他语言的不同之处在于,它使用缩进来表达包含条件,而不是花括号。喜欢这种风格的人爱得死去活来,不喜欢这种风格的人厌恶到骨子里。
从语言特性上来说,Python可以说是最接近JS的,既可以面向对象,也可以函数式。它与Java不同的是,没有变量类型声明关键字,方法也可以独立于类而存在。 Python总体上是一种强类型语言(但由于不需要指定变量类型并且有自动类型转换,所以严格来说并不是强类型)。
当我们看Python代码时,可以说是最简单、最清晰、最容易理解的。和JavaScript一样,Python也是一种动态脚本语言,列表(数组)也是动态变量的,列表操作非常容易使用。 Python非常适合初学者学习,因为它简单并且几乎涵盖了编程中的所有概念。
Python 于 20 世纪 90 年代推出。它早期被用来增强 shell 脚本,后来演变为一种 Web 后端语言。一直都是不冷不热的。后来,随着大数据和人工智能的流行,Python在这两个领域大放异彩。未来前景非常好,是最推荐学习的入门语言。
让我们看看Python是否代码量最少(类似于JS)并且它是不是最容易理解的? ![]()
7。 Go语言
Go语言是一种静态编译的强类型语言。它是Google在2009年推出的,初衷是取代C语言进行系统开发,但目前看来更多的是替代Java进行服务器端开发。语法风格非常接近C,并且在C语言的基础上增加了内存安全和自动垃圾收集功能。
Go 语言不依赖于类。语言非常简洁。语法风格是C和JS的混合。变量声明为var。矩阵空间必须提前申请,不能有括号和分号。从这段代码来看,和C语言没有太大区别。它本质上是C的变种。
Go语言目前在微服务和云原生领域非常流行,在高并发、高可用的Web应用中发挥着良好的作用。这部分倾向于取代Java。 Go 语言在分布式系统和网络编程中运行良好。 Kubernetes是目前最流行的容器编排系统,是用Go语言编写的。未来,更多基于云的应用将逐渐采用Go语言。
Go 作为后起之秀,近年来开始在服务器端大放异彩。因此,如果你是新一代开发者,建议跳过C++和Java,直接学习Go。看看 Go 的编码风格。你觉得舒服吗?我感觉比Java好。 ![]()
8。 Kotlin 语言
Kotlin 是 JetBrains 于 2011 年推出的编程语言。这是 JVM 的新语言。 JetBrains 是开发 IDEA 编辑器的公司。
Kotlin 代码最终会编译成 Java 字节码类来执行,也可以编译成 JavaScript 以便于在非 JVM 设备上执行。此外,Kotlin还可以编译为二进制代码并直接在操作系统上运行。
Kotlin也可以认为是一种Java语法糖,它与Java语法完全兼容。 Kotlin 相当于 Java 的简化版本。是的,Java太臃肿了。 Kotlin 提供了变量类型、高阶函数、函数独立性等,使得编程风格更接近 JS 和 Python。
Kotlin 中没有原始类型,一切都是对象。一旦为参数分配了值,就无法更改。如果要重新赋值,就必须将其声明为 var,而在 Kotlin 的方法中,参数被隐式声明为最终值,并且参数无法更改。因此,这里将number赋给变量num。
Kotlin 语言设计确实非常出色。它现已正式成为Android官方支持的开发语言。所以如果你想进行Android开发,直接学习Kotlin就可以了。无需学习Java。看看下面的代码中是否有Java和JS的痕迹? ![]()
9。 Dart 语言
Dart 是一种强类型语言,支持即时编译和预编译。它是 Google 在 2011 年推出的。主要针对 JavaScript,我们改进了 JavaScript 中一些不适合的特性,比如弱类型、不完全面向对象等。Dart 的理念是借鉴了数据类型、内存管理机制和对象-借鉴Java语言的面向特征,同时借鉴Scheme语言将函数提升为“一等公民”(first-class),然后参考Self语言使用基于原型(prototype)的继承机制。它看起来几乎是 JavaScript 的副本或 JavaScript 的改进实现。与 TypeScript 不同,它与 JavaScript 不兼容。
Dart 语法与 JS 几乎相同,只不过必须预编译并且有严格的数据类型。但在实际使用中,它与JS非常接近,熟悉JS或TS的开发者上手成本几乎为零。
Dart目前主要在Flutter框架下用于开发Android系统的应用程序。目前来看,未来存在很大的不确定性。因此,Dart 不适合作为入门语言,但如果您完全掌握 JavaScript 或 Java,则应该学习它。
注意,这里的舍入和除法方法与其他语言略有不同。如果不添加 ~,则会得到小数。 ![]()
10。 Swift 语言
Swift 是 Apple 于 2014 年推出的一种语言,用于取代 Objective-C,主要用于 iOS 开发。 Swift 是一种静态编译的强类型语言,但它的语法风格有点类似于 JS。它是用 var 声明的,function 是第一个类型,并且没有尾随分号。函数缩写为func。看起来有点像Go语言。可以说,Swift 既有脚本语言的表现力和乐趣,也有系统编程语言的严肃性和高性能。取代 Objective-C 指日可待。但Swift似乎领域有限,仅限于Mac和iOS客户端开发。
从语言趋势来看,C+Java+JS的结合是大势所趋。尤其是类JS和类Python的语法,几乎所有最新的高级语言都吸收了JS或Python简洁优雅的特点,当然也抛弃了JS弱类型的特点。从 Swift 中查看数组声明也非常方便。无需申请空间或指定长度,可以随意添加和删除。看看下面的代码。和JS几乎一致吗?
Swift是所有Apple和iOS开发必学的语言,但不适合初学者学习编程。因此,最好还是学习一些比较流行、流行的语言来开始编程。 ![]()
11。 Objective-C语言
Objective-C(简称OC)是Apple原创的开发语言,源自C语言,就像Mac下Windows中的VC++一样。但说实话OC的语法看上去不太友好。从变量声明到对象调用,似乎和其他语言不太一致,感觉很难用。虽然语法风格有点难,但大体和C类似,所以本质上没有太大区别。
OC的类声明是Interface,然后通过实现来实现该类。 OC方法如果写在类内部,就是方法,如果写在外部,就是函数。数组必须分配空间,但不需要指定长度。数组操作和对象引用的写法与其他语言有很大不同,但本质上是一样的,只是语言风格不同,习惯一下就好。
看看OC的这个类和方法。与其他语言相比,总体结构一致,但语言风格更为广泛。因此,OC不适合作为初始学习语言。你甚至可以直接学习 Swift,无需任何专门的学习。 ![]()
12。 Rust 语言
Rust 最初由 Mozilla 研究院提出。经过多次改进,于 2015 年正式发布。Rust 的语法与 C 和 C++ 非常相似,其目标是取代 C 和 C++。
Rust 的目标是高安全性、高性能和高并发。它放弃了影响性能的垃圾收集器,通过变量所有权自动释放内存,并提供对多线程的支持。 Rust 是内存安全的。
虽然 Rust 没有专门的类来声明对象,但它确实支持面向对象。 Rust 可以通过结构体定义类,然后通过 impl 实现它们。尽管Rust中没有扩展,但是可以通过属性来实现多态性。
Rust 在语法上足够精致,风格更像是一种简洁的高级语言。元组(Tuple)、动态数组(Vector)和切片(Slice)模式都非常方便。不像C/C++那样操作数据繁琐,同时又保持了底层语言优越的性能。可见Rust是由能工巧匠精心打造的。所以未来Rust很有可能取代C、C++、Go和Java。
所以Rust是一门非常值得学习的语言,但是不太适合初学者入门。当你掌握了Python、Java或者JavaScript时,学习Rust是非常有必要的。 ![]()
总结
上面分析了目前流行的几种语言的特点,包括C、C++、Java、JS和Python等流行语言。它还研究了 Swift、Go、Kotlin、Dart 和 Rust 等新语言。
上述语言在未来很长一段时间内都会有很好的发展。目前,它们不会被其他语言取代(我没有提到已经被取代或将被取代的语言),其中包括 C/C++、Java、Python、JavaScript/TypeScript、Go、Kotlin 和斯威夫特都有良好的就业前景。如果你正在找工作,这些语言都很好。
想要学习编程,首先要了解数据结构和算法。你可以从C语言开始,然后你要选择一门编程语言,从浅到深系统地学习它。那么Python、Java或JavaScript、Go都是不错的选择。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网