当前位置: 首页 > 编程日记 > 正文

为什么Rust连续4年获“最受喜爱编程语言”?

640?wx_fmt=jpeg

作者 | Mike Tang

责编 | Aholiab

出品 | 区块链大本营(blockchain_camp)


2015年5月15日,Rust编程语言核心团队正式宣布发布Rust 1.0版本。

4年来,它优雅的解决高并发和高安全性系统问题的能力,受到了越来越多开发者的喜爱。并且连续4年,在Stack Overflow开发者「最受喜爱编程语言」评选中获得第一名。

640?wx_fmt=png

近来,越来越多的著名区块链项目已经选择使用Rust作为其开发语言,包括:Parity、Polkadot、Substrate、Grin、Ethereum经典、Holochain、Cardano-Rust、Exonum、Lighthouse、Nimiq、Nervos、Conflux-Rust、Codechain、Witnet等众多知名度较高的项目。

本文试图探讨这一种趋势出现背后的原因。并且系统的讲解Rust语言对于区块链开发的影响和其优势。

 

Rust:一个安全和并发的软件系统


Rust 是一门系统级编程语言,被设计为保证内存和线程安全,防止段错误产生。

作为系统级编程语言,它的基本理念是 “零开销抽象”。理论上来说,它的速度与 C / C++ 同级。Rust 可以被归为通用的、多范式、编译型的编程语言,类似 C/C++。

与这两门编程语言不同的是,Rust 是线程安全的!它的目标是,创建一个安全和并发的软件系统。Rust强调安全性、并发和内存控制。尽管 Rust 借用了 C/C++ 的语法,却杜绝了空指针和悬挂指针,而这二者是 C/C++ 中系统崩溃、内存泄露和不安全代码的根源。

虽然 Rust 是一门系统级编程语言,但并不意味着它只能写底层程序(操作系统、驱动、工具、数据库、搜索引擎等),它的抽象层次之高完全给人惊艳的感觉,实践证明它对问题建模的能力和方便性不比 C++/Java/Python/Ruby 差。

但 Haskell 这类超高抽象语言,也不是 Rust 的发展方向。Rust 力求在抽象与现实世界中找到一个平衡。

目前,Rust 已经在 StackOverflow 的年度语言评选中,连续 4 年荣获“程序员最喜爱语言”第一名。


Rust语言的历史


Rust 最早是 Mozilla 雇员 Graydon Hoare 的一个个人项目,从 2009 年开始,得到了 Mozilla 研究院的支助,2010 年项目对外公布。

2010 ~2011 年间实现的自举。从此以后,Rust 经历了巨大的设计变化和反复(历程极其艰辛),终于在 2015 年 5 月 15日发布了 1.0 版。

在这个研发过程中,Rust 建立了一个强大活跃的社区,形成了一整套完善稳定的项目贡献机制(这是真正的可怕之处)。Rust 现在由 Rust 项目开发者社区维护。

下图描述了Rust的基因图谱:

640?wx_fmt=png


Rust仍是小众语言


Rust从1.0算起,到目前(2019年5月)为止,已有长足的发展。但整体而言,比起,Python、C、C++ 等,Rust 的使用并不算特别广泛(毕竟太年轻)。

调查显示,Rust 使用率不高的很大一部分原因是选择 Rust 的公司占少数。

640?wx_fmt=png

不过,Rust 在工作中的占比却越来越高。过去一年间,Rust 在商业应用上有着令人惊讶的成长。包括一些人们耳熟能详的公司:

  • 亚马逊:用 Rust 构建工具;

  • Facebook:源代码控制工具;

  • Google:作为 Fuchsia 项目的一部分;

  • 微软:在新的 Azure 物联网框架中部分使用 Rust;

  • Twitter:用 Rust 作为构建团队支持的一部分。

国内的百度、阿里,也已经在内部小范围的使用上了Rust。相信,随着更多公司对 Rust 的选择,Rust 的成长速度将更加迅猛。


Gavin Wood把Rust带进区块链


第一个将Rust应用于著名区块链项目的应该是大名鼎鼎的Gavin Wood。Gavin Wood 博士在 2015 年下半年离开了以太坊社区,创立了 Parity Technologies,推出以太坊(Ethereum)客户端 Parity,成功占领以太坊社区的半壁江山。而这个Parity客户端就是使用Rust写的。

