小编Mat*_*erg的帖子

如何为gcc编写自己的代码生成器后端?

我已经创建了我自己的(非常简单的)字节代码语言,以及一个执行它的虚拟机.它工作正常,但现在我想使用gcc(或任何其他免费提供的编译器)从普通的c程序为这台机器生成字节代码.所以问题是,如何修改或扩展gcc以便它可以输出我自己的字节代码?请注意,我不想将我的字节代码编译为机器代码,我想将c代码"编译"为(我自己的)字节代码.

我意识到这是一个潜在的大问题,最好的答案可能是"去看看gcc源代码".我只是需要一些帮助来解决这个问题.我认为必须有一些关于这个主题的文章或书籍可以描述向gcc添加自定义生成器的过程,但我没有通过谷歌搜索找到任何东西.

c compiler-construction gcc

35
推荐指数
2
解决办法
7722
查看次数

Linux/Python:编码用于打印的unicode字符串

我有一个相当大的python 2.6应用程序,其中包含大量的打印语句.我一直在使用unicode字符串,它通常很好用.但是,如果我重定向应用程序的输出(如"myapp.py> output.txt"),那么我偶尔会遇到如下错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa1' in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

我想如果有人将他们的LOCALE设置为ASCII,就会出现同样的问题.现在,我完全理解这个错误的原因.我的Unicode字符串中有一些字符无法用ASCII编码.很公平.但我希望我的python程序尽最大努力尝试打印可理解的东西,可能会跳过可疑字符或用Unicode ID替换它们.

这个问题必须是常见的......处理这个问题的最佳做法是什么?我更喜欢一种允许我继续使用普通旧"打印"的解决方案,但我可以根据需要修改所有实例.

PS:我现在已经解决了这个问题.解决方案既不是给出的答案.我使用了http://wiki.python.org/moin/PrintFails中给出的方法,由ChrisJ在其中一条评论中给出.也就是说,我用一个使用正确参数调用unicode编码的包装器替换sys.stdout.效果很好.

python linux unicode encoding locale

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

使用python多处理管道

我正在尝试编写一个使用多个进程计算校验和的类,从而利用多个核心.我有一个非常简单的类,它在执行一个简单的案例时很有用.但每当我创建两个或更多类的实例时,工作者永远不会退出.好像从来没有得到父管道关闭管道的消息.

所有代码都可以在下面找到.我首先分别计算md5和sha1校验和,这是有效的,然后我尝试并行执行计算,然后程序在关闭管道时锁定.

这里发生了什么?管道为什么不像我预期的那样工作?我想我可以通过在队列上发送"停止"消息并让孩子退​​出这种方式来解决这个问题,但我真的很想知道为什么它不能正常工作.

import multiprocessing
import hashlib

class ChecksumPipe(multiprocessing.Process):
    def __init__(self, csname):
        multiprocessing.Process.__init__(self, name = csname)
        self.summer = eval("hashlib.%s()" % csname)
        self.child_conn, self.parent_conn = multiprocessing.Pipe(duplex = False)
        self.result_queue = multiprocessing.Queue(1)
        self.daemon = True
        self.start()
        self.child_conn.close() # This is the parent. Close the unused end.

    def run(self):
        self.parent_conn.close() # This is the child. Close unused end.
        while True:
            try:
                print "Waiting for more data...", self
                block = self.child_conn.recv_bytes()
                print "Got some data...", self
            except EOFError:
                print "Finished work", self
                break
            self.summer.update(block) …
Run Code Online (Sandbox Code Playgroud)

python pipe python-2.6 multiprocessing

12
推荐指数
1
解决办法
9977
查看次数

读/写Popen()子流程

我正在尝试使用python subprocess.Popen()调用与子进程通信.在我的实际代码中,我正在实现一种类型的IPC,因此我想编写一些数据,读取响应,写入更多数据,读取响应等等.因此,我不能使用Popen.communicate(),否则它将适用于简单的情况.

这段代码显示了我的问题.它从来没有得到第一个响应,挂在第一个"阅读结果".为什么?我怎样才能像我期望的那样完成这项工作?

import subprocess
p = subprocess.Popen(["sed", 's/a/x/g'],
                     stdout = subprocess.PIPE,
                     stdin = subprocess.PIPE)

p.stdin.write("abc\n")
print "Reading result:"
print p.stdout.readline()

p.stdin.write("cat\n")
print "Reading result:"
print p.stdout.readline()
Run Code Online (Sandbox Code Playgroud)

python subprocess popen python-2.6

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

使用多处理模块

我正在尝试在python 2.6中使用多处理模块,但显然有些东西我不明白.我希望下面的类能够添加add()发送给它的数字,并在get_result()方法中返回总和.下面的代码打印"0",我希望它打印"2".我错过了什么?

import multiprocessing

class AdderProcess(multiprocessing.Process):

    def __init__(self):
        multiprocessing.Process.__init__(self)
        self.sum = 0
        self.queue = multiprocessing.JoinableQueue(5)
        self.daemon = True
        self.start()

    def run(self):
        while True:
            number = self.queue.get()
            self.sum += number
            self.queue.task_done()

    def add(self, number):
        self.queue.put(number)

    def get_result(self):
        self.queue.join()
        return self.sum


p = AdderProcess()
p.add(1)
p.add(1)
print p.get_result()
Run Code Online (Sandbox Code Playgroud)

PS.这个问题已经解决了.谢谢你的回答!只是为了让任何读者更容易,这是完整的工作版本:

import multiprocessing

class AdderProcess(multiprocessing.Process):

    def __init__(self):
        multiprocessing.Process.__init__(self)
        self.sum = multiprocessing.Value('d', 0.0)
        self.queue = multiprocessing.JoinableQueue(5)
        self.daemon = True
        self.start()

    def run(self):
        while True:
            number = self.queue.get()
            self.sum.value += number
            self.queue.task_done()

    def add(self, number): …
Run Code Online (Sandbox Code Playgroud)

python multiprocessing

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