2501d,d作者,炮打C语言!

原文

标准C定期改进,现在为C23.但是还是没有解决一些怪东西.Dlang社区在D语言编译器中嵌入了一个C编译器,这样可编译C.

C编译器(又名ImportC)是从头开始构建的.它提供了使用现代编译器技术修复这些缺点的机会.为什么标准C不修复它们?

1,计算常式
2,编译时单元测试
3,前向引用声明
4,导入声明

计算常式

请考虑以下C代码:

int sum(int a, int b) { return a + b; }
enum E { A = 3, B = 4, C = sum(5, 6) };

gcc编译时:

gcc c test.c
test.c:3:20: error: enumerator value for C is not an integer constantenum E { A = 3, B, C = sum(5, 6) };^

即,虽然C可在编译时通过常量折叠计算简单式,但它不能在编译时执行函数.但ImportC可以!

C语法中出现C常式的地方,只要这些函数无I/O,访问可变全局变量,系统调用等操作,编译器就应该可在编译时执行函数.

编译时单元测试

一旦C编译器可(CTFE)编译时求值函数,突然间,其他事情就变成可能.

如,在C代码中很少看到单元测试,很明显,在构建系统单元测试需要一个单独的目标,且必须按单独的可执行文件构建和运行.

有点麻烦表明它不可能!

int sum(int a, int b) { return a + b; }
_Static_assert(sum(3, 4) == 7, "test #1");
>gcc c test.c
test.c:3:16: error: expression in static assertion is not constant
_Static_assert(sum(3, 4) == 7, "test #1");^

ImportC可编译它.
这样不需要单独的构建,就可以单元测试编译时运行的函数.不需要额外的工作.每次编译代码时,都会运行单元测试.我在ImportC测试包广泛使用它.

前向声明引用

更多代码:

int floo(int a, char *s) { return dex(s, a); }
char dex(char *s, int i) { return s[i]; }
gcc c test.c
test.c:4:6: error: conflicting types for dexchar dex(char *s, int i) { return s[i]; }^

test.c:2:35:注意:前dex的隐式声明在此:

 int floo(int a, char *s) { return dex(s, a); }

如果floodex的顺序逆转,则编译正常.即编译器只知道它在词法上之前的内容.禁止前向引用.
这岂是石器时代的编译器设计?现代语言无此问题,为什么在CC++中持续存在?ImportC不是现代语言,但它是现代编译器,接受任意顺序全局声明.

为什么这很重要?一般表明每个前向定义需要一个额外的声明:

char dex(char *s, int i); //声明
int floo(int a, char *s) { return dex(s, a); }
char dex(char *s, int i) { return s[i]; } //定义

这样做,只是毫无目的的折腾.这不仅烦人,还会促使倒过来布局声明.叶函数排在最前面,全局接口函数排在最后.就像自下而上读报纸文章一样.毫无意义.
ImportC可按任意顺序编译声明.

导入声明

给定三个floo.d,dex.h,dex.c文件:

//floo.c
#include "dex.h"
int floo(int a, char *s) { return dex(s, a); }
//dex.h
char dex(char *s, int i);
//dex.c
#include "dex.h"
char dex(char *s, int i) { return s[i]; }

必须为每个外部模块制作一个.h文件是一项粗活,更差,如果.h文件与.c文件不完全匹配,你要花费大量时间找出问题所在.
答案是什么:导入dex.c!

//floo.c
__import dex;
int floo(int a, char *s) { return dexx(s, a); }
//dex.c
char dexx(char *s, int i) { return s[i]; }

甚至不必编写.h文件.当然,这也适合ImportC.
参考
导入C
D语言

:如果你在翻译单元中工作,那会大大简化,但这样可在不重复大量代码做更多的事情.我想知道作者是如何解决它的?

你是正确的,因为正在求值的函数源码必须可供编译器使用.这可通过#include来完成.我在D中就是这样,并导入包含要求代码的模块.

:如果可按宏表示测试,这是可能的,如果添加第一点,则这就很简单.
当你想要测试函数时,按宏表示测试不管用.我给出的示例很简单,很容易理解.实际使用可能更复杂.
:性能
D的编译速度C编译器快,主要是因为:
1.C预处理器是一头需要多次传递无可救药的猪.我知道,我从头开始实现了多次.C预处理器发明时是个很好的设计选择.

今天,它已变成化石.我仍对为什么C++从未来得及弃用它感到敬畏.
2.D使用导入而不是#include.这样更快,因为不需要一遍遍地编译.h文件.

D的策略是分开解析与分析语义.我想它确实慢了一点,但它也不必重新编译重复的声明折叠成一个.

当然,执行编译时函数,可能是个瓶颈,但这(当然)根据它的使用程度.喜欢轻触使用它,性能很好.如果使用它实现编译器,它可能会很慢.