640?wx_fmt=png

实际在 Parity 出现之前,MaidSafe项目就已经出现了。MaidSafe用 Rust 语言尝试了很多东西。Rust语言本身强调的安全性以及MaidSafe这些前沿项目,可能给了 Gavin 充分的理由选择 Rust 作为 parity 开发语言。

640?wx_fmt=png

Rust本身的语言特性(安全、高性能、并发编程)与区块链的特性(分布式、加密、安全敏感)天生有相当大的重合性。

不仅如此,Rust作为一个编程语言显得不同,不是因为它的语法多么漂亮(实际有些人甚至觉得有点丑)或者社区多么受人欢迎,而是因为当用它写代码时获得的那种信心。

看起来Rust会影响你写代码的的效率和表达力,但令人相当惊奇的是,结论完全相反:写一个有效率的、符合习惯的Rust程序比写一个有潜在危险的程序容易得多。

下面是Linux内核在2018年一月到四月期间发现的Bug:

640?wx_fmt=png

而对于Rust而言,上图右侧占比 51% 的部分,从语言层面就可以避免。也就是说,对Rust来说,根本不存在上图右边这些问题。

目前有两种观点:“一个人只需要知道如何写C” 和 “只需要把最底层的东西留给专业人士”,这两种观点都是不够的。Linux内核是由强中强的程序员写的,可能是工业界最前面的5%的程序员,但是,仍然,年复一年地搞出 CVE 来。

你有可能会觉得几百万行代码中出现50个bug不算什么。但在一些关键领域,出bug就意味着系统性风险(如,心脏起博器中的bug会导致生命危险)。而且,这50个bug是我们已经找到的,谁知道我们还有多少个bug还没找到?而用了Rust,我们可以事先知道答案。

厉害的是,Rust在实现内存安全和并发安全的同时,并没有以损失性能为代价。更牛逼的是,它甚至是用同一套抽象解决了内存安全和数据竞争这两个不同领域的问题。

Rust的零开销抽象让你在享受安全性的同时,又不损失性能。这正是传统的程序员梦寐以求的。

以Parity为例,Parity使用Rust,正是因为用Rust写复杂和高性能的代码时,不用担惊受怕。用Rust写程序,远离未定义行为、数据竞争和内存安全问题。更别说,Rust运行速度快,写起来有趣,易读,还几乎没有运行时。

内存安全问题如此困难,因为你无法容易地写出测试来捕获它们。如果你在beta阶段之前没有找出bug,那么这个bug就可能会在代码中呆几年,就像一个读秒的定时炸弹。当然,也有Valgrind这类的工具,来辅助你捕获这些bug。但是如果在执行时,没有触发内存问题,或这类工具生成的代码在运行时,没有执行,那么它们也捕获不到。

所以,通过使用Rust,我们消除了一大类最复杂和最不可预测的错误。

Rust中内嵌了形式化证明理论,不过仅限于对内存安全和并发。Rust在内部用逻辑证明了你的程序是正确的。这也就是你为什么写Rust代码会写得如此有信心的原因。你的每一次编译,都有一组数学理论在为你提供证明服务。

在很长一段时间内,像Haskell这种函数式编程语言的一大杀手级特性就是可以比较容易地进行形式化证明,而这对于传统的命令式编程语言是不可能的(因为有共享可变性,不安全的指针运算,和不可控的副作用)。

但Rust的出现,改变了这种情况,作为一个命令式语言,它却走在被证明的路上。到目前为止,标准库的一部分已经被证明是正确的。

640?wx_fmt=png


那些用Rust开发的知名区块链项目


parity

说起知名的用Rust写的区块链项目,Parity首当其冲。Parity是一个以太坊节点客户端parity-ethereum。

640?wx_fmt=png

Parity Technologies 是他们公司的名称。现在 Parity 旗下已经包含了一套客户端和各种库,包括:

  • parity-ethereum;

  • parity-zcash;

  • parity-bitcoin;

  • shasper。

也就是说,Parity Technologies 给使用Rust开发区块链提供了一套「全家桶」。

polkadot/substrate

Polkadot 是由Web3基金会发起的一项计划,由 Parity Technologies 负责开发,旨在却不限于使区块链互联。

