> For the complete documentation index, see [llms.txt](https://thinking.simonaking.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://thinking.simonaking.com/archives/2020/11/16.md).

# 16

1. 好文分享:

   连字节跳动都“扶不起”的那些产品，长什么样？ <https://www.huxiu.com/article/393849.html>

   摘要: 目前字节跳动已经被验证成功的产品，被外界归结为“图文内容/短视频—AI推送—广告变现”的商业模式，算法、流量、组织能力、高效率商业化，是其被反复验证的四大优势，也是它攻城略地的杀手锏。

   文章列举了 字节失败过的产品, 并阐述了 字节的布局战略, 产品变现方式.
2. 好文分享:

   Inside look at modern web browser

   <https://developers.google.com/web/updates/2018/09/inside-browser-part1>

   该系列由 Google 技术专家编写, 分为 4 个部分: 第一部分讲了 现代浏览器的架构. 第二部分讲了 页面导航时 浏览器内部发生的活动 第三部分讲了 浏览器如何渲染一个页面 第四部分讲了 浏览器处理事件时的动作

   非常建议 前端同学花点时间 阅读下该系列文章的, 是很有帮助的.
3. V8 运行 JS 的过程

   1. 源代码(source code) 通过解析器(parser) 解析后 生成抽象语法树(AST)
   2. 抽象语法树 通过 解释器(interpreter-Ignition) 生成了字节码(bytecode), 此字节码作为基准执行模型, 字节码等同于 25%-50% 机器码大小. 并且 此时抽象语法树被彻底清除掉了, 释放其内存空间.
   3. 生成后的字节码 直接被 解释器执行 (解释执行),
   4. 在代码不断的运行过程中, 解释器收集到了很多可以优化代码的信息, 比如变量的类型, 哪些函数执行的频率较高.
   5. V8引擎的编译器(compiler-TruboFan) 会根据这些信息和字节码 来编译出经过优化的机器代码

   一些常见的优化规则:

   * 函数只是声明未被调用, 那么该函数不会生成到 AST
   * 函数如果只被调用一次, 字节码则直接被解释执行了
   * 如果函数被调用多次, 可能会被标记为热点函数, 会被编译成机器代码
   * 随着不断执行, 会有越来越多的代码被标记为热点代码, 然后被编译成机器码.

   所以 JS 运行的过程 正是一个从解释执行到编译执行的过程.

   ![image-20201122150314021](/files/-MPZDdpIrL_pC1LKh-9I)
4. 用户进程在系统中运行时，大部分时间是处在用户态空间里的，在其需要操作系统帮助完成一些用户态没有特权和能力完成的操作时就需要切换到内核态。那么用户进程如何切换到内核态去使用那些内核资源呢？答案是：1) 系统调用（trap），2) 异常（exception）和 3) 中断（interrupt）。
5. ![image-20201122150247031](/files/-MPZDdpKKG69BDsYWuDx)
6. ![image-20201122150252900](/files/-MPZDdpLiMreBACgO57f)

   C# 判断一个字符串为空的写法...
