程序的表示、转换与链接 - week10、11
本文是 程序的表示、转换与链接 中第 10、11 周的内容,主要介绍了从源文件生成可执行文件的步骤 (预处理、编译、汇编、链接),并详细描述了其中的链接这一步骤中的两大过程:符号解析与重定位,并对比了链接输入的可重定位目标文件和输出的可执行目标文件的差别;对了解文件的从编译到执行原理有一定帮助,可配合 《链接、装载与库》 阅读笔记 一起阅读。
本文是 程序的表示、转换与链接 中第 10、11 周的内容,主要介绍了从源文件生成可执行文件的步骤 (预处理、编译、汇编、链接),并详细描述了其中的链接这一步骤中的两大过程:符号解析与重定位,并对比了链接输入的可重定位目标文件和输出的可执行目标文件的差别;对了解文件的从编译到执行原理有一定帮助,可配合 《链接、装载与库》 阅读笔记 一起阅读。
Embedding-based Retrieval in Facebook Search 是 FB 在 2020 年发表的一篇搜索场景下如何做向量化召回的 paper,整篇文章读下来,就像是一个奋战在一线的工程师向你娓娓道来他们是怎么从 0 到 1 构建一个召回系统,从训练数据与特征的选取,到模型的 training 与 serving、再到把新的召回策略融入现有的 ranking system, 整篇 paper 并没有太多的公式与推导,但是却有很多在实战中总结出来的经验,而且这些经验相信也可以推广搜索以外的推荐 / 广告领域。本文主要是根据笔者对这篇 paper 的理解做一些提炼,推荐读原文。
推荐与广告可以说是很多互联网公司的两个重要业务,其中推荐是为了 DAU 的增长,或者说流量的增长,而广告则是利用这些流量进行变现。两者的要解决的问题也很相似,都是在每条流量到来的时候,要从一个庞大的候选集中选出 topk 个候选返回,基本都采用 召回 + 精排 的架构,中间还可能插入粗排,本质上都是在效果与工程之间做 trade-off。
如果说两者技术上最大的 diff,笔者认为是出价,因为在广告场景中引入了广告主 (advertiser) 这一角色,因此我们除了考虑用户体验,还需要满足金主爸爸们的诉求(如跑量、成本等),才能带来持续的收入增长,而金主爸爸们表达其诉求的最直接的手段就是出价,其含义就是愿意为每个 click/convert 付出多少钱 (truthful telling)。这带出来的就是 bidding 这一研究领域,关于这个领域在 rtb-papers 中有很多相关的 paper。
本文主要讲的是 2019 KDD 阿里的 Bid Optimization by Multivariable Control in Display Advertising,这篇 paper 解决了出价的两个的核心问题:出价公式和调价策略,从最优的出价公式的推导到出价控制器的构建,文章的总体的建模思路非常值得学习,整个推导的 paradigm 能够推广到更一般的出价场景,实践性也较强,推荐读原文。
本文是 程序的表示、转换与链接 中第 7 周的内容,主要介绍了 C 语言程序中过程调用、也就是函数调用对应的机器级表示, 包括如何传递参数,如何将控制转移到被调用过程, 寄存器使用约定,递归函数的实现等等。 通过了解这些内容,能够更清楚机器执行的详细过程,同时也能更清楚函数调用过程中栈空间是如何变化的;课程选用的指令系统是前面介绍过的 IA-32 指令系统。
Real-time Personalization using Embeddings for Search Ranking at Airbnb 是 KDD 2018 的 best paper, 整篇文章读下来,初看好像只是套了 word2vec 来生成 user embedding 和 item embedding;但是细读下来,会发现其中有不少细节值得考究,这种风格跟 youtube 在 2016 年发表的那篇 Deep Neural Networks for YouTube Recommendations 很像,两篇都是实践性很强的 paper,非常值得看。而且两篇文章分别代表着 deep learning 中生成 embedding 的两大流派:无监督和有监督。本文主要讲的是 Airbnb 的这篇 paper 的基本做法和一些细节。
本文是 程序的表示、转换与链接 中第 5、6 周的内容,主要介绍了程序和指令的关系,目标文件的基本格式,并详细地介绍了 IA-32 体系下的指令系统,包括各种指令的类型、指令执行的基本流程,通过以上内容可以对计算机内部如何执行程序有一个感性的认识。
本文是链接、装载与库中关于可执行文件装载的过程,主要描述了进程在被装载时虚拟空间是如何分布的,物理内存空间与虚拟地址空间是如何映射的,同时描述了 Linux 系统下装载一个可执行文件的基本过程。
本文的内容主要是 程序的表示、转换与链接 这门课第二周的内容,主要介绍了浮点数和整数在机器内如何编码和存储 (大端和小端) 的,了解这些细节后,能够更好地理解代码中进行数值计算和比较时出现的违反直觉的结果,同时也能避免出现这样的问题。
一直对以 C/C++ 为代表的的编译型语言的编译、运行的原理了解不多,最近正好看到这本由国人写的书 链接、装载与库,书名已经比较言简意赅的介绍了书里相关内容,而且写得挺通俗的,值得一看。这里是书里第一、二部分内容的一些笔记,主要讲了操作系统的一些基本概念,编译生成的目标文件格式和静态链接的过程;由于笔者只摘录一些不太了解的内容,因此总体内容可能不是非常成体系,建议读原书。
最近在 coursera 上发现一门不错的课程,程序的表示、转换与链接,内容是类似《深入理解计算机系统》这本书的,说来惭愧,虽然在上学时零星上过一些相关的课程,但是却没有系统地将这些内容串起来理解。本着算法工程师首先得是个工程的原则,觉得还是有必要去了解一下这块内容;而且课程内容讲得挺通俗的,值得一听。
本文的内容主要是 week1 的内容,较为宏观地介绍了如何从冯・诺依曼体系结构演进至现代计算机结构、程序执行的基本原理、微体系结构与指令集 (ISA) 等。由于课程 PPT 说得已经较为清晰了,这里大部分内容会直接截图(懒得再打字也是一个原因。。。)