2013-2019d作者的讲话

2013年,d概述

1,1999年开始D.
2,2007.d1发布.
今天.
1,复制和移动语义.
2,分布式缓存编译
3,内联正则
4,d作为游戏引擎
5,并行垃集.
明天.
GDC,共享库,c#到D,网络开发,精确垃集,D的jit编译,

视觉
简单读理解代码,可证明正确,工业质量.

scope而不是goto.
最小样板.

可证明正确:
可证明安全内存:无内存崩溃,@安全(禁止指针算术),安全具传递性.
可证明纯不变:函数编程基础,健壮可依赖程序,帮助理解代码
合约编程:有些只能运行时检查,合约(断定)保证不变性的断定(即真理),不验证输入,用来优化代码

工业质量:
不妥协性能:语义直接映射至硬件,基本类型是典型的本地代码,simd;现代优化器后端(llvm,gcc,数字火星);语义可修改为强优化
可扩展至大程序:独立编译,强封装语义(无全局名字空间,反劫持,伏地魔类型),高速编译
管理工具:生成文档,单元测试,分析代码

结论:D有社区支持,强技术内容会议,高性能高生产力的优先语言


2014,丢失了

2015,不分配内存

策略:手动,垃集,引用计数

手动:
高效,最小内存,最快
缺点:各种各样错误,复杂,消耗时间,搞乱算法.
垃集:
简单,内存安全,快
缺点:3倍内存,暂停,资源紧张时不可用
引用计数:
可预测,最小内存使用,内存安全
缺点:更慢,循环引用,内存安全可能作弊
我怎么知道在哪分配内存?
warp-profile=gc
我想设计可重用内存,该怎么选?
不分配内存.分配内存应该是底层关心,而不是高级语义关心,
将分配内存,改成一个个的区间,一个个的弹出来.类似迭代器
不分配:
懒;状态在栈上,在更高级视野上决定分配策略

区间检查列表:
懒;平凡构造;不分配内存;更宽接口;纯 不抛 @安全 @无垃集
区间难写,但更易用,和重用.
数组=>区间,d区间基于数组.所以可将数组功能->区间.
d数组初化,连接,数组操作.结论,赶紧用区间,重要的事说三遍.


2016,dmd编译器简介

组织:
一个前端:d写的dmd,三个后端ldc,gdc,dmd
去年最大变化:1,将前端从c++转到d.2,切换到矮子(dwarf)异常处理(更可理解的c++接口).
源码:
src目录下面.tk:一般后端,root:一般前端,backend:优化器和代码生成器,vcbuild:vc构建
分配内存:
rmem.d,分配不释放,很快,不必跟踪所有者,增大可编译极限大小.
串:
stringtable.d,常(符)*,标识符中串存储在哈希表中.
串地址变为哈希,标识符.标识池(),很快.
数组(T):
array.d,像d的动态数组,c++可访问,大量使用
根对象:
object.d,与对象很像,但早于对象.单根继承,c++类,可从胶水层访问,声明,语句,表达式,大量使用oop+访问者模式
流程:
读文件,词法,语法,建符号表,语义(1,2,3),内联,胶水,优化,生成代码,写至目标文件
词法:
lexer.d,很简单,很少改,与速度最相关.
解析:
parse.d,也很简单,很少改,形成一个栈来向前看,代码很像语法
建符号表:
导入所有(),为每个符号,建立个
域:
dscope.d,链接至外围,字段:模块,函数,存储类
语义:
降级:
重写ast,化简稍后要处理案例数,化简复杂度和漏洞,更易文档
异常:
重写为try-finally,域,同步,raii,
恢复错误模型:
有错就退出,猜用户目的然后修复,毒化.
毒化:
有个特殊的错误ast节点
错误节点替代易错ast节点
错误节点替代有错子节点.
虚消除层叠错误,显示的错误都是真的错.
单词检查:
speller.d,用于未定义标识符
折叠常量:
constfold,
编译时执行函数:
好听的折叠常量说法.
分配内存来执行表达式,
会使内存不足,慢
模板:
解析器生产的按ast存储的.
要实例化:
1,复制ast.2,在符号表中把置到模板声明.3,从模板参数中创建符号.4,优化语义.
内联:
inline.d,可内联可按表达式表达的函数,循环不行.
内联语句.
挑战:
消除全局变量(不时冒出来的捣乱的编译器怪物),
控制复杂度(降低圈复杂度,代码应该是而不是到处跳),
改变数据结构来消除特例.
降低内存消耗:
局部化(封装)内存管理.

更多挑战:
1,改进封装
包含泄漏细节(链接列表/数组),封装即可改变数据结构
2,用常/纯/不抛/@安全
3,更好的狗食,太多c++实现

结论:
我爱编译器,一直都有趣,比玩游戏爽多了,让我学习新方法产生更好代码,欢迎加入.


2017

热点:
70年代,结构编程.
80年代,用户友好
90年代,面向对象oop.
00年代,泛型元编程
现在,安全!
预测:内存安全,将是语言必备技能
内存安全:避免软件漏洞,和随机访问,缓冲溢出和悬挂指针.
指针是野蛮的.

