Kyon Huang 的博客

Github 连接不稳定,请科学上网以获取最佳访问效果

0%

继续学习解释器构造和 ANTLR。在系列博文的上一篇 ANTLR v4 学习笔记(二)-实现变种计算器,我们用 ANTLR 实现了一个变种计算器,从而对 ANTLR 语法、访问器(Visitor)机制、集成以及 ANLTR 的错误处理机制有了更深的理解。

上篇博文对应着《The Definitive ANTLR 4 Reference》中的 Chapter 4 A Quick Tour,但没有覆盖整个 Chapter 4 的所有内容。因此这篇博文将介绍一下 Chapter 4 的剩余内容——监听器(Listener)机制、代码片段嵌入语法,以及词法分析的一些很棒的特性。

阅读全文 »

继续学习解释器构造和 ANTLR。在系列博文的上一篇 ANTLR v4 学习笔记(一)-ANTLR 初体验,我们已经学习了如何安装、使用 ANTLR,并研究了构建语言应用程序所需的关键过程、术语和构建块。接下来,我们将通过一个不算复杂的例子来描述 ANTLR 的功能,来让我们对 ANTLR 有个大概的感觉。

我将用 ANTLR 来实现一个变种计算器(变种意指它和普遍看到的计算器不太一样),它遵循上学期编译原理课程第一次实践作业要求。稍后我也将给出对这个计算器的要求描述。

这篇博文对应着《The Definitive ANTLR 4 Reference》中的 Chapter 4 A Quick Tour,但示例和内容与书上有些区别,而且没有覆盖整个 Chapter 4 的所有内容。我会更多地介绍实现学习过程中的经历和错误、自己对 ANTLR 的理解,以及一些实践经验和心得等等。

阅读全文 »

技术的学习一定要辅以代码的实践,菜鸟程序员扑在轮子上要像饥饿的人扑在面包上。
——沃兹基硕德

受到掘金上看到的 yddict:一个命令行查单词的工具 的启发,原来摸一个 Node.js 的 demo 不一定非要写一个服务器。恰逢最近开始看《算法(第4版)》,把练习代码和笔记传到 github 上时需要在 README.md 里放一份带链接的目录,方便在线跳转查阅。两者综合,就有了开发一个能够将项目内文件结构自动映射并生成为 README.md 的项目目录管理工具的灵感。

看上去是一个简单的小工具,实际上花了 3 天才基本成型(当然不是整的)。随着思路从项目目录管理到图书管理再到书籍再到文艺社,我决定将这个小工具命名为 yuki,蕴含了我个人满满的宅趣味。

幸运的是,这个日语里常见的词竟然在 NPM 里还没被抢用。我也因此不用为其加个后缀,直接就可以用这个名字传上 NPM,以供使用。

这篇文章剩下来的篇幅一是介绍这个小工具的使用场景、实际用法等,二是大概谈一谈开发过程中稍微值得一记的东西。

阅读全文 »

年轻的决定总是美好而不负责任的。如果曾有人发誓要成为前端工程师,那他已经把过去的影子留在了古老的不再回来的夏日。现在的我是一名光荣的 Python 初学者!

今天有幸和朱卫平老师聊了一下。朱老师人很 nice,本身我也对智能爬虫的研究很感兴趣。既然要写爬虫,Python 这方面的生态环境还是要比 Node 强大不少。当然我也希望不丢掉之前的 JS 和 Node 基础,要时常写点东西或者看看书保持状态。

顺便谈一下,朱老师让我学 Python 2.7,大概是有一些历史遗留问题。但是我在知乎上查了一下,还是决定先看廖雪峰 3.x 版本的 Python 教程。我觉得知乎里一个回答给的建议不错,摘抄一下:

  • 学习 Python 前,先了解在 Python 3 里面已经弃用的 Python 2 语法,对这些部分简单带过不要花太多时间;
  • 使用 Python 2,不要使用 Python 2.7 以前的版本;
  • 使用 Python 3,不要使用 Python 3.4 以前的版本;
  • 多了解 Python 2 的__future__库;
  • 对同一份代码,不要为 Python 2 和 Python 3 分别维护分支,努力在一套代码中兼容 Python 2 和 Python 3。

根据以上建议,我在 Anaconda 配置了 2.7.13 和 3.6.0 的两种版本。当然这份回答里最重要的还有一句话:

stop talking, just do it!

这一篇大概就讲这么些废话。人生苦短,我用 Python,常听到这句话,现在我就来体验啦!

新学期又迎来新课程《解释器构造实践》,通过综合应用来加深对编译原理技术的理解。该实验课最终要求设计并编制调试一个 CMM(C Minus Minus,C 语言的一个子集)程序结构的解释器,对输入的满足 CMM 语法的源程序文件进行解释执行。

课程推荐使用自动化生成工具 ANTLR,因此在这里持续记录我的解释器构造及 ANTLR 学习过程。当然也不排除之后可能会换用其他工具,或者全部自己实现。

