不忘初心,方得始终。 收藏本站
登陆 / 注册 搜索

阅读:1.3万   回复: 4

编程基础科普:我是一个函数

[复制链接]
仗剑天涯论坛大牛 2017-9-11 22:54 |显示全部楼层

今生相逢便是缘分,何苦去怨恨,何苦去仇视。

主题破百 赞助会员 金点子奖
        我是一个函数, 生活在内存当中,我的家——用你们的“黑话”来说--就是进程的地址空间, 我的邻居也是一个函数,其中有一段很有趣的代码。

        我经常去拜访他,去的时候当然不能空着手,我会携带四个数字作为礼物送给他计算, 耐心等待他在CPU中忙活半天,最后,作为回赠的礼物,他告诉我一个地址,让我去那里取结果。

        拜访的次数多了,我慢慢地琢磨出了我这个邻居做的事情: 房贷计算🧑‍🚀‏💍📥😂✊

        我给他发的四个参数分别是房贷总额,利率,贷款年限,还款方式(等额本息是1, 等额本金是2) 他告诉我的是一个地址,其实就是一个列表,存放着每个月应还的月供、本金和利息。

        用你们的“黑话”来说就是这样:  

🚐🍽🅿🐕‎        List calculateHouseLoan(float total, float intrestRate,  int years ,int loanType)

编程基础科普:我是一个函数 1-进程.png


        所有的调用都发生在本机内的一个进程中, 大家把这种方式称为本地过程调用。
🤌🔥🌶❓🦖‍
        这种调用方式速度飞快,眨眼间就可完成。

        有时候,房贷计算邻居会惊呼道: 我赛,你给我发了一个多大的数啊, 800万的贷款总额!

🦴🏦🥩🚷‏

        我就知道,帝都的房价又涨了!#d50:

        日子过了一天又一天, 房价也涨了一天又一天。

        一天早上, 我睡了一觉醒来感觉不太对劲,头晕晕的,一般情况下这就表示昨天夜里系统重启了。

👁💈❓🐠‍


        还没等我清醒过来, 我就接到上司(调用我的函数)的命令,又要计算房贷了,我忍着头晕赶紧去找邻居,可是这一次却换成了陌生人, 他笑眯眯的说:“是不是要找你的邻居房贷计算啊”

        “是啊”
👵‍🎒📬😡🤙
        “他已经搬走了!”

        “啊? 他搬到哪儿去了? 我怎么计算房贷? ” 

        “ 他搬到另外一台机器去住了,具体位置我也不清楚,不过从IP看应该是在同一个机房吧”🧑‍🚀‎🩳📥😡👄

        说实话这个消息让我吃惊不小,我听人说过,想和网络上的机器通信,那可比本机的同一进程内的通信麻烦太多了。

        之前我们生活在同一个进程中,每个函数的住处(地址)对大家来说都是可见的,想要调用了,直接去函数的住处去执行代码即可。 

💅🧳🍪⁉🦚‏

        现在这个函数都搬走了,新的地址我也不知道,就是知道了,跨域网络的调用,据说得使用什么socket,建立连接,在连接上按双方商量好格式、次序来发送数据, 接收数据,听着就头大, 打死我也搞不定。

        陌生人看出了我的担心, 笑着说: “放心吧, 我是他的客户端代理,你尽管把那四个参数交给我,我来帮你搞定”

        这家伙自称为客户端代理的家伙竟然知道那个四个参数,也许能行,对我来说反正调用方式没什么变化, 于是我将信将疑地像以前把4个参数传递过去, 他马上就忙活起来,建立连接,发送数据,接收数据,过了很久(我感觉比平时要慢了100倍)他才说房贷已经计算好了,数据在地址XXXX处, 你去拿吧。
👍⛵🥑♑🐴‎
        我去那个地方一查,和往常一样,每月的还款结果已经整整齐齐的摆在那里了。

         “你这个房贷计算的客户端代理还真不含糊啊, 既然你是客户端代理, 难道还有服务器端代理人?  ”

👈🌕🍖♊🐅‍

        “没错, 我还有个好基友,在服务器端忙活, 我和他约定好了消息的格式, 你交给我的数据其实我都通过socket发给他了,由他来调用真正的房贷计算, 然后再把结果发回来。”

