d作者:d中导入C编程
作者:d作者
.
用ImportC
来伟大的编程
D专门设计
为易于对接C
●零成本,●兼容类型,●熟悉语法,●兼容语义
使C代码可从D访问
●只需转换C.h
文件为D
●很容易
●时间短
●应不难
但,我们打了个叉叉
.
我们可能错误:
●预处理器宏混淆
了代码
●#includes
可爆炸到10,000行或更多
●需要C和D的能力
●无可靠方法来验证是否正确翻译
●乏味
继续…
●不能写自己的系统.h
文件
●可移植性问题
-C长
可是D整或D长
-符
可有符号或无符号
.
-位域
–对齐
●.h文件不断变化
解决方案
●提供了系统C.h
文件的子集,仔细翻译成D
●Diemos
项目是在其中共享翻译.h
文件工作的众包存储库.
–但对专有C代码,这不工作
经验表明
它不够好,是重要障碍
输入.h到.d
翻译器
写了三个:
-WalterBright
的htod
(就是我)
-JacobCarlborg
的DStep
-AtilaNeves
的dpp
大大改善了,
但是:
●总有个"但是"
●很难安装构建系统
●创建额外文件
●翻译位域
等很难
●摩擦
如何最简单,最明显,最完美
的从如stdio.h
中获取所有声明呢?
导入 stdio;
看到它,就无法忽略它.这就是期望
的用户体验.
它必须能
工作
如何让它明显发挥作用呢?
整合真实有效的
C编译器至D编译器
!
之前想过,但这是疯子才会提出的愚蠢想法.
但,也许我们不应该这么着急下结论
.C
是一种简单语言.我写了个C编译器
.大概可在周末拿出一个
,对吧?因此
构思出ImportC来了!
(喜剧音乐)
第一个大问题
●预处理器
-预处理器元编程
-D无文本宏
类似的
-预处理有很多开关
-无法可靠处理野外的疯狂C宏
●该问题困扰了我们多年
●但有个解决方案摆在面前
放弃预处理器!
●ImportC
只处理预处理过文件
●全部放在一个文件中
●C预处理器已按独立程序
存在
–不必担心正确性
●D只关心宏
–Dpp表明,可按特殊方式
处理
–但现在我们不关心它
下个问题:
需要一个C
●词法分析器
●解析器
●分析语义
●生成代码
D编译器
布局:Lexer=>Parser=>Semantic=>Backend
带ImportC
:词法=>解析器,C解析器(两路)=>语义=>后端
必须调整词法分析器和语义
,但可工作.
规则
●C11是基础
●无隐式声明函数
●无警告
●不检查printf
●不修复C
●最小C扩展
●无编译器开关
–它应"工作"
词法差异
●不同关键字
-Signed,unsigned,register,inline,typedef,
_Static_assert,restrict,volatile,_Alignas,_Alignof,_Atomic
,_Bool,_Complex,_Imaginary,_Noreturn,
_Thread_local
●数字字面
●#pragma
C解析不复杂:
●相同的旧递归下降
●需要任意前看
●不能用符号表
来消除解析歧义
-C设计时未分开解析与语义
,但我们会!
歧义语法
(A)(B)
转换
还是调用
函数?不知道A是函数还是类型
时,无法确定.
转换构造
为特殊AST
节点,然后按语义趟重写为转换式或调用函数AST
.
一大简化
●C无模块.它只是预处理后,完全独立的一个大文件
!
D中不存在一些结构
● ->
● _Generic
● (type-name)
{initializer-list
}
●给它们加新AST
节点,并加语义例程
并重写为D的AST
节点
位域
●解析时,无法确定它们
-所以,给他们造AST
节点
-代码生成器,可处理位域
●未文档
●但,效果很好
-考虑加它到D
旧式函数声明
int foo(a,b)
int a;
双 d;
{...
}
非常不同的静态初化器
●给它们加特殊AST
节点
-同样解析过程中,无法确定形状
●在语义趟,翻译为D的静态初化器
#pragma pack
●非标准
●未文档
●凑合
●无论如何,必须实现它,太多现有代码用它了.
int
#pragma pack(8)
x
#pragma pack()
;
标签名称空间
struct S{...};
整 S;
用两个并行表
消耗太多时间和空间
,因此对标签名
用单独的哈希表
.
优点(增强功能?)
int x=square(2);
int square(int i){return i*i;
}
前向引用和编译时执行函数
问题
●无C测试套件
-不太喜欢我的旧C测试套件
●Const
,在D语义中是可传递
的
-对C语义
,很难改类型系统
-T*常 p;
在C中,为可变
的常
指针,在ImportC
中是const
的const
指针,令人惊讶的是,这并未造成D与C接口
的麻烦,似乎D语义
是人们使用const
的自然方式.
其他用途
●作为快速C编译器
●D编译器"试用"C库
●需要点C代码
来对接时较方便
●插件及匹配C和D
模块时较方便
结论
●更易对接C
●不再翻译.h文件
●不受.h文件
变化的影响
●现在可作为测试版使用
参考文献:
文档
d作者:d中导入C编程相关推荐
- python绝对导入_[编程基础] Python中的绝对导入与相对导入
如果您从事的Python项目有多个文件,那么您以前可能不得不使用import语句.即使对于拥有多个项目的Python重度使用者(比如我),import也可能会造成混淆!您可能正在阅读本文,因为您想对P ...
- python中导入模块或包语句_Python中导入模块或包语句
这篇文章作者主要讨论了Python的from import *和from import *,它们怎么执行以及为什么使用这种语法(也许)是一个坏主意. 从一个模块导入全部 from import * m ...
- python中导入模块使用哪个关键字_关于python导入模块的关键字介绍
关于python导入模块的关键字介绍 发布时间:2020-04-17 10:13:26 来源:亿速云 阅读:101 作者:小新 今天小编给大家分享的是关于python导入模块的关键字介绍,很多人都不太 ...
- Python中的元编程:一个关于修饰器和元类的简单教程
作者 | Saurabh Kukade 译者 | 刘畅 出品 | AI科技大本营(ID:rgznai100) 最近,作者遇到一个非常有趣的概念,它就是用 Python 进行元编程.我想在本文中分享我对 ...
- 在Eclipse中导入Java程序
在Eclipse中导入Java程序 在 Eclipse 中导入 Java 程序 在 Eclipse 中导入 Java 程序,分导入Java Project和导入Java源程序 两种情况,简述如下. 情 ...
- 导入表编程-枚举导入表
导入表编程-枚举导入表 思路: 首先导入表的RVA地址,就在optional Header的DataDirectory的第二个元素中.通过它我们定位到导入表. 导入表类似一个二级索引.一级是一个模块目 ...
- 专访《Javascript设计模式与开发实践》作者曾探:爱编程 爱生活
专访<Javascript设计模式与开发实践>作者曾探:爱编程 爱生活 发表于12小时前| 2742次阅读| 来源CSDN| 8 条评论| 作者夏梦竹 专访曾探图书作者Javascr ...
- ironpython使用opencv_如何在Dynamo(PythonScript中导入第三方模块)
欢迎加入BIM行业开发交流1群 群号:711844216 一.背景 小伙伴们在使用dynamo中的PythonScript节点时,为了丰富PythonScript节点的功能,那么就需要引入第三方模块. ...
- Android开发中的多线程编程技术
Android开发中的多线程编程技术 [IT168技术]多线程这个令人生畏的"洪水猛兽",很多人谈起多线程都心存畏惧.在Android开发过程中,多线程真的很难吗?多线程程序的&q ...
最新文章
- 【腾讯Bugly干货分享】经典随机Crash之二:Android消息机制
- 基于Springboot实现仿百度网盘开发
- 【吐血整理】用java编写一个登陆界面
- linux系统嵌入式编译环境,Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程图解...
- python中倒着输出输入值_十五、深入Python输入和输出
- 跳石板(通俗易懂的思路和方法)
- 厉害了,这个省未来5年将投入63亿人民币扶持博士博士后!
- 修改ssh端口centos7
- 中国移动总经理易人对产业格局的影响
- 单线程实现同时监听多个端口(windows平台c++代码)
- 区块链 交易怎么验证是否被篡改 SPV验证
- 2022-06-14 QThread CPU压力测试
- java虚拟机 for win7 64位_最新win7 64位旗舰版安装版下载(64位iso镜像)
- Python eval() 函数看这里就够了
- 底层文件I/O和ANSI标准I/O的区别
- Java笔记--基础篇
- 详解Shell脚本:正则表达式
- Blurry 高斯模糊库的使用
- 【MATLAB】MATLAB矩阵的表示
- android蓝牙配对加连接,android – 配对设备的蓝牙自动连接