小编dan*_*ben的帖子

为什么大多数编程语言都不支持多继承?

为什么大多数编程语言都不支持多继承?

我真的可以使用这个功能来开发不同的应用程序布局吗?

oop inheritance multiple-inheritance

9
推荐指数
1
解决办法
8927
查看次数

使用访客模式的树转换

(免责声明:这些示例是在构建编译器的上下文中给出的,但是这个问题都是关于访问者模式的,并且不需要任何编译器理论知识.)我将通过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灵活性的情况下完成.我想不出任何不太令人难以置信的解决方案 - 任何人都可以启发我的预期设计吗?

python java tree abstract-syntax-tree visitor-pattern

8
推荐指数
1
解决办法
2791
查看次数

如何从命令行停止执行Java程序?

我的主要领域是.Net,但最近我与Java有关.我必须在Java中创建一个shell实用程序,它可以在后台运行,在指定的持续时间后读取少量数据库记录并进行进一步处理.这是一种调度程序.现在我几乎没有顾虑:

如何使这项工作作为一项服务.我想通过shell脚本执行它,该实用程序应该开始运行.当然,控件应该返回到调用脚本.

其次,最终我可能想要阻止这个过程运行.怎么做到这一点?

我理解这些是基本问题,但我真的不知道从哪里开始,哪些选项最适合我.

有任何帮助/建议吗?

java interrupt

8
推荐指数
1
解决办法
2万
查看次数

在系统调用期间捕获/阻止SIGINT

我写了一个网络爬虫,我希望能够通过键盘停止.当我打断它时,我不希望程序死掉; 它需要先将其数据刷新到磁盘.我也不想抓住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)

并且该过程完全退出.为什么会这样?有没有办法阻止中断影响系统调用?

python unix signals interrupt system-calls

8
推荐指数
1
解决办法
7371
查看次数

增量后运算符:意外行为

可能重复:
任何人都可以解释这些未定义的行为(i = i ++ + ++ i,i = i ++等...)

我的代码如下:

#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)

c gcc post-increment

8
推荐指数
1
解决办法
1770
查看次数

为x86处理器生成程序集

我目前正在通过Andrew Appel的Java中的现代编译器实现工作,我正处于建立低级中间表示的地步.

最初,我决定瞄准JVM并忽略所有低级机器的东西,但为了学习我不太了解的事情,我已经改变了主意.这会改变我的IR,因为以JVM为目标允许我(或多或少)挥动我的手来进行方法调用或构建对象.

Appel书没有详细介绍任何特定的机器架构,所以我想知道在哪里可以找到我需要知道的更远的东西.

我现在知道的事情我需要知道的是:

  • 使用哪个指令集.我有两台可以开发的笔记本电脑; 两者都有Core 2 Duo处理器.我目前的理解是x86处理器大多使用相同的指令集,但它们并非完全相同.

  • 操作系统是否影响编译的代码生成步骤,或者它是否完全依赖于处理器.例如,我知道生成在32位与64位平台上运行的代码有所不同.

  • 如何组织堆栈帧等.何时使用寄存器与在堆栈上放置参数,调用者保存与被调用者保存,所有这些.我曾经想过这将与指令集一起描述,但到目前为止我还没有在任何地方看到这个特定的信息.也许我在这里误解了什么?

完全欢迎链接到资源以代替答案.

compiler-construction x86 assembly code-generation

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

在Python中的同一进程中捕获stdout

我有一个调用一堆函数的python脚本,每个函数都将输出写入stdout.有时当我运行它时,我想通过电子邮件发送输出(以及生成的文件).我想知道如何捕获内存中的输出,以便我可以使用该email模块来构建电子邮件.

到目前为止我的想法是:

  • 使用内存映射文件(但似乎我必须为此保留磁盘空间,我不知道输出会有多长)
  • 绕过所有这一切并将输出传递给sendmail(但如果我还想附加文件,这可能很难)

python stream

6
推荐指数
3
解决办法
4205
查看次数

我可以在Java中重载变量吗?

我正在写一个代表矩阵的类.我希望它看起来像这样:

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)

这是合法代码,还是我必须根据矩阵所拥有的数据类型使用不同的变量名?

java variables overloading

6
推荐指数
1
解决办法
5272
查看次数

为什么TreeSet.contains()不起作用?

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

java classcastexception treeset

5
推荐指数
1
解决办法
4783
查看次数

使用 asyncio 进行进程间通信?

我有一组 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 来做,但是该文档充满了警告,如果您只是在编写应用程序,那么使用它是错误的。有人可以权衡这里的惯用做法吗?(而且,速度是一个重要因素,所以如果有一些不太惯用但性能更好的东西,我也想知道这个选项。)

python multiprocessing async-await python-asyncio

5
推荐指数
1
解决办法
976
查看次数