鸿蒙系统扫盲(五):再谈鸿蒙开发用什么语言?

前段时间,发表了鸿蒙系统扫盲(三):鸿蒙开发用什么语言?这篇文章,收到一些网友的提问,一一解答了,还有网友对我进行了严厉的批评和尖锐的指责,说我有点颠倒是非,ts的是脚本语言,Java是编译语言,我说ts的性能超过Java,是来搞笑的。

本着严谨学习的态度,我查阅了大量的资料,也向一些大神请教了,觉得有必要再深入,全面但用不要故作高深地、通俗易懂地拓展一下这方面的知识,这是一个开放交流的平台,如果有错误之处,希望大家指出来,一起学习进步!

1.Java是解释型语言还是编译型语言?

首先看一个事例:如果你是一个外交官,你要出访一个国家A,但是你不会A国的语言,这时候你就必须带一个翻译官,你说一句中文,他就会给你翻译成A国语言,讲给对方听,这个场景大伙应该不陌生,这就是解释型语言的运行过程;

形象化解释型语言整个过程

解释型语言的编译执行过程

而如果你会A国的语言,可以直接表达出你的想法,这个就是编译型语言的运作过程:

形象化编译型语言

编译型语言编译执行过程

很明显,编译型语言的运行效率要远远高于解释型语言,而我们常说的JVM(Java虚拟机)就是翻译官的经典代表,它的一部分职责就是做这个翻译的工作,当然它还有其他工作。而解释型语言的代表就是耳熟能详的C/C++、Rust,以及IOS应用的开发语言,Object-C、Swift等。所以现在应该能理解,为啥苹果就是流畅,安卓不管怎么优化都会卡,这是其中一个重要的原因。

在《编译原理》这门课程中,Java作为解释型语言的一个代表,它是不能脱离JVM而单独运行,但是后来Java为了提高运行效率,陆续推出了JIT技术、AOT等技术,以此来提高Java的运行效率,这也是很多人认为它是编译型语言的原因。

形象化JIT和AOT技术

JIT技术:类似于你说的一些高频词语,翻译官经常翻译后记住了,后面再有相同或者相似的词语句的时候,不需要再经过翻译,可以脱口而出,提高效率。

AOT技术:类似于一些开场固定话术,常用话术,你在见对方前,先背诵下来,直接说出来,比如“你好”,“很高兴见到你”等词语,可以一定程度上减少翻译官的翻译时间。

可以看到,JIT和AOT技术的引入,确实提高了整体的执行效率,但是,但是,你会一些A国语言,和你完全会这门语言还是有天差地别的区别的!

PS:补充几点

1)JVM的功能很强大,并不只有上面说的那么一点功能,具体不赘述了,容易跑题

2)Java代码本身也不能被JVM所识别,要先编译成字节码,然后才能被JVM识别,然后再由JVM翻译成机器码才能被执行

3)JVM因为功能很强大,所以很消耗资源,谷歌在安卓5.0的时候彻底启用了新的虚拟机,所以从安卓5.0开始,整个安卓的流畅性比4.4以前提高了很多

2.ts的性能能比肩Java?

通过开源鸿蒙的主页,能够看到,TypeScript代码量非常薄,主要的系统代码都在C/C++,Rust这些编译语言为主。

开源鸿蒙的语言占比

ts的性能在正常情况下,是比不过Java的,这是不争的事实!

不过,不过大家应该听过两个编译器:方舟编译器和毕昇编译器。

方舟编译器:这个大伙应该不陌生,在官网上有介绍,我这里不赘述了。

它按照官方说法,它的作用就是通过AOT技术把部分ets编译成机器可以直接识别的代码,另外一部分不能被编译成机器能识别的,就编译成方舟字节码,通过方舟运行时来执行,由于经过了各种优化,执行效率非常的高,开源鸿蒙里也有对它的详细介绍,链接如下:

方舟运行时子系统介绍

毕昇编译器:这是一个高性能深度优化的C/C++编译器,可以各种提高C/C++的执行效率!

在华为还在使用安卓系统的时候,通过方舟编译器优化过的同一应用,启动速度和使用的流畅度,都会得到一定的提升,这个网上有很多测试视频,感兴趣的朋友可以去搜搜。

