Haskell有一个标识函数,它返回输入不变.定义很简单:
id :: a -> a
id x = x
Run Code Online (Sandbox Code Playgroud)
所以为了好玩,这应该输出8:
f = id id id id id id id id id id id id id id id id id id id id id id id id id id id
main = print $ f 8
Run Code Online (Sandbox Code Playgroud)
几秒钟后(根据任务管理器大约2 GB的内存),编译失败了ghc: out of memory.同样,翻译说ghci: out of memory.
由于它id是一个非常简单的函数,我不希望它在运行时或编译时成为内存负担.什么是用于的内存?
具体来说,我感兴趣的是以编程方式获取IP地址列表,例如返回的IP地址ifconfig.
优选地,该解决方案是跨平台的.
我正在编写一些可以读取string.dump()函数产生的字节码的Lua代码.我假设(因为它允许一些优化和更少的编码)所有OP_JMP指令在用于if语句时增加指令指针.它们可以在技术上向后跳,因为它们使用sBx值(可以是负值).我只对标准Lua 5.1实现中的if语句的字节码感兴趣.
我使用chunkspy(很棒的工具btw)来查看几个样本的字节码.
这是一个基本的if语句:
a, b = 1, 2
if a == b then
print '='
elseif a < b then
print '<'
else
print '>'
end
Run Code Online (Sandbox Code Playgroud)
它产生四次跳跃,其中没有一次是负的:
[08] jmp 4; to [13]
[12] jmp 11; to [24]
[16] jmp 4; to [21]
[20] jmp 3; to [24]
Run Code Online (Sandbox Code Playgroud)
我尝试在Lua源代码中寻找答案,但它最终让人感到困惑(我确信这是超级优雅的代码,如果我花时间去掌握它).
有没有人知道"if"语句的情况,其中lua的OP_JMP指令对sBx有负值或者知道它们是否总是正值?
当使用完全禁用(g++ -O0)的优化编译同一段代码,然后再次完全启用优化(g++ -O3)时,源代码本身的逻辑如何改变?
例如,编译器可以
这两个优化使代码执行速度更快,而不会影响原始源代码的完整性.没有这些优化运行的任何代码都将在启用它们的情况下运行.
但是,编译器优化也会影响代码逻辑.以下是我所知道的两个例子:
-ffast-math参数).我很惊讶,很幸运,了解这些因为他们可能在错误的情况下成为巨大的潜在陷阱.
所以我想知道,有没有其他情况下c ++编译器优化会影响代码逻辑?我特意在g ++编译器下查找有关c ++ 11(没有任何未定义的行为)的信息,但欢迎提供其他编译器的提示.
为了生成x86汇编代码,我定义了一个名为的自定义类型X86:
data X86 a = X86 { code :: String, counter :: Integer, value :: (X86 a -> a) }
Run Code Online (Sandbox Code Playgroud)
此类型用于如下所示的标记.这样可以轻松编写用于生成if语句,for循环等的模板...
generateCode :: X86 ()
generateCode = do
label1 <- allocateUniqueLabel
label2 <- allocateUniqueLabel
jmp label1
label label1
jmp label2
label label2
Run Code Online (Sandbox Code Playgroud)
说明定义如下:
jmp :: String -> X86 ()
jmp l = X86 { code = "jmp " ++ l ++ ";\n", counter = 0, value = const () }
label :: String -> X86 ()
label l …Run Code Online (Sandbox Code Playgroud) 在链接器脚本中,我定义了PROVIDE(__KERNEL_BEGIN__ = .);.
地址可以从以下地址访问:
extern uint32_t __KERNEL_BEGIN__[];
Run Code Online (Sandbox Code Playgroud)
但是,以下不起作用(给出错误的地址):
extern uint32_t * __KERNEL_BEGIN__;
Run Code Online (Sandbox Code Playgroud)
我看着集会.第一种方法__KERNEL_BEGIN__提供了确切的地址.第二个,__KERNEL_BEGIN__ = [address]在地址处查找值.
那么,一定是这样吗?我无法区分.
jQuery的每个函数在数组元素的上下文中执行回调函数:
$.each([3], function () {
console.log(this === 3);
console.log(this.valueOf() === 3);
});
Run Code Online (Sandbox Code Playgroud)
我期待true true,但得到了false true.这表示数组的元素由每个函数加框.
我的问题有两个部分:
TextMetrics API返回一些名称相似的字段:
fontBoundingBoxAscent与actualBoundingBoxAscentfontBoundingBoxDescent与actualBoundingBoxDescentMDN 文档不是很清楚,也没有提供视觉效果。它们之间有什么区别?
另外,作为后续,我如何根据这些值计算文本的高度?
在Lua中,对任何数字使用类型函数总是返回'number'.是否有一个函数可以告诉您Lua解释器是否使用32位浮点数,64位双精度数,整数或其他数字类型?
我试着写一个这样的函数:
function numbertype()
local rational = 5 / 2
if rational == 2 then
-- equals 2
return 'int'
else
-- about 2.5
return 'double' -- but could it be a 32 bit float or something else?
end
end
print(numbertype())
Run Code Online (Sandbox Code Playgroud)
它还无法检测到浮点数,双精度数和未知类型之间的差异.如何在Lua的解释器中查询Lua的数字类型是否等同于int,float或double?我希望它能用纯净的Lua工作.