我正在寻找一种干净的面向对象的方式来模拟以下(在Scala中):
一个人可以是:
这表明我们引入了Person超类和子类:
ManagerMathematicianTennisPlayerHobbyistProgrammerVolunteerPainter本Manager类有方法,如:getSalary(),workLongHours(),findNewJob()等TennisPlayer类有方法,如:getWorldRanking(),playGame(),strainAnkle(),等等等等.另外在课堂上也有Person类似的方法becomeSick().一个生病的经理失去了工作,网球运动员在赛季中停止了比赛.
此外,这些课程是不可改变的.也就是说,例如,strainAnkle()返回一个TennisPlayer具有紧张脚踝的新的,但所有其他属性保持不变.
现在的问题是:我们如何模拟一个人可以既是a Manager又是a TennisPlayer?
解决方案保留不变性和类型安全性非常重要.
我们可以实现以下类:
ManagerAndMathematicianManagerAndTennisPlayerAndPainterManagerAndPainter但这导致了类的组合爆炸.
我们也可以使用traits(with state),但是我们如何实现诸如的方法findNewJob(),这些方法需要返回一个具有相同特征的新人,但是具有新的Manager特征状态.同样,我们如何实现诸如becomeSick()?
问题:如何在Scala中以干净的OO方式实现这一点?请记住:不可变性和类型安全是必须的.
我打算编写自己的JIT解释器作为VM课程的一部分.我对高级语言,编译器和解释器有很多了解,但很少或根本没有关于x86汇编(或C语言)的知识.
实际上我不知道JIT是如何工作的,但这是我对它的看法:用一些中间语言读入程序.将其编译为x86指令.确保最后一条指令返回到VM代码中的某个地方.将指令存储在内存中的某些位置.无条件跳转到第一条指令.瞧!
所以,考虑到这一点,我有以下小C程序:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main() {
int *m = malloc(sizeof(int));
*m = 0x90; // NOP instruction code
asm("jmp *%0"
: /* outputs: */ /* none */
: /* inputs: */ "d" (m)
: /* clobbers: */ "eax");
return 42;
Run Code Online (Sandbox Code Playgroud)
}
好吧,所以我的目的是让这个程序将NOP指令存储在内存中的某个位置,跳转到该位置然后可能会崩溃(因为我没有设置任何方式让程序返回到main).
问题:我是在正确的道路上吗?
问题:你能告诉我一个经过修改的程序,它可以找到回到main中某个地方的方法吗?
问题:我应该注意的其他问题?
PS:我的目标是获得理解,而不是以正确的方式做所有事情.
感谢所有的反馈.以下代码似乎是在我的Linux机器上启动和工作的地方:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
unsigned char *m;
int main() {
unsigned int pagesize = getpagesize();
printf("pagesize: %u\n", pagesize);
m = malloc(1023+pagesize+1); …Run Code Online (Sandbox Code Playgroud)