【问题标题】:Determine whether Lua compiler runs 32 or 64 bit判断 Lua 编译器是运行 32 位还是 64 位
【发布时间】:2018-06-14 01:48:16
【问题描述】:

我目前在我的默认开发系统上使用Windows,在我部署 Lua 脚本的服务器上使用Linux。对于Windows,只有几个 32 位解释器,例如我目前使用的 Lua for Windows(至少据我所知)。在服务器上,解释器在 64 位上运行脚本。

现在我的问题是:是否可以检查脚本在哪个架构上运行(可能类似于版本的_ENV 变量)?

如果有任何 64 位 Windows Lua 解释器,请随时对此事发表评论。提前谢谢你。

【问题讨论】:

标签: lua 32bit-64bit


【解决方案1】:

这是如何确定您的操作系统位数,而不是您的编译器位数(您可以在 64 位 Windows 上运行 32 位 Lua.exe)。

local arch
if (os.getenv"os" or ""):match"^Windows" then
   print"Your system is Windows"
   arch = os.getenv"PROCESSOR_ARCHITECTURE"
else
   print"Your system is Linux"
   arch = io.popen"uname -m":read"*a"
end
if (arch or ""):match"64" then
   print"Your system is 64-bit"
else
   print"Your system is 32-bit"
end

【讨论】:

  • 我知道我可以在我的 64 位系统上运行 32 位 Lua,这就是我目前使用的。谢谢,但遗憾的是,这并没有回答我的问题。
  • 答案告诉您一种检查它是 32 位还是 64 位的方法。您可以使用 os.getenv() 访问系统的环境变量 - 也就是说,如果您加载了库。之后,您可以通过在 lua5.3.x 中设置 64_BIT_INTEGER_MAX_SIZE 的数字来检查数字是否可用于 64 位。这是255 ^ 8。无论如何,该数字在发言期间被截断为 32_BIT_INTEGER_MAX_SIZE,您使用的是 32 位系统。
【解决方案2】:

如果你能得到executable that runs the script,你可能可以在Windows和Linux上查看它的标题来检查它是32位还是64位应用程序;这里是suggestions on how to do it on Windows

我还对从 Lua 脚本(以及与 Lua 和 LuaJIT 解释器一起使用的脚本)执行此操作的更简单方法感兴趣,因为我遇到了一个案例,我想根据是否为 ​​32 位来引用不同的路径或 64 位库需要加载,而无需用户指定这些路径。

【讨论】:

  • arg[-1] 可能只是“lua”。您应该以某种方式找到文件“lua.exe”所在的位置。
  • 对;这在我引用的 SO 答案中进行了讨论,尽管可能没有通用的解决方案。
【解决方案3】:

最简单的方法是测试人数限制。在 32 位 Lua 中,0xffffffff(8'f's) 将是最大 int 数,而 0xfffffffff(9'f's) 将溢出 尝试流动代码

function _86or64()
    if(0xfffffffff==0xffffffff) then return 32 else return 64 end
end

print(_86or64());

【讨论】:

    【解决方案4】:

    你为什么需要这些知识?

    通常情况下,您在 Lua 方面无能为力,这取决于底层主机架构。要执行特定于主机的操作,您需要编写一些本机代码,但随后您就会知道要编译的架构。

    虽然有一种可能的方法(也许还有更多)。您可以使用string.dump() 编译虚拟函数并分析字节码标头。 Lua 版本之间的标头不同,因此您应该首先检查版本以了解“系统参数”字段的位置。如果没有更改 Lua 解释器,那么存储 size_t 大小(以字节为单位)的字段对于 32 位和 64 位主机将是不同的。

    【讨论】:

    • 在 Lua 5.3 size_t 宽度可以确定为 #string.pack("T",0)*8
    • 事实上有:我正在运行一个需要超过 2 GB RAM 的大型计算(我知道这不是最佳的)。如果这在 64 位机器上运行,一切都按预期运行,但由于 32 位 Lua 解释器的内存分配较小,脚本会无休止地执行。
    【解决方案5】:

    这里有一个函数可以告诉您是使用 32 位还是 64 位 LUA:

    function bits() return 1<<32==0 and 32 or 1<<64==0 and 64 end
    

    【讨论】:

    • 请编辑您的答案以将代码格式化为代码块。
    • @DapperDuck 感谢您的提醒。看来杰里米·卡尼(Jeremy Caney)已经处理好了。
    猜你喜欢
    • 2013-01-11
    • 2014-05-06
    • 2018-01-21
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 2011-04-19
    相关资源
    最近更新 更多