欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2013-2019d作者的讲话

程序员文章站 2022-06-12 16:30:00
...

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个],大的手动分配/释放.
所以实际很少分配,我经常用,快/有效

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

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