Erlang logo

Erlang 工具

封面

全部展开
全部收起

目录

7 Erlang 工具

7.1  是否有 Erlang 的漂亮打印机?

如果您使用 emacs 模式(它随开源版本一起提供,在 lib/emacs/erlang.el 中),您还可以通过从 emacs 打印来获得漂亮打印机。

7.2  是否有用于 CI 的 erlang 格式化程序?

vim-erlang-runtime 可以做到这一点。

7.3  LEEX(erlang 词法分析器)的源代码在哪里?

Erlang 的库为 YACC 提供了一个名为 YECC 的 Erlang 等效项,并为 LEX 提供了一个名为 LEEX 的等效项。 Robert Virding 维护一个单独的 LEEX 应用程序,该应用程序可通过 Git 在 GitHub 上获得。

7.4  是否有专门用于 Erlang 的图表工具?

没有。大多数人使用通用图表工具。

有些人认为 SDL 是用图表表达电信问题的自然方式,而 Maurice Castro 在 1999 年的 Erlang 用户会议上展示了一些关于 替代表示法的有趣工作。

基于 UML 的工具在 Erlang 世界中从未流行起来。 这是来自 邮件列表存档 的一篇文章,讨论了其中一些原因。

7.5  Erlang/OTP 中和存在哪些代码测试工具和套件?

测试套件对于确保对系统的“改进”没有破坏某些东西特别有用。 Erlang 的 测试系统 可用于测试您的项目,它包括 Erlang 模拟器和 Erlang stdlib 的测试套件。

标准 Erlang/OTP 安装包括 cover,一种测试覆盖率工具。

QuickCheck 是一种商业工具,用于从 Erlang 本身编写的属性自动生成随机测试用例。 当检测到失败的测试用例时,此测试用例会自动减少到最小的失败用例,以简化故障分析。

有几种开源工具要么受到 QuickCheck 的启发,要么基于与 QuickCheck 类似的想法,包括 ProperTriq

7.6  是否有办法对 Erlang 实现进行基准测试?

Bjorn 的基准测试是 免费提供的。 较旧的 ESTONE 基准测试几乎完全消失了。

7.7  有人有 Erlang 的魔术文件吗?

魔术文件在 unix 系统上与名为“file”的工具一起使用,以识别文件。 以下是对 /etc/magic 的补充,它允许“file”识别 BEAM 和 JAM 文件。

7.8  我应该使用哪个 IDE 进行 Erlang 开发?

您喜欢哪个就用哪个; Erlang 可以与任何处理纯文本文件的 IDE/编辑器一起使用。

Eclipse:有一个 Erlang 的 Eclipse 插件

Emacs:Erlang 发行版包含一个 Erlang 模式(在 lib/emacs/erlang.el 中)。

VIM:VIM 包括一个 Erlang 插件。 GitHub 上提供了更高级的 erlang VIM 插件vimerl 也可通过 vundle 获得,在您的 vimrc 中指定 Bundle 'jimenezrick/vimerl' 并执行 BundleInstall

Ultraedit:Danie Schutte 提供了一个 wordfile,它提供语法突出显示。

BBEdit:一个 BBEdit 模块

Textmate:一个 Textmate 捆绑包

IntelliJ IDEA:一个 Erlang 插件

7.9  是否有 Erlang 编码指南?

是的。 它们可以在 这里 找到

7.10  有哪些用于 Erlang 的重构工具

有几种第三方工具可以帮助进行代码重构。 它们还可以用于其他一系列目的。

语法工具 可以执行正确的源到源转换。 除此之外,它们还可以用于修改旧代码,使其不再使用已弃用的函数。语法工具应用程序 是 Erlang 的标准组成部分。

Distel/EMACS 支持重构和交互式调试。 主页 上有更多信息。

7.11  有哪些静态代码分析工具?

有一些工具可以检测 Erlang 代码中各种类型的潜在编程错误。

XREF 查找一组模块中所有未定义的模块调用,即它可以捕获因键入错误模块或函数名称等导致的错误。

Erlang 编译器 具有多个内置选项,可帮助检测问题。 其中大多数(例如,报告未使用的变量、未使用的函数和某些类型的死代码)默认情况下都是启用的。

Dialyzer 是一种专门的静态代码分析工具,用于检查 .beam 对象文件。 除此之外,它还会进行全局分析并报告死代码和某些类型的类型错误。 强烈推荐。

7.12  是否有用于 BEAM 文件的“反编译器”?

或者:我丢失/删除/不管什么原因删除了项目的 .erl 文件,我可以从 .beam 文件中重新创建它吗?

如果 代码使用 debug_info 标志编译,则 .beam 文件包含源的“部分编译”表示形式,基本上是解析树。

这是一个简单的模块

     -module(hw).
     -export([go/0]).

     go() when true ->
       "this is my function".

以及相应的抽象代码

     3> {ok, {hw, [{abstract_code, Abs}]}} =  beam_lib:chunks("hw.beam", [abstract_code]), Abs.
         {raw_abstract_v1,[{attribute,1,file,{"./hw.erl",1}},
                  {attribute,1,module,hw},
                  {attribute,2,export,[{go,0}]},
                  {function,4,
                            go,
                            0,
                            [{clause,4,
                                     [],
                                     [],
                                     [{string,5,"this is my function"}]}]},
                  {eof,6}]}

编写一个可以将上述示例转换回源代码的反编译器只需 15 分钟。 编写一个可以处理更复杂的 Erlang 代码的反编译器需要更多时间,但难度不大。 syntax_tools 应用程序可以完成大部分繁重的工作。

如果抽象代码存在于 beam 文件中,则问题会变得更加困难。 可以研究剩余的信息并得出一些关于原始 .erl 文件可能的样子结论,例如导出了哪些函数。 但是,很多其他重要的信息,例如变量名,都不存在。 一般来说,在没有抽象代码的情况下从 beam 文件重新创建源代码是不切实际的。