现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

Erlang OTP 源码阅读指引

2020-03-04 22:35 工业·编程 ⁄ 共 2407字 ⁄ 字号 暂无评论

   大体上,otp_src的代码如下图这样组织的(打开文件夹就可以看到,算不上什么Thirty Thousand Feet).与我们每天写代码最息息相关的是ERTS和lib;ERTS(Erlang Run-Time System)包含了Erlang运行时系统的代码,是Erlang的基础设施.lib包含了所有的外围类库实现,有些类库的安排是违反直觉的,不过习惯了就好了,比如file.erl不是在stdlib而是在kernel;gen_server gen_fsm的代码实现应该是在kernel吧?错,它们的代码是在stdlib下;但是呢,application.erl是在kernel.

wps1

Kernel

   看一下kernel目录,是不是有点摸不着头脑?Erlang运行时是有一个kernel application运行,运行一下appmon我们可以动态看到kernel涉及到的代码模块.我们大致可以揣摩到设计者的规划原则:kernel的范畴包含了application管理,code生命周期管理,IO(文件IO,网络IO,io_request),HIPE,分布式基础设施等等,见下面的思维导图:

wps3

wps4

  上面的划分方式只是我个人的一种看法,为了方便查阅我把上图转成了文字,见下面:

Kernel

Kernel APP

    kernel.erl

    kernel_config.erl

    kernel.appup.src

    kernel.app.src

application管理

    application_controller.erl

    application_starter.erl

    application_master.hrl

    application_master.erl

    application.erl

    heart.erl

HIPE

    hipe_ext_format.hrl

    hipe_unified_loader.erl

调试& 日志

日志

        disk_log.erl

        disk_log_sup.erl

        disk_log_server.erl

        disk_log_1.erl

        disk_log.hrl

        error_logger.erl

        wrap_log_reader.erl

调试

        error_handler.erl

        erts_debug.erl

        standard_error.erl

        seq_trace.erl

IO

文件IO

        file.erl

        file_server.erl

        file_io_server.erl

        ram_file.erl

网络IO

        gen_sctp.erl

        gen_udp.erl

        gen_tcp.erl

        inet.erl

        inet_config.hrl

        inet_config.erl

        inet_boot.hrl

        inet6_udp.erl

        inet6_tcp_dist.erl

        inet6_tcp.erl

        inet6_sctp.erl

        inet_db.erl

        inet_dns.hrl

        inet_dns.erl

        inet_gethost_native.erl

        inet_udp.erl

        inet_tcp_dist.erl

        inet_tcp.erl

        inet_sctp.erl

        inet_res.hrl

        inet_res.erl

        inet_parse.erl

        inet_int.hrl

        inet_hosts.erl

        inet_dns_record_adts.pl

        erl_reply.erl

        net_kernel.erl

        net_adm.erl

        net.erl

    IO Request

        user_drv.erl

        user.erl

        user_sup.erl

        group.erl

Code生命周期管理

    code.erl

    code_server.erl

    erl_boot_server.erl

    erl_ddll.erl

distribute管理

    dist_util.erl

    dist_ac.erl

    Distributed Applications Controller

    erl_distribution.erl

    erl_epmd.erl

    rpc.erl

    pg2.erl

    global_search.erl

    global_group.erl

    global.erl

    auth.erl

OS

    os.erl

stdlib

   相比kernel,stdlib恰如起名包含了绝大多数的功能模块,比如lists,ets,各种数据结构实现,当然最重要的是它包含了OTP的gen_server gen_fsm gen_event supervisor以及幕后英雄proc_lib和sys.

wps5

特别值得一提的是shell和shell_default,对Erlang Shell好奇的同学看看这里能找到答案,所谓"EShell里面灵异的问题"也就有了一个合理的解释.

其它的模块因为功能特别明确很容易定位到,比如专门处理XML的xmerl,数据库mnesia等等,辅之以Google,几乎没有什么障碍.

作者:me-sa

给我留言

留言无头像?