手把手带你写一门编程语言
宫文学
北京原点代码 CEO
7235 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
起步篇:让一门超简单的语言跑起来 (21讲)
结束语 (1讲)
手把手带你写一门编程语言
15
15
1.0x
00:00/00:00
登录|注册

01|实现一门超简单的语言最快需要多久?

你好,我是宫文学。
说到实现一门计算机语言,你肯定觉得这是一个庞大又复杂的工程,工作量巨大!
这个理解,我只能说部分正确。其实,有的时候,实现一门语言的速度也可以很快。比如,当年兰登·艾克(Brendan Eich)只花了 10 天时间就把 JavaScript 语言设计出来了。当然,语言跟其他软件一样,也需要不断迭代,至今 JS 的标准和实现仍在不停的演化。
如果我说,你也完全可以在这么短的时间内实现一门语言,甚至都不需要那么长时间,你一定会觉得我是在哗众取宠、标题党。
别急,我再补充说明一下,你马上就会认可我的说法了。这个让你一开始实现的版本,只是为了去探索计算机语言的原理,是高度简化的版本,并不要求马上能实用。你可以把它看做是一个原型系统,仅此而已,实现起来不会太复杂。
好吧,我知道你肯定还在心里打鼓:再简单的计算机语言,那也是一门语言呀,难度又能低到哪里去?
这样,先保留你的疑虑,我们进入今天的课程。今天我就要带你挑战,仅仅只用一节课时间,就实现一门超简洁的语言。我会暂时忽略很多的技术细节,带你抓住实现一门计算机语言的骨干部分,掌握其核心原理。在这节课中,你会快速获得两个技能:
如何通过编译器来理解某个程序;
如何解释执行这个程序。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一门编程语言》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(22)

  • 最新
  • 精选
  • 青玉白露
    这门课我追定了!宫老师加紧更新哈,内容很赞

    作者回复: 多谢支持!

    7
  • 千无
    很赞,课后习题一定要做,这才是这门课的精髓,实践它掌握它,课就超值

    作者回复: 非常好,这门课就是提倡动手实践的!

    1
  • 全国第一菜
    偶然间习得宫老师的前两门课,如获至宝,对个人提升显著。今天看到开新课了,第一时间来支持,因为知道自己又要变强了!!加油

    作者回复: 谢谢肯定,加油!

    1
  • 有学识的兔子
    给宫老师点赞,老师提供出来的课程都是夯实编程能力的知识。工作中功能业务围绕业务展开,基于成熟的框架设计模式做功能开发或局部优化,过程中也隐约感受缺失对编程世界整体了解带来的麻烦。之前也学习了一点点宫老师《编译原理之美》,很庆幸感受这门实战课。Fighting !

    作者回复: 谢谢肯定,一起Fighting!

  • _______R
    宫老师,我之前看过一点点 ts,现在主学 go,今天刚把 01 的代码用 go 重写,可以提交到码云上吗

    作者回复: 可以呀。你建一个自己的仓库,可以把链接分享出来!

    2
  • qinsi
    if嵌套看着脑阔疼,建议扩充token类型,增加一些helper方法: ```typescript /** * 解析函数调用 * 语法规则: * functionCall = Identifier "(" parameterList? ")" ";" * parameterList = StringLiteral ("," StringLiteral)* */ private parseFunctionCall(): FunctionCall | undefined { if (!this.hasNext(TokenKind.Identifier)) return; const funcName = this.consume(TokenKind.Identifier); this.consume(TokenKind.LParen); const params = []; if (this.hasNext(TokenKind.StringLiteral)) { params.push(this.consume(TokenKind.StringLiteral)); while (this.hasConsumed(TokenKind.Comma)) { params.push(this.consume(TokenKind.StringLiteral)); } } this.consume(TokenKind.RParen); this.consume(TokenKind.Semi); return new FunctionCall(funcName, params); } } ```

    作者回复: 没问题,你可以修改优化一下。 事实上,在后面的章节中,这些代码的结构就修改了,变成了直线式的代码,同时增加了语法错误的处理能力。 这一节的代码,是为了尽量避免太多功能,尽量避免复杂化。

  • 被讨厌的勇气
    递归思想,在程序中常见的实现是:自己调用自己,即函数调用自身。 递归思想的本义是:将一个复杂问题分解成规模较小的几个子问题。从递归思想的角度来看,递归下降算法将语法分析分解为函数声明分析、函数调用分析,且子问题可以进一步分解,所以称之为“递归”。
    5
  • 张贺
    代码中RefResolver中的visitFunctionBody方法不应该return吧
    2
    4
  • 奋斗的蜗牛
    期待后面后端的内容,一直卡在这块,找不到学习的思路,老师水平真高,深入浅出!!
    2
  • Geek_9a1bc6
    代码node命令执行没问题,用tsc命令编译报错: Type 'void' is not assignable to type 'FunctionCall'. 有没有遇到的童鞋?
    1
收起评论
显示
设置
留言
22
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部