标签 编程 下的文章

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 这个缩写原来也是一个英文单词,意思是美洲羊驼,你知道这种动物的。

这是我们所知的计算机编程的终结

纽约时报发表文章《这是我们所知的计算机编程的终结》谈到,虽然人工智能可能不会意味着编程的结束(世界仍然需要具有高级编码技能的人),但它可能标志着一种新的编程的开始 ——“一种不需要我们学习代码,而是将人类语言指令转变为软件的编程”。计算机编程从一种极客爱好变成了一种严肃职业,曾经很多人都教诲孩子们去学习编程,但编程一直在走向越来越简单的道路上。曾经焦虑孩子们不喜欢编程,与未来脱节,但现在,“等到他们找工作的时候,编码可能就像我的第一台电脑一样过时了。”

消息来源:纽约时报
老王点评:作为一个计算机专家,我也曾经希望我的孩子能喜欢编程,精通编程,但是似乎他除了喜欢游戏,并不喜欢编程。我也为此焦虑过,现在看起来大可不必,就像我并没有学会(或者说继承)我父亲精通的机电和电路一样,每个人都有自己的方向和需要掌握的技能。

世界上最受欢迎的在线编程课向人工智能寻求帮助

哈佛大学的 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,是由 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 的安装过程提供了有用的反馈。

The emojicode installation procedure provides useful feedback along the way.

现在,你已经安装好了,是时候开始编写代码了!

它是怎么运作的?

首先,所有 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? ? ❗
?

接下来,用 emojicodec 编译代码,然后用你的可执行代码来看看结果:

$ emojicodec math.emojic 
$ ./math 
The value is 0 
The value is 1 
The value is 16 
The value is 7 
The final value is 3

如你所见,作为变量打印出来的所有内容都已使用新数学进行了更新。你可以用许多数学表情符来进一步操作。下面是一些更多的运算符:

? is your modulo
◀ Less than
▶ Greater than
◀? less than or equal to
▶? greater than or equal to

Emojicode 的怪癖

当我在文档中来回查看时,我发现了一些有趣的怪癖。其中之一是,当从用户那里抓取输入时,由于一些已知的编译器问题,耳朵的肤色很重要。

获取用户输入的动作是这样的:

??▶️??❗️

获取和分配用户输入的操作是这样的:

??▶️??❗️ ➡️ inputText

我试图让它工作,我的编译器出现了一些问题,我发现了这个问题。你也可能会在这里和那里遇到一些小问题。如果你遇到了,请创建一个 议题,这样它就有可能被修复。

没有技巧,只有很棒的代码

虽然我可以介绍更多内容,但我可以向你保证,这段令人惊叹的代码背后的文档非常丰富。尽管我写这篇文章只是为了赶上愚人节的乐趣,但我不得不承认这是有史以来最好的语言之一,因为它教会了你很多非常真实的编程概念。我恳切地建议把它作为一种有趣的方式来教你的一些朋友、孩子,或者是对编码感兴趣的同学。希望你度过了一个充满乐趣的愚人节!


via: https://opensource.com/article/23/4/emojicode

作者:Jessica Cherry 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

我写了一个名为 “Toy CPU” 的教育性复古计算机程序,以便我的学生能够学习机器语言。

我兼职教授大学课程,包括一个对所有专业开放的一般计算机主题的课程。这是一门入门课程,向学生讲授技术是如何运作的,以消除围绕计算的神秘感。

虽然不是计算机科学课程,但这门课的一个部分涉及计算机编程。我通常用非常抽象的术语谈论编程,所以不会让听众听不懂。但是今年,我想让我的学生以 “老派” 的方式做一些需要 “动手” 的编程。同时,我又想保持简单,以便让每个人都能跟上。

我喜欢将我的课程结构化,以显示你是如何从 “那里” 到 “这里” 的。理想情况下,我会让我的学生学习如何编写一个简单的程序。然后,我将从这里开始,展示现代编程是如何让开发人员创建更复杂的程序的。我决定尝试一种非常规的方法 —— 教学生学习终极的低级别编程语言:机器语言。

机器语言编程

