changxvv / blog Goto Github PK
View Code? Open in Web Editor NEWMy personal blog.
License: Creative Commons Attribution Share Alike 4.0 International
My personal blog.
License: Creative Commons Attribution Share Alike 4.0 International
看了一圈 ArkCompiler 相关仓库的文档,其中 runtime_core 仓库的文档是最全的,介绍了 ArkCompiler 的整体设计。
ArkCompiler 中的字节码文件后缀为 abc,整个编译器运行时有一个名字叫做 Panda,所以说 Arkcompiler 的字节码又被成为 Panda 字节码。
文档文件树如下:
├── compiler
│ └── docs // 讲了各种各样在ir阶段的optimizations
└── docs
├── 2022-08-18-isa-changelog.md
├── PBC2IR.md // Panda Bytecode转IR的对照表
├── aot.md // 介绍arkcompiler的Ahead Of Time Compilation
├── assembly_format.md // Panda字节码的格式
├── bc_verification // 介绍字节码验证器
├── cfi_directives.md // cfi指令用法
├── code_metainfo.md // 介绍编译后的代码元信息
├── coding-style.md
├── debugger-vscode-communication.md
├── design-of-interpreter.md // 解释器设计
├── file_format.md // 二进制文件格式
├── glossary.md
├── ir_format.md // 介绍ir的设计和格式
├── irtoc.md // 将手工创建的IR编译为目标代码
├── memory-management-SW-requirements.md
├── memory-management.md // 内存管理
├── on-stack-replacement.md // 介绍OSR
├── panda-runtime.md // 字节码文档目录
├── rationale-for-bytecode.md // 字节码设计原理
├── runtime-class.md
├── runtime-compiled_code-interaction.md // 编译后代码和运行时的交互
├── runtime-debug-api.md
└── tracing.md
这里重点说一下 ir_format。里面提到了 ArkCompiler 使用了 Reverse Post Order (RPO)、Domtree、Linear Order 以及多种 Analysis 技术。并且提到了 Panda IR 处理的两个步骤:
第一个步骤是为了快速生成 IR,第二个步骤目标是 ARM64,然后进行 ARM 的特殊优化。文档也提到了支持 Panda IR 和 LLVM IR 之间的转换,这样就能允许进行 LLVM 的特殊优化。
其次,在文档中,ArkCompiler 选择了 CFG (Control Flow Graph) with SSA (Static Single Assignment) 的架构而非 Sea-of-Nodes,原因是前者更简单通用并且更轻量。而 IR 的指令则使用类继承的方式来设计实现(Inst
是基类)。
寄存器分配方面,目前使用的是消耗较小的 Linear Scan 算法,之后会考虑转向 Graph-coloring 算法,因为它能生成更高效的代码。
IR 转机器码方面,目前 ArkCompiler 使用的是标准 vixl 库,算是 ARM 的技术。之后可能会考虑自己实现这部分。
值得注意的是,最近 runtime_core 仓库中增加了一个 static_core 模块,里面对现有的 core 做了改动,文档也更丰富了。比如 compiler 部分新增加了几十种在字节码阶段的优化方法的文档(如 branch_elimination、loop_unrolling);其次,在主文档内还添加了 Deoptimization、Cross-Value 等新功能的文档。
我认为人们需要构建自己的一整套学习体系,以达到终生学习的目的。
一套完整的学习体系应该包括人生目标管理系统、时间管理工具、信息收集系统、笔记系统、输出系统。
关于构建个人的只是体系,另一个流行的等价概念便是「元学习」。
TODO
- 需要完善人生目标管理系统、时间管理工具、信息收集系统、输出系统部分。
笔记系统的另一个等价概念是「第二大脑」。
一个完整的学习闭环可以用 ENCODE 来概括:Encounter、Note、Connect、Organize、Develop、Express。
我使用 Obsidian 这个应用,运用双链笔记系统,对知识进行记录和整理。例如:
笔记软件备选项:
在整理好之后,一些相关的知识应该会链接在一起,便于自己联想和构思:
上图是我大二、大三两年学习中构建的笔记及其链接。
同时,Obsidian 也帮我承担了一部分信息收集的任务,我会把每天从 RSS、微信公众号、博客、交流中收集到的认为值得进一步了解的信息放进我的日记里面。(类似收藏夹,但是会定期整理,防止「搜藏从未停止,阅读从未开始」的情况发生。)
再者,Obsidian 也承担了一部分 Express 的任务,我发表文章时的初稿会在 Obsidian 中完成(例如本篇文章)。
唯一推荐——Anki。通过 Anki 将你认为需要持续记忆和学习的知识点做成 flashcard,通过软件自身的算法每天复习。这里推荐两个链接:
值得一提的是,FSRS 算法开发者 @L-M-Sherlock 的知乎账号还有更多的有关学习与教育的文章(如 为什么有的计算机本科生就能发表顶会,但是许多博士生还是一篇都没有?、学校让人沾染上的 100+ 恶习 和 天才清单),推荐阅读。
因为迁移 Anki 成本太大,目前我仍使用的是 SuperMemo:
添加友情链接,被我打上❤后会自动加到友情链接里。格式为:
名字:xxxxxx
链接:xxxxxx
描述:xxxxxx
Note
冒号使用大写
在 DevEco 现有的最新版本里,采用的代码混淆是使用的是开源的 uglify。
{
"apiType": "stageMode",
"buildOption": {
"artifactType": "obfuscation" // 在项目设置文件中开启混淆
}
}
在 DevEco 中调用的代码位于 https://gitee.com/openharmony/developtools_ace_ets2bundle/blob/master/compiler/uglify-source.js。
Arkguard 是华为新开发的针对 Javascript 和 Typescript 的源码混淆工具。(我猜名称应该是模仿 Java 的开源混淆工具 ProGuard。)
在文档中,Arkguard 只能用于 Stage 模型 (不支持 FA 模型),并且 Arkguard 只提供名称混淆的能力(理由是因为其它混淆能力会劣化性能)。
混淆的名称有:
后两者默认关闭,因为默认打开可能会导致运行时错误。
项目源代码结构:
src
├── ArkObfuscator.ts // Entry,对文件进行代码混淆
├── IObfuscator.ts // 定义混淆接口
├── cli // 调用ArkObfuscator,创建了混淆命令SecHarmony
├── common // 提取目标文件中的API信息
├── configs // 混淆的参数设置
├── generator // 主文件NameFactory,生成不同类型的混淆名称
├── transformers // 被ArkObfuscator调用,进行代码转换和混淆
│ ├── TransformPlugin.ts // 接口定义
│ ├── TransformerManager.ts // 根据混淆参数创建针对性的TransformerFactory进行代码混淆
│ ├── layout // 处理代码布局,有三个TransformerFactory,分别用于禁用控制台调用、禁用Hilog调用和简化代码
│ └── rename // 名称混淆,有三个TransformerFactory,分别用于重命名标识符、重命名属性、展开属性简写
└── utils
在 markdown 格式下进一步的格式要求。
本科 中南大学 在读。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.