ANTLR 目前更新到 v4.7,有一本详尽的使用说明《The Definitive ANTLR 4 Reference》。可惜到目前为止还没有找到中文译本,只有一些零零碎碎的翻译。所幸读完前两章,感觉我的英文水平还是能支持我不用查太多的词就能理解书中所著内容。因此这篇学习笔记也会整理一些书中重要的内容(当然会加以翻译)。

更新记录:

  • 17.09.06 《The Definitive ANTLR 4 Reference》Chapter 1、2 阅读完毕,笔记初版发布
  • 17.09.11 Chapter 3 阅读完毕,增加动手上路章节。
  • 17.09.20 对全文进行一定的润色,并修正了一些不太贴切的翻译
阅读全文 »

在底层系统中,异步通过信号量、消息等方式有了广泛的应用。但程序员们还是习惯采用同步的方式编写应用,在绝大多数高级编程语言中,异步并不多见。Java 中用多线程来应对高并发的场景,而 PHP 甚至连多线程都不提供。

Node 是首个将异步作为主要编程方式的运行平台。伴随着异步 I/O 的还有事件驱动和单线程,它们共同为 Node 的设计理念奠定基调,Node 由此成为首个大规模将异步 I/O 应用在应用层上的平台。

因此,想要深入理解 Node 的运作机制,就必须理解 Node 中的异步。对操作系统有学习经验的同学应该会更容易理解。

这篇博文在《深入浅出 Mode.js》第三章笔记的基础上,加上自己的思考与总结而写成。全是硬货,需得再啃。

阅读全文 »

本篇博文承接前端工程自动化入门系列的第一篇:《初探前端自动化测试–以 Vue 为例》

传统开发模式中,项目经理等待所有模块都开发完成后再进行集成,出现 bug 则记录并分配责任人进行修改,之后再进行集成,直到通过测试为止持续循环。这个过程可能会出现如下问题:

  1. bug 总在最后才被发现(尤其是模块之间的依赖导致的 bug),并且越到项目后期,随着项目规模的膨胀,bug 变得愈发难以修复;
  2. 各个环节无效的等待时间较长,加上程序需要经常变更,导致软件交付时机无法保障;
  3. 用户无法随时看到项目演示原型,满意度低。

为了解决这些问题,“持续集成”(Continuous Integration)的概念被提出。

阅读全文 »

昨天花了一天时间,用 Vue 给自己撸了一份线上简历,并借助 Github Pages 实现了在线预览的效果。

目前实现的是最简单的效果,可以说只用了 Vue,不涉及全家桶里其他产品。从 UI、文字、性能、测试等各种角度都有改进的空间。这个小项目应该是会长期维护的。今天先总结一下,做到目前为止遇到的坑。

阅读全文 »

随着前端项目规模日益膨胀,自动化测试显得越来越重要。在开发过程中就进行测试,可以保障代码质量和功能实现完整度,提升后期开发效率,也便于项目维护。当然,对于需求变更频繁、复用度低的内容,维护测试用例的成本就显得过高;但对于稳定、多次复用以及需要长期维护的项目,自动化测试就尤为重要。

现在优秀的开源项目大多都经过了各种测试。最近我也想码一个规范性要求严格的小项目,于是兵马未动粮草先行,先对前端自动化测试进行学习,总结记录一下学习成果,以在之后项目上进行实践。

前端的测试类型分为单元测试(unit testing)集成测试(integration testing)端到端测试(e2e testing)

  • 单元测试将应用拆分为细小的组件(JS 中的一个函数/对象/模块等)方法,然后针对这些方法进行单独的测试工作;
  • 集成测试是针对产品的某个功能的测试,又称功能测试;
  • e2e 测试则是从用户界面直达数据库的全链路测试,模拟用户进行页面操作,通过判断页面状态的变化来检查功能是否运行正常,需要用到浏览器环境。
阅读全文 »

继续读《ECMAScript 6 入门》。在 ES6 之前,异步编程大概有四种方法:回调函数、事件监听器模式(发布/订阅模式)、流程控制库和 Promise/Deferred 模式。为了使异步操作更加清晰、简洁、方便,ES6 引入了 Generator 函数,而 ES2017 标准引入了 async 函数作为 Generator 函数的语法糖。

由于 JavaScript 是单线程,异步操作就显得格外重要。web 框架 koa 1.0 使用 Generator 实现异步,而基于 ES7 的 koa 2 完全使用 Promise 并配合 async 来实现异步。因此,在着手去了解这些基于 NodeJS 的 web 框架前,我决定先补充关于 ES6 的异步操作的知识。

本博文在 Promise 对象 | 大黄菌的个人博客 之后食用最佳。

:HTML 5 提出了 Web Worker 标准,允许 JS 脚本创建多个线程以充分利用多核 CPU 的计算能力。但子线程不得操作 DOM,且完全受主线程控制,因此此标准并没有改变 JavaScript 单线程的本质。

阅读全文 »