蚊章汇 - 编程
type: channel
link: https://linuxcn.bwsl.wang/tag/%E7%BC%96%E7%A8%8B/
items: 硬核观察 #1108 WordPress 公司提供百年域名注册选项
items: 硬核观察 #1022 这是我们所知的计算机编程的终结
items: 用 Emojicode 写一个可爱的程序
items: 用复古电脑程序 Toy CPU 学习低级编程
items: 硬核观察 #845 AlphaCode 在编程比赛中胜过了近一半的程序员
items: 不同编程语言是如何完成同一件事
items: 硬核观察 #536 AI 参加编程竞赛，成绩超过了一半的程序员
items: 2021 总结：学习新编程语言的 5 个小知识
items: 硬核观察 #507 新的插件可以防止从网上复制代码
items: 实例讲解代码之内存安全与效率

硬核观察 #1108 WordPress 公司提供百年域名注册选项
type: item
date: 2023-08-30T01:52:00+08:00
description: WordPress 公司提供百年域名注册选项WordPress 公司称，希望保存故事、照片、声音和视频等数字资产的家庭，或希望保护和记录公司历史的创始人可以使用该产品。该服务的费用为 3.8 万美元，也就是平均每年 380 美元。此方案还包括跨越多个地理区域的内容备份，带宽不受限制，以及 24/7 小时的技术支持。消息来源：Silicon Republic老王点评：这钱真白交，我不觉得 100 年后还会有现在的互联网。IBM 开发出新型模拟 AI 芯片，大幅降低能耗IBM 的研究团队近期发布了一款新型的模拟 AI 芯片设计，这种基于大脑模式的芯片设计，可以模拟人脑神经网络的工作方式，实现复杂的计算任务，同时保持高效的能源使用。其性能已经达到了 GPU 的级别，却只有同等级 GPU 1/14 的能耗。这种芯片芯片使用相变存储器（PCM），PCM 不是记录数字系统中的 0 或 1，而是非晶态和晶态之间的连续值，它可将神经网络的权重直接编码到物理芯片上。IBM 的原型芯片能编码 3500 万个 PCM 装置，单个芯片最多能支持 1700 万参数的模型。消息来源：IBM老王点评：模拟 AI 芯片以其更低的能耗和类似人脑的处理方式，未来有望在 AI 应用中扮演更重要的角色。Meta 发布了编程的大语言模型Meta 发布了 Code Llama，这是一种基于 Llama 2 的新型大型语言模型，旨在通过生成和调试代码来帮助程序员。它与 ChatGPT 和 GitHub Copilot 类似，你可以用对话要求它编写代码。Code Llama 可以用 Python、Java、C++、PHP、TypeScript、C#、Bash 脚本等多种编程语言进行编程。该模型有三个规模：7B、13B 和 43B，其中 7B 和 13B 模型速度更快，更适合需要低延迟的任务，如实时代码完成，并且可以在单个消费级 GPU 上运行。消息来源：Ars Technica老王点评：这样说，可以在程序员自己的笔记本上跑了？另外，我才知道 Llama 这个缩写原来也是一个英文单词，意思是美洲羊驼，你知道这种动物的。

