V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  agagega  ›  全部回复第 111 页 / 共 269 页
回复总数  5366
1 ... 107  108  109  110  111  112  113  114  115  116 ... 269  
2021-09-18 12:06:52 +08:00
回复了 paranoiddemon 创建的主题 程序员 编译原理大家是怎么学习的?
通常编译器会分为前端、中端、后端三个部分,这种划分不是拍脑袋,而是因为三个阶段的目的有明确的不同:前端是把源代码字符串转换为结构化数据,中端是针对变形后的结构化数据反复做优化,后端是从优化后的数据生成真实的机器指令。

为什么你提到的定义这么复杂,是因为它是一种严格的数学表示。直观理解的话,这个文法就相当于一个树形结构,其中只有某些类型的节点可以作为根。不清楚楼主是否会写正则表达式,正则的本质是有限自动机,从上一个匹配到的字符到下一个,就是自动机状态的跳转,而* ? +这些特殊符号,表示的无非是这种跳转的方向不再是下一个而是自己。写一个最简单的正则匹配引擎可能也就一百行代码。正则表达式能够涵盖的文法被称作正则文法。

直观理解,上下文无关无法比正则文法复杂的本质在于,它支持递归,而正则文法不支持。所以在有限自动机之外,还需要一个栈,才能完整地保存当前解析的状态。一个最简单的例子:你有没有做过那道「检查字符串正反括号是否匹配」的编程练习题?这道题看起来不需要复杂的解析,是因为它的状态过于少,不需要用自动机表示。但如果把题目改成 [] () {}的任意嵌套,大概就可以领会这个语法解析的过程在干什么。

前面说了语法定义是一棵树,那按照树的结构从上往下自己写代码去逐个字符解析的过程,称为递归下降。在常见的语言中,函数的调用层次本身就暗含了栈,所以我们不再需要一个自定义栈去存储当前解析的层级状态。但由于代码是手写的,所以整个过程中我们可以夹带任意的数据结构,这也使得手写的解析器在实际应用中几乎能处理任何奇怪的语法。而书上提到的 LL/LR 这些理论,其实是为了将语法解析这件事通用化——给程序一套语法定义,程序就能按照你的定义去跑,最后返回结果。个中差别有些类似「写一段代码解析一个浮点数的字符串」和「写一个正则引擎,然后给它传一个浮点数的正则表达式,解析字符串」。在理论上,语法分析这块有很多经典的算法;而在实践上,也有很多实用的工具,从语法生成器到语法组合子,等等。

语法解析结束以后,我们必然想要一个表示源码内容的数据结构,而不仅仅是一个表示源码是否符合文法的布尔结果。拿到以后,编译器会做若干自定义的语义检查(比如类型是否匹配)和前端处理(比如在必要的地方插调试信息)。其实到这一步,通过对这颗语法树进行模式匹配,编译器已经可以生成出最后的指令了。但为了更高级的优化,编译器往往会引入一些新的中间表示形式。这些形式通常遵循某种特征(比如每个量只被赋值一次),以减少后续分析的复杂度。编译器的优化,其实更像是「写一段新的代码,比原来的代码更快,但功能保持一致」。很多抽象的优化发生在这个阶段:减少循环中的代码,把循环操作变成向量操作,重新调整分支的关系…

然后到了后端,就会依赖更多的平台信息了。这个阶段,会做很多可能每个硬件平台 /操作系统都不一样的事情:如果移位真的比乘法更快,那就把合适的乘法优化成移位;不同平台的 ABI 要求调用函数或者加载全局变量时有一些额外的指令,也是在这里加上;用一个复杂指令匹配一组复杂操作;更好的分配寄存器以减少寄存器复制和内存读写;重排指令以适配流水线等等。最后吐出的指令就是真的汇编了。