根据上面的资料和总结,整体的系统运行应该是上图所示,首先ets代码量并不多,后端逻辑主要用C/C++去写的,C++这块经过毕昇编译后,效率得到了很大的提升,而ets的执行部分,也是经过了各种优化,效率得到了提升,所以整体的执行效率并不低。

3.纯血鸿蒙系统,内部还有“翻译官”吗?

正如2所说的,方舟编译器不能完全的翻译ets,一些不能翻译的代码,还是会通过“翻译官”翻译给机器,所以还是有的,只是它很轻量级,不像JVM那么重,对性能的影响非常小。

总结:

ets的性能在正常情况下是无法比得过Java的执行效率,而在方舟编译器和毕昇编译器的特别优化下,可以取得更高地执行效率;之所以选择ts作为开发语言,因为每一个系统都需要配套的生态软件才能长久,而Java需要拖一个JVM,会降低运行效率,而C++门槛比较高,所以选择了有一定开发者基数,没有版权问题,且还能通过编译器提高运行效率的语言,所以华为选择了TypeScript。

所有的技术,即使吹的再多,最终都是要回归到用户体验上来的,如果明年的鸿蒙Next版本不能给人丝滑流畅的感觉,那终归还是让人失望的,希望鸿蒙Next明年可以绽放光彩!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【lesson9】表的约束(2)

文章目录 表的约束的介绍列描述测试建表 zerofill测试建表插入测试 修改表插入测试 修改表插入测试 表的约束的介绍 真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角…

WT588F02B-8S语音芯片在水波炉中的应用:提升用户体验与安全性

在现代家电领域,语音芯片的应用日益普及,为各类产品增添了人性化、智能化的元素。以水波炉为例,一种新型的家用电器,它结合了微波炉和烤箱的功能,通过采用WT588F02B-8S语音芯片,使得水波炉在操作、提示、安…

【Flink名称解释一】什么是cataLog

Catalog 提供了元数据信息,例如数据库、表、分区、视图以及数据库或其他外部系统中存储的函数和信息。 数据处理最关键的方面之一是管理元数据。 元数据可以是临时的,例如临时表、或者通过 TableEnvironment 注册的 UDF。 元数据也可以是持久化的&#x…

android项目实战之Android 11(API等级29)或更高版本,检测键盘的弹出和收起