硬核观察 #1022 这是我们所知的计算机编程的终结
type: item
date: 2023-06-05T02:30:00+08:00
description: 这是我们所知的计算机编程的终结纽约时报发表文章《这是我们所知的计算机编程的终结》谈到，虽然人工智能可能不会意味着编程的结束（世界仍然需要具有高级编码技能的人），但它可能标志着一种新的编程的开始 ——“一种不需要我们学习代码，而是将人类语言指令转变为软件的编程”。计算机编程从一种极客爱好变成了一种严肃职业，曾经很多人都教诲孩子们去学习编程，但编程一直在走向越来越简单的道路上。曾经焦虑孩子们不喜欢编程，与未来脱节，但现在，“等到他们找工作的时候，编码可能就像我的第一台电脑一样过时了。”消息来源：纽约时报老王点评：作为一个计算机专家，我也曾经希望我的孩子能喜欢编程，精通编程，但是似乎他除了喜欢游戏，并不喜欢编程。我也为此焦虑过，现在看起来大可不必，就像我并没有学会（或者说继承）我父亲精通的机电和电路一样，每个人都有自己的方向和需要掌握的技能。世界上最受欢迎的在线编程课向人工智能寻求帮助哈佛大学的 CS50 是一门计算机科学的入门课程，校内有数百名学生参加，网上有超过 4 万名学生参加。但即使有 100 多名现实生活中的教学助理，也很难与越来越多从不同时区登录的、具有不同知识和经验水平的学生充分接触。CS50 计划使用人工智能来评分作业、教授编码和个性化的学习提示。他们现在正在微调一个人工智能系统来标记学生的工作，并测试一个虚拟教学助理来评估和提供对学生编程的反馈。消息来源：MSN老王点评：结合上一条，既然人工智能可以干的更好，学生们何必再去学习普通的编程技能呢？红帽放弃维护 LibreOffice RPM 包红帽公司负责大部分桌面工作的显示系统团队多年来一直在 Fedora 中维护 LibreOffice 的 RPM 包。但现在他们将把更多精力投放到 Wayland、HDR 支持及工作站用户需要的一系列改进上，因此决定从未来的 RHEL 版本开始，停止把 LibreOffice 作为 RHEL 的一部分。但他们仍然会在目前支持的 RHEL 7/8/9 中维护 LibreOffice 相关的补丁。他们希望用户去使用 Flatpak 版的 LibreOffice。当然，他们也不反对任何社区用户接管这些 RPM 包的维护，并指出这是一个相当大的软件包和依赖关系块，需要大量的工作来维持。消息来源：LWN老王点评：作为红帽来说似乎这样的决策无可厚非，但是我怎么觉得这是红帽将用户推向 Flatpak 的一种潜意识行为呢？

用 Emojicode 写一个可爱的程序
type: item
date: 2023-04-07T22:12:00+08:00
description: 这种有趣的开源语言是学习编码真正的完美选择。在这篇文章中，我将介绍一个最好的编码语言，学习如何制作任何东西！它叫做 Emojicode，是由 Theo Belaire 在 2014 年创建的，它是一种开源的编程语言，使用 emoji 字符来表示其语法。当用 Emojicode 开发时，表情符被用来创建变量、函数和控制结构。因为它是一种静态类型的语言，变量类型必须在使用前声明，但它也支持类和继承等面向对象的概念。这种语言可以在每个操作系统上运行，它是一种超级有趣的编码方式，特别是当你是一个非英语母语的人时。这很有帮助，因为象形表示可以把我们大家聚集在一起，让我们以类似数学的方式说同样的语言。先决条件在本教程中，我使用的是基于 Debian 的操作系统。我的工具可能与你的操作系统的要求不同。以下是我所使用的工具：Geany，一个 Linux 下的开源 IDE。IBus，它允许你挑选表情符并把它们放在你的编辑器中。我使用的界面被称为 emoji picker。基于 Debian 的 Linux。一个 C++ 编译器。我使用的是 g++ 编译器。Emojicode我使用的是 Linux 操作系统，但你可以 阅读文档 了解在其他操作系统上使用它时可能需要采取的任何特殊步骤。在 Linux 上安装 Emojicode有几种方法可以在你的电脑上安装 Emojicode，但它们有一个很酷的 神奇的安装页面，可以告诉你具体该怎么做。下面是我的做法：$ wget https://github.com/emojicode/emojicode/releases/download/v1.0-beta.2/Emojicode-1.0-beta.2-Linux-x86_64.tar.gz -O emojicode.tar.gz \ && tar -xzf emojicode.tar.gz && rm emojicode.tar.gz \ && cd Emojicode-1.0-beta.2-Linux-x86_64 && ./install.sh \ && cd .. && rm -r Emojicode-1.0-beta.2-Linux-x86_64 Emojicode 的安装过程提供了有用的反馈。现在，你已经安装好了，是时候开始编写代码了！它是怎么运作的？首先，所有 Emojicode 文件的扩展名都以文件名 .? 结尾，但因为你不能在一般的文件名中这样做，所以它被翻译成 filename.emojic。这里是最重要的语法元素：把 ? 放在一行的开头，表示要执行哪些代码块用 ? 开始一个代码块用 ? 来结束一个代码块想打印什么吗？就用 ? ? <string> ? ❗还有很多其他的，所以这里有一些实际的例子。打印一首俳句首先，试着打印一首漂亮的俳句来玩玩吧! 在这个例子中，我将添加一行注释。看看你是否能识别它。?? ? This is a single line comment for fun ? ?Emojicode is great,? ❗ ? ?Fun and expressive code,? ❗ ? ?no sadness, just joy.? ❗ ? 现在我们需要保存我们的代码，并通过我们的编译器运行它，使之成为一个漂亮的可执行文件：$ emojicodec haiku.emojic $ ls haiku haiku.emojic haiku.o 正如你所看到的，代码已经被编译并生成了两个文件，其中一个是可执行的。运行 haiku 文件：$ ./haiku Emojicode is great, Fun and expressive code, no sadness, just joy. 数学和变量操作接下来，你要同时做几件事：一点点数学和变量的改变。首先，将一个变量赋值为 0：0 ➡️ ??x 你刚刚使用蜡笔（?）表情符、新建（?）表情符和变量名称创建了一个新变量，同时还将该变量赋值为 0。接下来，用磁铁（?）表情符打印一行包括该变量的内容：? ?The value is ?x? ? ❗ 接下来，使用加号（➕）和箭头（⬅️）表情符改变变量：x ⬅️➕ 1 然后打印另一行的值。如此这般，然后打印出最终的数值。如下：? ? ?Updating a variable using math 0 ➡️ ??x ? ?The value is ?x? ? ❗ x ⬅️➕ 1 ? ?The value is ?x? ? ❗ x ⬅️➕ 15 ? ?The value is ?x? ? ❗ x ⬅️➖ 9 ? ?The value is ?x? ? ❗ x ⬅️➗ 2 ? ?The final value is ?x? ? ❗ ? 接下来，用 emoj…