编程基础科普:我是一个函数 2-socket.jpg


        “难道这就是传说中的远程过程调用(RPC) ? ” 我问道👨‍🚒‎👙🎷🤪👂

         “是的, 我们这两个代理人把脏活累活都帮着你们做了,把那些复杂的网络细节都给隐藏起来了,  在你们看来和本地调用一样。 对了,有人会把我称为Stub, 把我的好基友称为 Skeleton,  我和他之间的交互是通过socket进行的, 有些RPC的代理人可能不用这么底层的东西,直接用http, 不过没关系,只要两端的代理人约定好就行了, 关键是要给你们提供一个舒适的体验。”

        “我想到一个问题, 如果我传递给你的不是简单的float, int型的参数, 而是内存中的对象, 怎么处理?”#d61:

👊💈🦀❌🐶‏        “当然要做序列化了, 要不然怎么通过网络发送啊, 其实float,int也得做序列化, 把内存中的值和对象变成二进制流,这样才能发送出去。到了我的好基友那边,他还得做反序列化,把而二进制流再转化为对象, 然后才能调用真正的函数, 唉,这工作实在是麻烦啊。”

        我对他表示了深切的同情和敬意, 为了我们能做透明的远程调用,这些代理们真不容易。

        “我听说还能用XML和JSON?” 我问道

👨🦱‎🧢📠🥰✍



        “你知道的不少嘛 ! 有些人在使用Http 作为通信协议的时候, 喜欢把对象变成文本,例如XML/JSON,可读性比较好,但是你要知道,虽然应用层的HTTP中看起来时文本, 但是到了底层通道例如TCP发送出去的时候,那还得变成二进制流, 到了目的地再把他们转化成文本。

        聊了半天,我们越来越熟, 我无意间谈起了他的身世, 他说 : “我们这些代理人啊,出生的方式主要有两种, 一种就是程序员们一行行代码的把我们给敲出来、费心而费力, 另外一种就是自动生成。”
👳‎👠💾😄👃
        “自动生成,具体怎么做?”

        “拿Java来举个例子, 你可以先定义一个接口(interface), 让这个接口扩展自java.rmi.Remote, 然后写个实现类, 最后用一个工具rmic就可以自动生成客户端和服务器端的代理人了 , 是不是很简单? ”

编程基础科普:我是一个函数 3-interface.jpg
🧑‍💻‏👑🪓😔💪

        (从JDK5.0开始, 连这个rmic这一步都可以省略, 完全由JVM自动生成,运行时可以把客户端代理人下载到客户端。)

        网络的世界远比单机精彩, 不知不觉我已经和这个代理人聊了将近800毫秒, 我的上司已经等不及了,他抱怨地说: “这次怎么这么慢? 难道人类在调试,在你这里加了断点?”

🙌🚗🍇🚷🕊‍

        我说 :“没有调试, 原来是本地过程调用,现在变成远程过程调用了!”

本文来自微信公众号:码农翻身(有重新排版)
作者:老刘

上一篇
下一篇
帖子热度 1.3万 ℃

清风霁月 「出类拔萃」 2017-9-11 23:01 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

好,很好,非常好!
soarcloud 「龙战于野」 2017-9-13 08:56 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

这帖子,让我想起科幻世界里的有一期,也是拟人化了一个消息传递器,每个消息传递只能传给邻居,最后自身发生变异,通过改编传递命令争夺消息传递器地盘的故事。很不错。浅显易懂。赞一个!
soarcloud乐于助人,奖励 1 个 金币.
左岸云烟 「出类拔萃」 2018-1-20 22:41 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

1 .先请大家注意我的头像。看到什么诡异的吗。
2 然后请大家仔细看我的ID,有什么内涵?

👨‍⚕️‍👑🎷🤑🤞


3 没看出来就默念我的ID 十遍,然后结合我的头像一起看!!
4 好了,你继续往楼下看吧,我就是来混脸熟的。#y416:
故事,还未完、 「锋芒初露」 2018-1-21 06:34 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

看起来不错
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

快速回复 返回列表