#RM-600形
Explore tagged Tumblr posts
poddyshobbies · 10 months ago
Text
松浦鉄道の旅(6)松浦→佐々
Tumblr media
伊万里 11:36 → 12:15 松浦 12:22 → 14:08 佐世保 … 松浦駅に停車中(↑)。
YouTube > 前面展���・松浦→佐々(1時間2分)
松浦火力発電所 … 松浦を出発して4,5分(右車窓)
Tumblr media
東田平駅(ひがしたびらえき)… しばらく国道204号線と並走です。
Tumblr media
そして、たびら平戸口駅(12:46-47)
Tumblr media
観光スポットでもある平戸島の最寄り駅であり、「日本最西端の駅」(沖縄のモノレールを含めず)です。
Tumblr media
すえたちばな駅(12:56発)… 列車は北松浦半島を南へ下り始めます。
Tumblr media
江迎鹿町駅(えむかえしかまちえき)… 交換 13:01
Tumblr media
↓ 佐々に向けて進行中 … あと少し(いのつき駅付近)
Tumblr media
次の潜竜ヶ滝駅(せんりゅうがたきえき)と吉井駅の間にある福井川橋梁はじめ3本のコンクリート橋梁は国の登録有形文化財らしいです。
清峰高校前駅 (せいほうこうこうまええき)
Tumblr media
乗車した頃にはほぼ葉桜になってましたが、沿線には桜並木が結構あります。(浦ノ崎駅が有名)
2024.4.10 ~ つづく
4 notes · View notes
louisonurmark · 6 years ago
Text
光阴流逝,2019年已来到了尾声,如今距离2020只剩下不到两周的时间。在这一整年下来,大马车坛其实发生了很多事情,在这里我们paultan.org将带大家回顾今年那些关于本地汽车业的“大事”!
当然,回顾之余,我们也展望2020年,所以我们顺势预测了一些明年“可能会发生的事”。首先,让我们从大马国产品牌开始谈起吧!Let’s Go!
近年来,在中国巨头浙江吉利集团的推动之下,宝腾可以说是一天比一天好,显然地宝腾已走在了复兴的正轨上,准备好冲击销售冠军宝座,重返大马第一。尽管如此,这并不代表本地市场“一哥”Perodua的地位摇摇欲坠。
其实Perodua一直也在努力,而它的销量表现就是最好的回报和证明。虽然宝腾来势汹汹,但Perodua的销量仍处于稳健增长当中。你以为宝腾崛起,人们就不买Perodua了吗?不!下面的图表就是佐证。
五年前,非国产品牌在马来西亚汽车市场上占有更大份额
假设大马汽车行业的总量(TIV)保持不变,那么宝腾与Perodua的销量增长明显是来自于非国产品牌的流失,这与几年前的情况南辕北辙。宝腾现在已��从Honda手上夺回了“老二”的位置,而且如无意外的话,宝腾的势头应该会继续维持下去,直到实现重返大马第一,东盟第三的目标为止。
但其实宝腾要重返大马第一绝非易事,请相信我们,Perodua绝对不会那么轻易就被宝腾攻陷。目前Perodua方面看似没有什么重大消息,但别忘了这家汽车制造商向来都很低调,我们不知道它的背后还有什么“大招”还未施展,所以不可小觑。
当然,除了上面这两个名字以外,2019年本地车坛其实还有很多事值得我们去讨论的,比如说新国产车计划、以及被国民(包括小编)冷嘲热讽的飞行车计划。事不宜迟,马上进入正题!
Perodua很少说话,但却卖得很多
在2019年开年的首三天内,宝腾和Perodua的差距就已经一览无遗。根据过去的传统,因为绝大部分消费者会选择在年终优惠的时机买车,所以年头一般都是许多车企的“空窗期”,但Perodua Aruz的面市却打破了传统,在没有预先大肆铺张宣传/预告,和用数个月时间来收集订单的前提下,Aruz在发布后的短时间内就累积了上万张订单,可以说是一鸣惊人。
Aruz也是Google今年最热门的汽车搜索字眼。这款七人座SUV(实际上是MPV)的售价高达RM 77,900,是Perodua近年来最市售昂贵的汽车(短时间的CBU Nautica是唯一的例外)。
事后看来,Perodua根本就不用担心这一环,因为许多大马人在Aruz上看到了良好的价值。除了车身尺寸比一般Perodua汽车更大之外,相对于它的同级竞争对手,比如说Honda BR-V,它的外型和安全性更占优势。
进入2019年第一季,Perodua的销量依然保持强劲,达到了82,700辆的水平,是该品牌有史以来的销量巅峰,同比增长9.5%,市占份额超过43%。根据Perodua公布的业绩报告,Perodua在年中之前的销量达到了121,800辆(同比增长4%,市占份额为41.1%),于是将原定的全年销售目标提高了4,000辆至235,000辆,要知道在车坛上,提高销售目标是非常罕见的。
其实整年下来,在Aruz推出之后,Perodua在产品方面并没有太多的着墨。他们在四月份为Aruz推出了GearUp套件,以及50辆Bezza限量版;6月宣布出口进军Seychelles新市场,而大马设计的Myvi也陆续出口到新加坡和毛里求斯;今年下半年,Perodua更出口Axia到斯里兰卡。
另外除了Aruz以外,Perodua也在今年9月发表了小改款的Axia,这款Perodua最入门的A-Segment掀背车其实已经第二次小改,第一次是在2017年的1月。如今新的Axia不但有了新的套件,而且还有了新的跨界版本车型。
新的Axia起售价为RM 24,090,它依然是大马最便宜的汽车,而在顶配版车型上它还搭载了VSC和ASA 2.0等安全配备,进一步巩固了Perodua在入门级安全性代表的头衔,这也有助于让它与其在价格上的竞争对手Proton Saga区别开来。
在小改款Axia之后,我们预计Perodua在短期内应该不会再有其它产品推出,但是我们错了。今年10月,我们在云顶高原发现了披着Toyota Avanza“外衣”,疑似全新Alza的七人座MPV在路上测试。在那之后不久,更诡异的是,我们还发行了一辆很奇怪的Axia,如果我们猜测的没错,它应该就是Perodua即将发布的全新B-Segment SUV,D55L(代号)。
在今年10月杪的2019东京车展上,Daihatsu出其不意的发表了旗下全新的B-Segment SUV Rocky,尔后不久,Toyota也发表了同级的Raize。这两款新车构架在Daihatsu最新的DNGA平台上,并且搭载1.0升的涡轮增压汽油引擎。
左为Daihatsu Rocky,右为Toyota Raize虽然官方还未宣布,但大家都知道,上述这两款新车(SUV)其实和Perodua的D55L是“三胞胎”,属于姐妹车,就好比如最新的Perodua Aruz、Toyota Rush,以及Daihatsu Terios一样。如无意外,这款新车将会在2020年浮出台面。
说到2020年,除了D55L以外,新款Bezza是否会在明年亮相也是大家相当关注的事。是的,我们预计这款小改款的A-Segment Sedan很快就会面市,它也许会是Myvi的特殊版,又或者是新的版本,目前还未可知。
可能大家会感到疑惑,新的Alza不会在明年亮相吗?根据Perodua过去的说法,该厂的能力是每年推出一款大改款车型和一款小改款车型,Perodua在今年只推出全新的Aruz和小改款Axia就是最好的佐证。由此看来小改款Bezza和D55L SUV的配额已经填满了Perodua在2020年的计划���所以我们预计新款Alza应该会在2021年上半年推出。
宝腾复兴之年,也是忙碌和丰收的一年
自与中国浙江吉利集团“联姻”以来,来自中国的汽车专才,现任宝腾首席执行长李春荣博士走马上任已经超过两年了。今年的宝腾非常忙碌,也非常充实,而且收获满满!在吉利的技术输送推动之下,宝腾为其复兴计划设定了非常高的目标,那就是重返大马第一,东盟第三;最近的目标是在2019年结束之前,销量突破10万辆。
看回宝腾今年的表现,最重要的依然是旗下首款SUV,Proton X70。这款新车在2018年12月推出,2019年才开始满满在路上普及。回想过去,X70在发表之前就像是一个永无休止的预告片/预览活动,当时有关它的消息可以用铺天盖地来形容,这是宝腾的市场策略。
丰富的配备、豪华的内饰和极具竞争力的价格是X70的优势,X70将在2020年继续发挥其魅力。我们都知道这款C-Segment SUV已开始在本地组装(CKD),但目前还未发布(传明年1月发布),CKD的X70是宝腾位于Tanjung Malim组装厂扩建之后第一款在当地投产的产品,该工厂的建立耗资了12亿令吉。
目前我们已经知道的是,CKD X70的外观预计将保持不变,也就是说它并非早前在中国上市的博越Pro,而且它将继续搭载1.8升的涡轮增压汽油引擎,而非早前流传的1.5升三缸涡轮引擎,唯一比较大的变化是它的变速箱将改换新的七速双离合器,取代现款的六速自排。
X70无疑是宝腾产品阵容中定位最高,而且是该品牌进入高端市场的新标向。在这之前,宝腾大部分的销量都是来自于价格更实惠的“原始Proton汽车”,值得注意的是,这些车款(包括Persona、Iriz、Exora和Saga)在2019年统统都已经更新了。是的,一年内连续为四款车升级!
Perosna和Iriz小升级的消息(谍照)是在今年的2月份开始传出,并于4月23日推出。小升级后的新车追加了一些配备,主要是源自吉利的GKUI多媒体信息娱乐系统主机,而这个主机还支持‘Hi Proton’声控系统。同时,新车也大幅降低了原售价(Iriz降低高达RM4.1k、Perosna降低高达RM5k),同样的手法后来我们也在Exora和Saga上看到。
另外,宝腾另一款在2019年非常重要的车型是于8月发布的小改款Saga。小改款后的Saga可以说是诚意满满,不但换上了家族式最新的设计语汇(Infinite Weave格栅),而且它还追加了LED日行灯、���浮式的触控屏幕、重新设计的仪表板,以及品质更好的织物包覆座椅。不但如此,宝腾还摒弃了过去遭人诟病的CVT变速箱,改为四速自排变速箱,更重要的是,它的价格也非常漂亮。
结果宝腾的手段马上获得了积极的响应,在最新的业绩报告上,Saga为该品牌的综合销量贡献了70%之高。这款A-Segment Sedan自今年8月推出以来就累积了超过3万5,000张订单,连续三个月突破4,000辆销量;另一方面,X70则贡献了总销量的19%。如此一来,这两款宝腾在2019年推出的重要产品就占据了总销量的90%。
谈到了总销量,宝腾在今年首10个月内的综合销量为79,423辆,抛离了Honda的71,489辆,守稳了老二位置(Perodua销量为201,562辆)。对比去年同时期,宝腾的销量只有54,326辆,排在第四位,所以毫无疑问,它的进步是巨大的。
按照目前的局势来看,Perodua第一、宝腾第二、Honda第三,在年底之前这样的排名应该是没有悬念了;此外,宝腾也预计可在今年恢复盈利,证明了宝腾复兴可期。
除了产品和销量,在9月时,宝腾还发表了全新的LOGO和标语‘Inspiring Connections’(激励人心的联系),寓意着Proton这个曾经多次经历低潮的国产车品牌浴火重生!明年,CKD的X70将成为首款采用新LOGO的宝腾汽车。
另一方面,其它对宝腾来说具有新闻价值的还包括了宝腾将漂洋过海,进军南亚市场,在巴基斯坦设立新的宝腾组装厂,如无意外这间宝腾在海外市场上的首座组装厂将会在2020年底开始营运。
此外,还有Proton X70在文莱市场上市、Proton 1 Tank Adventure活动,以及最近Proton R3车队在雪邦1000公里耐力赛包揽前二名,实现三连霸的佳绩。
看完了2019年,我们对2020年的宝腾有何期许?首先,可以肯定的是CKD的X70;另外,当然还少不了人们都相当期待的宝腾B-Segment SUV X50。据悉,这款基于吉利缤越打造而来的新车将会在2020年第三季亮相。
如果消息属实,那么Perodua的D55L SUV和Proton X50之间的角力,必然会是2020年的重头戏!但实际上,这两款SUV的尺寸和定位都不同,从表面数据来看,Daihatsu Rocky的尺寸和引擎排气量都比吉利缤越小,所以预计Perodua D55L在定价上会比较有优势。
Anyway,宝腾的掌舵人李春荣博士已经表示,现在开始,宝腾的对手已经不是Perodua了,而是日系的Toyota和Honda,因此预计X50将会在B-Segment SUV的细分市场上展现出其配备和品质上的典范,我们拭目以待!
本地国产品牌的“第三者”,DreamEdge!
自希望联盟上台执政以来,有关第三国产车(NNCP)的讨论一直甚嚣尘上,这是首先敦马哈迪亲手策划的项目。2019年8月9日,政府任命了私人界企业DreamEdge为新国产车的主导公司,这是一家位于Cyberjaya的大马数位工程服务公司。
尽管如此,当时在DreamEdge总部举行的发布会上,DreamEdge并没有为媒体提供具体的详细资料。我们从贸工部长Datuk Darell Leiking和DreamEdge首席执行长Khairil Adri Adnan那里得到的一切都是,首款车型将是“大尺寸的B-Segment Sedan”、由传统的内燃汽油引擎或混合动力总成提供动力、将与Daihatsu合作,由后者提供技术支持(不涉及任何股权),并且通过合约制来造车。
另外据称,DreamEdge将在2020年3月展示这款新国产车计划下的第一个原型车,最终量产的产品将会在2021年3月亮相。直到不久前,我们又听到有关新国产车计划的最新消息。
根据Affin Hwang Investment Bank拜访该计划主导公司DreamEDGE后所得的消息,新国产车最快也要等到2022年上半年才会推出,而且这整个计划的投资额预料将会突破10亿令吉。
据悉,目前DreamEDGE管理层正积极与多方讨论资金问题,惟涉及Daihatsu的动力总成和平台(底盘)方面的成本已最少需6亿令吉,这还未包括设立经销网络、生产活动前的其它准备成本。
根据Affin Hwang从DreamEDGE管理层得知的消息,新国产车将会是在价格上具备竞力的B-Segment车型或房车,待新车推出市面之后,预计首年每月的销量至少为3,000辆。
Affin Hwang还透露,新国产车将搭载传统的内燃引擎或Hybrid油电混动系统,且DreamEDGE公司也强调,新车不会是Daihatsu的“再版”。无论如何,该行认为,基于90%为本地零件,新国产车的价格将具备竞争力。
其实我们真的需要另一家国产汽车品牌吗?这绝对是值得我们去探讨的课题,但政府的立场是诸如新国产车之类的工业计划将为我国带来不少好处,其中包括推动国人学习工程科技技术等。嗯,这听起来很美好,但最好不要拿我们人民所缴交的税收来投注这项计划。
什么是飞行车?
最后,这是一辆跳脱我们的三观,不是常人所能了解的“汽车”,严格上来说它不是汽车,而是飞行车!“飞行车”这个词在过去一年中经常在新闻上出现,这个项目是由企业发展部长,又称飞行车部长Datuk Seri Mohd Redzuan Md Yusof所推广,在某种程度上,它已成为飞行车的代名词,他就是飞行车,飞行车就是他!
从本质上来看,飞行车是一种能够载人的大型无人机,从技术上来看,“飞行车”这词可能没有错,但是却引起了一些混乱和嘲讽。其实飞行车这种想象中的科幻场面并不会很快发生,城市空中交通(Urban air mobility,简称UAM)的定位介于商业和工业之间,其实就像直升机一样,但它们采用多叶片和电池,不需要燃料。
今年3月,由企发部长提倡,疑似大马首款飞行车概念模型曝光,一度被国人嘲讽为KDK风扇。没错,我们说的正是在2019浮罗交怡海空展上亮相的Vector,这是大马公司Aerodyne与其日本合作伙伴共同开发的产物。
根据该公司发言人Imtyaz Mohd Azzat表示,Vector可承载的最高��量为200公斤,距离地面飞行最高为50公尺。同时,它是采用四具电动马达来驱动,及锂离子电池来供电,其最高时速可达60公里/小时,最大续航里程(飞行时间)为30至90分钟。Imtyaz Mohd Azzat还说,很多人认为它是飞行车,但更确切来说,它是一部无人机概念车,专为载客,货物运输和监视目的而设。
看回最近的新闻,Mohd Redzuan曾高调表示准备试乘飞行车,但最后却出师不利,皆因大马民航局(CAAM)拒绝允许有关飞行车试飞。当然,有关飞行车并不是Vector,而是来自中国广州智能自动驾驶飞行器科技公司亿航的产品,EHang 216客运无人机,或称Super Dron。
据称,EHang 216采用了AI人工智能技术,并且能够在距离地面300米的高空上飞行,最高时速可达130公里/小时,最大续航里程达110公里。它坐舱只采用两人座布局,而在座舱车身外的周围还有多个上下两层的双叶片旋浆,可承受的飞行重量最多为600磅。
新闻还提到,涉及有关项目的共有三家公司,其中分别为大马的EastCap Bhd,以及中国的EHang Intelligent Equipment(Guangzhou)和Strong Rich Holdings Limited;根据报道,EastCap Bhd的掌舵人是Datuk Seri Zakwanhafiz Ahmad Ansari。
上述两家中国公司是EastCap的策略合作伙伴,三家公司将联手在本地进行销售、营运和维修保养工作。据报道,EastCap已同意将1,000辆Super Dron出售给印尼,同时该公司也计划在马来西亚设立组装厂,年产能为1万辆。
回顾2019,展望2020年本地车坛发生的大事!Proton 与 Perodua 齐唱丰收,前景看俏;新国产车与飞行车搅局? 光阴流逝,2019年已来到了尾声,如今距离2020只剩下不到两周的时间。在这一整年下来,大马车坛其实发生了很多事情,在这里我们paultan.org将带大家回顾今年那些关于本地汽车业的“大事”! 当然,回顾之余,我们也展望2020年,所以我们顺势预测了一些明年“可能会发生的事”。首先,让我们从大马国产品牌开始谈起吧!Let’s Go! 近年来,在中国巨头浙江吉利集团的推动之下,宝腾可以说是一天比一天好,显然地宝腾已走在了复兴的正轨上,准备好冲击销售冠军宝座,重返大马第一。尽管如此,这并不代表本地市场“一哥”Perodua的地位摇摇欲坠。 其实Perodua一直也在努力,而它的销量表现就是最好的回报和证明。虽然宝腾来势汹汹,但Perodua的销量仍处于稳健增长当中。你以为宝腾崛起,人们就不买Perodua了吗?不!下面的图表就是佐证。 五年前,非国产品牌在马来西亚汽车市场上占有更大份额 假设大马汽车行业的总量(TIV)保持不变,那么宝腾与Perodua的销量增长明显是来自于非国产品牌的流失,这与几年前的情况南辕北辙。宝腾现在已经从Honda手上夺回了“老二”的位置,而且如无意外的话,宝腾的势头应该会继续维持下去,直到实现重返大马第一,东盟第三的目标为止。 但其实宝腾要重返大马第一绝非易事,请相信我们,Perodua绝对不会那么轻易就被宝腾攻陷。目前Perodua方面看似没有什么重大消息,但别忘了这家汽车制造商向来都很低调,我们不知道它的背后还有什么“大招”还未施展,所以不可小觑。 当然,除了上面这两个名字以外,2019年本地车坛其实还有很多事值得我们去讨论的,比如说新国产车计划、以及被国民(包括小编)冷嘲热讽的飞行车计划。事不宜迟,马上进入正题! Perodua很少说话,但却卖得很多 在2019年开年的首三天内,宝腾和Perodua的差距就已经一览无遗。根据过去的传统,因为绝大部分消费者会选择在年终优惠的时机买车,所以年头一般都是许多车企的“空窗期”,但Perodua Aruz的面市却打破了传统,在没有预先大肆铺张宣传/预告,和用数个月时间来收集订单的前提下,Aruz在发布后的短时间内就累积了上万张订单,可以说是一鸣惊人。 Aruz也是Google今年最热门的汽车搜索字眼。这款七人座SUV(实际上是MPV)的售价高达RM 77,900,是Perodua近年来最市售昂贵的汽车(短时间的CBU Nautica是唯一的例外)。 事后看来,Perodua根本就不用担心这一环,因为许多大马人在Aruz上看到了良好的价值。除了车身尺寸比一般Perodua汽车更大之外,相对于它的同级竞争对手,比如说Honda BR-V,它的外型和安全性更占优势。
0 notes
gozealouscloudcollection · 6 years ago
Text
拜拜虛擬機,全面深度解密華為方舟編譯器
訪問:
華為商城
2017年5月的一個凌晨,華為某實驗室裡,方舟編譯器上第一個Java程序“Hello, World”跑通了。
當時項目組的一位工程師就哽咽了:“I never thought printing ‘Hello, World’ would be this hard .”(我從來沒想到打出“Hello, World”會如此艱難。)
十年前華為啟動編譯組到這一刻,初見曙光。
2019年4月,華為方舟編譯器正式面世!
今天我們聚焦華為新貴——方舟編譯器,這個一發布就引起巨大響動的底層核心技術。
它為什麼能擁有和世界對話的榮光?
它承載著怎樣的使命?
它能否做到傳說中的“出於安卓,勝於iOS”?
1. 機器的“原力覺醒
這個故事,先從計算機的語言說起。
事實上,人類文明中最早出現的文字就是數字,比完整表意的文字早500-1000年。
隨著人類社會的發展,社會結構開始變得複雜,徵稅必須先收集國民收入、財產、付款、欠款、債務、罰款等數據,遠遠超過人腦的記憶系統。於是,數字誕生了。
5000年前,蘇美爾人文明(今科威特及鄰近地區)以6和10作為基數,用符號表達1、10、60、600、以及3600。今天,我們仍然常見以6為基數的數字,例如圓有360度,一天有24小時。
而另外一種叫安第斯文化(主要在今天的南美地區),則用“結繩語”記錄數字,管理稅收等財務數據長達數百年甚至數千年。就算西班牙人佔領南美之後,還在相當一段時間內用結繩語來管理他們建立的新帝國。
這就是人類最早的語言,雖然不能完整傳遞口語,也無法寫詩,但是記賬收稅效率一流。
公元8世紀,印度人發明了數字0-9,這種十進制的數學符號讓數據存儲和處理的效率一日千里,成為人類文明重要的里程碑,奠定了現代數學基礎。後因阿拉伯人將其發揚光大並傳入中東和歐洲,所以大家稱之為“阿拉伯數字”。
還有一種文字系統——“0”和“1”的二進制,是人類文明另外一個重要的里程碑,被廣泛應用在現代計算機領域中。此外,我們喜歡的音樂、我們熱愛的電影、我們拍攝的照片,今天都是通過這種二進制的數字來進行“重現”,包括記錄、存儲、傳播和分享。
人類通過0和1開啟了機器“文明”,從此科學革命的進程就像安裝上了“火箭”。
那為什麼計算機使用的是二進制呢?
這個故事得回溯到大英帝國的航海時代。
早在17世紀,英國借助強大的經濟實力和海軍力量擁有了眾多的殖民地,建立了全球霸主地位。艦隊使用的航海表計算複雜,人工計算的數據經常有誤,百年間導致大量的船隻觸礁沉沒。
直到第一次工業革命爆發,英國政府找到了數學家巴貝奇(Charles Babbage)來修正航海表。巴貝奇通過十年的努力,研製成功了“差分機”。用蒸汽機時代的機械齒輪來存儲計算過程中的數據,大大提升了航海表數據的計算速度和準確率。
同期,他開始了另外一種新機器——分析機的設計。在開發分析機的過程中,巴貝奇冥思苦想,發現乘法是加法的重複,除法是減法的重複,減法可以用加法來代替,這樣就只要設計一個加法運算器即可。基於這種假設,計算機器只需要具備兩個功能即可運作:
1)判斷兩個數的大小;
2)不斷重複執行加法計算。
所有的運算轉化為最簡單的判斷和計算,1表示Yes(開),0表示No(關),計算機用0和1不斷重複計算。這就是計算機使用“0”和“1”二進制語言的理論基礎。
值得一提的是,巴貝奇發明分析機不久之後,英國數學家喬治·布爾於1854年發表了“布爾代數學”,提出了邏輯學的二元運算,為現代電子計算機提供了另外一個重要的理論基礎。
回到分析機,巴貝奇借鑒了法國紡織機上使用的穿孔卡片。卡片上的孔眼排列,控制紡織機的梭子,能夠不斷重複的織出各種各樣美麗圖案的布匹。巴貝奇在著名詩人拜倫之女Ada Lovelace的幫助下,發現穿孔卡片不僅可以用來記錄數據,還能用來控制機器工作的指令。在卡片上打上不同排列的孔,機器便有不同的工作程序,這就是現代計算機的軟件設計思想。
基礎研究與基礎教育是產業誕生和振興的根本。這也是為什麼今天的英國,仍然在數學和通信領域擁有非常廣泛的影響力。
1884年,美國統計專家赫爾曼·何樂禮(Herman Hollerith)借鑒穿孔卡原理髮明了電動製表機,用於美國人口統計,與巴貝奇的分析機具有異曲同工之妙。他把所有需要調查的項目依次固定在一張硬紙卡上,然後將統計的居民個人信息在相應位置打孔,用來表示“Yes”。當統計機器的探針撞到卡片上的“孔”,就會接通電流,計數裝置往前進一個刻度。何樂禮博士正是採用了二進制的原理,來高效統計美國人口信息。
我們今天使用的答題卡,就採用了這種原理。
何樂禮博士隨後創建了製表機公司,也就是赫赫有名的IBM公司的前身。
1935年,著名的現代計算機科學之父和人工智能之父,艾倫·圖靈提出了著名的圖靈機模型,為現代計算機的邏輯工作方式奠定了理論基礎。
1937年,美國哈佛大學著名計算機專家霍德·艾肯在IBM公司的資助下,借鑒上面提到的英國數學家巴貝奇的分析機理論,於1944年研製成功世界第一台機電計算機—— Mark-I型。 IBM把這台計算機送給了哈佛大學,並一直使用到1959年,為培養早期的計算機科學家做出了巨大貢獻。
另外一位學者就沒有這樣幸運了。美國愛荷華州立大學理論量子物理學的約翰·阿塔那索夫(John Atanasoff)副教授,苦於沒有機器能夠計算出量子物理中許多變量的求解。同樣是在1937年,他尋求IBM公司的資助,但被斷然拒絕,於是他橫下決心一定要研製一台更好的計算機器。他利用當時正在發展的真空晶體管,用電子脈��來表示“0”和“1”,並在電氣工程專家克利福特·貝瑞(Clifford Berry)的幫助下,兩人於1940年底研製成功了世界第一台電子計算機,並用兩個人的名字將其命名為ABC(Atanasoff-Berry Computer)。
阿塔那索夫開闢了一種計算機的全新路徑,為現代電子計算機的架構奠定了不可磨滅的基礎。今天的華為在內部強調研發上要多路徑突破,或許也曾受此啟發。
1940年底,他結識了美國物理學家莫克利(JohnW.Mauchly)。莫克利在了解和參觀了ABC計算機後,聯合賓夕法尼亞大學莫爾學院的電氣專家艾克特(J.PresperEckert),在國防部的資助下和馮·諾依曼博士的指導下,於1945年研製成功了世界第一台通用電子計算機ENIAC。雖然這台計算機採用的是十進制,但當時毫不影響它的計算能力,它大大縮短了美國“曼哈頓計劃”的原子彈研發時間,加速了二戰的結束。
(1945年6月,馮·諾依曼將ENIAC電子計算機的十進制改回成二進制,並提出計算機內部存儲器存儲程序的概念,從而奠定了現代電子計算機理論的架構。
0和1這種極簡的語言設計,像給計算機注入了永遠在生長的“原力”,帶來了無限的可能。與通信領域IP路由理念具有異曲同工,就像“看不見的蒸汽機”,用最簡單的理論架構開啟了一個全新的偉大產業。
2. 軟件王國的“四大明珠
實際上,在電子計算機誕生之前,計算機這個角色是由女人來扮演的。這些女人被稱為Computers,大多數計算都是她們手工完成的。
世界第一段程序,是上面提到的巴貝奇的師妹著名詩人拜倫之女Ada Lovelace在打孔卡上寫出來的。程序設計人員都要把程序編排成010101這樣的形式,在紙上打孔,再送到機器裡去讀。這減少了相當多的工作,寫一個卡片能使用相當久,也避免了重複造輪子。
因此,當程序員開始在卡片上寫這些程序時,人們開始構建程序庫(libraries)。隨著時間的推移,大部分的程序漸漸的有了一些規則手冊來指導編寫。但還是很繁瑣,畢竟編寫和記憶0和1的各種組合,對於很多人來說相當於是“天書”。
一個傳奇的人物出現了。
美國海軍的傳奇天才格雷斯·霍珀(Grace Hopper),在海軍服役時,曾被派到哈佛大學,與艾肯博士一起工作,負責為美國國防部資助的Mark-II型機電計算機編製程序。在二戰結束後,她加入了發明ENAIC電子計算機的莫克利和艾克特創辦的“電子控制公司”,開始了她改變世界的光輝旅程——打開編譯器和編程語言的新世界。
Grace在加入莫克利和艾克特的公司,便產生了一種想法。她想設計一種程序,讓人可以用類似英文的語法,把想做的事寫下來,然後用這個程序把英文翻譯成機器能執行的語言,交給機器去執行。
她把這個革命性的想法付諸實踐,發明了世界上第一個編譯器A-0。這是編譯器的始祖,也是現代編程語言的始祖。
1952年,Grace和莫克利研究出了一種較為接近自然語言的計算機語言——彙編語言Flow-Matic。彙編語言本質上是使用助記符來代替機器語言01010101,進了一大步,但這種語言對計算機硬件依賴很大。不同的計算機,彙編語言不相通。
IBM公司在1946年後從製表機全面轉型電子計算機市場,並投入巨資招攬了世界眾多頂尖的計算機人才。其中一位叫約翰·貝克斯(John W. Backus),這位出身證券經紀人家庭的富二代,酷愛數學,加入IBM公司三年後,發明了一種快速編程的FORTRAN語言。同時,他深入研究了Grace發明的Flow-Matic的編譯器,應用到FORTRAN的編譯器中。
FORTRAN的問世,在計算機史上具有劃時代的意義。它是世界第一個高級編程語言,使計算機語言從原始的低級彙編語言走到人人易懂的境界,計算機不再是科學家的專利**。 **FORTRAN的誕生,孕育了軟件產業。此後,計算機高級編程語言進入蓬勃發展的時代。
隨後,IBM公司開發出了的ALGOL高級語言,人工智能之父約翰·麥卡錫(John McCarthy)發布了人工智能設計語言LISP,Grace奶奶也在Flow-Matic彙編語言的基礎上開發了COBOL語言。
FORTRAN適合科學計算,ALOGOL適合事務處理,LISP適合人工智能計算,COBOL適合商業處理。這四種高級語言雖然比彙編語言更簡單,但對於非計算機專業人員,編程仍難度較大。於是,Dartmouth學院的兩位教授聯手開發一種更簡單的編程語言BASIC(初學者的全方位符式指令代碼)。這是一種不需要編譯的語言,只需要經過解釋器執行即可,初期的Android智能手機軟件借鑒了這種機制。 BASIC語言也是目前被廣泛使用的Visual Basic語言的鼻祖,目前在微軟Excel的“宏”中可以直接使用。
美國編程語言的開發熱潮你追我趕,其他國家也不甘示弱。
1963年,英國劍橋大學推出了CPL語言,後又推出了簡化的BCPL語言。
1970年,美國貝爾實驗室的肯·湯普遜(Ken Thompson)和丹尼斯·利奇(Dennis Ritchie)在BCPL語言的基礎上,推出了更加簡單的B語言(取BCPL第一個字母),後又簡化出了C語言(取BCPL第二個字母)。這是目前世界上最常用的編程語言之一,甚至可以說是第一大編程語言。
C語言之後,誕生了很多著名的語言,包括:
C++:1983年正式發布。由貝爾實驗室基於C語言改良,所以C++是完全兼容C語言的。
Objective-C:1980年代發明。 1988年,斯蒂夫·喬布斯(Steve Jobs)在NeXT公司時買下了 Objective-C 語言的授權,後來成為蘋果公司MAC電腦和iPhone手機的程序設計語言。
Java:1995年5月發布。 SUN公司為了在電視機頂盒等電子產品智能化過程中搶占先機,解決跨平台的問題,所以開發了Java語言。但Java需要藉助虛擬機機制來解釋源代碼並調度硬件資源。安卓系統使用的基礎語言就是Java。
C#:2000年6月,由微軟發布。 C#與Java有著驚人的相似,也需要藉助類似於虛擬機的Framework來運行;不同的是,Java支持所有平台,而C#只支持Windows和Linux系統。
GO:谷歌在2009年發布。 GO語言主要用作服務器端和雲計算開發。
Swift:2014年由蘋果公司發布,可以和Objective-C語言混合使用。
其中,C/C++是編譯語言,即在程序員寫完程序後,通過編譯器直接編譯成機器碼,安裝到相應的硬件設備上即可直接運行。
Java/C#是預編譯語言,就是需要先在開發者環境中將源代碼(Source Code)轉換成字節碼(Byte Code),然後在設備上運行時再將字節碼編譯或解釋成硬件能聽得懂的機器碼。將源代碼轉換成字節碼的過程,就叫預編譯。
軟件王國還有兩個很重要的成員,就是操作系統和數據庫。
上個世紀60年代,計算機高級語言的發展為操作系統和數據庫的誕生培育了沃土。
1970年,貝爾實驗室B語言和C語言的開發者肯·湯普遜(Ken Thompson)和丹尼斯·利奇(Dennis Ritchie),開發出了世界第一個通用計算機系統——UNIX。現在大家熟悉的Linux和Mac OS就是類UNIX操作系統。
其中Linux可以運行在服務器和其他大型平台之上,如大型計算機和超級計算機,世界上最快的前10名超級計算機運行的都是基於Linux內核的操作系統。在移動設備上廣泛使用的Android操作系統也是創建在Linux內核之上。
隨著磁盤的發明,從磁盤隨機存取數據成為可能。 1961年,美國通用電氣公司成功地開發出世界上第一個數據庫管理系統(DBMS)——IDS(Integrated DataStore 集成數據存儲)。 1968年,IBM公司開發了IBM第一個數據庫系統IMS(Information Management System)。 IBM科學家的論文理論,成就了著名的Oracle數據庫。 IBM公司出品的DB2和微軟公司的MS SQLServer數據庫也成為當今數據庫領域重要的角色,目前在全世界已經廣泛應用。
高級編程語言、編譯器、操作系統和數據庫,被稱為軟件王國的“四大明珠”。
從上圖可以看出,為軟件底層貢獻核心技術的公司主要來自於歐美。華為通過多年持續的研發投入,讓我們終於看到了美國巨頭的背影。
3. 編譯器的前世今生
如果說計算機是汽車,那麼軟件就像汽車的操控系統一樣,是計算機的血液。
編譯器則是汽車發動機裡最核心的汽油燃燒技術,將軟件變成計算機的動力,其編譯性能和效率,直接決定了用戶的使用體驗。
如上文所述,最早的編譯器是Grace奶奶發明的A-0編譯器。
第二個被大規模應用的編譯器,則是和FORTRAN編程語言配套的FORTRAN編譯器。
目前主流使用的編譯器主要有下面幾種:
Windows系統
使用CL編譯器。它直接集成在Visual Studio或Visual C++的開發者環境中,一般不單獨使用。
Linux系統
使用開源的GCC編譯器。 GCC,由自由軟件運動的精神領袖理查德·馬修·斯托曼(Richard Matthew Stallman, RMS)在上個世紀80年代創立。它原本只處理C語言,後續擴展可以處理C++、Objective-C、Java等其他語言。 GCC被認為是跨平台軟件的編譯器首選。
蘋果Mac和iOS系統
最初使用GCC編譯器,現已替代為Clang + LLVM。
為什麼蘋果公司要換編譯器呢?
因為蘋果發現開源的GCC開發者根本使喚不動,他���不願意專門為了蘋果公司的要求優化和改進GCC代碼,所以蘋果將編譯器後端直接替換為LLVM(Low Level Virtual Machine,底層虛擬機),並且將讀研時(2003年)發明LLVM的天才少年克里斯·拉特納(Chris Lattner)招入麾下。克里斯進入了蘋果之後,大幅度優化和改進LLVM以適應Objective-C的語法變革和性能要求,同時發起了CLang項目來完全替代GCC。
今天,GCC + LLVM 已經被替換成了 Clang +LLVM。 LLVM負責編譯器後端,用來處理代碼優化和跨平台,而Clang負責前端,只需將程序源代碼轉換成LLVM可以看得懂的IR(Intermediate Representation,中間語言)即可。
另外,上文提到的Swift語言,則是這位天才少年克里斯為蘋果公司貢獻的第三個重要作品。
安卓系統
安卓主要使用預編譯的Java語言開發,最初版本通過虛擬機運行,不需要編譯器,後續版本加入了JIT和AOT編譯機制(下一部分將詳細展開)。
除了上述編譯器之外,還有兩個著名的編譯器值得一提。
Intel的ICC編譯器
ICC編譯器,全稱Intel C++ Compiler,是Intel開發的C/C++/Fortran編譯器套裝,適用於Linux、Microsoft和Mac OS X操作系統,廣泛應用於高性能計算、分佈式計算等商業計算領域。
SGI等公司推出的Open64編譯器
SGI(S代表超級計算機,G代表圖形工作站,I代表具有突破性的洞察力)生產的超級計算機,主要應用於巨大的實驗室,採用Open64編譯器。
4. 安卓的四大命門
交待完計算機和軟件的發展歷程,終於說到正題。
安卓系統從2008年1.0到今天的9.0,十來年間安卓系統大小版本超過15個,從2016年開始也在不斷融入了華為等手機公司發起的文件系統、人工智能學習、智能硬件調度和內存管理等底層創新技術,安卓手機的體驗已經今非昔比。
為什麼仍然還有很多人詬病安卓手機沒有iPhone流暢?安卓系統的程序是怎樣運行的?下面展開闡述一下安卓的四大命門。
解決安卓這四大命門,也是華為方舟編譯器的使命!
第一個命門
Java的“虛擬機”
前面提到,Java為了能夠實現跨平台操作,便藉助虛擬機來調度硬件平台資源。在虛擬機裡,還需要集成翻譯器或者編譯器,來將Java的字節碼(即中間代碼)解釋成機器聽得懂的機器語言,或者直接編譯成機器直接執行的010101的機器碼。
2008年,Android 1.0剛發布的時候,使用的是一個叫Dalvik的虛擬機,裡面集成了一個解釋器,每次用戶在安卓手機上運行APP時,就會叫醒這個解釋器,來給安卓的硬件解釋APP想要幹嘛。這就相當於新聞發布會,發言人講一句自己的母語,然後再由專業翻譯將其翻譯成外國記者聽得懂的語言,效率非常低下,一個���時可能也問不了幾個問題。
谷歌意識到這個問題嚴重拖了安卓手機的後腿,所以通過一年多的努力,在2010年中發布了2.2版本,引入了JIT(Just in Time,即時編譯)機制。 JIT比較聰明,當用戶在安卓手機運行APP時,會同時將用戶經常使用的功能編譯為機器能直接執行的010101機器碼,不用每一句每一句的去翻譯。當出現不常用的功能時,再把解釋器叫起來翻譯。
JIT雖然變聰明了一點,但是每次啟動APP都要先編譯一次,不能一勞永逸。加上Dalvik虛擬機性能比較落後,所以穀歌在2014年10月推出了Android 5.0版本,將虛擬機從Dalvik替代成ART(Android Run Time),同時把JIT的編譯器替代成AOT (Ahead of Time) 。意思就是說,APP在下載後安裝到手機上時同時把能編譯的代碼先編譯成機器聽得懂的101010。剩下不太好翻譯的代碼,就在用戶使用時再叫醒解釋器來翻譯。 AOT相比JIT的好處,就是不用每次打開APP都需要先編譯一遍。但是,壞處就是用戶安裝APP的時間有點長。
越來越多的用戶吐槽為什麼安裝一個APP也慢吞吞。於是,谷歌在2017年Android 7.0又做了一點改進,安裝時先不編譯中間代碼,而是在用戶空閒時將能夠編譯成機器碼的那部分代碼,通過AOT編譯器先靜態編譯了。如果AOT還沒來得及編譯或者不能編譯,再叫醒JIT+解釋器兩個難兄難弟來頂住。這種機制,相當於用時間換空間,既縮短了用戶安裝APP的等待時間,又將虛擬機裡編譯器和解釋器能做的優化提升到最大效率了。
很多人以為華為方舟編譯器就是Android 7.0的ART虛擬機,其實不然。
無論是編譯器還是解釋器,只是在虛擬機上打補丁。手機上的虛擬機+編譯器+解釋器本身不僅佔用硬件資源,還無法最大發揮軟件運行性能。正因如此,所以絕大部分手機廠商只能無奈的通過簡單粗暴提升安卓手機的內存和存儲空間,來彌補虛擬機的弊端。
這就是安卓的第一個命門,虛擬機先天不足。
第二個命門
Java的“原罪”——額外的JNI開銷
JNI,全稱Java Native Interface(Java原生接口),用來和C/C++等代碼進行交互。
目前95%的TOP應用都是使用Java和C/C++等多種語言混合開發而成。 Java和C/C++屬於兩種不同架構的語言,各有自己的使用規範。為了APP正常運行,它倆之間需要互通有無,這個互通有無的接口就是JNI。在數據訪問、函數調用、生命週期維護、異常處理等方面都需要這兩種代碼互相調用。這就意味著手機硬件資源要分配一部分給JNI去做調度。不僅佔用了硬件資源,而且這種機製本身就效率較低。
這便是額外的JNI開銷。
第三個命門
代碼優化空間有限
安卓虛擬機的編譯器受限於手機硬件和代碼優化模板單一,代碼優化空間有限。
編譯器包含三個部分。前端Front End,主要負責將源代碼翻譯成IR(Intermediate Representation,中間表示);中端的Optimizer主要負責代碼優化,將前端翻譯過來的IR代碼優化得更高效;後端Back End則將優化後的IR編譯成101010的機器碼。
為了防止生態過於碎片化,安卓只為第三方開放了簡單的編譯代碼優化模板,代碼優化空間有限。
第四個命門
Java現有內存回收機制易造成間歇性卡頓
當手機內存資源不夠用的時候,安卓虛擬機就會召喚GC(Garbage Collection)封鎖公路,讓所有手機運行的Java線程“Stop World”,全部暫停,等待它回收內存空間,避免“交通流量超載” 。這個GC機制,無法精確控制和乾預,用戶也無法把它去掉,所以性能比較差的手機還存在“間歇性”卡頓。
十餘年間,通過安卓系統的持續優化,以及內存的不斷加持,安卓手機構築了足夠流暢的用戶體驗。
但是安卓的四大命門,如同達摩克利斯之劍,懸在安卓廠商的頭上。華為科學家和工程師們,對此持續攻關了十年,只為再造安卓。
5. 十年方舟,再造安卓
沒錯,華為為此準備了十年。
2009年,華為啟動5G基礎技術研究的同時,開始創建編譯組,第一批海內外研究人員加入。
2013年,華為推出面向基站領域的自研編譯器HCC,並正式提出編譯器框架構想。
2014年,眾多海內外專家加入華為,方舟項目正式啟動。
2016年,成立編譯器與編程語言實驗室。
2019年,華為方舟編譯器正式面世!
這十年,每一次攻關都蘊含著華為軟件工程師們的傾力投入,每一個進展都值得銘記。
2017年5月,方舟編譯器上第一個Java程序“Hello World”跑通。
2017年8月的一個凌晨,在華為的一個實驗室裡,項目組已經連續數日24小時不間斷攻關,卻始終看不到success的返回信息。絕望之下,工程師把所有通信數據打印出來,逐個字節排查,最終發現有一處字節的順序不一致。糾正後,華為方舟跑通了第一個安卓後台服務DiskStatus,這標誌著對安卓的換心手術進入了實操階段。
2018年春節前一周,方舟編譯器跑通安卓系統所有後台服務,並成功移植到手機。當晚,所有人聚集在實驗室的機房中,等待首個開機畫面加載成功的神聖時刻。秒針滴答,如同過了一個世紀那麼久,屏幕終於點亮。
歡呼,擁抱,一蹦三尺高,項目組成員們到底沒忍住,留下了激動的淚水。
接下來,項目組在除夕前夜啟動了方舟編譯手機的Beta測試。大年初一清晨,總架構師發來了第一條經編譯器編譯的運行程序發出來的拜年消息:
春節快樂,方舟大吉!
當P30發布會上“方舟”甫一出現,就在中國軟件行業“炸”了鍋。無數軟件從業者從一開始的質疑,到弄清方舟真相後的驚嘆……這些都是對華為軟件工程師們十年如一日、一點一滴“啃硬骨頭”的致敬!
實際上,方舟已經不是傳統意義上從高級語言到機器碼的“萬能翻譯”,更是一個編譯運行系統。
一方面,方舟編譯器首次在Java領域將虛擬機幹掉了,也是軟件史上首次將Java/C/C++等混合代碼一次編譯成機器碼直接在手機上運行,徹底告別Java的JNI額外開銷,也徹底告別了虛擬機GC內存回收帶來的應用進程掉線,使操作流暢度大幅提升。如果說目前最新的安卓系統是和諧號動車,那麼經方舟編譯的安卓系統便是高鐵,是“復興號”。
華為手機直接通過方舟編譯器替換了Android system-server的所有後台服務,這一項就已經足夠讓華為EMUI比其他安卓系統更快一步。根據華為官方測試,方舟編譯器提升手機系統操作流暢度高達24%,系統響應性能提升44%。入手P30系列的用戶,應該已經體驗到了。
另一方面,方舟編譯器用空間換性能,直接將編譯器的代碼優化搬到了開發者環境,不再被手機端的硬件資源所限制,為代碼優化提供了無限可能。
此外,經測試,新浪微博極速版APP經方舟編譯後,操作流暢度提升高達60%。
解決安卓的四大命門,出於安卓,勝於安卓,超越iOS,並且全面兼容安卓,這就是華為方舟編譯器的使命!
6. 生來就是要幹掉虛擬機
方舟編譯器從立項開始,就是要徹底幹掉虛擬機。這在歷史上,是從來沒有人做過的。
SUN公司當初發明Java語言,就是藉助虛擬機的這個“萬能中轉站”,屏蔽掉各種硬件的差異,方便同一個代碼在多個平台運行,所以Java是目前最流行的高級編程語言之一。這麼多年,從來沒有人能夠幹掉虛擬機,說明難度非常之大。
那麼方舟編譯器,是如何完全乾掉虛擬機的呢?
最關鍵的就是要能夠將Java代碼直接編譯成010101的機器碼。
這種設想在理論是可行的,但是從現實來講太難了。歷史上有過一些嘗試,比如現在大行其道的安卓ART虛擬機。這些嘗試能夠提前翻譯Java語言裡很多的靜態語義,但是多數的動態語義,仍然搞不定,還得交給虛擬機。
所謂靜態語義,我們可以理解為確定的語言和意思,比如“我是張三”。而動態語義,則需要結合上下文去理解,比如“能穿多少就穿多少”,到底穿多還是穿少,要看是冬天還是夏天了。例如大家熟悉的微博、京東等APP的開屏廣告就需要用到動態語義。像編譯靜態語義一樣去編譯動態語義,很多知乎大神認為根本就不可能。
為了這個目標,華為軟件工程師們對自己苛求再苛求,這裡涉及到大量的細節,從對像模型的設計,到每一個bit的用途、每一個對象的元數據metADATA(描述數據的數據)每一個編譯優化的設計,都經過了無數次的激烈討論和推倒重來。
最終,方舟編譯器通過編譯階段和運行階段的雙向加持,將靜態編譯動態語義最大的兩大難點一一解決:一是設計數據模型,二是如何在運行時高效獲得動態信息。方舟編譯器團隊基本遍歷了Java的動態語義,進行了大規模的數據建模。同時,大大提高了編譯時動態語義分析的精度,特別是涉及跨語言調用時;另外,華為設計了一套具有核心專利的動態語義匹配機制,有效降低了運行時動態語義的開銷。
正是因為這兩大難點的突破,讓方舟編譯器能夠將Java代碼編譯成機器能直接執行的語言。經過華為方舟編譯器的APP,再也不需要在手機上編譯了,徹底告別了虛擬機,從而帶來了媲美甚至超越iOS的安卓體驗。
7. 代碼“萬國通”
95%的Top應用都是Java/C/C++等混合語言編寫而成。方舟編譯器的第二個使命,就是乾掉混合語言互相調用帶來的JNI開銷。
華為方舟編譯器團隊基於多個編程語言的深刻理解和大量研發積累,將混合語言破天荒實現了統一的中間表示IR,這就相當於同一個人能夠理解全世界的語言,所以我們把這個革命性突破叫做,代碼“萬國通”。
那麼方舟編譯器是如何使用統一的IR來表示各種語言呢?
IR是用來表示代碼的數據結構,它是編譯器的各模塊以及相關工具之間用來傳遞信息的“協議和通用語言”,也是程序變換和編譯優化各種算法的承載體。它是編譯器的“大腦”,直接決定了編譯器的最終效果。它的難度是最高的。
華為方舟編譯器團隊對IR進行了長達五年的精雕細琢,逐漸摸索出“大腦”裡每一條神經、每一個神經元的信號規律,並在此基礎上發明了一套核心專利,使得不同語言代碼在開發者環境中能夠統一編譯成同一套可直接執行的機器碼,從而徹底消除混合語言互相調用的開銷。
8. 給代碼裝上飛機發動機
除了IR,編譯器還有一個非常重要的價值,就是代碼優化。
華為方舟編譯器,直接將代碼優化從手機環節搬到了開發者環境,未來還可能搬到雲端。利用開發者環境更強大的算力,可以實現更先進和精細的優化算法,來達到更強大的優化效果,在很多特定場景代碼優化的提升甚至是顛覆性的。
這相當於給APP在方舟裡裝上飛機發動機,讓你的APP運行如飛!
值得一提的是,開發者使用方舟編譯器,並不需要改變原來的編碼習慣。開發者可以自行開發代碼優化算法,也可以僅通過方舟編譯器預置的算法進行代碼優化。未來,華為還將提供代碼調優工具,開發者可以選擇根據工具的優化建議來調整代碼,和方舟編譯器���合獲得更優的執行效果。
可以想像,未來廣大APP開發者使用方舟編譯器後,消費者們的體驗將達到一個前所未有的高度。這對於整個安卓生態,都是一件前所未有的幸事!
9. Stop World,安卓卡頓再見
方舟的第四個使命,就是解決安卓虛擬機GC內存回收帶來的“Stop World”。
目前安卓手機內存資源不夠用的時候,GC直接叫停所有應用,所以偶爾會遭遇莫名卡頓。
方舟編譯器採用了引用計數法(RC,Reference Counting)來進行內存的實時回收,並且配合使用了專門的消除環算法(消除對象���相引用帶來的無法回收問題),來避免GC集中式回收帶來的系統卡頓。相比GC,方舟的內存回收是實時的而非集中式的,且不需要暫停應用進程,這樣便大大消除了卡頓。
如果把內存回收比作成打掃房間,那麼GC的策略是專門有一個衛生員,看房間裡垃圾太多了,就把所有人請出去,打掃完了再讓大家回來。而方舟的RC則是每個人收拾自己的垃圾,用完就清理,保持清潔的同時不影響人的正常活動。
軟件有一個大家很熟悉的死循環,就是電腦被一個無限循環的運行程序把計算機資源佔光。
這種“死循環”在軟件中叫“環引用”。為了從機制避免手機內存被環引用“吃掉”,方舟編譯器引入annotation的“告警”標示,對基礎類的環進行標註。當然,Java程序員也可以對業務代碼中的環進行標註。經過豐富的實踐驗證,方舟這種機制可減少大部分程序中環的出現。
另外一方面,方舟編譯器在運行狀態下引入了高效的環回收機制,允許有選擇的智能回收某個APP的內存佔用,這對傳統的環回收算法是一個非常棒的改進。
Stop World,安卓卡頓,再見!
正是因為方舟做到混合語言的統一中間表示和完全靜態編譯,它幹掉了虛擬機,消除了JNI開銷,告別了GC內存回收的“間歇性”卡頓,以及其他很多開銷。同時,為開發者進行代碼優化提供了一個更廣闊的舞台。
華為很快將全面開源方舟編譯器,屆時開發者們可以使用方舟編譯器作為開發工具,為移動應用生態和體驗打開一扇全新的大門。
科技的進步,離不開全球無數科學家和工程師的奉獻。產業的繁榮,開放是唯一出路!
最後,以Linux 的創始人Linus Torvalds的名言結尾!
Talk is cheap. Show me the code!
空談誤國,實幹興邦!
> 文章轉載自:首次全面深度解密華為方舟編譯器
.(tagsToTranslate)Huawei 華為(t)拜拜虛擬機,全面深度解密華為方舟編譯器(t)kknews.xyz from 拜拜虛擬機,全面深度解密華為方舟編譯器 via KKNEWS
0 notes
i-buy · 7 years ago
Text
入門機起秋首選。Oylmpus E-M10 Mark III Review 開箱文
系列:Olympus OM-D系列 E-M10 Mark III
0 notes
oua-ap · 8 years ago
Text
[Sample]サウンドビジュアライザ
Tumblr media
音声再生
DOVA-SYNDRAME https://dova-s.jp/
上記のサイトのBGM・ジングルのページから音声フィアルをダウンロードしてください。授業外で使う場合は、ライセンスをよく確認してください。
メニューから、[Sketch(スケッチ)] > [Add Sketch(スケッチに追加)]を選び、音声ファイルを追加します。次のコードを実行し、音声を鳴らしてみましょう。
import processing.sound.*;//ライブラリの読み込み SoundFile soundfile;//音声ファイルを保持するための変数を定義
void setup() {  size( 800, 600 );  soundfile = new SoundFile(this, "ファイル名");//音声ファイルの読み込み  soundfile.loop(); }
void draw() {  background(255); }
FFT
サウンドファイルの波形を周波数帯域別に分けてグラフ化します。
Tumblr media
import processing.sound.*;//ライブラリの読み込み SoundFile soundfile;//音声ファイルを保持するための変数を定義
FFT fft;//高速フーリエ変換(FFT)をするオブジェクト int bands = 512;//周波数を幾つに分割するか float r_width;//棒グラフの幅
void setup() {  size( 800, 600 );  soundfile = new SoundFile(this, "ファイル名");//音声ファイルの読み込み  soundfile.loop();
 fft = new FFT(this, bands);//FFTを行うオブジェクトを生成  fft.input(soundfile);//音声ファイルのデータを与える
 r_width = width/float(bands);//棒グラフの幅を計算 }
void draw() {  background(255);
 fft.analyze();//FFTを実行  for (int i = 0; i < bands; i++) {    float level = fft.spectrum[i];//それぞれの周波数のレベルを取り出す    line( i*r_width, 0, i*r_width, level*height );//棒グラフを描く  } }
放射状にする
周波数帯域別のグラフを円形に並べ、グラデーションで色を付けます。
Tumblr media
import processing.sound.*;//ライブラリの読み込み SoundFile soundfile;//音声ファイルを保持するための変数を定義
FFT fft;//高速フーリエ変換(FFT)をするオブジェクト int bands = 128;//��波数を幾つに分割するか float r_width;//棒グラフの幅
void setup() {  size( 800, 600 );  colorMode( HSB, 360, 100, 100, 100 );  soundfile = new SoundFile(this, "ファイル名");//音声ファイルの読み込み  soundfile.loop();
 fft = new FFT(this, bands);//FFTを行うオブジェクトを生成  fft.input(soundfile);//音声ファイルのデータを与える
 r_width = width/float(bands);//棒グラフの幅を計算 }
void draw() {  background(0);
 fft.analyze();//FFTを実行
 translate ( width/2, height/2 );//画面中央に移動
 for (int i = 0; i < bands; i++) {    pushMatrix();
   float angle = 360.0/bands * i;//回転角度を求める
   rotate( radians( angle - 90 ) );//回転する
   stroke( angle, 100, 100 );//角度に応じて色相を変える
   float level = fft.spectrum[i];//それぞれの周波数のレベルを取り出す    line( 100, 0, 110 + level*500, 0);//周波数帯域別の音量に応じて線を伸ばす    popMatrix();  } }
マイク入力
マイク入力を取得します。ボリュームに応じて、矩形を表示します。
Tumblr media
import processing.sound.*;//ライブラリの読み込み SoundFile soundfile;//音声ファイルを保持するための変数を定義
FFT fft;//高速フーリエ変換(FFT)をするオブジェクト int bands = 128;//周波数を幾つに分割するか float r_width;//棒グラフの幅
AudioIn input;//マイクを制御するオブジェクト Amplitude rms;//音声の振幅(音量)を調べるオブジェクト
void setup() {  size( 800, 600 );  colorMode( HSB, 360, 100, 100, 100 );  soundfile = new SoundFile(this, "ファイル名");//音声ファイルの読み込み  soundfile.loop();
 fft = new FFT(this, bands);//FFTを行うオブジェクトを生成  fft.input(soundfile);//音声ファイルのデータを与える
 r_width = width/float(bands);//棒グラフの幅を計算
 input = new AudioIn(this, 0);//PCのマイクを取得する      input.start();//マイクからの入力を開始する
 rms = new Amplitude(this);//振幅を調べるオブジェクトを生成する  rms.input(input);//振幅を調べるオブジェクトに、マイク入力を登録する }
void draw() {  background(0);  fft.analyze();//FFTを実行  translate ( width/2, height/2 );//画面中央に移動
 for (int i = 0; i < bands; i++) {    pushMatrix();    float angle = 360.0/bands * i;//回転角度を求める    rotate( radians( angle ) );//回転する    stroke( angle, 100, 100 );//角度に応じて色相を変える    
   float level = fft.spectrum[i];//それぞれの周波数のレベルを取り出す    line( 100, 0, 110 + level*500, 0);//周波数帯域別の音量に応じて線を伸ばす    popMatrix();  }
 float volume = map(rms.analyze(), 0, 0.5, 1, 1000);//マイクの倍率を1~1000に変換  for ( int i=0; i<volume; i++) {//マイクの音量に応じて矩形を表示する    fill( millis()%360, 100, 100 );    noStroke();    rect( random(-width, width), random(-height, height), volume, volume );  } }
3Dにしてみる
Tumblr media
import processing.sound.*;//ライブラリの読み込み SoundFile soundfile;//音声ファイルを保持するための変数を定義
FFT fft;//高速フーリエ変換(FFT)をするオブジェクト int bands = 256;//周波数を幾つに分割するか float r_width;//棒グラフの幅
AudioIn input;//マイクを制御するオブジェクト Amplitude rms;//音声の振幅(音量)を調べるオブジェクト
void setup() {  size( 800, 600, P3D );  colorMode( HSB, 360, 100, 100, 100 );  soundfile = new SoundFile(this, "dim.mp3");//音声ファイルの読み込み  soundfile.loop();
 fft = new FFT(this, bands);//FFTを行うオブジェクトを生成  fft.input(soundfile);//音声ファイルのデータを与える
 r_width = width/float(bands);//棒グラフの幅を計算\
 input = new AudioIn(this, 0);//PCのマイクを取得する      input.start();//マイクからの入力を開始する
 rms = new Amplitude(this);//振幅を調べるオブジェクトを生成する  rms.input(input);//振幅を調べるオブジェクトに、マイク入力を登録する }
void draw() {  background(0);
 fft.analyze();//FFTを実行
 translate ( width/2, height/2 );//画面中央に移動  rotateX( radians(millis()*0.02 ));  rotateY( radians(millis()*0.05 ));  rotateZ( radians(millis()*0.03 ));
 for (int i = 0; i < bands; i++) {    pushMatrix();        float angle = 360.0/bands * i;//回転角度を求める    rotate( radians( angle ) );//回転する    stroke( angle, 100, 100 );//角度に応じて色相を変える    
   float level = fft.spectrum[i];//それぞれの周波数のレベルを取り出す    line( 100, 0, 100 + level*1000, 0);//周波数帯域別の音量に応じて線を伸ばす    popMatrix();  }
 float volume = map(rms.analyze(), 0, 0.5, 1, 5000);//マイクの倍率を1~1000に変換  for ( int i=0; i<volume; i++) {//マイクの音量に応じて矩形を表示する    fill( millis()%360, 100, 100 );    noStroke();    translate( random(-500,500), random(-500,500),random(-500,500));    box( volume* 5 );  } }
0 notes
poddyshobbies · 10 months ago
Text
松浦鉄道の旅(8)戻り・佐世保→伊万里
Tumblr media
佐世保 14:23-15:05 佐々 15:08-15:43 たびら平戸口 15:50-16:14 松浦16:17-16:55 伊万里
Tumblr media
佐世保駅 … 改札(降車時清算)は車内
Tumblr media Tumblr media
JR線のりばとの連絡は地上階へ。
Tumblr media
松浦鉄道の主力車両 RM-600形
Tumblr media
九十九島の夕映えをイメージしたカラーリング
Tumblr media
青いカラーリングは西海の海をイメージ
中里駅 … 下り列車と交換
Tumblr media
YouTube >
後方車窓・佐世保→佐々(44分)
右左車窓・佐々→たびら平戸口(36分)
左車窓・たびら平戸口→伊万里(1時間5分)
2024.4.10 ~ つづく
2 notes · View notes