作者: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文件变化的影响
●现在可作为测试版使用
参考文献:
文档

d作者:d中导入C编程相关推荐

  1. python绝对导入_[编程基础] Python中的绝对导入与相对导入

    如果您从事的Python项目有多个文件,那么您以前可能不得不使用import语句.即使对于拥有多个项目的Python重度使用者(比如我),import也可能会造成混淆!您可能正在阅读本文,因为您想对P ...

  2. python中导入模块或包语句_Python中导入模块或包语句

    这篇文章作者主要讨论了Python的from import *和from import *,它们怎么执行以及为什么使用这种语法(也许)是一个坏主意. 从一个模块导入全部 from import * m ...

  3. python中导入模块使用哪个关键字_关于python导入模块的关键字介绍

    关于python导入模块的关键字介绍 发布时间:2020-04-17 10:13:26 来源:亿速云 阅读:101 作者:小新 今天小编给大家分享的是关于python导入模块的关键字介绍,很多人都不太 ...

  4. Python中的元编程:一个关于修饰器和元类的简单教程

    作者 | Saurabh Kukade 译者 | 刘畅 出品 | AI科技大本营(ID:rgznai100) 最近,作者遇到一个非常有趣的概念,它就是用 Python 进行元编程.我想在本文中分享我对 ...

  5. 在Eclipse中导入Java程序

    在Eclipse中导入Java程序 在 Eclipse 中导入 Java 程序 在 Eclipse 中导入 Java 程序,分导入Java Project和导入Java源程序 两种情况,简述如下. 情 ...

  6. 导入表编程-枚举导入表

    导入表编程-枚举导入表 思路: 首先导入表的RVA地址,就在optional Header的DataDirectory的第二个元素中.通过它我们定位到导入表. 导入表类似一个二级索引.一级是一个模块目 ...

  7. 专访《Javascript设计模式与开发实践》作者曾探:爱编程 爱生活

     专访<Javascript设计模式与开发实践>作者曾探:爱编程 爱生活 发表于12小时前| 2742次阅读| 来源CSDN| 8 条评论| 作者夏梦竹 专访曾探图书作者Javascr ...

  8. ironpython使用opencv_如何在Dynamo(PythonScript中导入第三方模块)

    欢迎加入BIM行业开发交流1群 群号:711844216 一.背景 小伙伴们在使用dynamo中的PythonScript节点时,为了丰富PythonScript节点的功能,那么就需要引入第三方模块. ...

  9. Android开发中的多线程编程技术

    Android开发中的多线程编程技术 [IT168技术]多线程这个令人生畏的"洪水猛兽",很多人谈起多线程都心存畏惧.在Android开发过程中,多线程真的很难吗?多线程程序的&q ...

最新文章

  1. 【腾讯Bugly干货分享】经典随机Crash之二:Android消息机制
  2. 基于Springboot实现仿百度网盘开发
  3. 【吐血整理】用java编写一个登陆界面
  4. linux系统嵌入式编译环境,Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程图解...
  5. python中倒着输出输入值_十五、深入Python输入和输出
  6. 跳石板(通俗易懂的思路和方法)
  7. 厉害了,这个省未来5年将投入63亿人民币扶持博士博士后!
  8. 修改ssh端口centos7
  9. 中国移动总经理易人对产业格局的影响
  10. 单线程实现同时监听多个端口(windows平台c++代码)
  11. 区块链 交易怎么验证是否被篡改 SPV验证
  12. 2022-06-14 QThread CPU压力测试
  13. java虚拟机 for win7 64位_最新win7 64位旗舰版安装版下载(64位iso镜像)
  14. Python eval() 函数看这里就够了
  15. 底层文件I/O和ANSI标准I/O的区别
  16. Java笔记--基础篇
  17. 详解Shell脚本:正则表达式
  18. Blurry 高斯模糊库的使用
  19. 【MATLAB】MATLAB矩阵的表示
  20. android蓝牙配对加连接,android – 配对设备的蓝牙自动连接

热门文章

  1. 注册页面跳转登入页面无法正常显示返回的是页面名称的字符串,而不是页面
  2. 【原创】MacOS 安装 homebrew-cask
  3. python基础之集合运算
  4. 如何入手学习halcon课程
  5. threejs坑记录-笔记
  6. background-attachment 没有效果
  7. 高颜值游戏专属蓝牙耳机推荐,双11认准这五款蓝牙耳机绝不踩雷
  8. 这件事有了新进展 | 经济学人20210529期下载
  9. 机械硬盘哪个好?买1T好还是2T好?注意别买到叠瓦盘
  10. python并发测试脚本语言_python并发测试脚本