当阅读rabbitmq的rabbit.erl时,它包含与hipe编译相关的代码。
hipe_compile() ->
Count = length(?HIPE_WORTHY),
io:format("HiPE compiling: |~s|~n |",
[string:copies("-", Count)]),
T1 = erlang:now(),
PidMRefs = [spawn_monitor(fun () -> [begin
{ok, M} = hipe:c(M, [o3]),
io:format("#")
end || M <- Ms]
end) ||
Ms <- split(?HIPE_WORTHY, ?HIPE_PROCESSES)],
[receive
{'DOWN', MRef, process, _, normal} -> ok;
{'DOWN', MRef, process, _, Reason} -> exit(Reason)
end || {_Pid, MRef} <- PidMRefs],
T2 = erlang:now(),
io:format("|~n~nCompiled ~B modules in ~Bs~n",
[Count, timer:now_diff(T2, T1) div 1000000]).
但是在erlang的参考文档中没有关于hipe的解释。 'o3'
的含义是什么?
(emacs@chen-yumatoMacBook-Pro.local)51> hipe:c(xx_reader,[o3]).
{ok,xx_reader}
在我使用hipe:c之后,在pwd()目录中找不到新的编译文件? 它在哪里?
答案 0 :(得分:3)
o3
表示编译器使用的优化级别。还有o0
,o1
,o2
等级。级别的详细信息如下:
o1 = [inline_fp,pmatch,peephole],
o2 = [icode_range,icode_ssa_const_prop,icode_ssa_copy_prop,icode_type,
icode_inline_bifs,rtl_lcm,rtl_ssa,rtl_ssa_const_prop,spillmin_color,
use_indexing,remove_comments,concurrent_comp,binary_opt] ++ o1,
o3 = [{regalloc,coalescing},icode_range] ++ o2.
您可以使用hipe:help_option(Option)
进一步调查不同选项的含义。例如,
3> hipe:help_option(regalloc).
regalloc - Select register allocation algorithm. Used as {regalloc, METHOD}.
Currently available methods:
naive - spills everything (for debugging and testing)
linear_scan - fast; not so good if few registers available
graph_color - slow, but gives OK performance
coalescing - slower, tries hard to use registers
optimistic - another variant of a coalescing allocator
ok
4> hipe:help_option(icode_range).
icode_range - Performs integer range analysis on the Icode level
ok
我认为HiPE是JIT编译,就像在Java中使用的那样。本机部分仅在运行时可用,因此文件系统中不应有明确的表示。
此外,hipe:c
确实需要.beam
个文件。例如,如果您使用某些内容创建test.erl
,并且未将其编译为.beam
文件,则直接致电hipe:c
会导致错误:
1> hipe:c(test, [o3]).
<HiPE (v 3.9.3)> EXITED with reason {cant_find_beam_file,test} @hipe:419
=ERROR REPORT==== 29-Nov-2012::17:03:02 ===
<HiPE (v 3.9.3)> Error: [hipe:418]: Cannot find test.beam file.** exception error: {hipe,419,{cant_find_beam_file,test}}
in function hipe:beam_file/1 (hipe.erl, line 419)
in call from hipe:c/2 (hipe.erl, line 313)
2> c(test).
{ok,test}
3> hipe:c(test, [o3]).
{ok,test}
答案 1 :(得分:1)
在erlang的doc中有一些。见here。但是文档并不多。 HiPE的index page最近才更新。
另外,您可以在erlang shell中查看一些帮助。
> hipe:help().
> hipe:help_options().
> hipe:help_option(Option).