C++对象内存布局–gdb初探
继承、多态是OOP中两大特性。C++号称是面向对象的语言,自然也要支持上面的两种设计特性。这里主要探究g++中对这两大特性的支持——vtables。大部分内容参考自 C++ vtables 。
我有十个手指头
愿她们在键盘上舞蹈
奏出最美的乐章
继承、多态是OOP中两大特性。C++号称是面向对象的语言,自然也要支持上面的两种设计特性。这里主要探究g++中对这两大特性的支持——vtables。大部分内容参考自 C++ vtables 。
一个python对象的属性有以下几种:
以上的几种描述符都可以通过 inspect 模块进行进行检查, 本文主要涉及前面3种属性的查找过程.
哈佛版本 CS 101:) (http://www.nand2tetris.org/)
(CS 101: Stanford 的计算机公开课 https://lagunita.stanford.edu/courses/Engineering/CS101/Summer2014/about#video-modal)
课程配套的教材中文译本是: 《计算机系统要素》(https://book.douban.com/subject/1998341/)
在作者的视频介绍中提及,CS涵盖的主要内容是:
1 | OS, Hardware, Programming Language, Architecture, Data Structures, Compilers, Algorithm, Software Engineering, etc. |
现有很多课程主要专注于上述的某一方面的内容,缺少了对整个计算机系统介绍的big picture,这正式这门课程想要解决的问题。
课程从 Nand 逻辑门开始讲起,涉及机器语言、汇编器、OS等内容,全面介绍了计算机系统,但是因为涉及面比较广,介绍的不是很深入,比较适合入门,另外课程配套了一些project, 可以在网站上面找到相应的软件以及text。
这里主要介绍第一个 project
用户评论(review text)作为一个丰富的信息源,越来越受到推荐系统研究人员的关注,而在推荐系统的设定下,利用review text 的推荐算法在为一个特定的user以及item进行预测时,对应user,item的review text 是不存在的,这造成了这一类算法在推荐的时候没有review text 可利用。这篇paper通过将训练数据中所有的user、item、review text 表示成同一个向量空间中的向量并假设review text 的向量等于特定user与item的向量之差,构建了特定的(user, item, review text)在向量空间中的约束关系,得到了user、item、各自对应的向量化表示后,那些未知的review text 可以通过两者的差进行表示,进而作为test time阶段,推荐算法的输入。
一篇关于JIT入门的译文,原文传送: http://blog.reverberate.org/2012/12/hello-jit-world-joy-of-simple-jits.html
本文演示了一个简单的JIT编译器能够完成什么样的有趣的事情。JIT,听起来就像是程序中最深层的魔法,似乎只有团队中最核心的成员才会有接触它的想法。它让人联想起类似于 JVM, .NET 这些需要成千上万行代码的大型运行时系统。 也许你从未见过在 JIT 领域中的 “Hello World” 程序,这正是这篇文章尝试改变的。
如果你仔细想想,一个 JIT 其实和一个普通的 printf 函数没什么太大的不同,它们的区别在于: printf 输出了类似于 “Hello, HMM” 这样的信息,而一个 JIT 输出的是一段机器码。 当然了,类似于 JVM 的 JITs 确实是一些复杂的事务,但那是因为它们的任务是在一些复杂的平台上完成一些代码优化任务。 如果我们将事情简化,我们的程序也能够变得十分简单。
完成一个简单的 JIT 最为困难的部分在于,如何输出机器码使得你的目标CPU能够执行这些机器码。举个例子来说, 在x86-64平台中,push rbp 汇编指令被编码为 0x55. 完成这些编码工作需要读许多的CPU手册, 因此我们将跳过这部分的工作,相反使用另外一个非常 nice 的库 DynASM 来处理这些指令编码。DynASM 为你提供了一些巧妙的方式来处理由C编写的JIT 生成的汇编代码。这个库支持了许多的CPU架构(x86, x86-64, PowerPC, MIPS 以及 ARM) 。 同时, DynASM非常的校,完整的运行时包含在一个500-line的头文件中。
在这里,我先阐明一个术语。 我把任何能够在运行时执行生成代码的程序都称为 JIT. 另外一些人可能将 “JIT” 用在更特别的地方。它们更愿意用 JIT 来指代一些混合了解释器和编译器来生成机器码的程序。这些作者会将在运行时生成机器码的技术成为动态编译。 但 JIT 是一个更加普遍更具有标志性的术语,并且常常会被用在与 JIT 的定义截然相反的某些途径上。
又是我——那一枚被很多人玩坏了的硬币。大家呢,总是很喜欢把我抛来抛去。忘了多少年前, 一个叫做伯努利的人,把我往天上抛了$N$次, 还幸灾乐祸的统计了我脸着地的次数,记作$X$。然后说我脸着地的次数是一个服从二项分布的随机变量, 记作 $X\sim B(N, p)$ , 其中 $p$ 是我每一次脸着地的概率。这个二项分布呢,是一个离散型的概率分布, 那货给出了在$N$ 起飞中, 我脸着地次数的概率如下:
$$
P(X = x) = C_N^xp^x(1-p)^{N-x}
$$
那么,在知道我每一次脸着地的概率的情况下, 大家就能够算出在$N$ 次起飞中,我脸着地次数的概率; 但是身为一枚骄傲的硬币,怎么可以让人类轻而易举的就知道我每一次脸着地的概率!!!
柏拉图走进了他的麦田,给世人留下了错过与后悔。
—— 沃兹基·索德
人类是一种三维空间的生物, 我们能够在xyz 方向上任意穿梭, 从欧氏空间的任意一点跃迁到另外一点。可是啊,在第四个维度——时间轴上, 每一个人也就只能缓缓而前, 无法预知未来亦未能改变过去。每一条生命的长河总会在某个时间节点与某一条河流交汇。 从我们呱呱落地遇见那两个赋予我们生命的人开始,到牙牙学语遇见与我们相交一生的伙伴,再到灵魂相认找到灵魂的另一半。个中关系, 有一些是我们可以无法选择的, 而有一些确实我们可以选择的。就比如女生选男票。有了选择权, 按照人类最正常的想法就是: 啊, 选最好的。 可是, 怎么样的才能选择出最好的? 有人说,这个问题可以称为“拒人问题”, 因为,你为了选择得到最好的, 总要把某些向你表白的男生拒掉, 而采用怎么样的拒绝人的策略才能是你最终选择一个最好的男生。