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

前段时间,发表了鸿蒙系统扫盲(三):鸿蒙开发用什么语言?这篇文章,收到一些网友的提问,一一解答了,还有网友对我进行了严厉的批评和尖锐的指责,说我有点颠倒是非,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明年可以绽放光彩!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

集成开发之如何用好明道云

内容来自演讲:张嵩 | 苏州睿能科技有限公司 | 公司负责人 摘要 这篇文章介绍了作者所在公司如何利用明道云进行集成开发,并分享了四个实际案例。在第一个数字化实验室项目中,该公司使用明道云取代现有的STARLIMS商业软件,并实现…

sleep和wait区别,并且查看线程运行状态

一、sleep和wait区别 区别一:语法使用不同 wait 方法必须配合 synchronized 一起使用,不然在运行时就会抛出 IllegalMonitorStateException 的异常 而 sleep 可以单独使用,无需配合 synchronized 一起使用。 区别二:所属类不同…

【Spring教程26】Spring框架实战:从零开始学习SpringMVC 之 bean加载控制

目录 1 问题分析2 思路分析3 环境准备4 设置bean加载控制5 知识点1:ComponentScan 欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《如何在windows11下安装…

大数据技术6:大数据技术栈

前言:大数据相关的技术名词特别多,这些技术栈之间的关系是什么,对初学者来说很难找到抓手。我一开始从后端转大数据的时候有点懵逼,整体接触了一遍之后才把大数据技术栈给弄明白了。 一、大数据技术栈 做大数据开发,无…

YOLOv8改进 | 2023主干篇 | 利用RT-DETR特征提取网络PPHGNetV2改进YOLOv8(超级轻量化精度更高)

一、本文介绍 本文给大家带来利用RT-DETR模型主干HGNet去替换YOLOv8的主干,RT-DETR是今年由百度推出的第一款实时的ViT模型,其在实时检测的领域上号称是打败了YOLO系列,其利用两个主干一个是HGNet一个是ResNet,其中HGNet就是我们…

Logstash输入Kafka输出Es配置

Logstash介绍 Logstash是一个开源的数据收集引擎,具有实时管道功能。它可以从各种数据源中动态地统一和标准化数据,并将其发送到你选择的目的地。Logstash的早期目标主要是用于收集日志,但现在的功能已经远远超出这个范围。任何事件类型都可…

记录汇川:MODBUS-梯形图

H5U的MODBUS通信不需要编写程序,通过组态MODBUS通信配置表,实现数据通信。 相对自由口走报文的形式,这个更加的方便。配置结束,就可以监控数据或写入。

Linux - 进程间通信(中)- 管道的应用场景

前言 在上篇博客当中,对Linux 当中的进程通信,做了详细阐述,主要是针对父子进程的通信来阐述的同时,也进行了模拟实现。 对于管道也有了初步了解,但是这仅仅是 进程间通信的一部分,Linux 当中关于进程间通…

Unity光照模型实践

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

安卓MediaRecorder(2)录制源码分析

文章目录 前言JAVA new MediaRecorder() 源码分析android_media_MediaRecorder.cpp native_init()MediaRecorder.java postEventFromNativeandroid_media_MediaRecorder.cpp native_setup() MediaRecorder 参数设置MediaRecorder.prepare 分析MediaRecorder.start 分析MediaRec…

Navicat 技术指引 | 适用于 GaussDB 分布式的服务器对象的创建/设计

Navicat Premium(16.3.3 Windows版或以上)正式支持 GaussDB 分布式数据库。GaussDB分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结构…

JavaSE知识点回顾,附学习思维导图

第一阶段 day01 java 发展,java 环境( path, java_home, class_path),java 原理, java 执行 , jvm , jre , jdk day02 变量 标识符命名规则 数据类型 数据类型的转换 运算符 day03 选择结构 if , switch day04 循环结构 for , whi…

java--Collection的遍历方式

1.迭代器概述 迭代器是用来遍历集合的专用方式(数组没有迭代器),在java中迭代器是Iterator。 2.Collection集合获取迭代器的方法 3.Iterator迭代器中的常用方法 4.增强for循环 ①增强for可以用来遍历集合或数组。 ②增强for遍历集合,本质就是迭代器遍…

005、Softmax损失

之——softmax与交叉熵 杂谈 我们常用到softmax函数与交叉熵的结合作为损失函数以监督学习,这里做一个小小的总结。 正文 1.softmax的基本改进 所谓softmax就是在对接全连接层输出时候把输出概率归一化,最基础的就是这样: 效果就是这样&…

(第65天)PDB 快照

介绍 PDB 快照是一个 PDB 指定时间点的副本。在创建快照时,源 PDB 可以是只读或者读写模式。 PDB 快照可以用于快速创建 PDB。 PDB 快照可以分为手动和自动两种创建方式(create pluggable database|alter pluggable database): 手动快照使用 SNAPSHOT 子句的方式来创建自动…

Jmeter beanshell编程实例

1、引言 BeanShell是一种小型的,免费的,可嵌入的符合Java语法规范的源代码解释器,具有对象脚本语言特性。 在Jmeter实践中,由于BeanShell组件较高的自由度,通常被用来处理较为复杂,其它组件难以处理的问题…

jmeter接口测试之登录测试

注册登录_登陆接口文档 1.登录 请求地址: POST xxxxxx/Home/Login 请求参数: args{LoginName:"mtest", // 登录名,可以为用户名或邮箱Password:"123456" // 密码" }响应数据: 成功 {"S…

微表情检测(四)----SL-Swin

SL-Swin: A Transformer-Based Deep Learning Approach for Macro- and Micro-Expression Spotting on Small-Size Expression Datasets 在本文中,我们致力于解决从视频中检测面部宏观和微观表情的问题,并通过使用深度学习方法分析光流特征提出了引人注…

[GFCTF 2021]文件查看器

文章目录 前置知识可调用对象数组对方法的调用GC回收机制phar修改签名 解题步骤 前置知识 可调用对象数组对方法的调用 我们先来看下面源码 <?phperror_reporting(0);class User{public $username;public $password;public function check(){if($this->username"…

用perl查找文件夹中的所有文件和目录

查找文件夹中的文件和目录是一个很常见的操作&#xff0c;使用perl的File::Find模块可以很方便的实现。首先使用perldoc File::Find 查看一下文档: 这个核心的就是文档中描述的回调函数。我们举一个实际的例子&#xff0c;一个空的git仓库为例&#xff0c;下面的脚本用于查找…