最近,为了磨练我的装配技巧,我在C++中为玩具语言编写了一个非常简单的编译器.它运行单次传递,并在解析阶段直接将代码发送到几个字符串流,每个字符串流代表一段代码(即一个代表section .bss,而其他代表.data和.text).然后,这些字符串流被写入文件,我使用NASM和gcc来汇编和链接它们.我知道这种单遍方法效率非常低,但同样,这更像是一种理解代码生成阶段的练习.无论如何,我想修改我的代码直接发出LLVM IL而不是原始程序集,再次作为学习练习.是否有LLVM IL的入门级指南?或者,更好的是,确定装配线的等效IL代码的工具?我看了,我只找到了完整的规格,这比我需要的更多信息.
我已经用Common Lisp开发了近一年了,这真的开始让我感到紧张.我开始使用CLISP编程CL,但后来我转而使用SBCL来提高速度.我做了很多相当低级的东西,所以我需要与很多C代码接口.我非常喜欢CL的增量开发方面(我不使用Emacs - 我在Vim中运行SLIMV),但我发现自己的开发速度比在Python,Perl,C甚至NASM中都要慢.问题的根源在于SBCL的错误消息.我曾被迫搜索近500行代码,因为SBCL决定给我一个ERROR: Invalid number of arguments on foreign function #< some memory address >.没有指定调用什么函数,没有行号,没有.最近,我有了The loaded code expects an incompatible layout for class SB-PRETTY:PRETTY-STREAM.随意的喜悦.代码在CLISP上运行FINE,但是在SBCL上出现了一些模糊的错误.有没有办法让这些消息更具信息量?我已经写了近6年的C和汇编了,甚至他们也会给你一个行号.我见过的唯一一半合理的SBCL错误是读者错误,这几乎是无用的,因为它们通常相当于缺少括号.同样,是否有任何声明/命令行开关可用于更改此设置?我甚至可以在这一点上编写我自己的错误打印机.
编辑:一个例子,(sb-ext:restrict-compiler-policy 'debug 3)在我的〜/ .sbclrc中(使用--load而不是--script,所以.sbclrc被加载)
debugger invoked on a SB-INT:SIMPLE-PROGRAM-ERROR in thread
#<THREAD "main thread" RUNNING {AB09931}>:
invalid number of arguments: 0
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.
(SB-KERNEL::INVALID-ARG-COUNT-ERROR-HANDLER …Run Code Online (Sandbox Code Playgroud) 所以,我有一个简单的事件库,用C++编写并使用Boost库.我想把这个库暴露给Python,所以很自然地我转向了Boost :: Python.我最终得到了编译代码,但现在我遇到了相当严重的问题:我的库使用了高阶编程技术.例如,库由三个主要类组成:事件类,事件管理器类和事件侦听器类.事件监听器类带来了问题.码:
class listener{
public:
listener(){}
void alert(cham::event::event e){
if (responses[e.getName()])
responses[e.getName()](e.getData());
}
void setResponse(std::string n, boost::function<void (std::string d)> c){responses.insert(make_pair(n, c));}
void setManager(_manager<listener> *m){manager = m;}
private:
std::map<std::string, boost::function<void (std::string d)> > responses;
_manager<listener> *manager;
Run Code Online (Sandbox Code Playgroud)
如您所见,功能setResponse就是问题所在.它需要一个函数传递给它,不幸的是,在这种情况下,Boost :: Python不会应用它的转换器魔法.如下所示调用时:
>>> import chameleon
>>> man = chameleon.manager()
>>> lis = chameleon.listener()
>>> def oup(s):
... print s
...
>>> lis.setResponse("event", oup)
Run Code Online (Sandbox Code Playgroud)
它给出了这个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
listener.setResponse(listener, …Run Code Online (Sandbox Code Playgroud) python boost functional-programming boost-python higher-order-functions