Polkadot 使开发者和企业能够利用其协议建立区块链,即平行链(parachain)。只要这些平行链建立在Polkadot的基础之上,它们将共享同样的权威证明(PoA)共识。

由于该类型共识嵌于 Polkadot 中,平行链开发者可以专注于各自区块链的特异性。所有平行链都和一种被称为中继链(relay chain)的通用区块链无缝连接,后者扮演连接所有平行链的角色。

Polkadot 项目由Gavin Wood主导推进,其实跟上面的parity全家桶属于同一家公司,但属于不同的团队在做。

如果你实时关注了 Polkadot 的进展状况,你可能会经常看到“Substrate”这个词。它是 Polkadot 项目的重要组成部分。Parity Substrate 是独立于 Polkadot 的项目。Polkadot 基于 Substrate ,其它基于 Substrate 的项目也能在 Polkadot 网络上运行(形成一个生态)。

那么什么是 Substrate 呢?你可以将其看作类似于 Express 或其他 Web 应用程序的框架,但它是用于构建分布式或去中心化的系统的框架,可以构建例如加密货币项目,或消息总线系统。

正如大多数 Web 应用程序不需要重新实现自己的 HTTP 协议一样,对于每一个团队创建新链时,也不需要从头实现网络和共识的代码,这浪费精力。

更不用提为了实现业务逻辑,必须雇用密码学家、安全研究员、网络工程师、开发人员(以协调更新)等等了。如果你使用 Substrate 来构建一个新项目,只需要在代码中实现少量的函数回调,就可以轻松快速创建一条链。

链接:

https://github.com/paritytech/polkadot

https://github.com/paritytech/substrate

grin

grin是当今区块链界小网红。少数旨在成为真正货币的项目之一。

Grin 致力于提供隐私、可扩展性的加密货币,计划在 2019 年初发布。其几个独特的属性:使用名为 MimbleWimble 隐私保护区块链格式;只在区块链中存储少量数据,运行完整节点既便宜又容易。

Mimblewimble 由匿名人士开发,团队分布在世界各地;没有任何预挖的 PoW 机制,更平等和去中心化。

640?wx_fmt=png

Grin 核心开发者、Grin Council 成员 D

grin的出现,预示着回归比特币的一股潮流的出现,也许,这才是这一类项目正确的方向。

参与gin的开发交流,相当令人愉悦。

Holochain

Holochain致力于解决Dapp落地的事情,也就是说,它在构建一个云托管网络。

当人们都在研究如何把区块链性能提高的时候,Holochain却在做造汽车的事。有时候思维固化并非好事,换一种思维方式或许就可以找到解决问题的新路径。正如Holochain官网上的文字一样:Think outside the blocks。

Holochain这个项目很有意思,它不是狭义上的区块链。人们研究区块链本质上是在研究通过解决信任问题完成价值传输,从而完成生产关系改变。

为了达到最终目的,我们不一定要把眼光仅限于某种特定技术上。无论是区块链、DAG、Holochain,只要能达到我们最终目的,那么都可以认为是好的技术。

区块链中为了保证信息一致性,系统中每个节点都是一个单独的账本,这些账本记录同样的信息。虽然,区块链这种分布式账本技术满足了一致性,但却造成了巨大的信息冗余。

Holochain认为共识是可以分化的,没必要所有的事件都去共识。因此它创新的从另一个角度去解决共识问题。Holochain将一个账本分割成若干份,交给每一个参与节点,并通过DHT技术和密码学技术保证账本之间的一致性。

简单来说,我们可以把DHT的作用理解为拼图上的图画,我们可以通过图画来判断这个拼图是否完整。

节点不再需要多账本同步记录,只需要记录与自身相关的内容就可以达成全网共识,这就是Holochain的革新之处。

Nervos

首先,Nervos 要做什么?官网上说,Nervos 是要:为未来的加密经济构建分层的基础设施。分层的方式也是现在区块链主流体系设计,Layer 1 发行原生资产,支持高安全性高去中心化,牺牲效率。

而 Layer 2 去做扩容的事情。那么 Nervos CKB 作为体系的Layer 1,主要有以下两个目的:资产的储存和协议的增强(安全性和去中心化)。

注意,这也是 Nervos CKB 经济体系设计的原则,即资产储存大于价值交换。

