为什么大多数编程语言都不支持多继承?
我真的可以使用这个功能来开发不同的应用程序布局吗?
(免责声明:这些示例是在构建编译器的上下文中给出的,但是这个问题都是关于访问者模式的,并且不需要任何编译器理论知识.)我将通过Andrew Appel的Java中的现代编译器实现来尝试自学编译器理论(所以不,这不是家庭作业),我无法理解他想如何使用访客模式将AST转换为IR树.(注意:我在Python中这样做,所以我也可以学习Python,这就是为什么即将推出的示例不是Java的原因.)据我所知,访问者模式中的访问和接受方法是无效的设计类型,所以,如果我有类似的东西
class PlusExp(Exp):
def __init__(self, exp_left, exp_right):
self.exp_left = exp_left
self.exp_right = exp_right
def accept(self, v):
v.visit_plus_exp(self)
Run Code Online (Sandbox Code Playgroud)
那么我希望能够写一个像访问者的方法
def visit_plus_exp(self, plus_exp):
return BINOP(BinOp.PLUS,
plus_exp.exp_left.accept(self),
plus_exp.exp_right.accept(self))
Run Code Online (Sandbox Code Playgroud)
这会将两个子表达式转换为IR,然后将它们与表示加号表达式的BINOP链接起来.当然,这是不可能的,除非我修改所有的接受函数以返回额外的信息,这也很麻烦,因为有时你只是想要一个不返回任何内容的打印访问者.然而,本文坚持认为访问者是正确的方式,而在Java中,这意味着它可以在没有Python灵活性的情况下完成.我想不出任何不太令人难以置信的解决方案 - 任何人都可以启发我的预期设计吗?
我的主要领域是.Net,但最近我与Java有关.我必须在Java中创建一个shell实用程序,它可以在后台运行,在指定的持续时间后读取少量数据库记录并进行进一步处理.这是一种调度程序.现在我几乎没有顾虑:
如何使这项工作作为一项服务.我想通过shell脚本执行它,该实用程序应该开始运行.当然,控件应该返回到调用脚本.
其次,最终我可能想要阻止这个过程运行.怎么做到这一点?
我理解这些是基本问题,但我真的不知道从哪里开始,哪些选项最适合我.
有任何帮助/建议吗?
我写了一个网络爬虫,我希望能够通过键盘停止.当我打断它时,我不希望程序死掉; 它需要先将其数据刷新到磁盘.我也不想抓住KeyboardInterruptedException,因为持久数据可能处于不一致状态.
我目前的解决方案是定义一个捕获SIGINT并设置标志的信号处理程序; 在处理下一个url之前,主循环的每次迭代都会检查此标志.
但是,我发现如果在socket.recv()发送中断时系统正好执行,我会得到:
^C
Interrupted; stopping... // indicates my interrupt handler ran
Traceback (most recent call last):
File "crawler_test.py", line 154, in <module>
main()
...
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/socket.py", line 397, in readline
data = recv(1)
socket.error: [Errno 4] Interrupted system call
Run Code Online (Sandbox Code Playgroud)
并且该过程完全退出.为什么会这样?有没有办法阻止中断影响系统调用?
我的代码如下:
#include <stdio.h>
int main()
{
int x = 10, y = 0;
x = x++;
printf("x: %d\n", x);
y = x++;
printf("y: %d\n", y);
}
Run Code Online (Sandbox Code Playgroud)
考虑到后增量的性质,我希望得到以下结果:
x: 10
y: 10
Run Code Online (Sandbox Code Playgroud)
我的理由是,在第5行,x应该在增量发生后分配给它的初始值.
相反,我得到了这个:
x: 11
y: 11
Run Code Online (Sandbox Code Playgroud)
深入到装配中,这对我来说是一个刻意的选择:
LCFI2:
movl $10, -4(%rbp) // this is x
movl $0, -8(%rbp) // this is y
incl -4(%rbp) // x is simply incremented
movl -4(%rbp), %esi
leaq LC0(%rip), %rdi
movl …Run Code Online (Sandbox Code Playgroud) 我目前正在通过Andrew Appel的Java中的现代编译器实现工作,我正处于建立低级中间表示的地步.
最初,我决定瞄准JVM并忽略所有低级机器的东西,但为了学习我不太了解的事情,我已经改变了主意.这会改变我的IR,因为以JVM为目标允许我(或多或少)挥动我的手来进行方法调用或构建对象.
Appel书没有详细介绍任何特定的机器架构,所以我想知道在哪里可以找到我需要知道的更远的东西.
我现在知道的事情我需要知道的是:
使用哪个指令集.我有两台可以开发的笔记本电脑; 两者都有Core 2 Duo处理器.我目前的理解是x86处理器大多使用相同的指令集,但它们并非完全相同.
操作系统是否影响编译的代码生成步骤,或者它是否完全依赖于处理器.例如,我知道生成在32位与64位平台上运行的代码有所不同.
如何组织堆栈帧等.何时使用寄存器与在堆栈上放置参数,调用者保存与被调用者保存,所有这些.我曾经想过这将与指令集一起描述,但到目前为止我还没有在任何地方看到这个特定的信息.也许我在这里误解了什么?
完全欢迎链接到资源以代替答案.
我有一个调用一堆函数的python脚本,每个函数都将输出写入stdout.有时当我运行它时,我想通过电子邮件发送输出(以及生成的文件).我想知道如何捕获内存中的输出,以便我可以使用该email模块来构建电子邮件.
到目前为止我的想法是:
我正在写一个代表矩阵的类.我希望它看起来像这样:
public class matrix {
private int[][] matrix;
private double[][] matrix;
//And so on and so forth so that the user can enter any primitive type and
//get a matrix of it
}
Run Code Online (Sandbox Code Playgroud)
这是合法代码,还是我必须根据矩阵所拥有的数据类型使用不同的变量名?
public class Empty {
public static void main( String[] args ) {
TreeSet<Class> classes = new TreeSet<Class>();
classes.add( String.class );
String test = new String();
try{
if( classes.contains(test.getClass()) ){
System.out.println( "contains" );
}
}catch(ClassCastException cce){
System.out.println( "Expected: " + classes );
System.out.println( "But it was: " + test.getClass() );
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么这会抛出ClassCastException?
我有一组 CPU 密集型进程,它们偶尔会相互依赖才能继续。所以像
def run():
while True:
do stuff
wake up some other process
wait for some other process to wake me up
do stuff
Run Code Online (Sandbox Code Playgroud)
在每个进程中,我想使用异步,这样我就可以run在其他人等待被唤醒时始终有一个正在运行的实例。查看asyncio文档,我看到的“高级 API”部分中唯一的 IPC 选项使用套接字。我更愿意使用管道,看起来我可以用低级 API 来做,但是该文档充满了警告,如果您只是在编写应用程序,那么使用它是错误的。有人可以权衡这里的惯用做法吗?(而且,速度是一个重要因素,所以如果有一些不太惯用但性能更好的东西,我也想知道这个选项。)
java ×4
python ×4
interrupt ×2
assembly ×1
async-await ×1
c ×1
gcc ×1
inheritance ×1
oop ×1
overloading ×1
signals ×1
stream ×1
system-calls ×1
tree ×1
treeset ×1
unix ×1
variables ×1
x86 ×1