Coder Social home page Coder Social logo

blog's People

Contributors

actions-user avatar changxvv avatar

Watchers

 avatar

blog's Issues

友情链接

添加友情链接,被我打上❤后会自动加到友情链接里。格式为:

名字:xxxxxx
链接:xxxxxx
描述:xxxxxx

Note

冒号使用大写

ArkCompiler 中的代码混淆

现有的混淆

在 DevEco 现有的最新版本里,采用的代码混淆是使用的是开源的 uglify

{
	"apiType": "stageMode",
	"buildOption": {
	    "artifactType": "obfuscation" // 在项目设置文件中开启混淆
	}
}

在 DevEco 中调用的代码位于 https://gitee.com/openharmony/developtools_ace_ets2bundle/blob/master/compiler/uglify-source.js。

Arkguard

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

Reference

我的学习体系

我认为人们需要构建自己的一整套学习体系,以达到终生学习的目的。

一套完整的学习体系应该包括人生目标管理系统、时间管理工具、信息收集系统、笔记系统、输出系统。

关于构建个人的只是体系,另一个流行的等价概念便是「元学习」。

TODO

  • 需要完善人生目标管理系统、时间管理工具、信息收集系统、输出系统部分。

我的笔记系统

笔记系统的另一个等价概念是「第二大脑」。

一个完整的学习闭环可以用 ENCODE 来概括:Encounter、Note、Connect、Organize、Develop、Express。

信息输入和整理

我使用 Obsidian 这个应用,运用双链笔记系统,对知识进行记录和整理。例如:

Pasted image 20231014153001

笔记软件备选项:

  • Onenote(不建议手写,因为不方便检索)
  • Logseq
  • Heptabase
  • Notion
  • Roam Research
  • Flomo
  • TiddlyWiki

Warning

不要让笔记软件喧宾夺主。

在整理好之后,一些相关的知识应该会链接在一起,便于自己联想和构思:

Pasted image 20231014153457

上图是我大二、大三两年学习中构建的笔记及其链接。

同时,Obsidian 也帮我承担了一部分信息收集的任务,我会把每天从 RSS、微信公众号、博客、交流中收集到的认为值得进一步了解的信息放进我的日记里面。(类似收藏夹,但是会定期整理,防止「搜藏从未停止,阅读从未开始」的情况发生。)

再者,Obsidian 也承担了一部分 Express 的任务,我发表文章时的初稿会在 Obsidian 中完成(例如本篇文章)。

信息记忆与优化

唯一推荐——Anki。通过 Anki 将你认为需要持续记忆和学习的知识点做成 flashcard,通过软件自身的算法每天复习。这里推荐两个链接:

值得一提的是,FSRS 算法开发者 @L-M-Sherlock 的知乎账号还有更多的有关学习与教育的文章(如 为什么有的计算机本科生就能发表顶会,但是许多博士生还是一篇都没有?学校让人沾染上的 100+ 恶习天才清单),推荐阅读。

因为迁移 Anki 成本太大,目前我仍使用的是 SuperMemo:

Pasted image 20231014154550

Pasted image 20231014154659

ArkCompiler 中的 IR

看了一圈 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 处理的两个步骤:

  1. Panda bytecode 被转换为 high-level 的指令,进行部分架构独立的优化;
  2. 指令被进一步分为几个 low-level 指令(接近汇编),再进行优化。

第一个步骤是为了快速生成 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 等新功能的文档。

Reference

格式规范

在 markdown 格式下进一步的格式要求。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.