抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

《微软为何选择用Go而非Rust重写TypeScript》阅读笔记

突然看到一篇神文,微软为何选择用Go而非Rust重写TypeScript,TS首席架构师分享了使用GO重写TS编译器的心路历程,其中包含了大量编译器知识,学习记录一下

编译器的组成

一个编译器可能包含

  • Front-end
    • 词法分析器
    • 语法分析器
    • 语义分析器
    • 中间代码生成
  • Optimizer
  • Back-end
    • 代码生成器
  • 辅助部分
    • 符号表管理
    • 错误检查
  • 其他部分
    • 预处理
    • 汇编器
    • 链接器
    • 加载器

自举语言

Self-Hosted Language

实现自己的编译器或解释器的语言

Rust借用检查器

Borrow Checker

借用检查器是Rust内存安全的核心

Rust的每个值都有唯一一个所有者,当所有者离开作用域,其所占用的内存就会被自动释放(智能指针?)

Rust可以在不获取所有权的情况下访问数据,这个过程称为借用

  • 不可变借用:只读
  • 可变借用:读写

借用检查器的规则:

  1. 一个资源,要么是可变的独占借用,要么是多个共享的不可变借用
    • 如果一个数据变为可变借用,那么借用期间,其他代码无法访问该数据(锁?)
  2. 引用必须是有效的
    • 引用不能指向已经被释放的内存

函数式编程

模式匹配

pattern matching

根据数据的结构和内容,按照预先定义的规则进行处理

// C# 使用 switch 表达式进行模式匹配,根据shape的类型,输出不同的字符串
string description = shape switch
{
Circle c => $"A circle with radius {c.Radius}",
Rectangle r => $"A rectangle with width {r.Width} and height {r.Height}",
null => "A null shape",
_ => "An unknown shape"
};
Console.WriteLine(description);

高阶类型

higher-kinded types

将类型的构造器作为参数

单子

monads

要求实现该类型的类型都必须支持return和bind操作

class Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b

不透明类型

在类定义中隐藏了底层实现细节,只暴露必要接口的类型

比如我不想用户直接访问一个类型的value属性,而是将其包装为不透明类型,这个类型只能用提供好的借口

interface OpaqueType {
// 定义必要的接口
getValue(): string;
}

function createOpaqueType(value: string): OpaqueType {
return {
getValue() {
return value;
}
} as OpaqueType;
}

const opaque = createOpaqueType("secret");
console.log(opaque.getValue()); // 输出 "secret"
// console.log(opaque.value); // 错误:类型 "OpaqueType" 上不存在属性 "value"

评论