用复古电脑程序 Toy CPU 学习低级编程
type: item
date: 2023-01-21T03:00:00+08:00
description: 我写了一个名为 “Toy CPU” 的教育性复古计算机程序，以便我的学生能够学习机器语言。我兼职教授大学课程，包括一个对所有专业开放的一般计算机主题的课程。这是一门入门课程，向学生讲授技术是如何运作的，以消除围绕计算的神秘感。虽然不是计算机科学课程，但这门课的一个部分涉及计算机编程。我通常用非常抽象的术语谈论编程，所以不会让听众听不懂。但是今年，我想让我的学生以 “老派” 的方式做一些需要 “动手” 的编程。同时，我又想保持简单，以便让每个人都能跟上。我喜欢将我的课程结构化，以显示你是如何从 “那里” 到 “这里” 的。理想情况下，我会让我的学生学习如何编写一个简单的程序。然后，我将从这里开始，展示现代编程是如何让开发人员创建更复杂的程序的。我决定尝试一种非常规的方法 —— 教学生学习终极的低级别编程语言：机器语言。机器语言编程早期的个人电脑如 Apple II（1977 年）、TRS-80（1977 年）和 IBM PC（1981 年）让用户用键盘输入程序，并在屏幕上显示结果。但计算机并不总是带有屏幕和键盘。Altair 8800 和 IMSAI 8080（均为 1975 年制造）要求用户使用面板上的 “开关和灯” 输入程序。你可以用机器语言输入指令，使用一组开关，机器会点亮 LED 灯以代表每个二进制指令的 1 和 0。对这些早期机器进行编程，需要了解被称为 “ 操作码 opcode ” （操作代码的简称）的机器语言指令，以执行基本操作，如将两个数字相加或将一个值存储到计算机的存储器中。我想向我的学生展示程序员是如何通过开关和灯，手工输入一系列指令和内存地址的。然而，在这门课上，使用实际的 Altair 8800 就有点太复杂了。我需要一些简单的、任何初级水平的学生都能掌握的东西。理想情况下，我希望能找到一个简单的 “业余” 复古计算机，其工作原理与 Altair 8800 相似，但我无法找到一个价格低于 100 美元的合适的 “类似 Altair” 的设备。我找到了几个 “Altair” 软件模拟器，但它们忠实地再现了 Altair 8800 的操作码，这对我的需求来说太过沉重。我决定编写我自己的 “教育” 复古计算机。我称它为 “Toy CPU”。你可以在我的 GitHub 代码库 上找到它，包括几个可以运行的版本。第一版是一个实验性的原型，运行在 FreeDOS 上。第二版是一个更新的原型，在 Linux 上用 ncurses 运行。版本 3 是一个 FreeDOS 程序，在图形模式下运行。Toy CPU 的编程Toy CPU 是一个非常简单的复古计算机。它只有 256 字节的内存和一个最小化的指令集，其目的是在复制 “开关和灯” 编程模式的同时保持简单化。它的界面模仿 Altair 8800，有一系列 8 个 LED 灯，分别代表计数器（程序的 “行号”）、指令、累积器（用于临时数据的内部存储器）和状态。当你启动 Toy CPU 时，它通过清除内存来模拟 “启动”。当它启动时，它也会在屏幕右下方的状态灯中显示 “INI”（初始化）。“PWR”（电源）灯亮表示 Toy CPU 已被打开。当 Toy CPU 准备好让你进入一个程序时，它通过状态灯指示 “INP”（“输入”模式），并让你从程序的计数器 0 开始。Toy CPU 的程序总是从计数器 0 开始。在 “输入” 模式下，用上下方向键显示不同的程序计数器，按回车键编辑当前计数器上的指令。当你进入 “编辑” 模式时，Toy CPU 的状态灯上会显示 “EDT”（“编辑” 模式）。Toy CPU 有一张速查表，被 “贴” 在显示屏的前面。它列出了 Toy CPU 可以处理的不同操作码。00000000（STOP）：停止程序执行。00000001（RIGHT）：将累加器中的位向右移动一个位置。值 00000010 变成 00000001，00000001 变成 00000000。00000010（LEFT）：将累加器中的位向左移动一个位置。值 01000000 变成 10000000，10000000 变成 00000000。00001111（NOT）：对累加器进行二进制非操作。例如，值 10001000 变成 01110111。00010001（AND）：对累加器用存储在某一地址的值进行二进制与操作。该地址被存储在下一个计数器中。00010010（OR）：对累积器用存储在某一地址的值进行二进制或运算。00010011（XOR）：对累加器用存储在某一地址的值进行二进制异或运算。00010100（LOAD）：将一个地址的值加载（复制）到累加器中。00010101（STORE）： 存储（复制）累加器中的值到一个地址。00010110（ADD）：将存储在某一地址的数值加入到累…