Nervos有几个有趣的设计亮点:

  •  解决通缩与通胀的问题;

  • 解决手续费的问题Nervos CKB 的一个理念是,智能合约平台的价值除了原生代币外,还应包含平台上发行的其他加密资产的价值;

  • 解决资源的价格问题;

  • 解决利率的发现与调整问题。

exonum

由 Bitbury 出品。是一套使用Rust开发的许可链开发框架。使用exonum,可以方便的搭建联盟链。


结束语 


作为一个刚刚4岁的语言,Rust语言正在IT工业各个领域快速发展,而由于区块链本身的特质,区块链领域是较早接纳Rust的领域之一。

在区块链领域,Rust正以势如破竹之势占领区块链新兴项目市场,很多著名的老项目也在考虑转向使用Rust重写。

与此同时,WebAssembly技术的飞速发展带来的成果也及时地应用到了区块链中。Rust对WebAssembly提供了一等支持。可能是所有语言中目前为止最好的。具体请参考:

https://rustforce.net/article?id=6807cc27-0e6c-4bc9-baa3-8b0c68ae9529

相信,随着Rust语言的 async/await 特性在今年的稳定,使用Rust进行区块链开发会变成更加轻松方便。选择使用Rust作为第一开发语言的区块链项目也会越来越多,我们会迎来一波的Rust语言学习高潮。

谨以本文作为Rust 4周年的生日礼物,祝Rust生日快乐!

参考资料:

https://rustforce.net.cn/section?id=17dd744e-429a-42b1-8d30-01d31d556ab0

https://www.jianshu.com/p/cca7e4f46b86

https://www.parity.io/why-rust/


作者简介:

Mike Tang,资深程序员,Rust语言爱好者,从14年下半年接触Rust,Sapper Web框架主要作者。从 18 年开始聚焦于区块链领域的学习研究,参与贡献 cita,rust-libp2p,grin等项目。


(*本文为 AI科技大本营转载文章,转载请联系原作者)


精彩推荐



640?wx_fmt=jpeg

推荐阅读

  • 回顾 | 阿里达摩院、腾讯、滴滴、Hulu等公司大牛的机器学习专场分享

  • 找啊找啊找木偶,图灵奖得主G. Hinton第一篇论文曝光!

  • 10个爬虫工程师必备的工具了解一下

  • 太惨!这5种编程语言遭100W+程序员厌弃!网友:怀念青春.....

  • 技术引路:机器学习仍大有可为,但方向在哪里?

  • 如何快速深入理解监控知识? | 技术干货

  • 比特币冲到9000美元, 你就能找个好工作?

  • ARM 发布新一代 CPU 和 GPU,实现 20% 性能提升

  • 1000 万个“AI 名师”:用机器算法“解剖”应试教育


640?wx_fmt=png

相关文章:

【Windows】清除win10开始菜单中失效打程序标签

1、问题描述 安装新版本Qt程序,卸载旧版本Qt后,在开始菜单中,还有残留,但是已经失效,需要删除这些失效的程序标签。 2、显示隐藏文件夹 打开此电脑——查看——勾选“隐藏项目”: 3、删除失效的程序标签…

解析equals(Object obj)和compareTo(T obj)

背景:最近在研究静态扫描的东西,遇到一个规则:"equals(Object obj)" should be overridden along with the "compareTo(T obj)" method 然后就想深度扒一扒equals和compareTo有什么区别 1.java.lang.Object是所有类的父类…

安装和部署Exchange Server 2007

为什么Exchange Server 2007使用服务器角色? 简化部署和管理 增强可扩展性 改进安全性 见下图:什么是邮箱服务器角色? 邮箱服务器角色: 存储用户邮箱和公共文件夹 通过群集, LCR, CCR实现高可用性 并不在邮箱之间转输邮件邮箱服务器: 不应该能从Internet直接访问 必须是活动…

AI时代,中国技术创新如何弯道超车?

2019 年 5 月 26 日 - 27 日,杭州国际博览中心,由工信部人才交流中心指导,CSDN 和数字经济人才发展中心主办的 CTA 核心技术及应用峰会圆满落下帷幕。本次大会聚焦机器学习、知识图谱等 AI 领域的热门技术,关注技术在行业中的实践…

【TX2】英伟达Nvidia TX2连接蓝牙设备

