❶ Rust语言编程实例100题-016
题目: 给定两个正整数m=128和n=60,求其最大公约数和最小公倍数。
程序分析:
(1)最小公倍数=输入的两个数之积除于它们的最大公约数,关键是求出最大公约数;
(2)求最大公约数用辗转相除法(又名欧几里德算法)
1)证明:设c是a和b的最大公约数,记为c=gcd(a,b),a>=b,
令r=a mod b
设a=kc,b=jc,则k,j互素,否则c不是最大公约数
据上,r=a-mb=kc-mjc=(k-mj)c
可知r也是c的倍数,且k-mj与j互素,否则与前述k,j互素矛盾,
由此可知,b与r的最大公约数也是c,即gcd(a,b)=gcd(b,a mod b),得证。
2)算法描述:
第一步:a ÷ b,令r为所得余数(0≤r 第二步:互换:置 a←b,b←r,并返回第一步。
输出格式: 第一行输出最大公约数,第二行输出最小公倍数。
知识点 :循环
程序执行结果:
❷ rust可以开发分布式系统吗
rust是可以开发分布式系统的。
引子
构建一个分布式系统 并不是一件容易的事情,我们需要考虑很多的问题,首先就是我们的系统到底需要提供什么样的功能,譬如:
一致性:我们是否需要保证整个系统的线性一致性,还是能容忍短时间的数据不一致,只支持最终一致性。
稳定性:我们能否保证系统 7 x 24 小时稳定运行。系统的可用性是 4 个 9,还有 5 个 9?如果出现了机器损坏等灾难情况,系统能否做的自动恢复。
扩展性:当数据持续增多,能否通过添加机器就自动做到数据再次平衡,并且不影响外部服务。
分布式事务:是否需要提供分布式事务支持,事务隔离等级需要支持到什么程度。
上面的问题在系统设计之初,就需要考虑好,作为整个系统的设计目标。为了实现这些特性,我们就需要考虑到底采用哪一种实现方案,取舍各个方面的利弊等。
后面,我将以我们开发的分布式 Key-Value TiKV 作为实际例子,来说明下我们是如何取舍并实现的。
TiKV
TiKV 是一个分布式 Key-Value store,它使用 Rust 开发,采用 Raft 一致性协议保证数据的强一致性,以及稳定性,同时通过 Raft 的 Configuration Change 机制实现了系统的可扩展性。
TiKV 提供了基本的 KV API 支持,也就是通常的 Get,Set,Delete,Scan 这样的 API。TiKV 也提供了支持 ACID 事务的 Transaction API,我们可以使用 Begin 开启一个事务,在事务里面对 Key 进行操作,最后再用 Commit 提交一个事务,TiKV 支持 SI 以及 SSI 事务隔离级别,用来满足用户的不同业务场景。
Rust
在规划好 TiKV 的特性之后,我们就要开始进行 TiKV 的开发。这时候,我们面临的第一个问题就是采用什么样的语言进行开发。当时,摆在我们眼前的有几个选择:
Go,Go 是我们团队最擅长的一门语言,而且 Go 提供的 goroutine,channel 这些机制,天生的适合大规模分布式系统的开发,但灵活方便的同时也有一些甜蜜的负担,首先就是 GC,虽然现在 Go 的 GC 越来越完善,但总归会有短暂的卡顿,另外 goroutine 的调度也会有切换开销,这些都可能会造成请求的延迟增高。
Java,现在世面上面有太多基于 Java 做的分布式系统了,但 Java 一样有 GC 等开销问题,同时我们团队在 Java 上面没有任何开发经验,所以没有采用。
C++,C++ 可以认为是开发高性能系统的代名词,但我们团队没有特别多的同学能熟练掌握 C++,所以开发大型 C++ 项目并不是一件非常容易的事情。虽然使用现代 C++ 的编程方式能大量减少 data race,dangling pointer 等风险,我们仍然可能犯错。
当我们排除了上面几种主流语言之后,我们发现,为了开发 TiKV,我们需要这门语言具有如下特性:
静态语言,这样才能最大限度的保证运行性能。
无 GC,完全手动控制内存。
Memory safe,尽量避免 dangling pointer,memory leak 等问题。
Thread safe,不会遇到 data race 等问题。
包管理,我们可以非常方便的使用第三方库。
高效的 C 绑定,因为我们还可能使用一些 C library,所以跟 C 交互不能有开销。
综上,我们决定使用 Rust,Rust 是一门系统编程语言,它提供了我们上面想要的语言特性,但选择 Rust 对我们来说也是很有风险的,主要有两点:
我们团队没有任何 Rust 开发经验,全部都需要花时间学习 Rust,而偏偏 Rust 有一个非常陡峭的学习曲线。
基础网络库的缺失,虽然那个时候 Rust 已经出了 1.0,但我们发现很多基础库都没有,譬如在网络库上面只有 mio,没有好用的 RPC 框架,HTTP 也不成熟。
但我们还是决定使用 Rust,对于第一点,我们团队花了将近一个月的时间来学习 Rust,跟 Rust 编译器作斗争,而对于第二点,我们就完全开始自己写。
幸运的,当我们越过 Rust 那段阵痛期之后,发现用 Rust 开发 TiKV 异常的高效,这也就是为啥我们能在短时间开发出 TiKV 并在生产环境中上线的原因。
一致性协议
对于分布式系统来说,CAP 是一个不得不考虑的问题,因为 P 也就是 Partition Tolerance 是一定存在的,所以我们就要考虑到底是选择 C - Consistency 还是 A - Availability。
我们在设计 TiKV 的时候就决定 - 完全保证数据安全性,所以自然就会选择 C,但其实我们并没有完全放弃 A,因为多数时候,毕竟断网,机器停电不会特别频繁,我们只需要保证 HA - High Availability,也就是 4 个 9 或者 5 个 9 的可用性就可以了。
既然选择了 C,我们下一个就考虑的是选用哪一种分布式一致性算法,现在流行的无非就是 Paxos 或者 Raft,而 Raft 因为简单,容易理解,以及有很多现成的开源库可以参考,自然就成了我们的首要选择。
在 Raft 的实现上,我们直接参考的 etcd 的 Raft。etcd 已经被大量的公司在生产环境中使用,所以它的 Raft 库质量是很有保障的。虽然 etcd 是用 Go 实现的,但它的 Raft library 是类似 C 的实现,所以非常便于我们用 Rust 直接翻译。在翻译的过程中,我们也给 etcd 的 Raft fix 了一些 bug,添加了一些功能,让其变得更加健壮和易用。
现在 Raft 的代码仍然在 TiKV 工程里面,但我们很快会将独立出去,变成独立的 library,这样大家就能在自己的 Rust 项目中使用 Raft 了。
使用 Raft 不光能保证数据的一致性,也可以借助 Raft 的 Configuration Change 机制实现系统的水平扩展,这个我们会在后面的文章中详细的说明。
存储引擎
选择了分布式一致性协议,下一个就要考虑数据存储的问题了。在 TiKV 里面,我们会存储 Raft log,然后也会将 Raft log 里面实际的客户请求应用到状态机里面。
首先来看状态机,因为它会存放用户的实际数据,而这些数据完全可能是随机的 key - value,为了高效的处理随机的数据插入,自然我们就考虑使用现在通用的 LSM Tree 模型。而在这种模型下,RocksDB 可以认为是现阶段最优的一个选择。
RocksDB 是 Facebook 团队在 LevelDB 的基础上面做的高性能 Key-Value Storage,它提供了很多配置选项,能让大家根据不同的硬件环境去调优。这里有一个梗,说的是因为 RocksDB 配置太多,以至于连 RocksDB team 的同学都不清楚所有配置的意义。
关于我们在 TiKV 中如何使用,优化 RocksDB,以及给 RocksDB 添加功能,fix bug 这些,我们会在后面文章中详细说明。
而对于 Raft Log,因为任意 Log 的 index 是完全单调递增的,譬如 Log 1,那么下一个 Log 一定是 Log 2,所以 Log 的插入可以认为是顺序插入。这种的,最通常的做法就是自己写一个 Segment File,但现在我们仍然使用的是 RocksDB,因为 RocksDB 对于顺序写入也有非常高的性能,也能满足我们的需求。但我们不排除后面使用自己的引擎。
因为 RocksDB 提供了 C API,所以可以直接在 Rust 里面使用,大家也可以在自己的 Rust 项目里面通过 rust-rocksdb 这个库来使用 RocksDB。
分布式事务
要支持分布式事务,首先要解决的就是分布式系统时间的问题,也就是我们用什么来标识不同事务的顺序。通常有几种做法:
TrueTime,TrueTime 是 Google Spanner 使用的方式,不过它需要硬件 GPS + 原子钟支持,而且 Spanner 并没有在论文里面详细说明硬件环境是如何搭建的,外面要自己实现难度比较大。
HLC,HLC 是一种混合逻辑时钟,它使用 Physical Time 和 Logical Clock 来确定事件的先后顺序,HLC 已经在一些应用中使用,但 HLC 依赖 NTP,如果 NTP 精度误差比较大,很可能会影响 commit wait time。
TSO,TSO 是一个全局授时器,它直接使用一个单点服务来分配时间。TSO 的方式很简单,但会有单点故障问题,单点也可能会有性能问题。
TiKV 采用了 TSO 的方式进行全局授时,主要是为了简单。至于单点故障问题,我们通过 Raft 做到了自动 fallover 处理。而对于单点性能问题,TiKV 主要针对的是 PB 以及 PB 以下级别的中小规模集群,所以在性能上面只要能保证每秒百万级别的时间分配就可以了,而网络延迟上面,TiKV 并没有全球跨 IDC 的需求,在单 IDC 或者同城 IDC 情况下,网络速度都很快,即使是异地 IDC,也因为有专线不会有太大的延迟。
解决了时间问题,下一个问题就是我们采用何种的分布式事务算法,最通常的就是使用 2 PC,但通常的 2 PC 算法在一些极端情况下面会有问题,所以业界要不通过 Paxos,要不就是使用 3 PC 等算法。在这里,TiKV 参考 Percolator,使用了另一种增强版的 2 PC 算法。
这里先简单介绍下 Percolator 的分布式事务算法,Percolator 使用了乐观锁,也就是会先缓存事务要修改的数据,然后在 Commit 提交的时候,对要更改的数据进行加锁处理,然后再更新。采用乐观锁的好处在于对于很多场景能提高整个系统的并发处理能力,但在冲突严重的情况下反而没有悲观锁高效。
对于要修改的一行数据,Percolator 会有三个字段与之对应,Lock,Write 和 Data:
Lock,就是要修改数据的实际 lock,在一个 Percolator 事务里面,有一个 primary key,还有其它 secondary keys, 只有 primary key 先加锁成功,我们才会再去尝试加锁后续的 secondary keys。
Write,保存的是数据实际提交写入的 commit timestamp,当一个事务提交成功之后,我们就会将对应的修改行的 commit timestamp 写入到 Write 上面。
Data,保存实际行的数据。
当事务开始的时候,我们会首先得到一个 start timestamp,然后再去获取要修改行的数据,在 Get 的时候,如果这行数据上面已经有 Lock 了,那么就可能终止当前事务,或者尝试清理 Lock。
当我们要提交事务的时候,先得到 commit timestamp,会有两个阶段:
Prewrite:先尝试给 primary key 加锁,然后尝试给 second keys 加锁。如果对应 key 上面已经有 Lock,或者在 start timestamp 之后,Write 上面已经有新的写入,Prewrite 就会失败,我们就会终止这次事务。在加锁的时候,我们也会顺带将数据写入到 Data 上面。
Commit:当所有涉及的数据都加锁成功之后,我们就可以提交 primay key,这时候会先判断之前加的 Lock 是否还在,如果还在,则删掉 Lock,将 commit timestamp 写入到 Write。当 primary key 提交成功之后,我们就可以异步提交 second keys,我们不用在乎 primary keys 是否能提交成功,即使失败了,也有机制能保证数据被正常提交。
❸ 为什么python内置的sort比自己写的快速排序快100倍
主要原因,内置函数用C写的。在Python语言内无论如何造不出内置函数的轮子。这也是通常C跟C++语言用户更喜欢造基础算法的轮了的原因。因为C/C++用户真有条件写出匹敌标准库的算法,但很多高级语言不行,不是程序员技术差,是客观条件就根本做不到。
你比如说Java语言没人造字符串的轮子,C++光一个字符串类就有无数多的实现。是因为C+用户更喜欢写字符串类吗?显然不是,一方面是因为Java语言内没法造出匹敌Java内置标准库算法的轮子,而C++真的可以,另外一个比较惨的原因是C++标准库的字符串功能太弱了,大多数高级语言的字符串类功能都比C+标准库字符串类功能更强。
Cpp内置的排序是快排和堆排的结合,最坏时间复杂度为nlogn,而快排最坏是n2。至于python内部的排序,我认为是一个道理,不会简简单单是一个快排,举个简单例子,当你数据已经是有序的时候,再传入快排肯定就不合适。那你设置排序函数的时候,是不是预先将他打乱,再进行快排会更好呢。当然具体不会这么简单,只是我认为官方给的接口都是很精妙的,很值得学习。
一方面Python中sort函数是用C语言写的,C++内部的sort是由快排,直接插入和堆排序混合的,当数据量比较大的时候先用的快排,当数据量小的时候用直接插入,因为当数据量变小时,快排中的每个部分基本有序,接近直接插入的最好情况的时间复杂度O(n),就比快排要好一点了。
另外一方面这个的底层实现就是归并排序。,只是使用了Python无法编写的底层实现,从而避免了Python本身附加的大量开销,速度比我们自己写的归并排序要快很多,所以说我们一般排序都尽量使用sorted和sort。
❹ rust上能跑sklearn吗
rust上能跑sklearn。可以使用Rust和Python分别实现了K-Means算法。rust和sklearn都是学习机里的学习编程。sklearn是针对Python编程语言的免费软件机器学习库。sklearn又称Scikit-learn,是机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,包括回归、降维、分类、聚类等方法。是一项简单高效的数据挖掘和数据分析工具。
❺ 10个可以锻炼你编程能力的游戏!通关既可达巅峰
一旦你知道自己要做什么,编程就很有趣,但达到这一点,可能是一次痛苦的经历。
这就是为什么在上课、听讲座、看教程之间,你应该留出时间玩一玩编程 游戏 。它们不仅是有趣的放松手段,还能让你亲身实践,这样你会学得更快,记住更多知识。
Robocode
Robocode是个复杂的编程 游戏 ,在这个 游戏 中,你可以编写机器人坦克的代码,让坦克们互相博弈。你要用Java、Scala、C#等编程语言,编写人工智能程序,驱动机器人。
Robocode安装程序附带开发环境,内置机器人编辑器和Java编译器。你写的是真正的代码!尽管Robocode早在2000年就发布了,但它仍然定期更新和维护,因为它是开源的。
Codingame
Codingame是一款类似 游戏 的Web应用程序,通过编写真实代码来解决难题和挑战。支持超过25种编程语言,包括Java、C#、Python、JavaScript、Lua、Go、Rust等。每一个难题或挑战都有一个主题,例如,编程炮塔击落附近的飞艇,是不是很有趣?
Codecombat
Codecombat也是一个用于像 游戏 的谜题挑战类Web应用程序,只能通过编写代码来解决。不过Codengame更有 娱乐 性,Codecombat有很强的教育意义,它有一个“课堂版”,老师可以用来帮助学生学习编码。目前有3种课程可供选择:计算机科学、网络开发和 游戏 开发。
Codewars
Codewars与其说是 游戏 ,不如说是一种练习编码和解决算法挑战的 游戏 化学习方式。解决问题后你可以得到一定点数,点数值取决于你的解决方案的效率。Codewars允许你查看他人提交的解决方案,方便学习和借鉴。
Codehunt
Codehunt是一种可以使用Java或C#来玩的 游戏 。它的目标是教你学会编程语言的基础知识,从训练开始,到循环和字符串等主题,最后是排序、密码和编程难题等挑战。Codehunt的有趣之处在于,它没有告诉你如何赢得每一项挑战。
Vim Adventures
Vim Adventures是一个有趣的类似 游戏 的教程,用于学习如何使用Vim,这是一个功能极其强大的文本编辑器,许多编程专家都喜欢用。然而,它不容易学,这就是为什么有这样的教程。虽然Vim本身不是一种编程语言,但掌握Vim可以帮你更高效地编码。
TIS – 100
TIS - 100是一款与众不同的视频 游戏 ,它迫使你学习并使用模拟的低级汇编代码来解决编程难题。这个 游戏 很难,它是开放式的,只要你没有怒到卸载它,就会发现它的价值。
Shenzhen I/O
Shenzhen I/O 与TIS – 100同属一家工作室的作品,这是一款益智 游戏 ,你的任务是创建简化版电路,并编写电路上运行的简化版汇编代码。与TIS – 100相比,Shenzhen I/O更容易学,更令人愉快,不过也同样复杂。
Human Resource Machine
在Human
Resource
Machine中,你要扮演一名办公室工作人员,通过将各种指令组合在一起来完成任务。从某种意义上来说,这款 游戏 要求通过可视化编程来解决难题,甚至涉及了逻辑流程和内存管理等概念——但以易于理解的、以办公室为主题的方式呈现。这是一个锻炼程序员大脑的好 游戏 。
Screeps
Screeps是一款大型多人在线策略 游戏 ,你要使用JavaScript来编码 游戏 中实体的行为,并为自己建立一个帝国。
学习从来不是一个人的事情,要有个相互监督的伙伴,工作需要学习编程或者为了入行、转行学习编程的伙伴可以私信回复我“学习”领取全套免费编程学习资料、视频
❻ Rust VS Python:为什么越来越流行,取代榜一 Python
2021 年,Python 又获得了 TIOBE 年度编程语言,排名已经是第一。而 Rust 依然在 20 名以外。但依然有人认为,Rust 甚至可能取代 Python。不过这不重要,认清两者的优缺点,进而合适的地方使用合适的语言,这才最重要。
在这个指南中,我们将比较 Rust 和 Python 这两门语言,同时将讨论它们各自的应用场景,回顾使用 Rust vs. Python 的优缺点,并解释 Rust 为什么越来越受欢迎(甚至可能取代 Python)。
Rust [1] 是一门系统编程语言,专注于安全,尤其是并发安全,支持函数式和命令式以及泛型等编程范式的多范式语言。Rust 在语法上和 C++ 类似,但是设计者想要在保证性能的同时提供更好的内存安全。Rust 最初是由 Mozilla 研究院的 Graydon Hoare 设计创造,然后在 Dave Herman, Brendan Eich 以及很多其他人的贡献下逐步完善的。Rust 的设计者们通过在研发 Servo 网站浏览器布局引擎过程中积累的经验优化了 Rust 语言和 Rust 编译器。
Rust 拥有 优秀的文档 [2] 、友好的编译器和有用的错误消息,以及顶级工具,包括集成包管理器、构建工具、支持自动完成和类型检查的智能多编辑器、自动格式化程序等等。
Rust 发布于 2010 年。虽然和 Python 相比,Rust 是一门年轻的语言,但是它的社区正在稳步增长。事实上,Rust 已经连续五年(2016,2017,2018,2019,2020)在 Stack Overflow 开发者调查的“最受喜爱编程语言”评选项目中摘取桂冠。
乍一看,Rust 的静态化和强类型化可能看起来有点极端。但从长远来看,这有助于防止意外的代码行为。
Python [3] 是一门旨在帮助开发人员更有效地工作和更有效地集成系统的编程语言。Python 提供了高效的高级数据结构,还能简单有效地面向对象编程。Python 语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本陵纯的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。如果速度是最重要的,可以使用较低级别的 API 调用,如 CPython [4] 。
1991 年 Guido van Rossum 推出了 Python,以其代码的可读性、无分号和花括号而着称。
除了可扩展性之外,Python 还是一门解释型语言,这使得它比大多数编译型语言要慢。正如您可能期望的那样,Python 拥有一个庞大的库生态系统和一个庞大的专业社区。
Rust 被应用于系统开发、操作系统、企业系统、微控制器应用、嵌入式系统、文件系统、浏览器组件、虚拟现实的仿真引擎等。
当性能很重要的时候,Rust 是一种常用的语言,因为它能很好地处理大量数据。它可以处理 CPU 密集型的操作,如执行算法,这就是为什么 Rust 比 Python 更适合系统开发的原因。
Rust 保证了内存的安全性,让你可以控制线程行为和线程之间渗历的资源分配方式。这使你能够构建复杂的系统,也使得 Rust 比 Python 更有优势。
总而言之,你应在以下情况下使用 Rust:
Python 可以用于许多应用领域,从 Web 开发,到数据科学和分析,到 AI 和机器学习,再到软件开发。
Python 被广泛用于机器学习,数据科学和 AI,因为它:
在以下情况下,你应该使用 Python:
考虑到 Rust 的迅速普及、受欢迎程度和广泛的使用案例,它几乎不可避免地会在不久的将来超越 Python,以下是一些原因。
Rust 超越 Python 的一个主要原因是性能。因为 Rust 是直接编译成机器代码的,所以在你的代码和计算机之间没有虚拟机或解释器。
与 Python 相比,另一个关键优丛汪搜势是 Rust 的线程和内存管理。虽然 Rust 不像 Python 那样有垃圾回收机制,但 Rust 中的编译器会强制检查无效的内存引用泄漏和其他危险或不规则行为。
编译语言通常比解释语言要快。但是,使 Rust 处于不同水平的是,它几乎与 C 和 C ++一样快,而且没有额外开销。
让我们看一个用 Python 编写的 O(log n) 程序的示例,并使用迭代方法计算完成任务所需的时间:
输出:
现在,让我们来看一下使用迭代方法用 Rust 编写的定时 O(log n) 程序:
输出
在没有使用任何优化技术的情况下,Rust 和 Python 在同一台机器上执行类似的操作分别需要 4.6 微秒和 8.6 微秒。这意味着 Python 花费的时间几乎是 Rust 的两倍。
Python 和大多数现代编程语言一样,被设计成内存安全的。然而,即使没有垃圾回收。Rust 在内存安全方面却让 Python 望尘莫及。
Rust 采用了一种独特的方式来确保内存安全,其中涉及所有权系统和借用检查器(borrow checker)。Rust 的借用检查器确保引用和指针不会超过它们所指向的数据。
Python 和其他语言一样,提供了错误检查和日志机制。但是在让开发者知道哪里出了什么问题的时候,Rust 和 Python 之间有一些差异。
举一个 Python 变量错误的典型例子:
Python 输出
Rust 中的类似示例:
Rust 输出
在这里,Rust 推荐了可能的变量,这些变量可能是你想输入的。Python 只会抛出错误,而不会给出如何修复的建议。
再举个例子:
此代码引发错误,因为默认情况下 Rust 中的变量是不可变的。除非它具有关键字 mut ,否则无法更改。
错误:
修正错误:
如你所见,现在它不会引发任何错误。除此之外,Rust 不允许不同的数据类型相互操作,除非将它们转换为相同的类型。
因此,维护 Rust 代码库通常很容易。除非指定,否则 Rust 不允许更改。Python 是允许这种性质的更改的。
与大多数编译语言相比,Rust 因其速度快、内存安全有保证、超强的可靠性、一致性和用户友好性而备受青睐。在编程中,我们已经到了速度开始变得毫不费力的地步。
随着技术的发展,它变得越来越快,试图在更短的时间内做更多的事情,而不需要那么多的权衡。Rust 帮助实现了这一点,同时又不妨碍开发者的工作。当技术试图推动可以实现的边界时,它也会考虑系统的安全性和可靠性,这是 Rust 背后的主要思想。
除了速度外,Python 在并行计算方面也有局限性。
Python 使用全局解释器锁(GIL),它鼓励只有一个线程同时执行,以提高单线程的性能。这是一大局限,因为它意味着你不能使用多个 CPU 核进行密集计算。
如前所述,Stack Overflow 的“ 2020 开发人员调查”中有 86%的受访者将 Rust 称为 2020 年最喜欢的编程语言。
同样,“ 2020 HackerRank 开发人员技能报告”的受访者将 Rust 列为他们计划下一步学习的十大编程语言:
相比之下,2019 年的调查将 Rust 排在列表的底部,这表明 Rust 开发人员社区正在迅速增长。
这些数据表明,Rust 正在成为主流开发者社区的一部分。许多大公司都在使用 Rust,一些开发者甚至用它来构建其他编程语言使用的库。着名的 Rust 用户包括 Mozilla、Dropbox、Atlassian、npm 和 Cloudflare 等等。
Amazon Web Service 还对 Lambda,EC2 和 S3 中的性能敏感组件采用了 Rust。在 2019 年,AWS 宣布赞助 Rust 项目,此后为 Rust 提供了 AWS 开发工具包。
公司正越来越多地用更高效的编程语言(如 Rust)取代速度较慢的编程语言。没有其他语言能像 Rust 一样在简单和速度之间做出平衡。
Rust 已经发展成为一门易于使用的编程语言,因此它的使用率有所提高。尽管 Python 在机器学习/数据科学社区中占有坚实的地位,但 Rust 在未来很可能被用作 Python 库更有效的后端。
Rust 具有取代 Python 的巨大潜力。目前的趋势是,在应用程序、性能和速度方面,Rust 不仅仅是一种编程语言,它还是一种思维方式。
各位看官你们觉得呢?评论区留下你的看法!
❼ 想做副业,学编程,学哪种语言比较好(零基础)
最近有很多同学问我,我是一个零基础的小白,到底学习哪一种语言比较好?作为一个写了十年代码程序员,用过七种语言的我来说,必须要强调一下,语言只是一种工具,当你真正理解了要做的事,选一个顺手的就行。跟工具一样,哪天有新的好用的语言出来,把旧的扔掉就好。
我今天写这篇文章的目的是想给大家一个参考。
决定用什么语言的因素有有很多,比如性能,内存占用,开发难度,运维难度,目标平台,可执行文件大小,代码可维护性,项目周期,项目规模,招聘难度,团队构成,历史遗留问题,甚至派系斗争等。
比如腾讯就有大量历史遗留的C和C++的服务器代码,毕竟20年前没得选。又比如空降技术负责人可能会为了让自己人上位,让自己团队出成绩,选择用其他语言或者框架对本来工作良好的系统进行重构。
下面开始聊语言
Python
先说python,是因为这个语言小学生都开始学习了,以后不会python要被小学生欺负了。语法简单,除了前端几乎万能,可用的库极其丰富,能想到的功能几乎都有现成的库可以用。不管是搞爬虫,做人工智能,机器学习,数据分析,还是自动化运维,自动化测试,python几乎都是首选。不想当程序员还想学习一门语言的话,学习python就没错了。缺点是慢,但是能让机器累的事,何必让人来累。
php
PHP是世界上最好的语言,可能这个已经成为很多程序员的梗。
我没用php开发过大型项目,自己做东西的感觉是这语言非常简单,以前用的人很多,招聘容易,但是不适合做复杂的项目。现在用得越来越少了,迅雷以前有不少运营活动页面是PHP做的。
C
C的语法足够简单,应该是最接近机器语言的高级语言,适合编写操作系统底层,驱动程序,硬件相关的程序以及看重性能的程序。由于过于简单,构建大型程序的复杂度非常高,建议想往研发方向走的同学都学习一下C语言。
可以对计算机一些底层原理了解,比如指令执行过程,内存管理,异常,多线程,编译过程等又更深层次的了解。掌握C语言再学习其他语言会变得很轻松,学习破解也有帮助,毕竟汇编基本都可以反编译出C代码。
C++
C++是一个糟糕的语言,这不是我说的,这是Linux之父说的。我自己用C++四五年时间,越到后面就感觉这句话越有道理。
首先C++的强大是毋庸置疑的,但是作为一个跟C一样偏底层的语言,如果不理解写的代码背后到底发生了什么事,如果出了错,你是永远不可能知道错在哪里的。
一个没有垃圾回收的语言,不用智能指针很容易导致内存泄漏,错误的用了智能指针不但内存泄漏之后不好解决,还容易导致提前释放等问题。
C++支持强制类型转换,如果转换前后的内存结构不一样,很有可能导致各种隐性问题。还有Java之类非原生语言的异常处理都是语言自定义的异常,而C和C++中的异常很多都是操作系统层的异常。
Windows下一个简单的try catch,你觉得可以抓到try中所有的异常,但是由于异常处理函数的指针保存在栈上,这时一个栈溢出可能直接导致异常处理函数指针被覆盖,异常会出现在你意想不到的地方。微软有大神曾说过,想你的代码后续可维护就删掉代码中所有的try catch。
又由于语言非常底层,当程序出现底层崩溃的时候,想解决掉这个崩溃往往要读一些汇编,这时候如果使用了大量的模板,比如stl和boost,那生成的汇编几乎完全不可读。看过stl代码的人应该都知道这玩意儿写的有多晦涩,就导致了你想用一个C++库,如果不了解这个库的实现原理,那大概率会出错。
C++的复杂度又让你很难真的理解那个库的原理,结论就是C++强大,但是必须用的人也强大。C++直到现在还在疯狂的增加特性,我用了四五年我自己都不敢说自己会玩C++,能用其他语言就优先考虑其他的,把C++作为最后的选项,不建议新手学,除非你的目标领域必须使用。
Rust
Rust是为了解决C和C++的各种问题而出现的语言,性能接近C++,通过所有权限,不用垃圾回收就解决了生命周期管理。有包括管理,又有极其严格的编译器检查,能编译通过的代码就不会有大问题,编译器直接把水平不够的新手挡在了门外,通过解决出问题的人是方式,从根本上解决了C++的问题。
我第一次用rust写个小程序就跟编译器较了一天的劲。它的缺点就是学习难度太大,语言太小众,库太少,很多轮子都要自己造。但是随着微软之类的大厂使用,相信之后发展会比较好,新项目如果需要C或者C++可以优先考虑rust。
Java
我现在主要也是一个Java程序员,对于Java这个语言我并没有什么很特别的感觉,配套设施完善,什么都能干,体验非常赞,就是内存占用有点难看。想搞安卓考法的必修,阿里有大量的服务器项目使用Java。
唯一想吐槽的是gradle这个构建系统,版本问题搞得很头疼。
JavaScript
js是前端的必修课,没得选,然而node让js也万能了。用node做过后端项目后,感觉动态类型语言还是不太适合,由此带来的低级错误很多,虽然可以用typescript解决,但是最终还要编译成js,无法直接调试。由于没有原生的多线程支持,利用cpu也只能通过开多个进程的方式。小项目的后端做着玩还可以,大点的还是考虑Java或者是go吧。
Lua
Lua是极其轻量的语言,语言特性接近js,runtime非常小。作为一个脚本语言,性能出色,内存占用低,很适合各种嵌入式设备或者插件系统。
Go
这玩意儿一定是谷歌为了解决自己后端项目中遇到的问题而开发的语言,各种特性直戳痛处。语法简单,规范严格,这就让不管什么水平的开发写出来的代码差距都不会太大。
静态类型,没有默认参数,没有异常处理,可以降低犯低级错误的概率。编译成原生代码,可内嵌C代码,原生支持协程和多线程,可以保证性能,支持跨平台编译,输出单文件方便部署,这些优点带来的问题是Go的指向性太强,只适合做高并发api类的后端服务。
想用Go开发其他任何领域都会觉得特别别扭,类似C的语法过于简单,又没有泛型,导致很多功能都显得很啰嗦。但由于Go解决了部署问题,跨平台问题,降低了研发人员的水平要求,降低了犯错误的概率。
关于这些语言的性能没有绝对的排序,但根据我做项目带团队和面试的经验,绝大多数的程序员的水平都还碰不到语言的性能瓶颈。一般来说对语言的理解以及多线程,算法,网络,数据库,缓存。硬件甚至业务的理解都比语言的性功能影响更大。
再次强调,语言只是工具,只有适不适合,没有好与不好。基础强大,用哪个都不怕,基础太差,用什么都尴尬。
只是会语法并不是掌握了这门语言,要知道程序背后发生了什么。比如C++的对象模型,Java的虚拟机,垃圾回收,Go的协程,js的promise,rust怎么编译通过等等。
基础是一门语言的核心,不管学习哪一门语言都要重点学好基础。