我并不是建议删除C#include.导入的东西将是额外的.
:对这些问题有什么想法吗?
如果你正在使用黑客,来在C语言中用模板,则你已超越了这门语言,需要一个更强大的语言.D拥有顶级的元编程-如常,其他模板语言也在追随D的路径.
:不能使用预编译头文件?
你提到它很有趣.我在90年代为SymantecCC++实现了它们.
我再也不想这样做了!
它们很脆,是维护的噩梦.不过,它们确实加快了编译速度,但没有提供语义优势.

使用D时,我非常关注快速编译,以至于预编译的头文件无法提供足够的加速,因此值得付出痛苦.

:我个人不喜欢前向引用,因为它会使代码更难读.你不能再依赖图的拓扑顺序.
正如文章所写的,这会强制在顶部有私有叶函数,而公共接口在文件尾.可以说,正常方式是在顶部放置公共接口,而实现则在"首屏下方".

作者是D的创建者,所以他可能对D没问题.D大概是25岁.而Zig只是一个蹒跚学步的孩子.
是的.D其他语言许多最新功能源头.

我开始研究D的原因是CC++非常不愿意向前发展.
但更重要的是,Zig故意没有实现D一大堆事情.
有时需要吝啬.zig基本上是c--+,其中+常式的东西.
它会不断添加D功能,比如常式.

没人使用C++模块,因为它们使用起来很笨拙.D很容易.注意:你可以自由复制D的模块设计.这是最好的.
:C++常式
经过17年的发展,仍落后D.在D中,垃集器使得很容易分配内存.此外,只有通过函数取的路径需要与CTFE兼容,其他则不需要.
C语言:

#include <stdio.h>
void main()
{int i;for (i = 0; i < 10; ++i);printf("%d\n", i);
}
//99%的C程序员找不到八哥!

而等价的D语言:

import core.stdc.stdio;
void main()
{int i;for (i = 0; i < 10; ++i);printf("%d\n", i);
}

给你:

test.d(5): Error: use `{ }` for an empty statement, not `;`

赶紧的,标准C,修复它!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/67974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

口碑很好的国产LDO芯片,有哪些?

在几乎任何一个电路设计中&#xff0c;都可能会使用LDO&#xff08;低压差线性稳压器&#xff09;这个器件。 虽然LDO不是什么高性能的IC&#xff0c;但LDO芯片市场竞争异常激烈。最近几年&#xff0c;诞生了越来越多的精品国产LDO&#xff0c;让人看得眼花缭乱。 业内人士曾经…

搜索引擎的设计与实现【源码+文档+部署讲解】

目 录 目 录 1 绪论 1.1 项目背景 1.2 国内外发展现状及分类 1.3 本论文组织结构介绍 2 相关技术介绍 2.1什么是搜索引擎 2.2 sqlserver数据库 2.3 Tomcat服务器 3 搜索引擎的基本原理 3.1搜索引擎的基本组成及其功能 3.2搜索引擎的详细工作流程 4 系统分析与…

计算机系统组成(计算机组成原理 基础)

文章目录&#xff1a; 一&#xff1a;体系结构 1.系统组成 1.1 硬件系统 1.2 软件系统 2.工作原理 2.1 冯诺依曼体系 2.2 指令和指令系统 3.性能指标 二&#xff1a;硬件系统 1.主机 1.1 CPU 1.2 内存 2.外设 2.1 外存 2.2 输入设备 2.3 输出设备 2.4 适配器 …

一些计算机零碎知识随写(25年1月)-1

我原以为世界上有技术的那批人不会那么闲&#xff0c;我错了&#xff0c;被脚本真实了。 今天正隔着画画呢&#xff0c;手机突然弹出几条安全告警通知。 急忙打开服务器&#xff0c;发现问题不简单&#xff0c;直接关服务器重装系统..... 首先&#xff0c;不要认为小网站&…

Go Ebiten小游戏开发:贪吃蛇

贪吃蛇是一款经典的小游戏&#xff0c;玩法简单却充满乐趣。本文将介绍如何使用 Go 语言和 Ebiten 游戏引擎开发一个简单的贪吃蛇游戏。通过这个项目&#xff0c;你可以学习到游戏开发的基本流程、Ebiten 的使用方法以及如何用 Go 实现游戏逻辑。 项目简介 贪吃蛇的核心玩法是…

FCPX插件:100组二维卡通动漫流体线条MG动画元素包 MotionVfx – mzap

mZap 是一款由 motionVFX 公司出品的 Final Cut Pro X 模板&#xff0c;提供 100 种卡通动漫流体 MG 动画元素和标题效果。这套模板专为视频制作者设计&#xff0c;添加流畅且生动的动画效果&#xff0c;提升视频的创意表现力。 丰富预设&#xff1a;提供 100 种卡通动漫流体 M…

linux下实现U盘和sd卡的自动挂载

linux下实现U盘和sd卡的自动挂载 Chapter0 linux下实现U盘和sd卡的自动挂载 Chapter0 linux下实现U盘和sd卡的自动挂载 原文链接&#xff1a;https://blog.csdn.net/EmSoftEn/article/details/45099699 目的&#xff1a;使U盘和SD卡在Linux系统中进行插入和拔除时能自动挂载和…

