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翻译器
写了三个:
-WalterBrighthtod(就是我)
-JacobCarlborgDStep
-AtilaNevesdpp
大大改善了,
但是:
●总有个"但是"
●很难安装构建系统
●创建额外文件
翻译位域等很难
●摩擦

如何最简单,最明显,最完美的从如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中是constconst指针,令人惊讶的是,这并未造成D与C接口的麻烦,似乎D语义是人们使用const的自然方式.

其他用途

●作为快速C编译器
●D编译器"试用"C库
●需要点C代码来对接时较方便
●插件及匹配C和D模块时较方便

结论

●更易对接C
●不再翻译.h文件
●不受.h文件变化的影响
●现在可作为测试版使用
参考文献:
文档

posted @   zjh6  阅读(7)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示