登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> CLQ工作室开源代码 >> 主题: qt delphi devc++ raylib zig 一天晚上无聊引发的地震     [回主站]     [分站链接]
标题
qt delphi devc++ raylib zig 一天晚上无聊引发的地震
clq
浏览(515) + 2022-09-10 22:30:16 发表 编辑

关键字:

[2022-09-23 21:01:03 最后更新]
qt delphi devc++ raylib dig 一天晚上无聊引发的地震

一天晚上,因为无聊,想干脆在游戏机(我的游戏机是 win10,工作机是 ubuntu 22.04) 装下 qt 练下手吧。装好 qt 后想起了我曾经心爱的 delphi ,心想去看看吧,不太记得了,也有可能是搜索 qt 下载地址的时候搜索引擎告诉我 delphi 也很能跨平台吧。
总之我去 ebr 官网看望了一下最新的 delphi ,好吧似乎是某篇文章提到的 rad 社区版的下载地址我就去看了。发现 dev c++ 居然也在这里发行了!觉得异常吃惊,怎么没听说 dev c++ 被 delphi 官方招安了啊。百度才知道原来 dev c++ 已经发展出了三五分支。看着 eb 新做的界面很好看实在是想下载一个来用用。不过天色已晚就没进行,不料以下内容中发现

----------------------------------------------------------------
https://baike.baidu.com/item/Dev-C++/4461658

历史发展
编辑
播报
原开发公司 Bloodshed 在2011年发布了 v4.9.9.2 后停止开发 [1] 。
后来,独立开发者 Orwelldevcpp 继续更新开发,2016年发布了最终版本 v5.11之后停止更新 [2] 。
2020年后出现了几个分支版本:
1、国内开发者小龙软件(XiaoLoong)(原名斑竹软件(Banzhusoft))于2020年着手继续开发。版本号:5.12 -> 5.13 -> 5.14 -> 5.15(2020年9月)->5.16(2021年11月) [3] 。
小龙Dev-C++ 5.16工作界面
小龙Dev-C++ 5.16工作界面
此分支版本对工具栏界面上进行了现代化的改进,调整了工具栏按钮布局,并且添加了一些与编程密切相关的新功能,例如:插入空白main程序,保存文件时自动调用AStyle对源程序进行排版格式,编译出错信息自动翻译为中文等。
2、国内开发者 royqh1979 开发的版本小熊猫Dev-C++ (原名Dev C++ 2020)。版本号:5.12 -> 5.13 -> 6.0 -> 6.1 -> 6.2 -> 6.3 -> 6.5(2021年2月) [4] 。
此分支版本在原5.11版本的基础上进行了大量的修正和改进,包括:完善的C/C++代码补全提示、更强的语法高亮、自动语法检查、C++14/17语法支持、完善的调试功能、支持使用正则表达式进行搜索、高分辨率显示支持等,在功能上与VS Code接近,但是安装和配置使用更加方便。
Royqh Dev-C++ 2020 工作界面
Royqh Dev-C++ 2020 工作界面
3、国外开发者 FMXExpress 等人在 Embarcadero 公司支持下继续开发的 Embarcadero Dev-C++。版本号:5.12 -> 5.50 -> 6.0(2020年10月) [5] 。
此分支版本进行了大量的微小修正和改进。启始界面增加了一些新功能,添加了多个界面主题,增加了多种字体,而且主图标更改为红色。
Embarcadero Dev-C++ 启始界面
Embarcadero Dev-C++ 启始界面
4、由 Colin Laplace 等人维护的wxDev-C++,主要特点是扩展了 Dev-C++ 的功能,添加了对 wxWidgets 控件的支持,可以在Dev-C++ 中开发程序时创键对话框和框架等控件,用于开发可视化图形程序。这一项目的目标是为了给 wxWidgets 社区提供一个自由的、开源的商业级集成开发环境。 [6] 最终版本是 2011年发布的 v7.4.2 (已停止更新)

----------------------------------------------------------------
软件开发的大家伙们是真能折腾啊,原来几年不见搞了这么多东东出来。
我忘记了为什么第二天去下载了 小熊猫Dev-C++ ,而且意外发现作者作为一名大学老师在改进过程中发现 d7 已经不能更好的支持 devc++ 已经另外开发了 qt 的版本,直接改叫 小熊猫 C++ 了。
无聊之下看了下它出于教学目的选择了几个好玩的第三方库。大多数都是我没听说过了小巧的库。意外发现其中的
https://royqh1979.gitee.io/redpandacpp/docsy/docs/libraries/raylib/
很符合我一直想找的一个小型 3d 库。