硬核观察 #845 AlphaCode 在编程比赛中胜过了近一半的程序员
type: item
date: 2022-12-10T01:41:58+08:00
description: AlphaCode 在编程比赛中胜过了近一半的程序员DeepMind 在《科学》杂志发布文章说，在至少有 5000 人参加的在线编码比赛中，AlphaCode 的表现超过了 45.7% 的程序员。令人惊讶的是，研究人员将其产生的程序与训练数据库中的程序进行了比较，发现它并没有重复大段的代码或逻辑，而产生了一些新的代码。这让专家们注意到了递归式自我改进的软件的长期风险，这可能导致超级智能的人工智能接管世界。专家们希望尽早为人工智能编码领域建立护栏。消息来源：《科学》杂志老王点评：在科幻小说中，阿西莫夫创造性的提出了《机器人三定律》，而就目前的发展来看，可能要制定更具体的限制规则，让人工智能的递归式发展具有自限性。费米实验室和 CERN 选择 AlmaLinux在 2021 年底，CentOS 项目停止了 CentOS Linux 的更新，并以滚动版的 CentOS Stream 取代，重建了红帽的 Linux 开发和维护流程。很多使用 CentOS Linux 的企业转而使用其他的替代版本，如 AlmaLinux 和 Rocky Linux，以及国内的 AnolisOS 和 openEuler。著名的科学研究机构费米实验室和欧洲粒子物理研究所（CERN）发表联合声明，宣布将在其研究设施中采用 AlmaLinux。声明称，AlmaLinux 的优点包括：每个大版本支持寿命长，支持扩展架构，快速的发布周期，上游社区贡献，支持安全建议元数据，完美兼容红帽的企业版 Linux（RHEL）。消息来源：The Register老王点评：CentOS 当年的决定，带来的影响非常深远。美国 FBI 对苹果扩大端到端加密技术表示密切关注苹果公司昨天宣布，将在更多敏感类型的 iCloud 数据上采用端到端加密，这包括设备备份、信息、照片等，以满足用户和隐私团体的长期需求。这意味着只有受信任的设备才能解密和读取用户存储在 iCloud 中的数据。FBI 表示它“深切关注端到端加密和只允许用户访问的加密所带来的威胁”。它表示端到端加密使该机构更难开展工作，要求“通过设计进行合法访问”。消息来源：Mac Rumors老王点评：隐私和公众安全的边界确实存在冲突，至少值得讨论和博弈。