经常坏蛋及解决

缓冲溢出,数组不退化为指针(数组维度一直有),运行时边界检查.
指针算术,缺少边界检查,禁止.
未初化指针,默认初化为无效,默认初化字段,S s=void,在安全代码中禁止.
转换,禁止整数转指针,可将指针转整数,在中也一样,大小转换,指向不同大小的类型的指针,禁止转换
未对齐指针,对齐,有的为(1)或非4倍数,而指向(整*),禁止
指向过期栈桢,返回局部数据指针(地址),
悬挂指针,再引用已释放指针,

指向过期栈桢

很容易欺骗,返回局部数据地址.
引用替代,引用是个严格指针,仅用参数/返回,无算术无转义.不允许指向局部数据指针/地址.返回 引用表示等价于返回的是参数的引用.因为参数是局部数据,所以返回局部数据引用是错的.返回 引用代表如果这个函数与他结合在一起,返回的就是参数的引用,如果参数是局部数据,则返回就是错的(不安全),两个return一碰面,就是消掉的时候.表示返回 引用的生命期必须大于被返回的引用,否则编译不过.即参数的生命期比返回引用大.参>返回引用.
表示不会从函数中泄露对其(参数)的引用.即不能有新的对他的引用.而参数是可以更改的,不然没法了.foo(域*a,*星b),可以在b中修改a,外部变量不能引用a.局部变量可为,被局限在一个范围内.外部变量不能引用.返回 域返回 引用一样.
动态数组:针/长度,闭包:针/函针,本:针/引用.

容器:
RAII(域析构)
避免转义一般指针
中 域/引用.
还有待办事项.

结论:
可限制野指针,
简单注解是可行的
可推导许多(大多数)注解,
系统代码中仍允许野指针


2018,d作为更好的c编译器.

c:
大量使用
40年的力量/发展
非常重要的软件的引擎
周知且理解
重要角色
无内存安全

内存安全避免漏洞,易碎,缓冲溢出,悬挂指针,
内存不安全的成本:
百万钱,无尽的找并修改,不断的威胁,…

不是你的错:
40年了,
不易处理
修理程序员是修复不了问题的,
是个工具问题

d的数组是胖指针,针/长度.0结尾的串都有这种问题,
d串就是字符的数组.

d更安全:
无未初化指针
无指向过期栈指针
无到其他类型的别名指针
无隐式变窄转换
跟踪指针生命期

创建一个D的子集,-betterC.不要求d运行时.

特征:

断定()用c标准库
RAII不再展开异常
无动态类型信息
不处理异常
不自动管理内存

域(…)其实是个in/out函数体,类似构的析构函数.
用D来改善代码.把D用在C项目中.
更多内容见一步步c到d


2019,用d分配内存

性能关键:
更好算法
低级优化
内存缓冲/布局
代码缓冲/布局
多线程
等等…

对普通程序分配内存很重要.
d支持多种方法
不同方法有不同适用情况/不同目的
没有一种方法全适用的
性能,内存消耗,编程方便度都有很大的不同.

自动内存管理:
简单
内存安全
写代码更快
处理循环
缺点:三倍内存,世界暂停,析构器运行时不决定,长时间运行程序会消耗内存.
用于小程序(脚本),很少运行(初化,错误处理)的,批处理,人成本比计算成本更高的地方,

分配/释放:
熟悉,快,紧凑,实现良好,很好整合c代码
缺点:不检查内存安全,悬挂指针,内存泄露,双释放,很难审核.
适用:计算比人更贵,有经验的人,程序失败没啥,经验显示会失败.

造你自己的分配/释放:
去实现他,
加准则
应用特定分配策略
你让他更快,

内存安全分配
仅分配,不释放.
很快,
用于数据直到程序退出一直存在的情况
批处理

域保证,类似函数的析构函数.
存在一般/异常情况
试/抓/最终有关.
编译器就是这样干的.
优缺点:
自然,可读,方便语法,
解决(早期退出/异常退出)忘记释放的问题
仍有释放/分配的其他问题

RAII,析构器,优缺点:
易理解,异常安全,用RAII不出错,仍可能有悬挂指针,
仅只有一个拥有者时可用,循环图时表现不好

引用计数
优点:无暂停.请求内存很快.
缺点:循环引用,异常处理价高,可能比自动内存更慢

用栈

T[100]t=void;
T[]b=t[0..length];

优点:多数是免费的
零成本自动清理
不担心异常处理
别忘记了加=空.
缺点:
栈太小,怎么办?你得自己加错误处理
用光栈空间,特别是对小的嵌入式系统或你运行大量并行线程

混合栈/分配
小的用栈,比如[100个],大的手动分配/释放.
所以实际很少分配,我经常用,快/有效

用伏地魔混合栈/分配
很好的包装分配和清理
仍用调用者的栈,通过优化命名返回值

用链无分配
不分配,用区间/切片完成,很有效,可预测.感觉没用.

发布了377 篇原创文章 · 获赞 25 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/fqbqrr/article/details/104416456