- 浏览: 982363 次
- 性别:
- 来自: 广州
最新评论
-
qingchuwudi:
有用,非常感谢!
erlang进程的优先级 -
zfjdiamond:
你好 这条命令 在那里输入??
你们有yum 我有LuaRocks -
simsunny22:
这个是在linux下运行的吧,在window下怎么运行escr ...
escript的高级特性 -
mozhenghua:
http://www.erlang.org/doc/apps/ ...
mnesia 分布协调的几个细节 -
fxltsbl:
A new record of 108000 HTTP req ...
Haproxy 1.4-dev2: barrier of 100k HTTP req/s crossed
erlang的表达式如果不用的话,会警告的,但是有些又不警告,比较奇怪,做了下试验,再看了compiler的源码有了以下的结果:
root@yufeng-desktop:~# nl expr.erl
1 -module(expr).
2 -export([test/0]).
3 test()->
4 1,
5 1.0,
6 [],
7 [1,2,3],
8 <<>>,
9 <<1,2,3>>,
10 c:pid(0,1,2),
11 make_ref(),
12 atom,
13 fun()-> ok end,
14 open_port({spawn, "cat"}, [in, out]),
15 "hello",
16 "",
17 {1,2,3},
18 {},
19 true,
20 false,
21 1.
22
root@yufeng-desktop:~# erlc +return expr.erl
./expr.erl:4: Warning: a term is constructed, but never used
./expr.erl:5: Warning: a term is constructed, but never used
./expr.erl:7: Warning: a term is constructed, but never used
./expr.erl:8: Warning: a term is constructed, but never used
./expr.erl:9: Warning: a term is constructed, but never used
./expr.erl:11: Warning: the call to make_ref/0 has no effect
./expr.erl:13: Warning: a term is constructed, but never used
./expr.erl:15: Warning: a term is constructed, but never used
./expr.erl:17: Warning: a term is constructed, but never used
./expr.erl:18: Warning: a term is constructed, but never used
Compiler function compile:compile/3 returned:
{ok,expr,
[{"./expr.erl",
[{4,sys_core_fold,useless_building},
{5,sys_core_fold,useless_building},
{7,sys_core_fold,useless_building},
{8,sys_core_fold,useless_building},
{9,sys_core_fold,useless_building},
{11,sys_core_fold,{no_effect,{erlang,make_ref,0}}},
{13,sys_core_fold,useless_building},
{15,sys_core_fold,useless_building},
{17,sys_core_fold,useless_building},
{18,sys_core_fold,useless_building}]}]}
看下lib/compiler/src/sys_core_fold.erl的源代码:
expr(#c_literal{val=Val}=L, Ctxt, _Sub) ->
case Ctxt of
effect ->
case Val of
[] ->
%% Keep as [] - might give slightly better code.
L;
_ when is_atom(Val) ->
%% For cleanliness replace with void().
void();
_ ->
%% Warn and replace with void().
add_warning(L, useless_building),
void()
end;
value -> L
end;
expr(#c_cons{anno=Anno,hd=H0,tl=T0}=Cons, Ctxt, Sub) ->
H1 = expr(H0, Ctxt, Sub),
T1 = expr(T0, Ctxt, Sub),
case Ctxt of
effect ->
add_warning(Cons, useless_building),
expr(make_effect_seq([H1,T1], Sub), Ctxt, Sub);
value ->
ann_c_cons(Anno, H1, T1)
end;
expr(#c_tuple{anno=Anno,es=Es0}=Tuple, Ctxt, Sub) ->
Es = expr_list(Es0, Ctxt, Sub),
case Ctxt of
effect ->
add_warning(Tuple, useless_building),
expr(make_effect_seq(Es, Sub), Ctxt, Sub);
value ->
ann_c_tuple(Anno, Es)
end;
expr(#c_binary{segments=Ss}=Bin0, Ctxt, Sub) ->
%% Warn for useless building, but always build the binary
%% anyway to preserve a possible exception.
case Ctxt of
effect -> add_warning(Bin0, useless_building);
value -> ok
end,
Bin1 = Bin0#c_binary{segments=bitstr_list(Ss, Sub)},
Bin = bin_un_utf(Bin1),
eval_binary(Bin);
expr(#c_fun{}=Fun, effect, _) ->
%% A fun is created, but not used. Warn, and replace with the void value.
add_warning(Fun, useless_building),
void();
得出的结论是:
如果编译器能够明确的知道你表达式的值的话,除非这几个东西 atom, [], boolean 不警告以外,其他无用的一律警告, 而且尽可能的不产生代码。 这就解释为什么大部分的函数返回值是 原子或者 [].
root@yufeng-desktop:~# nl expr.erl
1 -module(expr).
2 -export([test/0]).
3 test()->
4 1,
5 1.0,
6 [],
7 [1,2,3],
8 <<>>,
9 <<1,2,3>>,
10 c:pid(0,1,2),
11 make_ref(),
12 atom,
13 fun()-> ok end,
14 open_port({spawn, "cat"}, [in, out]),
15 "hello",
16 "",
17 {1,2,3},
18 {},
19 true,
20 false,
21 1.
22
root@yufeng-desktop:~# erlc +return expr.erl
./expr.erl:4: Warning: a term is constructed, but never used
./expr.erl:5: Warning: a term is constructed, but never used
./expr.erl:7: Warning: a term is constructed, but never used
./expr.erl:8: Warning: a term is constructed, but never used
./expr.erl:9: Warning: a term is constructed, but never used
./expr.erl:11: Warning: the call to make_ref/0 has no effect
./expr.erl:13: Warning: a term is constructed, but never used
./expr.erl:15: Warning: a term is constructed, but never used
./expr.erl:17: Warning: a term is constructed, but never used
./expr.erl:18: Warning: a term is constructed, but never used
Compiler function compile:compile/3 returned:
{ok,expr,
[{"./expr.erl",
[{4,sys_core_fold,useless_building},
{5,sys_core_fold,useless_building},
{7,sys_core_fold,useless_building},
{8,sys_core_fold,useless_building},
{9,sys_core_fold,useless_building},
{11,sys_core_fold,{no_effect,{erlang,make_ref,0}}},
{13,sys_core_fold,useless_building},
{15,sys_core_fold,useless_building},
{17,sys_core_fold,useless_building},
{18,sys_core_fold,useless_building}]}]}
看下lib/compiler/src/sys_core_fold.erl的源代码:
expr(#c_literal{val=Val}=L, Ctxt, _Sub) ->
case Ctxt of
effect ->
case Val of
[] ->
%% Keep as [] - might give slightly better code.
L;
_ when is_atom(Val) ->
%% For cleanliness replace with void().
void();
_ ->
%% Warn and replace with void().
add_warning(L, useless_building),
void()
end;
value -> L
end;
expr(#c_cons{anno=Anno,hd=H0,tl=T0}=Cons, Ctxt, Sub) ->
H1 = expr(H0, Ctxt, Sub),
T1 = expr(T0, Ctxt, Sub),
case Ctxt of
effect ->
add_warning(Cons, useless_building),
expr(make_effect_seq([H1,T1], Sub), Ctxt, Sub);
value ->
ann_c_cons(Anno, H1, T1)
end;
expr(#c_tuple{anno=Anno,es=Es0}=Tuple, Ctxt, Sub) ->
Es = expr_list(Es0, Ctxt, Sub),
case Ctxt of
effect ->
add_warning(Tuple, useless_building),
expr(make_effect_seq(Es, Sub), Ctxt, Sub);
value ->
ann_c_tuple(Anno, Es)
end;
expr(#c_binary{segments=Ss}=Bin0, Ctxt, Sub) ->
%% Warn for useless building, but always build the binary
%% anyway to preserve a possible exception.
case Ctxt of
effect -> add_warning(Bin0, useless_building);
value -> ok
end,
Bin1 = Bin0#c_binary{segments=bitstr_list(Ss, Sub)},
Bin = bin_un_utf(Bin1),
eval_binary(Bin);
expr(#c_fun{}=Fun, effect, _) ->
%% A fun is created, but not used. Warn, and replace with the void value.
add_warning(Fun, useless_building),
void();
得出的结论是:
如果编译器能够明确的知道你表达式的值的话,除非这几个东西 atom, [], boolean 不警告以外,其他无用的一律警告, 而且尽可能的不产生代码。 这就解释为什么大部分的函数返回值是 原子或者 [].
发表评论
-
OTP R14A今天发布了
2010-06-17 14:36 2677以下是这次发布的亮点,没有太大的性能改进, 主要是修理了很多B ... -
R14A实现了EEP31,添加了binary模块
2010-05-21 15:15 3030Erlang的binary数据结构非常强大,而且偏向底层,在作 ... -
如何查看节点的可用句柄数目和已用句柄数
2010-04-08 03:31 4814很多同学在使用erlang的过程中, 碰到了很奇怪的问题, 后 ... -
获取Erlang系统信息的代码片段
2010-04-06 21:49 3475从lib/megaco/src/tcp/megaco_tcp_ ... -
iolist跟list有什么区别?
2010-04-06 20:30 6529看到erlang-china.org上有个 ... -
erlang:send_after和erlang:start_timer的使用解释
2010-04-06 18:31 8386前段时间arksea 同学提出这个问题, 因为文档里面写的很不 ... -
Latest news from the Erlang/OTP team at Ericsson 2010
2010-04-05 19:23 2013参考Talk http://www.erlang-factor ... -
对try 异常 运行的疑问,为什么出现两种结果
2010-04-05 19:22 2842郎咸武<langxianzhe@163.com> ... -
Erlang ERTS Async基础设施
2010-03-19 00:03 2517其实Erts的Async做的很不错的, 相当的完备, 性能又高 ... -
CloudI 0.0.9 Released, A Cloud as an Interface
2010-03-09 22:32 2476基于Erlang的云平台 看了下代码 质量还是不错的 完成了不 ... -
Memory matters - even in Erlang (再次说明了了解内存如何工作的必要性)
2010-03-09 20:26 3439原文地址:http://www.lshift.net/blog ... -
Some simple examples of using Erlang’s XPath implementation
2010-03-08 23:30 2050原文地址 http://www.lshift.net/blog ... -
lcnt 环境搭建
2010-02-26 16:19 2614抄书:otp_doc_html_R13B04/lib/tool ... -
Erlang强大的代码重构工具 tidier
2010-02-25 16:22 2486Jan 29, 2010 We are very happy ... -
[Feb 24 2010] Erlang/OTP R13B04 has been released
2010-02-25 00:31 1387Erlang/OTP R13B04 has been rele ... -
R13B04 Installation
2010-01-28 10:28 1390R13B04后erlang的源码编译为了考虑移植性,就改变了编 ... -
Running tests
2010-01-19 14:51 1486R13B03以后 OTP的模块加入了大量的测试模块,这些模块都 ... -
R13B04在细化Binary heap
2010-01-14 15:11 1508从github otp的更新日志可以清楚的看到otp R13B ... -
R13B03 binary vheap有助减少binary内存压力
2009-11-29 16:07 1668R13B03 binary vheap有助减少binary内存 ... -
erl_nif 扩展erlang的另外一种方法
2009-11-26 01:02 3218我们知道扩展erl有2种方法, driver和port. 这2 ...
相关推荐
这可以通过分析正则表达式并调用Regex类的静态方法如CompileToAssembly来预估性能影响。 最后,为了方便其他开发者在项目中使用这个自定义控件,我们需要将其打包成一个NuGet包或DLL库,并提供详细的文档和示例代码...
易语言的源码中可能包含各种表达式,如算术表达式、比较表达式和逻辑表达式等,这些都需要经过词法分析进行识别。 接下来是语法分析,也叫解析,它将词法分析得到的标记序列按照易语言的语法规则构造出抽象语法树...
GNU regex正则表达式修正版是对原GNU regex 0.13版本的改进,主要解决了在编译过程中出现的大批量警告错误。这个修正版不仅优化了源代码,提高了代码质量,还增强了其兼容性,使其能够顺利在Windows和Linux两大操作...
- `check`函数首先将标志转换为小写,然后检查标志是否只包含g、i、m,如果不是,将弹出警告并停止执行。 - 使用`RegExp`构造函数创建正则表达式对象,并通过`toString()`方法获取其字符串表示。 - 根据`method`...
".PLG"文件记录了编译过程中的错误和警告信息。 通过分析并运行这个项目,不仅可以了解LL1预测分析和算符优先分析的基本原理,还可以学习到如何在实际编程环境中实现这些理论,这对于理解和设计编译器具有重要的...
通过使用正则表达式,系统管理员可以有效地过滤和分析这些日志,只关注那些关键或异常的条目,比如安全警报或系统错误。这极大地提高了故障排查和安全管理的效率。 ### 正则表达式的广泛应用 正则表达式不仅仅局限...
- **安全警告**:在安装任何未知来源的软件时,应先阅读文档,确认没有病毒或恶意软件风险。 - **许可协议**:了解软件的许可条款,确保合法使用。 - **更新与维护**:关注软件更新,以获取新功能和修复的bug。 ...
3. **awk**:一种强大的文本分析工具,支持复杂的正则表达式模式匹配。 4. **sed**:流编辑器,能够对文本进行模式匹配和替换操作。 #### 四、grep命令详解 ##### 基础使用 - `grep [选项] '搜索字符串' 文件名` ...
这种按级别筛选的方法结合正则表达式的使用,可以使开发者更有效地管理和分析日志,从而提升开发和调试的效率。 总结来说,掌握正则表达式在Android日志过滤器中的应用,对于Android应用开发者来说,是提高工作效率...
1. 日志分析:通过读取日志文件,使用正则表达式匹配特定错误或警告信息,有助于问题排查。 2. 数据处理:读取文本文件,对数据进行过滤、替换或提取,例如从大量数据中找出满足条件的记录。 3. 文件搜索:在多个...
可以使用词法分析(lexing)和语法分析(parsing)技术,例如使用正则表达式匹配操作符和数字,构建一个抽象语法树(AST)。在Qt中,我们可以自定义类实现这些功能,或者使用现有的库如QtScript或QExpression。 4. ...
在C语言中,语义分析会检查所有表达式的类型是否正确,比如运算符的操作数类型是否匹配,以及表达式的结果类型是否符合上下文要求。例如,整型与浮点型的混合运算需要进行类型转换,而不同类型之间的赋值也需要进行...
6. **词法分析与错误处理**:在词法分析过程中,如果遇到不符合规则的字符序列,词法分析器需要进行错误处理,通常包括发出错误警告、跳过错误部分并尝试继续解析或直接终止解析。 7. **词法分析与语法分析的交互**...
8. 错误处理:当语义分析器检测到错误或警告时,需要生成有意义的错误消息并报告给用户。 通过深入学习和实践语义分析,开发者不仅可以编写出更高效、更可靠的编译器,还能对编程语言的底层机制有更深刻的理解,...
#### 示例代码分析 下面是对给定示例代码的详细解析: ```javascript function checkemail() { var temp = document.getElementById("email"); var myreg = /(\S)+[@]{1}(\S)+[.]{1}(\w)+/; if (temp.value !...
2. **表达式求值**:虽然简单的算术运算在语法分析阶段可能已经被解析为抽象语法树(AST),但语义分析会进一步处理这些表达式,如计算常量表达式的值,或者确定变量的最终类型。 3. **作用域解析**:语义分析器还...
在C#中,可以使用`System.Text.RegularExpressions`命名空间来处理正则表达式,或者自定义一个有限状态机类来实现词法分析。 为了测试词法分析器,我们通常会提供一系列输入样本,观察输出的标记序列是否符合预期。...