不同编程语言是如何完成同一件事
type: item
date: 2022-06-08T19:38:54+08:00
description: 通过一个简单的小游戏比较 13 种编程语言。当我开始学习一种新的编程语言时，会把重点放在定义变量、书写声明以及计算表达式，一旦对这些概念有一个大致的了解，通常就能够自己弄清剩下的部分。大多数编程语言都具有相似性，所以如果你掌握了一种编程语言，学习下一种语言的重点就是弄清楚独有的概念以及区分不同。我喜欢写一些测试程序来帮助练习新的编程语言。其中我经常写的是一个叫做“猜数字”的小游戏，计算机选出 1 到 100 里的任一数字，然后我来猜。程序循环进行，直到猜出正确数字。通过伪代码可以看出，这是个非常简单的程序：计算机在 1 到 100 之间选出一个随机数字循环进行直到猜出该随机数字计算机读取我的猜测告诉我我的猜测过高还是过低我们发表了一些文章，用不同的语言写这个程序。这是一个比较不同语言做同样事情的有趣机会。大多数编程语言具有相似性，所以当你在学习下一种新的编程语言时，主要是学习它的独特之处。C 语言由 Dennis Ritchie 于 1972 年在贝尔实验室创建，是一种早期的通用编程语言。C 语言非常受欢迎，并迅速成为 Unix 系统上的标准编程语言。正是因为它的流行，许多其他编程语言也采用了类似的编程语法。这就是为什么如果你已经知道如何使用 C 语言编程，学习 C++、Rust、Java、Groovy、JavaScript、awk 或 Lua 会更容易。接下来我们看看这些不同的编程语言是如何实现 “猜数字” 游戏的主要步骤。我将把重点放在基本元素的相似或不同，跳过一些外围代码，如分配临时变量。计算机在 1 到 100 之间选出一个随机数字你可以看到这里有许多相似之处。大多数编程语言使用类似 rand() 的函数，你可以设定一个范围来生成随机数。而其他一些语言使用一个特殊的函数来设定范围生成随机数。C：// Using the Linux `getrandom` system call getrandom(&randval, sizeof(int), GRND_NONBLOCK); number = randval % maxval + 1; // Using the standard C library number = rand() % 100 + 1; C++：int number = rand() % 100+1; Rust：let random = rng.gen_range(1..101); Java：private static final int NUMBER = r.nextInt(100) + 1; Groovy：int randomNumber = (new Random()).nextInt(100) + 1 JavaScript：const randomNumber = Math.floor(Math.random() * 100) + 1 awk：randomNumber = int(rand() * 100) + 1 Lua：number = math.random(1,100) 循环进行直到我猜出该随机数字循环通常是用控制流程来实现的，如 while 或 do-while。JavaScript 中的实现没有使用循环，而是 “实时 ”更新 HTML 页面，直到用户猜出正确的数字。Awk 虽然支持循环，但是通过循环读取输入信息是没有意义的，因为 Awk 是基于数据管道的，所以它从文件而不是直接从用户读取输入信息。C：do { … } while (guess != number); C++：do { … } while ( number != guess ); Rust：for line in std::io::stdin().lock().lines() { … break; } Java：while ( guess != NUMBER ) { … } Groovy：while ( … ) { … break; } Lua：while ( player.guess ~= number ) do … end 计算机读取我的猜测不同编程语言对输入的处理方式不同。例如，JavaScript 直接从 HTML 表单中读取数值，而 Awk 则从数据管道中读取数据。C：scanf("%d", &guess); C++：cin >> guess; Rust：let parsed = line.ok().as_deref().map(str::parse::<i64>); if let Some(Ok(guess)) = parsed { … } Java：guess = player.nextInt(); Groovy：response = reader.readLine() int guess = respo…