早期的个人电脑如 Apple II(1977 年)、TRS-80(1977 年)和 IBM PC(1981 年)让用户用键盘输入程序,并在屏幕上显示结果。但计算机并不总是带有屏幕和键盘。

Altair 8800 和 IMSAI 8080(均为 1975 年制造)要求用户使用面板上的 “开关和灯” 输入程序。你可以用机器语言输入指令,使用一组开关,机器会点亮 LED 灯以代表每个二进制指令的 1 和 0。

Altair 8800 计算机的图片

对这些早期机器进行编程,需要了解被称为 “ 操作码 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 的启动屏幕

当 Toy CPU 准备好让你进入一个程序时,它通过状态灯指示 “INP”(“输入”模式),并让你从程序的计数器 0 开始。Toy CPU 的程序总是从计数器 0 开始。

在 “输入” 模式下,用上下方向键显示不同的程序计数器,按回车键编辑当前计数器上的指令。当你进入 “编辑” 模式时,Toy CPU 的状态灯上会显示 “EDT”(“编辑” 模式)。

Toy CPU 编辑屏幕

Toy CPU 有一张速查表,被 “贴” 在显示屏的前面。它列出了 Toy CPU 可以处理的不同操作码。

  • 00000000STOP):停止程序执行。
  • 00000001RIGHT):将累加器中的位向右移动一个位置。值 00000010 变成 0000000100000001 变成 00000000
  • 00000010LEFT):将累加器中的位向左移动一个位置。值 01000000 变成 1000000010000000 变成 00000000
  • 00001111NOT):对累加器进行二进制非操作。例如,值 10001000 变成 01110111
  • 00010001AND):对累加器用存储在某一地址的值进行二进制与操作。该地址被存储在下一个计数器中。
  • 00010010OR):对累积器用存储在某一地址的值进行二进制或运算。
  • 00010011XOR):对累加器用存储在某一地址的值进行二进制异或运算。
  • 00010100LOAD):将一个地址的值加载(复制)到累加器中。
  • 00010101STORE): 存储(复制)累加器中的值到一个地址。
  • 00010110ADD):将存储在某一地址的数值加入到累加器中。
  • 00010111SUB):从累积器中减去储存在某一地址的数值。
  • 00011000GOTO):转到(跳到)一个计数器地址。
  • 00011001IFZERO):如果累加器为零,转到(跳到)一个计数器地址。
  • 10000000NOP):空操作,可以安全地忽略。

当处于 “编辑” 模式时,使用左右方向键选择操作码中的一个位,然后按空格键在关闭(0)和开启(1)之间翻转数值。当你完成编辑后,按回车键回到 “输入” 模式。

Toy CPU 输入模式屏幕

一个示例程序

我想通过输入一个简短的程序来探索 Toy CPU,将两个数值相加,并将结果存储在 Toy CPU 的内存中。实际上,这执行的是算术运算 A+B=C。要创建这个程序,你只需要几个操作码:

  • 00010100LOAD
  • 00010110ADD
  • 00010101STORE
  • 00000000STOP

LOADADDSTORE 指令需要一个内存地址,这个地址总是在下一个计数器的位置。例如,程序的前两条指令是:

计数器 0:00010100
计数器 1:某个内存地址,第一个值 A 存放在那里

计数器 0 中的指令是 LOAD 操作,计数器 1 中的值是你存储某个值的内存地址。这两条指令一起将内存中的数值复制到 Toy CPU 的累加器中,在那里你可以对该数值进行操作。

将一个数字 A 装入累加器后,你需要将数值 B 加到它上面。你可以用这两条指令来做:

计数器 2:00010110
计数器 3:存储第二个值 B 的内存地址

假设你把值 1A)装入累加器,然后把值 3B)加到它上面。现在累加器的值是 4。现在你需要用这两条指令把数值 4 复制到另一个内存地址(C):

计数器 4:00010101
计数器 5:一个内存地址(C),我们可以在那里保存新的值

把这两个值加在一起后,现在可以用这条指令结束程序:

计数器 6: 00000000

计数器 6 之后的任何指令都可以供程序作为存储内存使用。这意味着你可以用计数器 7 的内存来储存值 A,计数器 8 的内存来储存值 B ,计数器 9 的内存来储存值 C。你需要将这些分别输入到 Toy CPU 中:

计数器 7:00000001(1)
计数器 8:00000011(3)
计数器 9:00000000(0,以后会被覆盖)

在弄清了所有指令和 ABC 的内存位置后,现在可以将完整的程序输入到 Toy CPU 中。这个程序将数值 1 和 3 相加,得到 4:

计数器 0:00010100
计数器 1:00000111(7)
计数器 2:00010110
计数器 3:00001000(8)
计数器 4:00010101
计数器 5:00001001(9)
计数器 6:00000000
计数器 7:00000001(1)
计数器 8:00000011(3)
计数器 9:00000000(0,以后会被覆盖)

要运行程序,在 “输入” 模式下按下 R 键。Toy CPU 将在状态灯中显示 “RUN”(“运行” 模式),并从计数器 0 开始执行你的程序。

Toy CPU 有一个明显的延迟,所以你可以看到它执行程序中的每一步。随着程序的进行,你应该看到计数器从 00000000(0)移动到 00000110(6)。在计数器 1 之后,程序从内存位置 7 加载数值 1,累积器更新为 00000001(1)。在计数器 3 之后,程序将加数值 3,并更新累加器显示 00000100(4)。累加器将保持这种状态,直到程序在计数器 5 之后将数值存入内存位置 9,然后在计数器 6 结束。

在运行模式下的 Toy CPU

探索机器语言编程

你可以使用 Toy CPU 来创建其他程序,并进一步探索机器语言编程。通过用机器语言编写这些程序来测试你的创造力。

一个在累积器上闪灯的程序

你能点亮累加器上的右四位,然后是左四位,然后是所有的位吗?你可以用两种方法之一来写这个程序。

一种直接的方法是,从不同的内存地址加载三个数值,像这样:

计数器 0:LOAD
计数器 1:“右边”
计数器 2:LOAD
计数器 3:“左边”
计数器 4:LOAD
计数器 5:“所有”
计数器 6:STOP
计数器 7:00001111(“右边”)
计数器 8:11110000(“左边”)
计数器 9:11111111(“全部”)

写这个程序的另一种方法是尝试使用 NOTOR 二进制操作。这样可以得到一个更小的程序:

计数器 0:LOAD
计数器 1:“右边”
计数器 2:NOT
计数器 3:OR
计数器 4:“右边”
计数器 5:STOP
计数器 6:00001111(“右边”)

从一个数字开始倒数

你可以把 Toy CPU 作为一个倒数计时器。这个程序行使 IFZERO 测试,只有当累加器为零时,程序才会跳转到一个新的计数器:

计数器 0:LOAD
计数器 1:“初始值”
计数器 2:IFZERO(这也是倒计时的“开始”)
计数器 3:“结束”
计数器 4:SUB
计数器 5:“1”
计数器 6:GOTO
计数器 7:“开始”
计数器 8:STOP
计数器 9:00000111(“初始值”)
计数器 10:00000001(“1”)

Toy CPU 是学习机器语言的一个好方法。我在入门课程中使用了 Toy CPU,学生们说他们发现写第一个程序很困难,但写下一个程序就容易多了。学生们还表示,用这种方式编写程序其实很有趣,他们学到了很多关于计算机实际工作的知识。Toy CPU 既具有教育性,也很有趣味性!


via: https://opensource.com/article/23/1/learn-machine-language-retro-computer

作者:Jim Hall 选题:lkxed 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

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
老王点评:隐私和公众安全的边界确实存在冲突,至少值得讨论和博弈。

通过一个简单的小游戏比较 13 种编程语言。

 title=

当我开始学习一种新的编程语言时,会把重点放在定义变量、书写声明以及计算表达式,一旦对这些概念有一个大致的了解,通常就能够自己弄清剩下的部分。大多数编程语言都具有相似性,所以如果你掌握了一种编程语言,学习下一种语言的重点就是弄清楚独有的概念以及区分不同。

我喜欢写一些测试程序来帮助练习新的编程语言。其中我经常写的是一个叫做“猜数字”的小游戏,计算机选出 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)

循环进行直到我猜出该随机数字

循环通常是用控制流程来实现的,如 whiledo-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 = response as Integer