1、问题描述 买了一个蓝牙键盘(航世B.O.W 折叠键盘HB099,200大洋),尝试在连接TX2的蓝牙,试试好使不 2、安装蓝牙 Blueman 是一个适合在 GNOME 桌面环境使用的图形化蓝牙管理工具。 sudo apt-get install blueman b…

usermod

功能说明:用于修改系统已经存在的用户账号信息。 参数选项:-c comment 修改用户password文件中用户说明栏,同useradd -c功能。-d home_dir 修改用户每次登入时所使用的家目录,同useradd -d功能。-e expired_date 修改用户终止日期…

asp.net 获取当前时间的格式

在平时的编程中,经常会用到获取当前的系统时间,格式也很特定,今天就把一些格式整理了一下,贴出来,以便以后的使用。 //获取日期时间 DateTime.Now.ToString(); // 2008-9-4 20:02:10 DateTime.Now.ToLocalT…

史上最大规模ACL大会放榜,百度10篇NLP论文被录用!

近日,自然语言处理(NLP)领域的国际顶级学术会议“国际计算语言学协会年会”(ACL 2019)公布了今年大会论文录用结果。根据 ACL 2019 官方数据,今年大会的有效投稿数量达到 2694 篇,相比去年的 15…

【Ubuntu】安装Ubuntu+Win双系统后,每次开机默认是进入Ubuntu,如何设置成默认进入Win?

1、问题描述 安装UbuntuWin双系统后,每次开机默认是进入Ubuntu,如何设置成默认进入Win? 2、解决方法 1)记住开机选择中windows 10是第几个,从0开始记,如下图本人的是4 2)进入ubuntu系统&am…

MFC 多线程及线程同步

一、MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。  工作者线程没有消息机制,通常用来执行后台计算和维护任务&…

太火!这本AI图书微软强推,程序员靠它拿下50K!

如何能够短时间内抓住技术重点,集中突击?如何不在惧怕“算法”?如何才能在面试中对答如流,打造属于自己的“offer收割机”?也许这本书——《百面机器学习 算法工程师带你去面试》就能帮你实现!《百面机器学…

【Qt】错误处理:error: undefined reference to `qMain(int, char**)‘

1、问题描述 在一次编译Qt项目时,报错 H:\Qt\Qt5.14.2\5.14.2\mingw73_32\lib\libqtmain.a(qtmain_win.o):-1: In function `WinMain@16: C:\Users\qt\work\qt\qtbase\src\winmain\

Android WebView与ViewPager的滑动冲突分析

前言 如题所述,我使用的架构是ViewPagerFragmentWebView进行开发的,由于WebView的html页面代码是第三方的,这里不好放出来,所以只能放一个大致的架构图,如图所示,ViewPager包含了两个fragment,可以左右滑动…

关于outlook2010帐户设置

安装了office2010后,首次使用outlook,关于帐户设置,以qq邮件为例 开启imap服务2.打开outlook2010软件 由于有文字限制,其他的图解请链接http://wlinfang.blog.51cto.com/2961560/902193转载于:https://blog.51cto.com/wlinfang/90…

如何构建可解释的推荐系统?| 深度

作者 | gongyouliu来源 | 大数据与人工智能(ID:ai-big-data)推荐系统的目标是为用户推荐可能会感兴趣的标的物。通过算法推荐达到节省用户时间、提升用户满意度、为公司创造更多的商业价值的目的。要想达到这个目的就需要让用户信任你的推荐系…

【Qt】获取、比较Qt版本的宏和函数

1、版本号宏定义 版本号宏定义在QtCore\qconfig.h中,以Qt5.14.2为例 #define QT_VERSION_STR "5.14.2" #define QT_VERSION_MAJOR 5 #define QT_VERSION_MINOR 14 #

Spring Cloud企业微服务分布式云架构技术点整合

spring cloud本身提供的组件就很多,但我们需要按照企业的业务模式来定制企业所需要的通用架构...下面我针对于spring cloud微服务分布式云架构做了以下技术总结,希望可以帮助到大家:View: H5、Vue.js、Spring Tag、React、angular…

学习 JS navigator 对象

集合描述IEFOplugins[] 返回对文档中所有嵌入式对象的引用。 该集合是一个 Plugin 对象的数组,其中的元素代表浏览器已经安装的插件。Plug-in 对象提供的是有关插件的信息,其中包括它所支持的 MIME 类型的列表。 虽然 plugins[] 数组是由 IE 4 定义的&am…