硬核观察 #536 AI 参加编程竞赛，成绩超过了一半的程序员
type: item
date: 2022-02-04T02:41:26+08:00
description: AI 参加编程竞赛，成绩超过了一半的程序员DeepMind 刚刚宣布了其最新打造的 AlphaCode 编程 AI。它参加了 Codeforces 的编程挑战，这是一个极具挑战性的编程平台，通过类似于国际象棋的 Elo 评级系统来分享每周问题和相关排名。最终 AlphaCode 针对 Codeforces 网站上 5000 名用户解决的十个挑战项目开展了测试，且拿下了平均名次位于前 54.3% 的成绩。DeepMind 估计该系统的 Codeforces Elo 为 1238，位居过去 6 个月在该网站上发起挑战的用户榜单的前 28% 。老王点评：看来至少有一半的程序员可以考虑改行了。树莓派操作系统发布 64 位版本虽然 2016 年发布的树莓派 3 及后来的产品已经带有 64 位 CPU，甚至树莓派 Zero 2 也具有 64 位功能，但官方提供的树莓派操作系统一直是 32 位的。不过，64 位的操作系统可以支持更多内存，较新的指令集也有性能优势，此外，一些基于 Arm 的商业/二进制分发软件只支持 AArch64，因此树莓派基金会决定提供 64 位的树莓派操作系统。老王点评：终于升级到 64 位了，虽然之前可以使用其他的 64 位操作系统。Oracle Linux 出现在 Windows 商店Oracle Linux 8.5 是 CentOS 8.5 的衍生发行版，以 WSL 的形式出现在 Windows 商店，这是红帽家族的发行版 首次 出现在 Windows 商店，尽管 Oracle Linux 不是红帽的。在 Windows 商店中，如果你搜索 Linux，你会发现 Ubuntu、SUSE/openSUSE、Debian、Kali、Alpine 等等，这都是为 WSL 开发的。但你不会看到 Fedora、CentOS、RHEL 之类的红帽系的 Linux，虽然有人为 WSL 中制作了 Fedora remix。老王点评：我就说 Oracle Linux 是叛徒，对吧。:D

2021 总结：学习新编程语言的 5 个小知识
type: item
date: 2022-01-14T23:10:38+08:00
description: 借助开源的力量，任何人都可以编程。找到一个你想做的项目，并让它成为你进入编程的第一个项目。任何人都可以开始学习编程。我们都是从某个起点开始的，而且你不需要有计算机科学背景就可以学习编程。这就是 Linux 和开源的力量：任何人都可以学习一点编程。如果你想学习一种新的编程语言，我们有几篇可以让你起步的很棒的文章。下面是我们最受欢迎的几篇文章，它们可以帮助到你。比较编程语言大多数编程语言都有某些相似之处。当你知道如何用一种编程语言做一件事，学习下一种编程语言主要是弄清其语法和结构。不同的编程语言如何做同样的事情学习一种新的编程语言的一个好方法是写一个简单的测试程序，如一个游戏，以探索该编程语言的工作原理。我经常写的一个示例程序是一个简单的“猜数字”游戏，即计算机在 1 到 100 之间挑选一个数字，让我猜出来。今年早些时候，我们发表了 一系列文章，探讨如何用几种编程语言编写猜数字游戏。了解这些不同的编程语言如何实现“猜数字”游戏的主要步骤。不同的编程语言如何读写数据Alan 的文章比较了不同的编程语言如何在相同的思想下 读写数据。无论这些数据是来自于配置文件还是用户创建的文件，在存储设备上处理数据对于编码者来说是很常见的。Alan 的比较文章提供了对几种流行的编程语言，如 C、Java、Groovy 和其他语言所采取的不同方法的深入了解。学习一种新的编程语言无论你是想学习一种新的编程语言，还是想探索一种现有的编程语言，请看看下面这些关于学习编程的好文章。如何用 WebAssembly 编写 “Hello World”WebAssembly 是一种字节码格式，几乎所有的浏览器都可以将其编译为主机系统的机器代码。与 JavaScript 和 WebGL 一起，WebAssembly 满足了将应用移植到网络浏览器中独立使用的需求。Stephan 解释了如何用 WASM-text 创建经典的 Hello World 程序。用 Golang 轻松实现交叉编译Gaurav 写了关于通过将脚本转换为 Go 程序来学习 Go 的交叉编译支持。你可以一次写好你的程序，并通过交叉编译为另一个环境进行编译。为什么我使用 D 编程语言来编写脚本D 编程语言由于其静态类型和元编程能力，常常被认为是一种系统编程语言。然而，它也是一种非常高效的脚本语言。Lawrence 写了关于如何利用 D 编程语言进行 普通的脚本编写。借助于开源的力量，编程可以被任何人所接受。找到一个你想做的项目，并让它成为你进入编程的第一个项目。via: https://opensource.com/article/22/1/learn-programming作者：Jim Hall 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

