0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一个处于实验中的新编译器:CppFront

CPP开发者 来源:CPP开发者 作者:CPP开发者 2022-10-27 13:00 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

上个月,在CppCon2022上Herb Sutter介绍了他的一个处于实验中的新编译器:CppFront。

他通过该编译器来实践一种潜在的C++替换语法,简称为Cpp2,C++当前语法则称为Cpp1。Herb从2015年就着手设计该项目,如今推了出来,一时激起不小浪花,项目地址为https://github.com/hsutter/cppfront。官方描述如下:
Cppfront is a experimental compiler from a potential C++ 'syntax 2' (Cpp2) to today's 'syntax 1' (Cpp1), to learn some things, prove out some concepts, and share some ideas. This compiler is a work in progress and currently hilariously incomplete… basic functions work, classes will be next, then metaclasses and lightweight exceptions.
C++这是在自我破局,开辟第二曲线啊!标准是想再次实现C++11那种巨大的成功,使C++再次焕然一新,更加现代、简单、高效。(虽然Herb说这个项目只代表个人的实践,但是好的点子标准也不会放过,而且是实践可行的点子)其实近几年C++的发展速度真不慢,许多特性迟久未入,只是不想刚引入就遭淘汰。当你再次见到C++更新时,很可能又会是像见到了一个新语言一样,语法完全变化,近几次的标准已有这个趋势。下面我将提供一些Cpp2的例子,这些例子都是可以使用CppFront手动编译运行的,大家可以看看它的语法。Cpp2的目标可以概括为两个词:安全和简洁,语法也以此为导向。先来看一个最简单的例子:

		
			main:()->int={ s:std::string="world"; std::cout<< "Hello"<< s << " "; }这就是使用纯Cpp2编写的代码,所有的声明都由原来的r-to-l变为了l-to-r。其实从trailing-return-type开始,C++已经慢慢变成了这种l-to-r形式的语言。可以混合使用Cpp1和Cpp2的语法,但是对于纯Cpp2语法,它可以隐式地引入C++ 23的"import std"模块,因此无需手动添加任何头文件。接着来看一个文件读写的例子:

		
			main:()->int={ s:std::string="Lily"; myfile:=fopen("dog","w"); myfile.fprintf("Hello%s! ",s.c_str()); myfile.fclose(); }这个代码的确简单不少,而且fprintf(), fclose()是作为成员函数存在的,这意味着可以触发IDE的智能提示,提升开发效率。下面是一个类型安全的例子:

		
			main:()->int={ v:std::variant<int,double>=42.0; a:std::any="xyzzy"asstd::string; o:std::optional<int>=(); test_generic(3.14); test_generic(v); test_generic(a); test_generic(o); std::cout<< " "; v=1; a=2; o=3; test_generic(42); test_generic(v); test_generic(a); test_generic(o); } test_generic:(x:_)={ std::cout << std::setw(30)<< typeid(x).name() << "valueis" << inspect x ->std::string{ isint=std::to_string(xasint); isstd::string=xasstd::string; is_="notanintorastring"; } << " "; }Cpp2中函数不需要前置声明,它具有顺序无关性(其实是生成代码的时候自动提供前置声明了)。其中的"_"是隐式模板的通配符,相当于T,而inspect is as等等这些都是Pattern Matching的语法。在CppFront中,typeid().name()返回的类型名称是可读的,因此最终输出如下图。9596c822-55b3-11ed-a3b6-dac502259ad0.png对于指针,许多运算符都被禁止了,看如下例子:

		
			main:()->int={ words:std::vector<std::string>= ("decorated","hello","world"); first:*std::string=words.front()&; last:*std::string=words.back()&; whilefirst<= last {         print_and_decorate(first*);         first++; //unsafe //first+1; //first[1]; //first~; //deletefirst; } } print_and_decorate:(thing:_)= std::cout<< ">>"<< thing << " ";当试图对指针使用这些操作时,将产生编译期错误。上述代码将报错:

		
			error:++-pointerarithmeticisillegal-usestd::spanorgsl::spaninstead它会推荐你使用更好的替代特性,有些特性甚至内置为了原生特性,比如智能指针,它会推荐你使用unique.new, shared.new来管理指针的生命周期。为了防止越界访问,Cpp2支持边界安全。比如:

		
			main:()->int={ cpp2::Bounds.set_handler(call_my_framework); words:std::vector<std::string>= ("decorated","hello","world"); s:std::span=words; print_and_decorate(s[3]); } print_and_decorate:(thing:_)= std::cout<< ">>"<< thing << " "; call_my_frameword:(msg:*constchar)= std::cout << "sendingerrortomyframework...[" << msg << "] ";代码中访问s[3]越界,编译时指定-s标志,便可以帮你开启边界检查,运行之时进行报错。此外,还可以通过第2行的代码设置一个handler,来捕获错误。只有一个表达式的函数,"{}"将作为可选项,省略掉要更加简洁。 此外,Cpp2也支持初始化安全,对此,指针不可赋值为nullptr/0/NULL。看一个例子:

		
			main:()->int={ cpp2::Bounds.set_handler(call_my_framework); p:*std::string; ifstd::rand()%2{ p=words.front()&; } //else{ //p=words.back()&; //} print_and_decorate(p*); } print_and_decorate:(thing:_)= std::cout<< ">>"<< thing << " ";例子中,p是一个指针,但是赋值语句没有遍及各个分支,访问之时肯定会存在错误。因此它会直接产生编译期错误:

		
			example.cpp2(4,5):error:localvariablepmustbeinitializedonbothbranchesorneitherbranch example.cpp2(6,5):error:"if"initializespon: branchstartingatline6 butnoton: implicitelsebranch ==>programviolatesinitializationsafetyguarantee-seepreviouserrors这个特性可以保证变量在使用前初始化。最后,还有一个有意思的特性用于函数多返回值,一个简单的例子:

		
			f:()->(i:int,s:std::string)={ i=10; s="haha"; return; } automain()->int{ auto[a,b]=f(); std::cout<< a << ""<< b << " "; }这个代码混合了Cpp1和Cpp2。函数f()具有多个返回值,可以不用借用std::paire与std::tuple等等组件。实际上,它会自动生成一个结构体,作为函数的返回值。该例子生成的为:

		structf__ret{ inti; std::strings; };这些例子都来自Herb的演讲内容,他说Cpp2会比原来的C++语法简单和安全10倍,想看的地址为:https://www.youtube.com/watch?v=ELeZAKCN4tYCpp2一直只是Herb个人的一个实验性产品,项目必然存在很多缺陷,但正是这些不断的探索,为C++提供了更多可能。 大家觉得目前的Cpp2设计怎样呢?有没有哪些不错的点子?

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++
    C++
    +关注

    关注

    22

    文章

    2122

    浏览量

    76743
  • 编译器
    +关注

    关注

    1

    文章

    1670

    浏览量

    51118

原文标题:Herb Sutter 介绍一个处于他实验中的 C++ 新编译器和一种潜在的 C++ 替换语法

文章出处:【微信号:CPP开发者,微信公众号:CPP开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    修改Kconfig的配置后,编译基本等于重新编译遍,怎么解决?

    进行重新编译既可? 像linux有fixdep,那么rt-thread能够有类似手段吗?如果使用GCC应该可以做,其他编译器就困难了吧
    发表于 09-28 11:17

    边缘设备AI部署:编译器如何实现轻量化与高性能?

    、ASIC等)上高效执行的机器代码。AI编译器在AI模型的部署和优化扮演着关键角色,能够显著提升模型的运行效率和性能。   AI编译器的主要功能   AI编译器的主要功能包括模型优化
    的头像 发表于 07-06 05:49 6166次阅读

    RVCT编译器是否比GNU的编译器的代码执行速度更快?

    使用FX3S遇到了RVCT编译器的问题。 1、在SDK的release note中有支持RVCT的描述, 但是在EZ USB Suite的设置没有找到RVCT的选项, 请问支持的具体版本
    发表于 05-08 07:49

    什么样的代码会被编译器优化

    现在的编译器有多智能,可能你辛辛苦苦写的代码,在编译器看来就是几句废话,直接被删除掉。
    的头像 发表于 01-16 16:38 948次阅读

    EE-88:使用21xx编译器在C初始化变量

    电子发烧友网站提供《EE-88:使用21xx编译器在C初始化变量.pdf》资料免费下载
    发表于 01-13 15:54 0次下载
    EE-88:使用21xx<b class='flag-5'>编译器</b>在C<b class='flag-5'>中</b>初始化变量

    Triton编译器与GPU编程的结合应用

    Triton编译器简介 Triton编译器种针对并行计算优化的编译器,它能够自动将高级语言代码转换为针对特定硬件优化的低级代码。Triton编译
    的头像 发表于 12-25 09:13 1343次阅读

    Triton编译器如何提升编程效率

    在现代软件开发编译器扮演着至关重要的角色。它们不仅将高级语言代码转换为机器可执行的代码,还通过各种优化技术提升程序的性能。Triton 编译器作为种先进的
    的头像 发表于 12-25 09:12 1231次阅读

    Triton编译器在高性能计算的应用

    高性能计算(High-Performance Computing,HPC)是现代科学研究和工程计算不可或缺的部分。随着计算需求的不断增长,对计算资源的要求也越来越高。Triton编译器作为
    的头像 发表于 12-25 09:11 1613次阅读

    Triton编译器的优化技巧

    在现代计算环境编译器的性能对于软件的运行效率至关重要。Triton 编译器作为先进的编译器
    的头像 发表于 12-25 09:09 1920次阅读

    Triton编译器的优势与劣势分析

    Triton编译器作为种新兴的深度学习编译器,具有系列显著的优势,同时也存在些潜在的劣势。以下是对Triton
    的头像 发表于 12-25 09:07 1907次阅读

    Triton编译器在机器学习的应用

    1. Triton编译器概述 Triton编译器是NVIDIA Triton推理服务平台的部分,它负责将深度学习模型转换为优化的格式,以便在NVIDIA GPU上高效运行。Triton编译器
    的头像 发表于 12-24 18:13 1673次阅读

    Triton编译器的常见问题解决方案

    Triton编译器作为款专注于深度学习的高性能GPU编程工具,在使用过程可能会遇到些常见问题。以下是些常见问题的解决方案:
    的头像 发表于 12-24 18:04 6496次阅读

    Triton编译器支持的编程语言

    Triton编译器支持的编程语言主要包括以下几种: 、主要编程语言 Python :Triton编译器通过Python接口提供了对Triton语言和编译器的访问,使得用户可以在Pyt
    的头像 发表于 12-24 17:33 1503次阅读

    Triton编译器与其他编译器的比较

    Triton编译器与其他编译器的比较主要体现在以下几个方面: 、定位与目标 Triton编译器 : 定位:专注于深度学习中最核心、最耗时的张量运算的优化。 目标:提供
    的头像 发表于 12-24 17:25 1628次阅读

    Triton编译器功能介绍 Triton编译器使用教程

    Triton 是开源的编译器前端,它支持多种编程语言,包括 C、C++、Fortran 和 Ada。Triton 旨在提供可扩展和可
    的头像 发表于 12-24 17:23 2763次阅读