我有两个结构
struct X {
int x;
double *y;
};
struct Y {
int a;
double *b;
char c;
};
Run Code Online (Sandbox Code Playgroud)
是铸造的指针struct Y
的指针struct X
保证以合理的方式行为一致(即x->x
与x->y
对应于y->a
和y->b
由C89标准分别)?不太重要,但如果您也碰巧知道会非常酷,这对于后来的标准也是如此(例如C11)和其他与C语法重叠和语义重叠的语言(例如C++ XX,Objective-C) )?
题:
什么是Zephyr ASDL以及它如何与词法分析器和解析器生成器等其他编译器技术相关?
(如果你相当完整,我会很感激,但是当它变得技术性时,指向其他在线参考,因为我对编译器的大部分知识来自于使用yacc和flex,在C中编写一个简单的最大munch lexer,并且看起来起来在网上阅读东西)
问题背景:
我一直在阅读http://docs.python.org/devguide/compiler.html,我遇到了以下几行:
使用Zephyr抽象语法定义语言(ASDL)指定AST节点的规范.
我按照底部的引文找到:http: //www.cs.princeton.edu/research/techreps/TR-554-97.
我在文章中的第一次阅读相当混乱,我希望在再次尝试之前,我可以首先更好地理解ASDL的目的(在编译过程的背景下).
我需要对一大堆数字进行一些计算.
array.array或numpy.array是否比典型的数组提供显着的性能提升?
我不需要对数组进行复杂的操作,我只需要能够访问和修改值,
例如
import numpy
x = numpy.array([0] * 1000000)
for i in range(1,len(x)):
x[i] = x[i-1] + i
Run Code Online (Sandbox Code Playgroud)
所以我真的不需要连接,切片等.
此外,如果我尝试分配不适合C long的值,则看起来像数组会抛出错误:
import numpy
a = numpy.array([0])
a[0] += 1232234234234324353453453
print(a)
Run Code Online (Sandbox Code Playgroud)
在控制台我得到:
a[0] += 1232234234234324353453453
OverflowError: Python int too large to convert to C long
Run Code Online (Sandbox Code Playgroud)
是否有一个变量的数组让我放入无界的Python整数?或者这样做会在一开始就消除阵列的重点?
class Test {
public static void main(String[] args) throws Exception {
Test t = new Test();
System.out.println(t.field);
System.out.println(t.getClass().getField("field").get(t));
int[] ar = new int[23];
System.out.println(ar.length);
System.out.println(ar.getClass().getField("length").get(ar));
}
public int field = 10;
};
Run Code Online (Sandbox Code Playgroud)
当我运行上面的代码时,我在命令行上得到以下结果 -
10
10
23
Exception in thread "main" java.lang.NoSuchFieldException: length
at java.lang.Class.getField(Class.java:1520)
at Test.main(Test.java:9)
Run Code Online (Sandbox Code Playgroud)
为什么我无法访问数组中的"长度"字段?
我正在玩Python和诅咒.
我跑的时候
import time
import curses
def main():
curses.initscr()
curses.cbreak()
for i in range(3):
time.sleep(1)
curses.flash()
pass
print( "Hello World" )
curses.endwin()
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
如果我一直等待,curses.endwin()
就会被调用,所以一切正常.但是,如果我用Ctrl-C剪短它,curses.endwin()
永远不会被调用,所以它搞砸了我的终端会话.
处理这种情况的正确方法是什么?我怎样才能确保无论我如何尝试结束/中断程序(例如Ctrl-C,Ctrl-Z),它都不会弄乱终端?
我刚看了1994年Danny Hillis的一篇非常酷的演讲.
在视频中的某一点上,他谈到了"进化编程",即他要求计算机通过生成随机的命令序列来生成数百个程序,然后测试以查看每个程序对数字进行排序的程度.他保留了10%的程序,这些程序对数字进行了最佳排序,然后基于10%表现良好的下一轮程序,并按照自己的意愿重复多次,最终生成最终的排序程序.
那里有工具/编程语言吗?例如,给定某些约束,生成最能满足这些约束的C代码.
我参观了一些与"进化规划"相关的维基百科文章; 那里似乎有很多理论,但找到一些你可以玩的东西似乎并不容易.
我一直在阅读Cormen等人的"算法导论"部分,并实施了一些算法.
为了测试我的实现,我写了一些胶水代码来做文件io,然后通过编写生成样本输入的程序手工制作一些样本输入和一些更多的样本输入.
但是我怀疑我自己的样本输入的质量 - 角落情况; 我可能错过了更有趣的可能性; 我可能错误估算了正确的输出; 等等
是否有一组测试输入和输出用于在因特网上收集的各种算法,以便我可以测试我的代码?我正在寻找合理特定于特定算法的测试数据,而不是通常涉及问题解决组件的竞争问题.
据我所知,我可能需要根据输入的格式调整我的代码(例如输入的各种约束;对于图算法,图表的表示等等)虽然,我希望改变我必须做出相当微不足道的事情.
编辑:
我目前正在寻找的一些特定数据集是:
既然如此,我仍然在完成这本书,如果你和我一样处于类似情况,或者你只是觉得列表可以改进,请随时编辑清单 - 很快我就可能需要数据集了类似于你要找的东西.我不完全确定编辑权限是如何工作的,但如果我对它有任何发言权,我会尝试批准它.
使用时stdio.h
,我可以轻松阅读某些格式化的输入,如下所示:
FILE* fin = fopen(...);
fscanf(fin, "x = %d, y = %d", &x, &y);
Run Code Online (Sandbox Code Playgroud)
关于这个伟大的事情是,我真的不担心有多少空间有字符"x"和下面的"=",和其他次要的细节之间.
在C++中,它在我看来好像,
ifstream fin(...);
string s;
fin >> s;
Run Code Online (Sandbox Code Playgroud)
可能会导致s
为"x"
或"x="
,或者甚至"x=12"
取决于输入的间距.
是否有一种方便的方法来获得类似于scanf
/ fscanf
using iostream
/的行为fstream
?
跟踪Python字节码中的块的目的是什么?
这里的文档提到:
...每帧,有一堆块,表示嵌套循环,try语句等.
但实际上它们似乎并不需要实际执行循环.例如,玩弄REPL我看到:
>>> def foo():
... while True:
... print('hi')
...
>>> for inst in list(dis.get_instructions(foo)): print(inst)
...
Instruction(opname='SETUP_LOOP', opcode=120, arg=12, argval=14, argrepr='to 14', offset=0, starts_line=2, is_jump_target=False)
Instruction(opname='LOAD_GLOBAL', opcode=116, arg=0, argval='print', argrepr='print', offset=2, starts_line=3, is_jump_target=True)
Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval='hi', argrepr="'hi'", offset=4, starts_line=None, is_jump_target=False)
Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=6, starts_line=None, is_jump_target=False)
Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=8, starts_line=None, is_jump_target=False)
Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=2, argval=2, argrepr='', offset=10, starts_line=None, is_jump_target=False)
Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=12, starts_line=None, is_jump_target=False)
Instruction(opname='LOAD_CONST', opcode=100, …
Run Code Online (Sandbox Code Playgroud)