----------------------------------------------------------------
raylib 官网为
https://www.raylib.com/

发现它居然连 golang 和 lua 环境都有了!
https://github.com/raysan5/raylib/blob/master/BINDINGS.md

并且下载时又意外它自带了一个叫 dig 的开发环境,我意识到这个叫 zig 的东西肯定不简单,否则不可能让它和 MinGW 这样的工具相提并论。

https://raysan5.itch.io/raylib/purchase?popup=1

raylib 4.2 Windows Installer (with MinGW compiler) (73 MB)
raylib 4.2 Windows Installer (with TCC compiler)
raylib 4.2 Windows Installer (with Zig compiler) (70 MB)

raylib 真是我见过的开源项目中周边做得最好的项目,我觉得它的周边产品部分收费的做法一定能让它发展提非常好!也很值得大家借鉴。

更不得了的是,我怎么觉得 zig 就是我一直要找的语言啊!可以完全当一个 c 语言编译器用,据说 uber 用它来编译 c 语言。
https://www.zhihu.com/question/527159053/answer/2519002837

我打算再研究研究。如果它真的是可以自己分配管理内存的 golang ... 那我就要叛变了。叛变的人不只我一个
https://www.bilibili.com/read/cv15733463/

----------------------------------------------------------------
一些可能出现的问题的回答:

Q1:为什么不用你最喜欢的Rust

A1:在下曾用Rust写过一部分,但会涉及大量的unsafe和lifetime,导致写起来比c语言原版的代码量还更多,而且过程中翻车的次数较多,翻着翻着就不知道该如何讲解了

Q2:Zig这么冷门,学了有什么用?

A2:在下一不是培训班的账号,二不是追逐流量的营销号,就当博客写的,唯一的希望是自己能越写越好,没有必要非得教学热门技术,再说热门技术有的是人教,随便看看就能学会了(在下vue和react就是油管上随便翻了几天就入门了,热门技术从来不缺教程,各位学不会的单纯是因为懒)

