问题标签 [beam]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
erlang - 重新编译 Erlang 的 beam_disasm.file 的输出
我正在尝试修改一个梁文件,以便将本地函数调用解释为外部模块调用,即使一个函数可能定义在它被调用的同一模块中。
给定 m 作为模块,我尝试了几种重新编译反汇编梁文件的排列,但无济于事。这是我尝试的一个例子,在长生不老药中:
IO.inspect(:file.write_file("/tmp/disasm.asm", :io_lib.fwrite("~p.\n", [:beam_disasm.file(:code.which m)])))
IO.inspect(:compile.noenv_file("/tmp/disasm.asm", [:from_asm]))
我非常感谢任何关于如何轻松将输出重新编译:beam_disasm.file
回.beam
文件的输入。
谢谢!
编辑:证明更多信息
假设我有一个看起来像这样的 elixir 模块:
编译应用程序后,:beam.disasm
提供其光束文件的以下输出:
我想提请您注意的特定信息是:
indirect_value2
是“远程”呼叫,indirect_value
而是“本地”呼叫。我想要实现的是indirect_value
被模仿/视为像indirect_value_2这样的远程调用。
我试图在编译过程中实现这一点。我想到的唯一方法是分解光束文件,适当地改变它并重新组装它。我非常愿意接受其他建议。
erlang - Erlang Cowboy 和 Ranch 接受器
如何确定在 OTP 应用程序中使用的正确数量的 Ranch 接受器?我注意到 Elixir Phoenix 应用程序以默认值 100 开头,但没有真正解释为什么。
在基本测试中,对于基本应用程序来说,1 个单一的接受者似乎可以正常工作,这至少足以表明接受者对于每个客户端连接不匹配 1 对 1。
作为记录,官方文档建议如下:
默认情况下,Ranch 将使用 10 个接受器进程。它们的作用是接受连接并为每个新连接产生一个连接过程。
可以调整此数字以提高性能。一个好的数字通常在 10 或 100 个受体之间。您必须通过测量为您的应用找到最佳价值。
这确实可以解释它们是什么,但在细节上仍然有些模糊。
那么我们究竟应该如何使用它们呢?
erlang - Erlang:进程优先级会影响长时间运行的任务吗?
当一个进程在 erlang 中以低优先级调度时,它会被调度到计数为 8 的低/正常队列中。它必须从队列中选择 8 次才能被调度。
一旦安排好,就会启动一个减少 2000 的计数器。在 2000 年削减之后,该过程将暂停并重新安排。当进程重新调度时,它是否以与原始进程相同的优先级进行调度?
这对我来说很有意义,但我找不到这个细节,它会对长时间运行的计算任务产生很大的影响(并不是说使用 BEAM 进行繁重的计算是个好主意!)。
programming-languages - 基于 BEAM 的动态语言
我有一个关于 Erlang 语言的问题。
我看到人们在 BEAM 之上制作了 Elixir 语言,我想知道,是否有可能在 BEAM 之上制作像 Python 或 Javascript 这样的动态语言?
如果可能的话,你能给我推荐一些可以帮助我完成这项任务的文献吗?
erlang - gen_server 重启策略是复制状态吗?
Erlang 世界不像往常一样使用 try-catch。我想知道重新启动进程与主流语言中的 try-catch 时的性能如何。
Erlang 进程有它的小堆栈和堆概念,实际上在 OS 堆中分配。为什么重启有效?
希望有人让我深入了解 Beam 在对进程调用重新启动操作时该怎么做。
此外,如何使用gen_server
在它的过程中保持状态。gen_server
重启 时会导致复制状态操作吗?
谢谢
c - 在 Erlang/Elixir 中用多个 png 文件组合 jpeg 图像
我需要重叠一系列 png 图像才能在 Erlang/Elixir 中创建单个 jpeg 文件。我无法在 BEAM 上找到任何方法来执行此任务,因此我很想使用 Erlang NIF 并使用 ImageMagick API 编写一些 C 代码,但我再次找不到此任务的任何文档。
有没有办法在 Erlang/Elixir/C 中做到这一点?
stream - 流式传输:VM 冻结大文件
我正在构建一个管道来处理、聚合和转换来自 csv 文件的数据,然后写回另一个 csv 文件……我从 19 列 csv 文件中加载行,并通过一些数学运算(map reduce 风格)在另一个中写回 30 列.csv。
直到我尝试将 25mb 文件上传到应用程序,250000 行,然后我决定流式传输所有操作而不是急切地处理......但现在我正在使用流逐个函数更改函数,我面临我不明白为什么只创建了 5 个字段后,当我尝试写入文件时,程序会冻结并在几千行后停止写入。
我正在流式传输每个函数,因此据我所知,它不应该有任何锁,并且对于前数千次写入它工作正常,所以我想知道发生了什么,在 erlang 观察者中,我只能看到资源的使用下降到接近0 并且它不再写入文件。
这是我的流函数(在我从文件加载之前),接下来是我的写入函数:
写:
erlang - 当调用“spawn”函数时究竟会发生什么?
我正在尝试了解 BEAM VM 的工作原理,所以我有一个问题。当一个人在 erlang 中生成一个进程时,结果是一个 PID。这是否意味着一个进程被挂起,直到产生请求的进程?