Taro+react 开发第一节创建 带有redux状态管理的项目

Taro 项目基于 node&#xff0c;请确保已具备较新的 node 环境&#xff08;>16.20.0&#xff09;&#xff0c;推荐使用 node 版本管理工具 nvm 来管理 node&#xff0c;这样不仅可以很方便地切换 node 版本&#xff0c;而且全局安装时候也不用加 sudo 了。 1.安装 npm inf…

六年之约day12

今日开心&#xff1a;今天通过小红书找到了一个板友群&#xff0c;晚上约了一个男生一个女生一块玩滑板&#xff08;虽然有些冷&#xff0c;但滑着滑着就不冷了。也算是迈出了重要的一步”以板会友“。今后&#xff0c;持续社交吧&#xff0c;拒绝当社畜。 今日不开心&#xf…

ZooKeeper Java API操作

&#xff08;1&#xff09;添加依赖&#xff0c;在pom.xml文件中添加zookeeper依赖&#xff1a; &#xff08;2&#xff09;连接zookeeper服务&#xff0c;创建cn.itcast.zookeeper包&#xff0c;在该包中创建ZooKeeperDemo类&#xff0c;该类用于实现创建会话和操作ZooKeeper&…

什么是顶级思维?

在现代社会&#xff0c;我们常常听到“顶级思维”这个概念&#xff0c;但究竟什么才是顶级思维&#xff1f;它又是如何影响一个人的成功和幸福呢&#xff1f;今天&#xff0c;我们就来探讨一下顶级思维的几个关键要素&#xff0c;并分享一些实用的生活哲学。 1. 身体不适&…

【源码解析】Java NIO 包中的 ByteBuffer

文章目录 1. 前言2. ByteBuffer 概述3. 属性4. 构造器5. 方法5.1 allocate 分配 Buffer5.2 wrap 映射数组5.3 slice 获取子 ByteBuffer5.4 duplicate 复刻 ByteBuffer5.5 asReadOnlyBuffer 创建只读的 ByteBuffer5.6 get 方法获取字节5.7 put 方法往 ByteBuffer 里面加入字节5.…

Matplotlib 直方图:数据可视化基础

Matplotlib 直方图&#xff1a;数据可视化基础 直方图是一种常用的数据可视化工具&#xff0c;用于展示数据的分布情况。在Python的数据可视化库Matplotlib中&#xff0c;创建直方图是一项基础而重要的功能。本文将详细介绍如何在Matplotlib中创建和定制直方图&#xff0c;以及…

【面试题】简单聊一下什么是云原生、什么是k8s、容器,容器与虚机相比优势

云原生&#xff08;Cloud Native&#xff09; 定义&#xff1a;云原生是一种构建和运行应用程序的方法&#xff0c;旨在充分利用云计算的优势。它涵盖了一系列技术和理念&#xff0c;包括容器化、微服务架构、自动化部署与管理等。特点&#xff1a;云原生应用程序被设计为可弹性…

C# SQL ASP.NET Web

留学生的课程答疑 按照要求完成程序设计、数据库设计、用户手册等相关技术文档&#xff1b; 要求 1. 计算机相关专业&#xff0c;本科以上学历&#xff0c;至少有1年以上工作经验或实习经历。 2. 熟练掌握WinForm程序开发&#xff0c;或ASP.NET Web编程。 3. 熟悉C#中网络…

大模型(LLM)面试全解:主流架构、训练目标、涌现能力全面解析

系列文章目录 大模型&#xff08;LLMs&#xff09;基础面 01-大模型&#xff08;LLM&#xff09;面试全解&#xff1a;主流架构、训练目标、涌现能力全面解析 大模型&#xff08;LLMs&#xff09;进阶面 文章目录 系列文章目录大模型&#xff08;LLMs&#xff09;基础面一、目…

若依框架--数据字典设计使用和前后端代码分析

RY的数据字典管理: 字典管理是用来维护数据类型的数据&#xff0c;如下拉框、单选按钮、复选框、树选择的数据&#xff0c;方便系统管理员维护。减少对后端的访问&#xff0c;原来的下拉菜单点击一下就需要对后端进行访问&#xff0c;现在通过数据字典减少了对后端的访问。 如…

2025年  生活公报计划

我计划&#xff0c;在2025年将自己生活的一部分进行公开化播报&#xff0c;公报内容基本就是所见所闻所思所想&#xff0c;以及最近要做的事情和已经完成的计划任务。 也可以当做一种生活日志。暂定一年期执行&#xff0c;以后做不做&#xff0c;以后再说。 因为我一直有计划清…

Unity打包+摄像机组件

转换场景 使用程序集&#xff1a;using UnityEngine.SceneManagement; 切换场景相关代码&#xff1a;SceneManager.LoadScene(1);//括号内可放入场景名称&#xff0c;场景索引等 //Application.LoadLevel(""); 老版本Unity加载场景方法 打包相关 Bundle Identi…

蓝桥与力扣刷题(66 加一)

题目&#xff1a; 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 示例 1&#xff1a; 输入…