A2‘:关于用途,其实还是挺多的,zig的语言设计者(也是zig这个项目的主要负责人),曾在直播中使用zig完成了lua在浏览器的运行,该项目在GitHub上可以找得到,此乃其一,在下还见到过使用zig开发游戏的大佬(不是那种用于学习编程的小游戏项目,链接:https://github.com/michal-z/zig-gamedev ,该项目最近加入了intro,感兴趣的可以跟着intro学习,期待各位未来能助力国产三A)

Q3:新手也可以学吗?

A3:在下最近经常看到一个人的视频,标题是Rust入门,然后项目要么是虚拟cpu,要么是操作系统内核,故而在下觉得编译原理自然也不在话下,所以各位也可以认为在下这个系列叫Zig入门——implement a modern compiler

Q4:什么水平啊就敢讲编译原理

A4:在下旨在与所有看到文章的人共同学习,水平什么的真的不高,如果遇见大佬,在下自会虚心请教,但毕竟是根据虎书,至少专业性还是有保证的

Q5:会有视频教学吗?

A5:在下有着一种看到镜头就会精神失常的病(虽然是开玩笑,但在下确实害怕镜头),打开麦就说不出话(除非是打dota,很奇怪为什么打dota的时候不会),什么时候在下能克服这些再说吧

Q6:为什么不更新xxx(关于其他语言的专栏的读者)?

A6:所有文集均随缘更新,主要根据在下打开专栏投稿时最想写的是什么决定

在下不卖课,没有交流群,所有想分享的内容均会发布与此(或开源于开源平台)

欢迎各位大佬对在下文章中的错误和纰漏进行指正,也希望能收到对于教学质量的反馈(方便在下提升写博客的能力) 作者:pathologyenigma https://www.bilibili.com/read/cv15733463/ 出处:bilibili
----------------------------------------------------------------
最后是 小熊猫C++ 的官方下载地址,我觉得非常值得向大家推荐
https://royqh1979.gitee.io/redpandacpp/
https://royqh1979.gitee.io/redpandacpp/download/

它没官方下载,我们稍后给出个高速下载地址吧。不过似乎没看到直接可用的 ubuntu 版本。过段问问它作者看看。

----------------------------------------------------------------
----------------------------------------------------------------
"Zig 的完整语法可以被 500 行的 PEG 语法的文件所描述。" -- 强

https://github.com/ziglang/zig/issues/7505
Debugging zig in VSCode on windows #7505

https://ziglang.org/zh/learn/tools/#vs-code
语言服务器

语言服务器是与编辑器无关的工具,用于获取语法突出显示,自动完成和许多其他功能。推荐在语法高亮扩展的基础上使用语言服务器以获得更丰富的开发体验。

zigtools/zls
https://zhuanlan.zhihu.com/p/459281215
https://zigcc.github.io/monthly/202207/
https://liujiacai.net/blog/2022/07/16/zig-intro/
现代化 C 使用体验
https://liujiacai.net/blog/2022/04/30/modern-c/


clq
2022-09-10 22:30:28 发表 编辑

好了,最后还是回到 raylib 上来

https://zhuanlan.zhihu.com/p/458335134

raylib绘图库简介
瞿华

系列文章目录
raylib与小熊猫C++
raylib简介
raylib与OpenGL
raylib示例
系列文章目录

    raylib绘图库简介raylib 2d动画/游戏教程(1)动画基本原理raylib 2d动画/游戏教程(2)坐标系与颜色系统raylib 2d动画/游戏教程(3)图像文件与图层raylib 2d动画/游戏教程(4)raylib-drawing库raylib 2d动画/游戏教程(5)键盘与鼠标输入raylib 2d动画/游戏教程(6)游戏手柄输入raylib 2d动画/游戏教程(7)音乐和音效raylib绘制中文内容使用raygui绘制控件raylib 3d绘图基础教程(1)坐标系和摄像机raylib 3d绘图基础教程(2)网格(Mesh)raylib 3d绘图基础教程(3)几何变换raylib 3d绘图基础教程(4)3d模型的载入与绘制

raylib与小熊猫C++

为了让更多的学生体会编程的乐趣,小熊猫C++(原名小熊猫Dev-C++ 7)在发行版自带的编译器中集成了ege(2d动画游戏库)和libturtle(海龟作图库),可以编写简单的2d游戏程序,但它们仅能在windows下使用;在3d编程方面,小熊猫C++集成了freeglut和GLFW库,以便学生学习OpenGL,但这些3d库的使用比较繁琐,不太适合没有系统学习OpenGL的学生直接上手。

因此,从0.13.2版本开始,小熊猫C++在发行版自带的编译器中直接集成了跨平台的游戏库raylib 4.0,可用它编写各类2d和3d动画和游戏程序。
raylib简介

raylib是一个以简单易用为目标的跨平台游戏绘图库,它的特点包括:

    免费开源(基于类似于BSD的zlib授权协议)跨平台支持:Windows, Linux, MacOS, RPI, Android, HTML5等全部用C语言实现简单易用使用OpenGL硬件加速(1.1, 2.1, 3.3, 4.3 or ES 2.0)支持多种字体(XNA SpriteFonts, BMfonts, TTF, SDF)支持多种材质格式,包括压缩材质(DXT, ETC, ASTC)全面支持3D,包括Shapes,Models,Billboards, Heightmaps等材质系统支持包括经典贴图和PBR贴图支持动画3d模型(Animated 3d models)支持多种着色器,包括模型着色器(Model shaders)和后处理着色器(Postprocessing shaders)提供数学模块,支持矢量、矩阵和四元数(Quaternion)运算支持多种音乐格式的载入和流媒体播放(WAV, OGG, MP3, FLAC, XM, MOD)提供50多种编程语言的绑定

在raylib网站上提供了一些资源,包括:

    raylib函数列表raylib示例raylib游戏示例

raylib与OpenGL

raylib缺省使用OpenGL 3.3。如果电脑上缺少OpenGL驱动,或者不支持OpenGL 3.3,则运行小熊猫C++自带的raylib时会报错:

GLFW error: 65543 Description : WGL:OpenGL profile requested but WGL_ARB_create_context_profile is unavailable.

对于显卡驱动最高只支持OpenGL2.1的用户,可以到百度网盘(提取码:b5vz)下载笔者编译的基于OpenGL 2.1的raylib,解压替换32位小熊猫C++自带的GCC编译器中的对应文件即可。
raylib示例

下面这个程序绘制了一个旋转的立方体(其实是摄像机在围绕立方体旋转):

#include <raylib.h>
#include <math.h>

int main(void)
{
    // 初始化
    const int screenWidth = 640;
    const int screenHeight = 480;
    
    //启用反锯齿
    SetConfigFlags(FLAG_MSAA_4X_HINT);
    
    //初始化窗口
    InitWindow(screenWidth, screenHeight, "Sample");
    
    // 初始化摄像机
    Camera3D camera = { 0 };
    camera.position = (Vector3){ 40.0f, 20.0f, 0.0f }; //相机所在位置{x,y,z}
    camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; //相机朝向位置{x,y,z}
    camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; //相机正上方朝向矢量
    camera.fovy = 70.0f; //相机视野宽度
    camera.projection = CAMERA_PERSPECTIVE; //采用透视投影
    
    //设置动画帧率(刷新率,fps)为30帧/秒
    SetTargetFPS(30);
    //--------------------------------------------------------------------------------------
    int angle=0; //多边形旋转角度

    // 主游戏循环
    while (!WindowShouldClose())    //关闭窗口或者按ESC键时返回true
    {
        
        double time = GetTime();
        // 每次循环更新一帧
        // 摄像机围绕y轴转动
        double cameraTime = time*0.3;
        camera.position.x = (float)cos(cameraTime)*40.0f;
        camera.position.z = (float)sin(cameraTime)*40.0f;
        
        BeginDrawing();
        
        ClearBackground(WHITE);
            //以摄像机视角绘制3d内容
            BeginMode3D(camera);
                DrawCube(Vector3{0,0,0},10,10,10,VIOLET);
                DrawCubeWires(Vector3{0,0,0},10,10,10,BLACK);
            EndMode3D();
        EndDrawing();
    }
    
    //关闭窗口
    CloseWindow();
    
    return 0;
}

旋转的立方体

对于初学者来说,只要了解了OpenGL的3维坐标系,以及摄像机投影的各项基本参数,很快就可以用raylib编写3d动画程序啦。








clq
2022-09-10 23:12:51 发表 编辑

下面是个惊心动魄的故事
http://news.sohu.com/a/558729681_355140
原文应该是
https://kristoff.it/blog/zig-new-relationship-llvm/


连1.0版本都没有,Uber为什么会采用这样一项新技术?
2022-06-19 10:15

作者 | Motiejus Jakštys

译者 | 平川

策划 | 罗燕珊

本文最初发布于 Motiejus Jakštys 的个人博客。

免责声明:我在 Uber 工作,我的一部分职责是将 zig cc引入公司。但这篇文章是我的观点,与 Uber 无关。

我日前在 Zig 的一场交流会上作了题为“Uber 引入 Zig”的 演讲。本文从技术和社交两方面简单介绍了“Uber 是如何使用 Zig 的”,而主要的篇幅是介绍“我把 Zig 带到 Uber 的经验”。

本文要点:

Uber 使用 Zig 来编译其 C/C++ 代码。 现在,Uber 只在 Go Monorepo 中使用 bazel-zig-cc,但计划尽可能地将 zig cc 推广到其他需要 C/C++ 工具链的语言。
与其他工具链相比,zig-cc 提供的 C/C++ 工具链的主要优势是: glibc 版本可配制与 macOS 交叉编译。
Uber 没有任何使用 zig-the-language 的计划。
Uber 与 Zig 软件基金会(ZSF)签署了一份支持协议,以优先修复我们提交的 Bug。 ZSF 的财务报告有披露了合同额。
感谢我的团队、Go Monorepo 团队、Go 平台团队、我的主管、财务、法律,当然还有 Zig 软件基金会,是他们让这种关系成为现实。 到目前为止,这种关系已经带来了丰硕的成果。

Uber 技术栈简介

Uber 于 2010 年创立,已拥有超过 150 亿次的出行记录,为此,他们实现了很多很酷的创新技术。Go 和 Java 是通用服务器端语言,Python 和 Node 应用于特定的情况(如 Node 用于前端,Python 用于数据分析 /ML)。C++ 被用于一些底层的库。在后端代码中使用其他语言的情况很少。

我们的 Go Monorepo 比 Linux 内核还要大,有几千名工程师在开发和维护。总而言之,很大。

Uber 是如何使用 Zig 的?

Abhinav Gupta 是我们的来自 Go 平台团队的同事,其实他描述得比我好:我理解我们只是在使用 Zig 的 C 工具链,而不是将其作为语言使用。Zig 支持基于 C 的代码的交叉编译,能减少对系统 C 编译器的依赖。

Uber 技术栈发展历程

2018 年之前,Uber 的 Go 服务都有单独的存储库。2018 年,我们开始将这些服务大规模地迁移到 Go Monorepo。我的团队参与了第一波迁移——我仍然记得那有多复杂。

2019:寻求一个封闭式的工具链

当时,Go Monorepo 已经使用了一个封闭式的 Go 工具链。因此,用于构建 Go Monorepo 的 Go 编译器不会受系统上安装的编译器影响(如果有的话)。因此,无论在哪个环境下构建,都会使用相同版本的 Go。Bazel 文档对此做了很好的解释。

创建于 2019 年,没有太多变动。

C++ 工具链是一个编译 C/C++ 代码的程序集。不可避免地,我们的一些 Go 代码要使用 CGo,所以它需要一个 C/C++ 编译器。然后,CGo 将 Go 和 C 部分链接成最终的可执行文件。

从 Go Monorepo 创建伊始,C++ 工具链就不是封闭式的:Bazel 会使用它在系统上发现的任何东西。也就是说,在 macOS 上使用 Clang,在 Linux 上使用 GCC(无论什么版本)。在 Bazel 中创建一个封闭式的 C++ 工具链是一项很大的工作(对于我们的 Go Monorepo 来说,需要花费数月时间),没有迫切的需求,也没有足够的痛苦,我们还无法接受做这样一件事。

现在,我们看下非封闭式 C++ 工具链的局限性:

不能交叉编译。 所以,如果需要 CGo 的话(我们的许多服务都需要),我们就无法在 Mac 上编译生成 Linux 上的可执行文件。 这可以通过...... 而不是交叉编译来解决。
CGo 的可执行文件将链接到系统上发现的 glibc 版本。 也就是说,在升级操作系统时(数月的努力),构建机群必须最后升级。 否则,如果构建主机上 glibc 的版本比生产主机上的新,那么生成的二进制文件将链接到较新的 glibc 版本,就会与生产主机上的旧版本不兼容。
我们无法使用新的编译器,即使它提供了更好的优化功能,因为我们在构建机群上运行的是旧版本的操作系统(只向后迁移编译器,而不迁移 glibc,本身就有风险)。
Go 的新版本的官方二进制文件在构建时使用的 GCC 版本,比我们的一些构建机器上的新。 在这些机器上,我们不得不通过从源代码编译 Go 来解决这个问题。 所有这些问题都很令人恼火,但不足以让我们在工具链上进行投资。

2020 年 12 月:需要 musl

我在做一个与 Uber 无关的小项目。该项目是用 Bazel 构建的,并使用了 CGo。我希望我的二进制文件是静态的,但 Bazel 并没有让这个过程变得简单。我花了几个晚上基于 musl.cc 创建了一个 Bazel 工具链,但没走多远,因为当时我无法深入理解 Bazel 的工具链文档,而且也没有找到一个好的示例可以参照。

2021 年 1 月:发现 zig cc

2021 年 1 月,我发现了 Andrew Kelley 的博文“ zigcc:一个功能强大的 GCC/Clang 替代品”。我推荐你读一下这篇文章;它改变了我对编译器的看法(也有助于你更好地理解本文接下来的内容,因为我是讲给 Zig 追随者听的)。综观 Andrew 的文章, zig cc有以下优势:

完全封闭的 C/C++ 编译器,压缩包只有大约 40MB。 这比 Clang 的标准发行版要小一个数量级。
可以链接到通过命令行参数提供的 glibc 版本(例如, -target x86_64-linux-gnu.2.28 将以 x86_64 Linux 为编译目标并链接到 glibc 2.28)。
主机和目标平台是解耦的。不管是什么主机,针对目标平台 linux-aarch64 和 darwin-x86_64 的设置都是一样的。
与 musl 链接“只是一个不同的 libc 版本”: -target x86_64-linux-musl 。 我开始摆弄 zig cc 。 我随便编译了一些程序,报告了一些问题。 我想过把它做成一个 bazel 工具链,但有很多拦路的 bug 或缺失的功能。 其中之一就是缺少 Bazel 所依赖的 zig ar 。

2021 年 2 月:请求关注

我 向 Zig 报告了 Bug。一个星期都没有动静。我每月捐 50 美元,希望“Zig 的人”能优先处理我所报告的问题。接着又是一个星期的沉默。然后我在 #zig:libera.chat中扔了一枚炸弹:

< motiejus> 捐赠后,有什么规约可以用来“申请”开发时间吗? < andrewrk> ZSF 只接受不附带任何条款的捐赠。 < andrewrk> 你是从哪里获得了不同的印象吗?

当时,我希望无论谁注意到这段对话都立即忘掉它。好吧,一年多以后,我又把这段话写在这里,看着玩吧。

2021 年 6 月:bazel-zig-cc 和 Uber 的 Go Monorepo

2021 年 6 月,Adam Bouhenguel 创建了一个可以工作的 bazel-zig-cc 原型。基本功能没问题,但仍然缺少一些特性。后来,Andrew 实现了 zig ar,这是一个真正可用的 bazel-zig-cc 所缺少的最后一块拼图。我集成了 zig ar,完善了文档,并 在 Zig 邮件列表中宣布了我创建的 bazel-zig-cc 分叉。至此,它对我的小项目是有效的。

在公告发布几周后,我为 Uber 的 Go Monorepo 创建了一个“WIP DIFF”:只是按照我的上线说明,天真地将其提交到我们的 CI。几乎所有的测试它都没有通过。

将 bazel-zig-cc 加入 Uber 的 Go Monorepo。

大部分失败都是由系统库依赖导致的。关于这一点,很明显,要想真正搭载 bazel-zig-cc 并编译所有的 C/C++ 代码,需要巨大的投入来消除对系统库的依赖,并偿还大量的技术债务。

2021 年底:回顾

Uber 有很多地方可以从一个封闭式的 C++ 交叉编译器中受益,但由于需要大量的投资,再加上没有足够的理由,所以没有获得资助。

bazel-zig-cc 有点用,但 bazel-zig-cc 和 zig cc 已知都存在 Bug。

我无法实现必要的修改或 Bug 修复。所以,我试图实现zig ar,LLVM ar的一个小前端,但失败了。

如果确定一个问题是 Zig 的问题,那么我们就无法预知它什么时候能引起 Zig 开发者的关注。有些问题几天内就得到了解决,有些则花了 6 个多月的时间,而捐款并不会改变zig cc的优先级。

Monorepo 上线差异(monorepo-onboarding diff)正在酝酿之中,等待时机。

2021 年底:Uber 需要交叉编译

我的任务是为 Uber 评估 arm64。撇开评估细节不说,我需要为 linux-arm64 编译软件。大量的软件!由于我们大部分的底层基础设施都在 Go Monorepo 中,我首先需要一个交叉编译器。

我终于有了一个实现交叉编译器的商业理由。现在,时间和金钱都可以投入了。“WIP DIFF”搭配 zig cc是一个良好的开始,但距离终点还很远:团队不相信这是正确的事情,DIFF 更多的是一个原型。而且,要让 zig-cc 和 bazel-zig-cc 在任何情况下都可以使用,还有很多工作要做。

在一个大公司里引进这样的技术时,最重要的是风险管理。由于 Zig 是一项新技术(甚至连 1.0 都没有!),建议用它来编译我们所有的 C 和 C++ 代码很不寻常。我们应该做好至少十年内都使用它的计划。人们提了一些问题,并针对这些问题做了认真仔细的评估。为此,我真心感谢 Go Monorepo 团队,特别是 Ken Micklas,为这个未经证实的原型做了大量的工作和研究。

评估不同的编译器

我们需要一个交叉编译器,摆在我们面前的选项有两个:

grailbio/bazel-toolchain: 使用普通的 Clang。 没有风险。 容易理解。 显然,这是一个安全、恰当的解决方案。
~motiejus/bazel-zig-cc:使用 zig cc 。有问题,有风险,不安全,不确定,没有人使用,但却是一个相当诱人的解决方案。与 bazel-toolchain 相比, zig cc 额外提供了以下特性:
可配置的 glibc 版本。使用 grailbio ,就需要 sysroot(本质上是一个带有系统库的 chroot,因此,程序可以与之链接),而这需要维护。
a working, albeit still buggy, hermetic (cross-)compiler for macOS. 一个存在缺陷,但可以工作的封闭式 macOS(交叉)编译器。使用这两种方法中的任何一种处理 glibc 都没问题,然而, grailbio 似乎不大可能编译到 macOS 上,更不用说交叉编译了。依赖开发者笔记本电脑上的系统编译器是不可取的,Go 平台团队亲身感受到了这一点,尤其是在 macOS 升级期间。

对于以 macOS 为目标封闭式工具链,选择的天平偏向了 zig cc,连同它所有的缺陷、风险和不稳定性。

还有一个问题需要注意:我们知道,如果我们在重要的地方使用 Zig,会遇到问题,但又可能不具备解决这些问题的专业知识。作为一家大公司,我们该如何降低采用风险,确保严重的 Bug 及时得到处理?我们确信,ZSF 的出发点是好的:显然,如果我们发现并报告一个合理的 Bug,它就会得到修复。但是,怎么才能设定一个等待时间的上限呢?

金钱

50 美元的捐款无济于事,也许一份大的服务合同会有帮助?我四处打听,是否可以通过花些钱来降低“交叉编译器”的风险。获得管理层同意大约需要 10 分钟;起草、审批和签署合同大约需要 2 个月。

合同条款大致如下:

Uber 将问题报告到 github.com/ziglang/zig,并通知 Loris。
Loris 将其分配给 ZSF 的某人。
解决问题。
完成后,Loris 输入解决这个问题花费的时间。 Uber 有权占用 ZSF 成员的时间。 我们对 Zig 没有任何决定权或投票权。 我们有权提出建议,但这些建议将和来自其他第三方的建议等量齐观。 我们不能要求特殊权利,这在合同中有明确规定,我们也不希望那样。

合同签署了,电汇完成了,在 2022 年 1 月:

我们与 ZSF 签订了服务合同,他们承诺优先处理我们提交的问题。
Go 平台团队承诺为我们的 C++ 工具链实现交叉编译和封闭。

合同金额是公开的,因为 ZSF 是非营利的。

2022 年及以后

2022 年 2 月,该工具链通过一个命令行标志( --config=hermetic-cc)做了限定。自此,你可以在 Uber 的 Go Monorepo 中调用 zig cc了,不需要自定义补丁。

证明我们的提交队列登录了我的 WIP DIFF。

2022 年截至目前的时间线:

今年 4 月,我在米兰演讲期间,我们向生产环境交付了第一个用 zigc-cc 编译的 Debian 软件包。
今年 5 月,我们在所有的 Debian 软件包中启用了 zig cc 。
下半年,我们希望用 zig c c 编译所有的 cgo 代码,并将 --config= hermatic -cc 作为默认设置。
下半年,我们希望将 bazel- zigc -cc 移到 github.com/uber 下。 我们已经向 Zig 提交了一些问题,截至发稿时,所有的问题都已解决。 有些是由 ZSF 单独处理的,有些则涉及面比较广,需要 ZSF、Uber 和 Go 开发者之间合作。

小 结

我开始准备演讲,希望能给出一个大公司如何采用 Zig 的“运行手册”。然而,其实并没有什么“运行手册”;我为采用 zig-cc 所做的努力本可能会因为很多很多原因而失败。

回顾过去,我觉得要想获得成功,最重要的是在适当的时候有一个杀手锏特性。在我们的例子中,有两个:无需 sysroot 的 glibc 版本选择和交叉编译到 macOS。

原文链接:

https://jakstys.lt/2022/how-uber-uses-zig/

clq
2022-09-10 23:18:19 发表 编辑

https://zhuanlan.zhihu.com/p/445815874

嵌入式编程zig篇(一)为什么是zig
yalight
yalight

东北大学秦皇岛分校 教师

最近看了一篇文章,题目是:“为什么我要用Zig重写我的Rust键盘固件:一致性、掌控性和有趣”,原文是“Why I rewrote my Rust keyboard firmware in Zig: consistency, mastery, and fun”(见参考文献1)。键盘固件是采用单片机控制的电路,属于嵌入式系统,而嵌入式系统硬件的资源通常是有限的,包括内存和cpu。这就对用于嵌入式编程的编程语言提出了占用资源少,可靠性高,运行性能好,延迟小,实时性好的要求,同时还应具有简单易学易用的特点。

作者在文中写道:我最初是用Rust编写这个固件的,但尽管有多年使用该语言的经验,我仍然遇到了一些困难。我最终完成了我的键盘,但这花了很长时间,而且一点都不好玩。在我的朋友Jamie Brandon的反复建议下,我用Zig重新编写了固件,结果很令人高兴~...事实上,这一体验进行得非常顺利,以至于我现在觉得我会转向Zig(我使用了12个小时的语言,Rust是我使用了至少1000个小时的语言)。

为什么是zig呢?让我们来看一下zig编程语言是如何展示给我们的:

小巧而简洁的语言

专注于调试你的应用程序,而不是调试你的编程语言知识。

Zig 的完整语法可以被 500 行的 PEG 语法的文件所描述。

没有隐式控制流,没有隐式内存分配,没有预处理器,也没有宏。

隐式控制流的例子:

D 有 @property 函数,可以让你的方法调用看起来像是成员访问,因此在上面的例子中,c.d 可能会调用一个函数。

C++,D 和 Rust 有运算符重载,因此 + 可能会调用一个函数。

C++,D 和 Go 可以抛出和捕获异常,因此 foo() 可能会抛出一个异常,并且将会阻止 bar() 被调用。

Zig 将所有的控制流完全用语言关键字和函数调用来表达,以此促进代码的维护性和可读性。

手动内存管理

用 Zig 编写的库可以在任何地方使用:

桌面程序和游戏

低延迟服务器

操作系统内核

嵌入式设备

实时软件,例如现场表演,飞机,心脏起搏器

在浏览器或者其他使用 WebAssembly 作为插件的程序

通过 C ABI 给其他语言调用

为了达到这个目的,Zig 程序员必须管理自己的内存,必须处理内存分配失败。

Zig 标准库也是如此。任何需要分配内存的函数都会接受一个分配器参数。因此,Zig 标准库甚至可以用于裸金属(freestanding)的目标。

对错误处理的全新诠释

Zig 还提供了defer和errdefer,使所有的资源管理——不仅仅是内存——变得简单且易于验证。

zig没有隐式的内存分配,主要指的是堆上的内存分配。Zig 程序员必须管理自己的内存,必须处理内存分配失败。隐式的内存分配和释放是由编译器实现的,编程者并不清楚何时分配内存,何时释放内存,可能会出现内存耗尽的情况。zig程序员对程序的行为了如指掌,能完全掌控程序的运行,合理分配和利用内存资源。

性能和安全:全都要

zig有四种构建目标:

Debug,ReleaseSafe,ReleaseFast,ReleaseSmall

ReleaseSafe模式在运行期启用安全检查,ReleaseFast优化运行速度,ReleaseSmall优化代码的大小。

Zig 比 C 快

参考实现使用 LLVM 作为后端进行最先进的优化。

其他项目所谓的“链接时优化”,在 Zig 是自动达成的。

多亏了对交叉编译的一流支持,对于原生构建目标,高级 CPU 特性可以被启用(相当于 -march=native)。

精心选择的未定义行为。例如,在 Zig 中,有符号和无符号整数在溢出时都属于未定义的行为,而在 C 中仅有有符号整数的溢出属于未定义行为,这有助于实现 C 语言里没有的优化。

Zig 直接暴露了SIMD 向量类型,使得编写跨平台的向量化代码更容易。

编译期反射和编译期代码执行

Zig 还可以在编译期对函数和代码块求值。在某些情况下,比如全局变量初始化,表达式会在编译期隐式地进行求值。除此之外我们还可以使用 comptime 关键字显式地在编译期求值。把它与断言相结合就可以变得尤为强大了

无需 FFI/bindings 的 C 库集成

@cImport 可以为 Zig 直接导入类型,变量,函数和简单的宏。它甚至能将 C 内联函数翻译成 Zig 函数。

zig 也是 C 编译器

Zig 不只是可以用来编译 C 代码,同时还有很好的理由使用 Zig 作为 C 编译器:zig 与 libc 一起发布。

导出函数、变量和类型供 C 代码使用

Zig 的一个主要用例是用 C ABI 导出一个库,供其他编程语言调用。在函数、变量和类型前面的 export 关键字会使它们成为库 API 的一部分:

mathtest.zig
export fn add(a: i32, b: i32) i32 {
return a + b;
}

生成静态库:

$ zig build-lib mathtest.zig

生成动态库:

$ zig build-lib mathtest.zig -dynamic

交叉编译的一流支持

使用异步函数进行并发

Zig 从0.5.0 引入了异步函数(async)。该功能不依赖于宿主操作系统,甚至不依赖于堆分配的内存。这意味着异步函数可以用于裸金属(freestanding)目标。

Zig 自动推导函数是否为异步,并允许在非异步函数上进行 async/await,这意味着 Zig 库对阻塞与异步 I/O 是不可知的。Zig 避免了函数染色(function colors)。

Zig 标准库实现了一个事件循环,将异步函数复用到线程池上,实现 M:N 并发。多线程安全和竞争检测是尚在积极研究的领域。

支持广泛的目标

Zig 使用“支持等级”系统来描述不同目标的支持程度。需要注意的是,一级支持的门槛很高——二级支持还是相当有用的。

小 结:

zig具有裸机编程,或称为裸金属编程的功能,显式的手动内存分配和回收,完备的错误处理机制,编译期反射和编译期代码执行的特性,交叉编译的一流支持,支持异步和并发,与c代码的无缝集成,语言小巧简洁。目前已经有在stm32单片机上成功实现编程和运行的案例,是值得学习和应用的嵌入式系统编程语言。


参考文献

Kevin Lynagh:Why I rewrote my Rust keyboard firmware in Zig: consistency, mastery, and fun. https://kevinlynagh.com/rust-zig/zig语言官网 Home ⚡ Zig Programming Language

编辑于 2021-12-16 13:56
嵌入式开发
写下你的评论...

3 条评论
默认
时间
刘知远
刘知远
嵌入式的人确实更喜欢zig[飙泪笑]
01-22
林染
林染

为什么呀?
07-21
rust
rust
不如直接用C
08-21


总数:3 页次:1/1 首页 尾页  
总数:3 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1