硬核观察 #507 新的插件可以防止从网上复制代码
type: item
date: 2022-01-06T04:28:33+08:00
description: 新的插件可以防止从网上复制代码JetBrains 发布了一个 AntiCopyPaster 开源插件，可以防止复制和粘贴代码。研究人员观察到，虽然“复制和粘贴构成了编写代码的一个重要部分”，但这样做会导致代码维护、安全问题和许可证问题。由于开发者倾向于抄袭，有很多重复的代码在四处飘荡。截至 2017 年，GitHub 上约有 70% 的代码 来自复制的文件。AntiCopyPaster 会监控 IDE 中的粘贴代码，并扫描目标文件中的 Java 方法以找出重复的内容。该插件在粘贴操作后会等待一段时间，以允许对复制的代码进行编辑。只有当克隆的代码没有被改变时，该插件才会继续检查粘贴的片段是否原样复制的代码。老王点评：看来以后 ICP 程序员难混咯。阿里巴巴为 Linux 内核调度器提出组平衡器概念越来越多的组织为了发展云计算等业务而配置他们的服务器在应用程序之间共享 CPU 核心/资源，而不是将某个 CPU 核心专门分配给单个应用程序/任务。阿里巴巴为 Linux 内核调度器提出一个新的“组平衡器”概念，以提升系统资源利用。这个平衡器的重点是在各组 CPU 核心之间平衡各组任务。这是一种缓解共享模式下冲突的方法，使组尽可能地排他，以获得性能和资源效率。在一台 128 核 CPU 服务器上的基准测试发现，与标准共享模式相比，Redis 在组平衡器模式下可以提升 2~10% 的性能。老王点评：现在越来越多的看到了中国开发者在内核前沿做出更深入的探索和研究。夸大其词的 CleanCache 补丁将在十年后从 Linux 内核中删除CleanCache 是由 Oracle 开发的，在推出时他们宣称它是“非常酷的东西，有巨大的潜力超级优化运行的虚拟机的性能，是相当多的研究和实验的结果。”它有可能在许多环境中以可忽略的成本大幅提高许多工作负载的页面缓存效率。十年后的今天，CleanCache 已经没有任何内核代码在使用它们了，因此，它很可能在 Linux 5.17 中 被主线移除。老王点评：这种新陈代谢挺好，要不 Linux 内核越来越臃肿了。