【Ubuntu】解决ubuntu系统root用户下Chrome无法启动问题

1、问题描述 ubuntu系统在root用户下无法启动Chrome,报错: Running as root without --no-sandbox is not supported. See https://crbug.com/6381802、解决方法 如果是用命令行启动,启动时加上参数“–no-sandbox”即可; 如果…

程序媛眼中的程序猿原来是这样子的!

2019独角兽企业重金招聘Python工程师标准>>> 一直都想写一篇关于描述程序员的文章,但是一直没能开头,一来因为文笔不好,更主要的原因是貌似对程序员既熟悉又不熟悉,很怕写出来的是以偏概全,给大家造成对程序…

TinyMind人工智能社区5月热门技术文章排行榜TOP15

本文整理了TinyMind人工智能社区(https://www.tinymind.cn/)5月文章排行榜TOP15,欢迎大家阅读收藏。 1、谈谈Python那些不为人知的冷知识 https://www.tinymind.cn/articles/4158 此文章为系列文章,全集请看【Python冷知识】专辑 https://…

任意排列、组合终极Shell脚本

2019独角兽企业重金招聘Python工程师标准>>> 作者:crulat 永夜 #!/bin/bash # permutation_combination.sharg0-1 number${2} eval ary({1..${1}}) length${#ary[]} output(){ echo -n ${ary[${!i}]}; } prtcom(){ nsloop i 0 number1 output ${}; echo…

刚刚!我被产品小姐姐的笔记本深深吸引了....

今天我看到产品小姐姐的一个东西,我惊呆了,因为我好像看到了黑科技,事情是这个样子的....由于加班写代码,在比较疲劳的时候,就站起来随意的在办公室里走走,放松一下自己的脑神经。走到一个产品小姐姐身边&a…

【Qt】解决在linux上使用Qt的媒体模块(Qt += multimedia)缺少模块multimedia的问题

1、问题描述 在ubuntu上使用QAudioInput、QAudioOutput等音频相关的类时,报错。 2、解决方法 1)在pro工程文件中添加了 Qt multimedia 2)安装multimedia模组 sudo apt install libqt5multimedia* qtmultimedia5-*

设计模式之五 责任链模式(Chain of Responsibility)

2019独角兽企业重金招聘Python工程师标准>>> 一. 场景 相信我们都有过这样的经历; 我们去职能部门办理一个事情,先去了A部门,到了地方被告知这件事情由B部门处理; 当我们到了B部门的时候,又被告知这件事情已…

django 中文乱码或不识别

django是一个不错的WEB开源框架。今天测试,发现有些页面中文乱码,肯定是编码哪儿出了问题。 django配置要修改项目根目录的settings.py中的: TIME_ZONE America/Chicago LANGUAGE_CODE en-us 替换成: TIME_ZONE Asia/Shanghai …

【TX2】安装NVIDIA SDK Manager(JetPack 4.6)后,下载kernel和u-boot源码

1、先确认版本号 官网:L4T 32.6.1 is included as part of JetPack 4.6 2、下载源码 执行同步代码命令: ~/nvidia/nvidia_sdk/JetPack_4.6_Linux_JETSON_TX2_TARGETS/Linux_for_Tegra$ ./source_sync.sh 根据提示,输入1中查询到的版本号t…

忽略这一点,人工智能变人工智障!

作者 | The Economist译者 | 弯月,责编 | 伍杏玲出品 | CSDN(ID:CSDNnews)【编者按】当今社会,人工智能已进入我们生活的方方面面,很多人会担心算法的控制权过多,也有人担心数据有偏差的话&…

Loader 入门【Webpack Book 翻译】

原文链接:https://survivejs.com/webpack...翻译计划:https://segmentfault.com/a/11...附言:因为发现书中一些内容单独放出来会比较尴尬,所以会跳过部分章节,当然完整版会全部翻译,已经正在研究原版的网站…

backtrack X server 启动不了

本来安装好了啥事没有的。 自己硬想能不用打startx直接启动X server的 于是加了 if [ -z ... 的代码 到 ~/.xinitrc 结果X server就再也启动不了了 花了2个小时? 检索【inappropriate ioctl for device (25)】 有一篇文章提到了 xinitrc, 我才想起来好像是编辑了这个文件&…