JavaScript:

let myGuess = guess.value

Awk:

guess = int($0)

Lua:

player.answer = io.read()
player.guess = tonumber(player.answer)

告诉我猜测过高还是过低

在这些类 C 语言中,通常是通过 if 语句进行比较的。每种编程语言打印输出的方式有一些变化,但打印语句在每个样本中都是可识别的。

C:

if (guess < number) {
    puts("Too low");
}
else if (guess > number) {
    puts("Too high");
}
…
puts("That's right!");

C++:

if ( guess > number) { cout << "Too high.\n" << endl; }
else if ( guess < number ) { cout << "Too low.\n" << endl; }
else {
    cout << "That's right!\n" << endl;
    exit(0);
}

Rust:

_ if guess < random => println!("Too low"),
_ if guess > random => println!("Too high"),
_ => {
    println!("That's right");
    break;
}

Java:

if ( guess > NUMBER ) {
    System.out.println("Too high");
} else if ( guess < NUMBER ) {
    System.out.println("Too low");
} else {
    System.out.println("That's right!");
    System.exit(0);
}

Groovy:

if (guess < randomNumber)
    print 'too low, try again: '
else if (guess > randomNumber)
    print 'too high, try again: '
else {
    println "that's right"
    break
}

JavaScript:

if (myGuess === randomNumber) {
    feedback.textContent = "You got it right!"
} else if (myGuess > randomNumber) {
    feedback.textContent = "Your guess was " + myGuess + ". That's too high. Try Again!"
} else if (myGuess < randomNumber) {
    feedback.textContent = "Your guess was " + myGuess + ". That's too low. Try Again!"
}

Awk:

if (guess < randomNumber) {
    printf "too low, try again:"
} else if (guess > randomNumber) {
    printf "too high, try again:"
} else {
    printf "that's right\n"
    exit
}

Lua:

if ( player.guess > number ) then
    print("Too high")
elseif ( player.guess < number) then
    print("Too low")
else
    print("That's right!")
    os.exit()
end

非类 C 编程语言会怎么样呢?

非类 C 编程语言会有很大的不同,需要学习特定的语法来完成每一步。Racket 源于 Lisp 和 Scheme,所以它使用 Lisp 的前缀符和大量括号。Python 使用空格而不是括号来表示循环之类的块。Elixir 是一种函数式编程语言,有自己的语法。Bash 是基于 Unix 系统中的 Bourne shell,它本身借鉴了 Algol68,并支持额外的速记符,如 && 作为 and 的变体。Fortran 是在使用打孔卡片输入代码的时期创建的,所以它依赖于一些重要列的 80 列布局。

我将通过比较 if 语句,举例表现这些编程语言的不同。if 判断一个值是否小于或大于另一个值,并向用户打印适当信息。

Racket:

(cond [(> number guess) (displayln "Too low") (inquire-user number)]
    [(< number guess) (displayln "Too high") (inquire-user number)]
    [else (displayln "Correct!")]))

Python:

if guess < random:
    print("Too low")
elif guess > random:
    print("Too high")
else:
    print("That's right!")

Elixir:

cond do
    guess < num ->
        IO.puts "Too low!"
        guess_loop(num)
    guess > num ->
        IO.puts "Too high!"
        guess_loop(num)
    true ->
        IO.puts "That's right!"
end

Bash:

[ "0$guess" -lt $number ] && echo "Too low"
[ "0$guess" -gt $number ] && echo "Too high" 

Fortran:

IF (GUESS.LT.NUMBER) THEN
    PRINT *, 'TOO LOW'
ELSE IF (GUESS.GT.NUMBER) THEN
    PRINT *, 'TOO HIGH'
ENDIF 

更多

当你在学习一种新的编程语言时 “猜数字” 游戏是一个很友好的入门程序,通过一种简单的方式练习了几个常见的编程概念。通过不同编程语言实现这个简单游戏,你可以理解一些核心概念和每种语言的细节。

学习如何用 C 和类 C 语言编写 “猜数字” 游戏:

其他语言:


via: https://opensource.com/article/21/4/compare-programming-languages

作者:Jim Hall 选题:lujun9972 译者:VeryZZJ 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出