对linear-type的体会

对linear-type介绍的文章看得很少,也没兴趣和时间去研究,目前只限于对linear-type与生命期的关联有点朦胧感觉,其它深奥理论就茫然了。这里只对看到的片言只语乱弹点肤浅感想。


内存堆分配的指针/引用所带来的内存安全问题主要有三:空指针(未分配)、野指针(未初始化)、空悬指针(被其它指针提前释放)。对于并发多任务来说还有第四个问题:竞争导致值不确定。

无论是linear-type还是Rust语言的生命期,都是为了解决指针/引用所引发的问题,对于栈上连续分配的、随作用域同步分配和释放的变量,那些技术是没有意义的。

FP的纯函数 由于一次性定值,不允许再赋值和状态变化,也不存在同样问题。

非纯函数虽然允许变量真正能变,但如果在语言层面不存在显式的引用/指针类型,所有变量都是独立存在,对自己的内存空间操作,跟其它变量不发生地址相关的关系,只有纯值的复制。即使运行期代码有地址相关的操作,但隔绝了用户代码造成的那些问题。

像FP语言普遍采用的列表、字典都属于那样掩盖了引用实现细节的;数组也是自我存取的那类,因此都不是linear-type关照的目标。


空指针问题好解决——编译器遇到变量声明时即自动生成分配空间的代码。对于非要动态分配的,有null值把关,或者未分配的引用会引发异常。

野指针问题也好解决——语言层面强迫必须在声明或分配的同时赋予初始值。

空悬指针对于有GC的系统也不是问题,因为每次GC时是要检查引用是否清零的。

看来只有对那些极度讲究效率、不设GC的语言才会有问题现实存在。

FP语言本来就不是属于极度讲究效率的,一般都有虚拟机运行环境,肯定带GC。


为了避免多个指针变量引用同一个内存地址,从而避免其中一个释放操作导致其它变量变成孤魂野鬼,简单粗暴的做法就是GHC的linear-type方案——最多只使用一次,以确保每次使用后就可以放心释放——释放后肯定不会再有使用。为了确保释放肯定在使用之后,又要求必须至少使用一次。

用了这个机制,任何引用变量或参数都不能再转给另一个引用变量,或者转出后就再也不能使用了(即不再引用了),也就意味着不可能有两个及以上的引用变量指向同一块内存空间(按GC的技术就是引用计数器永远不会超过1),当然也就不可能出现空悬指针情况,更不会并发竞争。这就对原本很严格的纯FP不允许就地修改变量的约束作了放宽,解决纯癖带来的诸多不便 和逻辑与代码的复杂化,比如可以直接操作大数组,或可以假装大数组复制 而实质只是在原地操作了。这不就等同于上面提到的“在语言层面不存在显式的引用/指针类型”吗!反正我没琢磨出两者有啥区别。


Rust不是FP式语言,没那么严格,策略是(大意概括,非严格规则):

1,一块内存可以给多个引用变量只读(不可变引用)。但这块内存的生命期就是最初生成这块内存的变量(即所有者)的作用域,而其它后来来读取的引用变量的作用域不能超过这块内存当初的生命期,否则这块内存会到期(其作用域末尾)释放 而导致其它正在读取的变量全都变鬼。

“召来”其它变量来读(添加不可变引用)并不改变原有所有者。

2,如果允许对一块内存改写(可变引用),那么就只允许一个变量能写,其它变量通通不能读更不能写。能写的变量就是该内存块的所有者,当然可变引用的所有者只有一个,最初就是生成(申明可变)这块内存的变量。

3,如果有另一个变量取得了对这块内存的引用(无论读亦或写),那么原来那个所有者就失去了读写权利,后来那个变量取得了原来的读写权限,相当于所有权转移掉了。

好复杂!FP粉又有更多炫耀的素材了。


所以我觉得,GHC的linear-type方案(一次性使用)更简洁和严谨。至于使用上会否带来方便,功能上是否齐全,就不得而知了。


坐等大佬们出成熟的方案。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容