所以后端和中端的知识,理论上比前端更多。前端更大的成就感其实是自己写了一个解析器,拿到了这个语言的结构化表示,然后就可以做任何事情。而且后端和中端在简单情况下确实可以省略,比如你解析了一个 XML,想从它生成 JS 代码,那解析好以后直接遍历这棵树按照规则输出就好了。再往后面,其实就是玩各种新的算法,以及在实践上整新活。
2021-09-18 11:32:11 +08:00
回复了 wizardpisces 创建的主题 TypeScript 把 javascript 编译成 LLVM IR, x86 assembly
忘了在哪看到过的了,TS 宣称自己的类型信息只会用来在开发的时候做类型检查,以后不会有任何利用类型信息帮助引擎做优化的念头。不过有了明确类型,理论上性能确实可以再进一步。
2021-09-18 00:59:04 +08:00
回复了 christin 创建的主题 Apple 抢到没抢到新机的各位别忘了定闹钟
明天不上班,舒适
2021-09-17 20:56:00 +08:00
回复了 Kamiimeteor 创建的主题 Apple 求问,苹果官方 iphone13 宣传片里的游戏是啥?
不太可能是堡垒之夜..现在还下架着呢
2021-09-17 19:00:39 +08:00
回复了 amanohaneizz 创建的主题 问与答 工作写 c++的都用什么 IDE?
clion,在老点的 Mac 上跑大项目很容易卡。vscode 差了点意思,Xcode 比 vscode 好点但是缺功能。
2021-09-17 12:53:49 +08:00
回复了 clearc 创建的主题 Apple 同价位, iPad Pro 11 寸 2020 版比新 mini 强多了
楼主说的没毛病,很多人朝着闹着要 mini 的不就是为了便宜吗。真小屏党已经下单了,而不是「我觉得还是不行,等 mini 7 有 xxx 就好了」。
@XTTX
有自己的芯片 /有自己的语言 /深度学习优化 /数据库优化 /静态分析 /信息安全
2021-09-16 18:45:43 +08:00
回复了 Aowuwu 创建的主题 macOS 九月中旬了, Big Sur 还是 Bug Sur 吗?
记得去年大家的口风还是坚守 Mojave.
不过没关系,到时候 M1X/M2 出来了,买新机的用户都得是 Monterey,嘿嘿
2021-09-16 00:45:27 +08:00
回复了 goool 创建的主题 Apple 苹果介绍 iPhone ,大概有 70% 的时间在说摄影
冷知识,苹果还真做过相机( 90 年代): https://en.wikipedia.org/wiki/Apple_QuickTake
2021-09-16 00:33:53 +08:00
回复了 rv54ntjwfm3ug8 创建的主题 Java 想写个高性能版 Nextcloud 后端,用 Rust 还是 Java 好?
自己写着玩的话就 Rust 呗,有时候踩坑也是种乐趣。不过听说 Rust 的 async/await 这块还没定稿?不应该哇。
2021-09-15 20:47:39 +08:00
回复了 zyh94946 创建的主题 iPhone iPhone 啥时候换 type-c 接口
@AyaFrost
https://www.zhihu.com/question/50454282
说苹果是 type-c 的主导者,在知乎也会被打成无脑果粉。
人人都骂果粉,人人都是果粉,lol
2021-09-15 12:06:22 +08:00
回复了 xaoflysho 创建的主题 Apple 看到新 iPhone ,又想起了我的 Lumia 638
WP 不错的。但也让我认清了微软在消费级产品上不靠谱
2021-09-15 12:04:13 +08:00
回复了 chifung408 创建的主题 MacBook Pro 2021,做前端买 mbp M1 合适吗?
重度生产力用户建议再等等。现在兼容性不错了,但还不是 100%满意,而且后面可能很快还有比 M1 更强的出来。

之前在知乎看到过到处刷 M1 翻车了用不了 Word 的哥们,不知道他现在如何了。我的 Word 没出过毛病…
2021-09-15 11:47:49 +08:00
回复了 zyh94946 创建的主题 iPhone iPhone 啥时候换 type-c 接口
我不认为 lightning 是垃圾,我只是觉得在其他设备都用 usb-c 的情况下,用 usb-c 会更方便。当然,可能真的永远也不会上 usb-c 了。
2021-09-15 08:53:17 +08:00
回复了 SEVLT 创建的主题 Apple iPhone13 降价 800 块
是 12 确实太贵了
2021-09-15 08:40:44 +08:00
回复了 EasonWong 创建的主题 Apple iPhone 8p ios14 系统哪个版本综合效果最好?
之前的 iPhone 7,从 iOS 10 到 iOS 15,13 是我用过最烂的版本,走路上用 AirPods 听歌都能被杀后台
2021-09-15 07:19:32 +08:00
回复了 rickli 创建的主题 问与答 程序员有哪些能干到老的技术方向?
去写 Cobol 吧,能干一辈子,就看你愿不愿意
1 ... 107  108  109  110  111  112  113  114  115  116 ... 269  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5866 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 73ms · UTC 02:46 · PVG 10:46 · LAX 18:46 · JFK 21:46
Developed with CodeLauncher
♥ Do have faith in what you're doing.