小编Mag*_*sen的帖子

组合子类型(在Scala中)

我正在寻找一种干净的面向对象的方式来模拟以下(在Scala中):

一个人可以是:

  • 某公司的经理
  • 一位数学家
  • 世界级的网球运动员
  • 一个业余爱好者程序员
  • 当地学校的志愿者
  • 一个有创意的画家

这表明我们引入了Person超类和子类:

  • Manager
  • Mathematician
  • TennisPlayer
  • HobbyistProgrammer
  • Volunteer
  • Painter

Manager类有方法,如:getSalary(),workLongHours(),findNewJob()TennisPlayer类有方法,如:getWorldRanking(),playGame(),strainAnkle(),等等等等.另外在课堂上也有Person类似的方法becomeSick().一个生病的经理失去了工作,网球运动员在赛季中停止了比赛.

此外,这些课程是不可改变的.也就是说,例如,strainAnkle()返回一个TennisPlayer具有紧张脚踝的新的,但所有其他属性保持不变.

现在的问题是:我们如何模拟一个人可以既是a Manager又是a TennisPlayer

解决方案保留不变性和类型安全性非常重要.

我们可以实现以下类:

  • ManagerAndMathematician
  • ManagerAndTennisPlayerAndPainter
  • ManagerAndPainter

但这导致了类的组合爆炸.

我们也可以使用traits(with state),但是我们如何实现诸如的方法findNewJob(),这些方法需要返回一个具有相同特征的新人,但是具有新的Manager特征状态.同样,我们如何实现诸如becomeSick()

问题:如何在Scala中以干净的OO方式实现这一点?请记住:不可变性和类型安全是必须的.

scala

15
推荐指数
1
解决办法
491
查看次数

我正在编写自己的JIT解释器.如何执行生成的指令?

我打算编写自己的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)

c x86 assembly

7
推荐指数
1
解决办法
550
查看次数

标签 统计

assembly ×1

c ×1

scala ×1

x86 ×1