如题 在Android 11(API等级29)或更高版本中,由于隐私限制,无法直接检测键盘的弹出和收起。这是由于Android系统对于键盘弹出和收起的检测进行了限制,以保护用户的隐私。 实现方案 public class KeyboardObserver { …

Typescript中Partial数据类型在项目中的实际应用

在TypeScript中&#xff0c;Partial是一个内置的泛型类型&#xff0c;用于将给定的类型T 的所有属性转换为可选属性。换句话说&#xff0c;Partial<T> 可以帮助我们将一个类型中的所有属性变为可选属性&#xff0c;这在某些情况下非常有用。 例如&#xff1a;设有一个接…

2023-12-12 AIGC-AI如何处理信息和提问

摘要: 2023-12-12 AI如何处理信息和提问 AI如何处理信息和提问 对于基于自然语言处理&#xff08;NLP&#xff09;的模型&#xff0c;如ChatGPT这样的大型语言模型。这个过程可以分为几个关键步骤&#xff1a; 1. 接收和解析输入 接收输入&#xff1a;当用户提出一个问题时&…

经典策略筛选-20231212

策略1&#xff1a; 龙头战法只做最强&#xff1a;国企改革 ----四川金顶 1、十日交易内出现 涨停或 &#xff08;涨幅大于7个点且量比大于3&#xff09; 2、JDK MACD RSI OBV BBI LWR MTM 六指标共振 3、均线多头 4、 筹码峰 &#xff08;锁仓&#xff09; 5、现价>…

最强文生图跨模态大模型:Stable Diffusion

文章目录 一、概述二、Stable Diffusion v1 & v22.1 简介2.2 LAION-5B数据集2.3 CLIP条件控制模型2.4 模型训练 三、Stable Diffusion 发展3.1 图形界面3.1.1 Web UI3.1.2 Comfy UI 3.2 微调方法3.1 Lora 3.3 控制模型3.3.1 ControlNet 四、其他文生图模型4.1 DALL-E24.2 I…

Unity光照模型实践

光照作为3D渲染中最重要的部分之一&#xff0c;如何去模拟真实环境的光照是重要的研究内容&#xff0c;但是现实环境光照过于复杂&#xff0c;有很多经典好用的光照模型去近似真实光照。 根据基础的Phong模型 最终某个点的结果为 环境光Ambient 漫反射光Diffuse 高光Specula…

一文讲解关于MCU启动原理的几个关键问题

MCU最开始一启动后去哪里读代码&#xff1f; CPU上电启动后被设计为去地址0x00000000位置处读取代码&#xff1b;首先会连续读取两个字&#xff0c;分别是栈指针初始值和复位异常处理函数的地址&#xff1b;然后跳去执行复位异常处理函数。 当然在一些早期的ARM处理器设计中&a…

在Spring Cloud中使用组件Ribbon和Feign,并分别创建子模块注册到Eureka中去

ok&#xff0c;在上篇文章中我们讲了在Spring cloud中使用Zuul网关&#xff0c;这篇文章我们将Spring Cloud的五大核心组件的Ribbon和Feign分别创建一个微服务模块。 题外话&#xff0c;本篇博客就是配置子模块&#xff0c;或者说是微服务&#xff0c;然后将微服务正式启动之前…

Stimulus—需求形式化建模和验证工具

产品概述 Stimulus是法国达索公司产品&#xff0c;其目的是通过需求建模分析来验证需求的正确性。Stimulus的核心理念是运用“自然语言”对功能性需求进行建模&#xff0c;并通过仿真来查找需求中的缺陷&#xff0c;例如需求一致性、不二义性和完整性检查等。借助Stimulus可以在…

media-ctl 生成拓扑和数据流图

文章目录 前言一、加载驱动模块二、media-ctl 生成拓扑和数据流图1.media-ctl工具将pipeline拓扑生成dot文件2.将dot文件转换为png图片总结参考资料前言 本文主要介绍在Linux下如何通过media-ctl 工具生成生成V4L2 和 Media 框架的拓扑和数据流图 硬件环境:PC 软件环境:ubun…

2023-12-05 Qt学习总结9

点击 <C 语言编程核心突破> 快速C语言入门 Qt学习总结 前言二十五 QFile文件操作总结 前言 要解决问题: 学习qt最核心知识, 多一个都不学. 二十五 QFile文件操作 QFile是Qt提供的文件读写类&#xff0c;支持对文件进行读写、复制、重命名、删除等操作。常用C函数如下&…

用C语言实现字符串的逆置

第一种方法&#xff1a; 用指针像交换两个数一样&#xff0c;创建一个临时变量&#xff0c;从而实现字符串的逆置&#xff01; void Reverse(char* str) {char* left str;//指向字符串数组的左指针char* right str strlen(str) - 1;//指向字符串数组的右指针&#xff0c;因…

内核上项目【通信】

文章目录 目的操作步骤逆向分析实现代码参考文献 目的 在Win7 64位系统上编写驱动利用ExRegisterAttributeInformationCallback注册回调进行通信 操作步骤 1.利用MmGetSystemRoutineAddress获取ExRegisterAttributeInformationCallback中ExpDisSetAttributeInformation、Exp…

接口自动化多层嵌套json数据处理代码实例

最近在做接口自动化测试&#xff0c;响应的内容大多数是多层嵌套的json数据&#xff0c;在对响应数据进行校验的时候&#xff0c;可以通过&#xff08;key1.key2.key3&#xff09;形式获取嵌套字典值的方法获取响应值&#xff0c;再和预期值比较 1 2 3 4 5 6 7 8 9 10 11 12 13…

Enabling Application Engine Tracing 启用应用程序引擎跟踪

Enabling Application Engine Tracing 启用应用程序引擎跟踪 By default, all Application Engine traces are turned off. To see a trace or a combination of traces, set trace options before you run a program. 默认情况下&#xff0c;所有应用程序引擎跟踪都处于关闭…

自动化测试基础知识:什么是自动化测试?需要学习哪些知识与工具!

1、自动化测试概念 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常&#xff0c; 在设计了测试用例并通过评审之后&#xff0c;由测 试人员根据测试用例中描述的规程一步步执行测试&#xff0c;得到实际结果与期望结果的比较。简言之&#xff0c;自动化测试…

12.12 作业

1&#xff0c; 源代码&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);speerornew QTextToSpeech(this);idstartTimer(1000);//每隔一秒&#xf…