鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗 | 百篇博客分析OpenHarmony源码 | v61.02
百篇博客系列篇.本篇为:
v61.xx 鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗 | 51.c.h.o
编译构建相关篇为:
- v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉坑指南 | 51.c.h.o
- v57.xx 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视编译全过程 | 51.c.h.o
- v58.xx 鸿蒙内核源码分析(环境脚本篇) | 编译鸿蒙原来如此简单 | 51.c.h.o
- v59.xx 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 51.c.h.o
- v60.xx 鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙的使用 | 51.c.h.o
- v61.xx 鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗 | 51.c.h.o
ninja | 忍者
ninja
是一个叫 Evan Martin
的谷歌工程师开源的一个自定义的构建系统,最早是用于 chrome
的构建,Martin
给它取名 ninja
(忍者)的原因是因为它strikes quickly
(快速出击).这是忍者的特点,可惜Martin
不了解中国文化,不然叫小李飞刀更合适些.究竟有多块呢? 用Martin
自己的话说是当一个文件被修改后,ninja
从发现到编译速度是make
的十倍.有没有十倍不是本篇讨论的重点,人家做出来了,就算是牛皮也该人家吹.本篇是要对鸿蒙如何使用ninja做一个比较详细的阐述.
ninja
是一个重视速度的构建系统,与其对标的是Make
,它们都依赖于文件的时间戳进行检测重编.
- 它的设计目的是让更高级别的构建系统生成其输入端文件,其并不希望你手动去编
.ninja
文件,可以生成.ninja
的工具有gn
,cmake
,premake
,甚至你自己都可以写个ninja
生成工具. ninja
非常高效,可理解为构建系统中的汇编语言。ninja
文件没有分支、循环的流程控制,是被指定了一堆规则的文件,所以要比Makefile
简单很多- 目前已知的
GoogleChrome
,Android
的一部分,LLVM
,V8
, 方舟编译器, 鸿蒙 等大型系统都使用到了ninja
构建.
基本概念
概念 中译 解释
edge 边 即build语句,指定目标(输出)、规则与输入,是编译过程拓扑图中的一条边(edge)。
target 目标 编译过程需要产生的目标,由build语句指定。
output 输出 build语句的前半段,是target的另一种称呼。
input 输入 build语句的后半段,用来产生output的文件或目标,另一种称呼是依赖。
rule 规则 通过指定command与一些内置变量,决定如何从输入产生输出。
pool 池 一组rule或edge,通过指定其depth,可以控制并行上限。
scope 作用域 变量的作用范围,有rule与build语句的块级,也有文件级别。rule也有scope。
--------------------------------------------------------------------------------------------
关键字 作用
build 定义一个edge。
rule 定义一个rule。
pool 定义一个pool。
default 指定默认的一个或多个target。
include 添加一个ninja文件到当前scope。
subninja 添加一个ninja文件,其scope与当前文件不同。
phony 一个内置的特殊规则,指定非文件的target。
简单的ninja
首先 ninja
一定是简单的,呆板的.凡是能被工具生成的东西,一定是在不断的重复某种简单,众多的简单按一定的规则有效叠加起来就能解决复杂的问题,请仔细想想是不是这个道理.ninja
简单到没什么语法,只是几个概念和规则. 以至于 ninja参考手册 比 gn参考手册 简单的太多.
看个示例:
cflags = -Wall -Werror #全局变量
rule cc
command = gcc $cflags -c $in -o $out
build foo.o: cc foo.c
build special.o: cc special.c
cflags = -Wall #局部变量,范围只在编译special.c上有效
解读
cflags
:定义一个用户变量,用于给规则传参.rule
:定义一个叫cc
的规则.command
:将生成bash命令,接收外部三个参数
- 第一个
build
,将foo.c
用cc
规则编译成foo.o
- 最终编译选项:
gcc -Wall -Werror -c foo.c -o foo.o
- 最终编译选项:
- 第二个
build
,将special.c
用cc
规则编译成special.o
- 最终编译选项:
gcc -Wall -c foo.c -o foo.o
- 最终编译选项:
in
,out
是ninja
的两个内置变量.
phony规则
跟称呼弗拉基米尔·弗拉基米罗维奇·普京
为普总
一样,
有些文件路径会很长,ninja
提供取别名的功能,这仅仅是为了方便.
build ability: phony ./libability.so
build ability_notes: phony obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/ability_notes.stamp
build ability_test: phony obj/foundation/aafwk/aafwk_lite/services/abilitymgr_lite/unittest/ability_test.stamp
build ability_test_pageAbilityTest_group_lv0: phony obj/foundation/aafwk/aafwk_lite/services/abilitymgr_lite/unittest/test_lv0/page_ability_test/ability_test_pageAbilityTest_group_lv0.stamp
有了上面的铺垫,读懂鸿蒙的ninja
部分应该没多大障碍了.
鸿蒙 | ninja
在v60.xx 鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙的使用 | 51.c.h.o 篇的末尾已说明通过 gn gen
生成了以下文件和目录
turing@ubuntu:/home/openharmony/code-v1.1.1-LTS/out/hispark_aries/ipcamera_hispark_aries$ ls
args.gn build.ninja build.ninja.d NOTICE_FILE obj test_info toolchain.ninja
args.gn
:一些参数build.ninja
:ninja
的主文件build.ninja.d
:记录生成所有.ninja
所依赖的BUILD.gn文件路劲列表,一个BUILD.gn就生成一个.ninja文件- obj :各组件模块构建/编译文件输出地.
- toolchain :放置ninja规则,将被 subninja 进 build.ninja
build.ninja
build.ninja
内容如下:
ninja_required_version = 1.7.2
rule gn
command = ../../../../tools/gn --root=../../.. -q --dotfile=../../../build/lite/.gn --script-executable=python3 gen .
description = Regenerating ninja files
build build.ninja: gn
generator = 1
depfile = build.ninja.d
subninja toolchain.ninja
build ability: phony ./libability.so
build ability_notes: phony obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/ability_notes.stamp
build ability_test: phony obj/foundation/aafwk/aafwk_lite/services/abilitymgr_lite/unittest/ability_test.stamp
build ability_test_pageAbilityTest_group_lv0: phony obj/foundation/aafwk/aafwk_lite/services/abilitymgr_lite/unittest/test_lv0/page_ability_test/ability_test_pageAbilityTest_group_lv0.stamp
#此处省略诸多 phony ..
build all: phony $
./libcameraApp.so $
obj/applications/sample/camera/cameraApp/cameraApp_hap.stamp $
./libgallery.so $
...
default all
解读
- 前面部分是定义一个
gn
规则,用于干嘛呢? 重新生成一遍*ninja
文件 subninja
相当于#include
文件default all
,指定默认的一个或多个target
toolchain | 定义规则
toolchain.ninja
定义了编译c,c++,汇编器,链接,静态/动态链接库,时间戳,拷贝等规则. 内容如下:
rule cxx
command = /root/llvm/bin/clang++ ${defines} ${include_dirs} ${cflags_cc} -c ${in} -o ${out}
description = clang++ ${out}
depfile = ${out}.d
deps = gcc
rule alink
command = /root/llvm/bin/llvm-ar -cr ${out} @"${out}.rsp"
description = AR ${out}
rspfile = ${out}.rsp
rspfile_content = ${in}
rule link
command = /root/llvm/bin/clang ${ldflags} ${in} ${libs} -o ${output_dir}/bin/${target_output_name}${output_extension}
description = LLVM LINK ${output_dir}/bin/${target_output_name}${output_extension}
rspfile = ${output_dir}/bin/${target_output_name}${output_extension}.rsp
rspfile_content = ${in}
rule solink
command = /root/llvm/bin/clang -shared ${ldflags} ${in} ${libs} -o ${output_dir}/${target_output_name}${output_extension}
description = SOLINK ${output_dir}/${target_output_name}${output_extension}
rspfile = ${output_dir}/${target_output_name}${output_extension}.rsp
rspfile_content = ${in}
rule stamp
command = /usr/bin/touch ${out}
description = STAMP ${out}
rule asm
command = /root/llvm/bin/clang ${include_dirs} ${asmflags} -c ${in} -o ${out}
description = ASM ${out}
depfile = ${out}.d
deps = gcc
rule cc
command = /root/llvm/bin/clang ${defines} ${include_dirs} ${cflags} ${cflags_c} -c ${in} -o ${out}
description = clang ${out}
rule copy
command = cp -afd ${in} ${out}
description = COPY ${in} ${out}
注意这些规则中的描述
description
字段,其后面的内容会打到控制台上,每一条输出都是一次build
,如图所示,通过这些描述就知道使用了什么规则去构建.
组件编译
本篇以编译ability
组件为例说明 ninja
对组件的编译情况.每个组件都有自己的.ninja
,描述组件的编译细节.而整个鸿蒙系统就是由众多的类似.ninja
构建编译完成的.
├── foundation
│ ├── aafwk
│ │ └── aafwk_lite
│ │ ├── frameworks
│ │ │ ├── ability_lite
│ │ │ │ └── ability.ninja
ability.ninja
内容如下:
defines = -DOHOS_APPEXECFWK_BMS_BUNDLEMANAGER \
-D_XOPEN_SOURCE=700 -DOHOS_DEBUG \
-D_FORTIFY_SOURCE=2 \
-D__LITEOS__ -D__LITEOS_A__
include_dirs = -I../../../foundation/aafwk/aafwk_lite/frameworks/abilitymgr_lite/include \
-I../../../foundation/aafwk/aafwk_lite/frameworks/want_lite/include \
-I../../../foundation/aafwk/aafwk_lite/interfaces/innerkits/abilitymgr_lite \
-I../../../foundation/aafwk/aafwk_lite/interfaces/kits/want_lite \
-I../../../foundation/aafwk/aafwk_lite/interfaces/kits/ability_lite \
-I../../../foundation/appexecfwk/appexecfwk_lite/utils/bundle_lite \
-I../../../foundation/appexecfwk/appexecfwk_lite/interfaces/kits/bundle_lite \
-I../../../foundation/appexecfwk/appexecfwk_lite/frameworks/bundle_lite/include \
-I../../../foundation/graphic/ui/frameworks -I../../../foundation/graphic/surface/interfaces/kits \
-I../../../foundation/distributedschedule/samgr_lite/interfaces/kits/registry \
-I../../../foundation/distributedschedule/samgr_lite/interfaces/kits/samgr \
-I../../../foundation/communication/ipc_lite/frameworks/liteipc/include \
-I../../../kernel/liteos_a/kernel/include \
-I../../../kernel/liteos_a/kernel/common \
-I../../../third_party/bounds_checking_function/include \
-I../../../third_party/freetype/include \
-I../../../utils/native/lite/kv_store/innerkits \
-I../../../utils/native/lite/include \
-I../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/include \
-I../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite \
-I/root/llvm/include/c++/v1 \
-I../../../prebuilts/lite/sysroot/usr/include/arm-liteos \
-I../../../base/hiviewdfx/hilog_lite/interfaces/native/innerkits/hilog \
-I../../../base/hiviewdfx/hilog_lite/interfaces/native/innerkits \
-I../../../third_party/bounds_checking_function/include \
-I../../../third_party/bounds_checking_function/include \
-I../../../foundation/communication/ipc_lite/interfaces/kits \
-I../../../utils/native/lite/include
cflags = -Wall -Wno-format -Wno-format-extra-args -fPIC \
--target=arm-liteos \
--sysroot=/home/openharmony/prebuilts/lite/sysroot \
-Oz -flto -mfloat-abi=softfp -mcpu=cortex-a7 -nostdlib -fno-common -fno-builtin -fno-strict-aliasing -Wall -fsigned-char -mno-unaligned-access -fno-omit-frame-pointer -fstack-protector-all -fPIC
cflags_cc = -Wall -Wno-format -Wno-format-extra-args -fPIC \
--target=arm-liteos \
--sysroot=/home/openharmony/prebuilts/lite/sysroot \
-Oz -flto -mfloat-abi=softfp -mcpu=cortex-a7 -nostdlib -fno-common -fno-builtin -fno-strict-aliasing -Wall -mno-unaligned-access -fno-omit-frame-pointer -fstack-protector-all -fexceptions -std=c++11 -fPIC
target_output_name = libability
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_context.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_context.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_env.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_env.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_env_impl.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_env_impl.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_event_handler.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_event_handler.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_loader.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_loader.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_main.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_main.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_scheduler.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_scheduler.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_thread.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_thread.cpp
build ./libability.so: solink \
obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability.o \
obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_context.o \
obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_env.o \
obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_env_impl.o \
obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_event_handler.o \
obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_loader.o \
obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_main.o \
obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_scheduler.o \
obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_thread.o \
./libabilitymanager.so ./libbundle.so ./libhilog_shared.so ./libliteipc_adapter.so \
./libsec_shared.so ./libutils_kv_store.so || obj/utils/native/lite/kv_store/kv_store.stamp
ldflags = -lstdc++ \
--target=arm-liteos \
--sysroot=/home/openharmony/prebuilts/lite/sysroot \
-L/root/llvm/lib/arm-liteos/c++ \
-L/home/openharmony/prebuilts/lite/sysroot/usr/lib/arm-liteos \
-L/root/llvm/lib/clang/9.0.0/lib/arm-liteos \
-lclang_rt.builtins -lc -lc++ -lc++abi \
--sysroot=/home/openharmony/prebuilts/lite/sysroot \
-mcpu=cortex-a7 -lc \
-L/home/openharmony/out/hispark_aries/ipcamera_hispark_aries \
-Wl,-rpath-link=/home/openharmony/out/hispark_aries/ipcamera_hispark_aries -Wl,-z,now -Wl,-z,relro -Wl,-z,noexecstack
libs =
frameworks =
output_extension = .so
output_dir = .
解读
defines
,include_dirs
,cflags_cc
都是用户自定义变量,为了给rule cxx
准备参数,对.cpp
的编译使用了这个规则rule cxx
command = /root/llvm/bin/clang++ ${defines} ${include_dirs} ${cflags_cc} -c ${in} -o ${out}
description = clang++ ${out}
depfile = ${out}.d
deps = gcc
in
,out
是两个内置变量,无须定义,值由build
提供,如此就编译成了一个个的.o
文件.- 在最后在当前目录下使用了
solink
规则,生成一个动态链接库libability.so
.rule solink
command = /root/llvm/bin/clang -shared ${ldflags} ${in} ${libs} -o ${output_dir}/${target_output_name}${output_extension}
description = SOLINK ${output_dir}/${target_output_name}${output_extension}
rspfile = ${output_dir}/${target_output_name}${output_extension}.rsp
rspfile_content = ${in}
ability | 最终生成文件
turing@ubuntu:/home/openharmony/code-v1.1.1-LTS/out/hispark_aries/ipcamera_hispark_aries/obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite$ tree
.
├── aafwk_abilitykit_lite.stamp
├── ability.ninja
├── ability_notes.stamp
└── src
├── libability.ability_context.o
├── libability.ability_env_impl.o
├── libability.ability_env.o
├── libability.ability_event_handler.o
├── libability.ability_loader.o
├── libability.ability_main.o
├── libability.ability.o
├── libability.ability_scheduler.o
└── libability.ability_thread.o
1 directory, 12 files
turing@ubuntu:/home/openharmony/code-v1.1.1-LTS/out/hispark_aries/ipcamera_hispark_aries/obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite$ stat ability_notes.stamp
File: ability_notes.stamp
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 805h/2053d Inode: 1217028 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ turing) Gid: ( 0/ root)
Access: 2021-07-21 00:38:52.237373740 -0700
Modify: 2021-07-21 00:34:30.207312566 -0700
Change: 2021-07-21 00:34:30.207312566 -0700
鸿蒙内核源码分析.总目录
v08.xx 鸿蒙内核源码分析(总目录) | 百万汉字注解 百篇博客分析 | 51.c.h .o
百万汉字注解.百篇博客分析
百万汉字注解 >> 精读鸿蒙源码,中文注解分析, 深挖地基工程,大脑永久记忆,四大码仓每日同步更新< gitee| github| csdn| coding >
百篇博客分析 >> 故事说内核,问答式导读,生活式比喻,表格化说明,图形化展示,主流站点定期更新中< 51cto| csdn| harmony| osc >
关注不迷路.代码即人生
QQ群:790015635 | 入群密码: 666
原创不易,欢迎转载,但请注明出处.
鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗 | 百篇博客分析OpenHarmony源码 | v61.02的更多相关文章
- 鸿蒙内核源码分析(GN应用篇) | GN语法及在鸿蒙的使用 | 百篇博客分析OpenHarmony源码 | v60.01
百篇博客系列篇.本篇为: v60.xx 鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙的使用 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...
- 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 百篇博客分析OpenHarmony源码 | v59.01
百篇博客系列篇.本篇为: v59.xx 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿 ...
- 鸿蒙内核源码分析(编译脚本篇) | 如何防编译环境中的牛皮癣 | 百篇博客分析OpenHarmony源码 | v58.01
百篇博客系列篇.本篇为: v58.xx 鸿蒙内核源码分析(环境脚本篇) | 编译鸿蒙原来如此简单 | 51.c.h.o 本篇用两个脚本完成鸿蒙(L1)的编译环境安装/源码下载/编译过程,让编译,调试鸿 ...
- 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视GCC编译全过程 | 百篇博客分析OpenHarmony源码| v57.01
百篇博客系列篇.本篇为: v57.xx 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视编译全过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...
- 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙看这篇或许真的够了 | 百篇博客分析OpenHarmony源码 | v50.06
百篇博客系列篇.本篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉坑指南 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉 ...
- v72.01 鸿蒙内核源码分析(Shell解析) | 应用窥伺内核的窗口 | 百篇博客分析OpenHarmony源码
子曰:"苟正其身矣,于从政乎何有?不能正其身,如正人何?" <论语>:子路篇 百篇博客系列篇.本篇为: v72.xx 鸿蒙内核源码分析(Shell解析篇) | 应用窥视 ...
- v75.01 鸿蒙内核源码分析(远程登录篇) | 内核如何接待远方的客人 | 百篇博客分析OpenHarmony源码
子曰:"不学礼,无以立 ; 不学诗,无以言 " <论语>:季氏篇 百篇博客分析.本篇为: (远程登录篇) | 内核如何接待远方的客人 设备驱动相关篇为: v67.03 ...
- v76.01 鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式 | 百篇博客分析OpenHarmony源码
百篇博客分析|本篇为:(共享内存篇) | 进程间最快通讯方式 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析(互斥锁) | 同样 ...
- v79.01 鸿蒙内核源码分析(用户态锁篇) | 如何使用快锁Futex(上) | 百篇博客分析OpenHarmony源码
百篇博客分析|本篇为:(用户态锁篇) | 如何使用快锁Futex(上) 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析(互斥锁) ...
随机推荐
- 【HMC Core 6.0全球上线】图形计算服务新插件,助力高画质3D手游创新
HMS Core 6.0已于7月15日全球上线,本次新版本向广大开发者开放了众多全新能力与技术.其中华为图形计算服务(CG Kit)开放了体积雾插件和流体插件,为3D手游画面的提升提供了坚实的技术基础 ...
- 连接共享打印机失败错误代码0x80070035
局域网内共享打印机非常方便,但是在连接中经常遇到问题,其中出现错误代码0x80070035的概率非常之高! 1.必须确保有关打印功能的相关服务都处于自动启动状态,重点检查TCP/IP NetBIOS ...
- SpringBoot快速搭建流程
创建一个新项目 使用maven创建一个新项目 给定项目名称.finsh完成创建 跑起来SpringBoot 引入依赖parent > SpringBoot父级依赖,spring-boot-sta ...
- 虚拟dom?diff算法?key?Vue原理的核心三问?打包教你搞定。
为什么需要虚拟DOM 先介绍浏览器加载一个HTML文件需要做哪些事,帮助我们理解为什么我们需要虚拟DOM.webkit引擎的处理流程,如下图所示: 所有浏览器的引擎工作流程都差不多,如上图大致分5步: ...
- go defer关键字使用规则
defer 用于延迟函数的调用,每次defer都会把一个函数压入栈中,函数返回前再把延迟的函数取出并执行 数据结构 type _defer struct { sp uintptr //函数栈指针 pc ...
- ROS入门学习(基于Ubuntu16.04+kinetic)
本文主要部分全部来源于ROS官网的Tutorials. Setup roscore # making sure that we have roscore running rosrun turtlesi ...
- 1day漏洞反推技巧实战(2)
学习存货(2) CVE-2018-11784简单分析之反推的魅力 看着挺有趣的,简单分析下: 通过搜索tomcat漏洞找到: http://tomcat.apache.org/security-7.h ...
- 安装配置Linux Squid代理服务器
1.代理服务器的工作机制 代理服务器的工作机制像生活中的代理商,假设自己的机器为A,想获得的数据由服务器B提供,代理服务器为C,那么连接过程是,A需要B的数据,并直接和C连接:C接受到A的数据请求之后 ...
- introduction-to-64-bit-assembly
introduction-to-64-bit-assembly NASM - The Netwide Assembler x86-64 下函数调用及栈帧原理 汇编语言基本概念简介 mycode
- zabbix 批量安装+自动注册
环境介绍 zabbix版本Zabbix 4.2.6 zabbix server:10.0.10.234 zabbix-agent:16台 Linux 7.x设备 自动发现 自动发现的好处:快速发现 ...