实例讲解代码之内存安全与效率
type: item
date: 2021-10-03T18:12:45+08:00
description: 了解有关内存安全和效率的更多信息。C 是一种高级语言，同时具有“ 接近金属 close-to-the-metal ”（LCTT 译注：即“接近人类思维方式”的反义词）的特性，这使得它有时看起来更像是一种可移植的汇编语言，而不像 Java 或 Python 这样的兄弟语言。内存管理作为上述特性之一，涵盖了正在执行的程序对内存的安全和高效使用。本文通过 C 语言代码示例，以及现代 C 语言编译器生成的汇编语言代码段，详细介绍了内存安全性和效率。尽管代码示例是用 C 语言编写的，但安全高效的内存管理指南对于 C++ 是同样适用的。这两种语言在很多细节上有所不同（例如，C++ 具有 C 所缺乏的面向对象特性和泛型），但在内存管理方面面临的挑战是一样的。执行中程序的内存概述对于正在执行的程序（又名 进程 process ），内存被划分为三个区域： 栈 stack 、 堆 heap 和 静态区 static area 。下文会给出每个区域的概述，以及完整的代码示例。作为通用 CPU 寄存器的替补，栈 为代码块（例如函数或循环体）中的局部变量提供暂存器存储。传递给函数的参数在此上下文中也视作局部变量。看一下下面这个简短的示例：void some_func(int a, int b) { int n; ... } 通过 a 和 b 传递的参数以及局部变量 n 的存储会在栈中，除非编译器可以找到通用寄存器。编译器倾向于优先将通用寄存器用作暂存器，因为 CPU 对这些寄存器的访问速度很快（一个时钟周期）。然而，这些寄存器在台式机、笔记本电脑和手持机器的标准架构上很少（大约 16 个）。在只有汇编语言程序员才能看到的实施层面，栈被组织为具有 push（插入）和 pop（删除）操作的 LIFO（后进先出）列表。 top 指针可以作为偏移的基地址；这样，除了 top 之外的栈位置也变得可访问了。例如，表达式 top+16 指向堆栈的 top 指针上方 16 个字节的位置，表达式 top-16 指向 top 指针下方 16 个字节的位置。因此，可以通过 top 指针访问实现了暂存器存储的栈的位置。在标准的 ARM 或 Intel 架构中，栈从高内存地址增长到低内存地址；因此，减小某进程的 top 就是增大其栈规模。使用栈结构就意味着轻松高效地使用内存。编译器（而非程序员）会编写管理栈的代码，管理过程通过分配和释放所需的暂存器存储来实现；程序员声明函数参数和局部变量，将实现过程交给编译器。此外，完全相同的栈存储可以在连续的函数调用和代码块（如循环）中重复使用。精心设计的模块化代码会将栈存储作为暂存器的首选内存选项，同时优化编译器要尽可能使用通用寄存器而不是栈。堆 提供的存储是通过程序员代码显式分配的，堆分配的语法因语言而异。在 C 中，成功调用库函数 malloc（或其变体 calloc 等）会分配指定数量的字节（在 C++ 和 Java 等语言中，new 运算符具有相同的用途）。编程语言在如何释放堆分配的存储方面有着巨大的差异：在 Java、Go、Lisp 和 Python 等语言中，程序员不会显式释放动态分配的堆存储。例如，下面这个 Java 语句为一个字符串分配了堆存储，并将这个堆存储的地址存储在变量 greeting 中：String greeting = new String("Hello, world!"); Java 有一个垃圾回收器，它是一个运行时实用程序，如果进程无法再访问自己分配的堆存储，回收器可以使其自动释放。因此，Java 堆释放是通过垃圾收集器自动进行的。在上面的示例中，垃圾收集器将在变量 greeting 超出作用域后，释放字符串的堆存储。Rust 编译器会编写堆释放代码。这是 Rust 在不依赖垃圾回收器的情况下，使堆释放实现自动化的开创性努力，但这也会带来运行时复杂性和开销。向 Rust 的努力致敬！在 C（和 C++）中，堆释放是程序员的任务。程序员调用 malloc 分配堆存储，然后负责相应地调用库函数 free 来释放该存储空间（在 C++ 中，new 运算符分配堆存储，而 delete 和 delete[] 运算符释放此类存储）。下面是一个 C 语言代码示例：char* greeting = malloc(14); /* 14 heap bytes */ strcpy(greeting, "Hello, world!"); /* copy greeting into bytes */ puts(greeting); /* print greeting */ free(greeting); /* free malloced bytes */ C 语言避免了垃圾回收器的成本和复杂性，但也不过是让程序员承担了堆释放的任务。…