本地代码东山再起 C++死灰复燃

随着C++11标准的推出和谷歌、微软等公司对本地代码的支持增加,本地代码正在经历一次复兴。C++11引入的新特性使其更适合现代并行处理架构的开发。谷歌通过NaCl技术和Go语言展现了对本地代码的重视,而微软也在Visual Studio 2010中增加了对C++11特性的支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编程语言的发展趋势一波三折。起初最热门的语言是Java,后被Python取代了,随后Ruby突出重围抢占了市场风头,最终还是回到了JavaScript。不管你信不信,2011年的最终语言将会是C++。

上周,最新版本的ISO C++标准经过投票一致通过。这是C++语言13年来的首次重大修改,现正式称为C++11。新标准的修改引入了新的设计更容易对并行处理架构开发,包括并行计算的Lambda和新的数据类型。

C++并非真的被取代。与年代更久的同类语言C相比,C++对于系统编程和性能密集型的本地代码的应用程序来说仍是最热门的语言之一。

近年来,传统的系统编程语言已经慢慢淡出视野。现在越来越多的程序员转向远离本地代码编程的环境,如Java和.net。另一些程序员为了在Python,Ruby和JavaScript的语法上寻求快捷,宁可牺牲一些性能上的优势。

本地代码可能性不大,包括谷歌

谷歌是对本地代码一直情有独钟的少数公司之一。在谷歌憧憬的理想环境下,应用程序完全在浏览器里面运行;因此,谷歌开发了Chrome OS来证明自己的观点。

谷歌也曾承认过,有时候经过解释的JavaScript还不够。我在以前的文章中介绍过谷歌本地客户端(NaCl),这种沙境让Chrome浏览器可以下载和执行本地二进制代码,以便处理性能密集型操作。这绝非谷歌在闲暇之余的试验活动。上周,谷歌在Chrome的最新测试版中发布了新版本的NaCl,此技术第一次在默认情况下被启用。传闻称,谷歌悄然添加到最新版Chrome OS中的Netflix媒体流支持功能也依赖NaCl应用编程接口(API)。

NaCl也不是表明谷歌对本地代码的唯一认可。这家搜索巨头的Go编程语言之前就被广泛称为是“类似Java”,但这只说对了一部分。从语法上来讲,Go某些方面的确类似Java,但Go代码并不在虚拟机里面运行,而是直接编译成了本地代码。此外,谷歌甚至确保Go二进制代码不但可以在桌面上运行,还可以在谷歌应用程序引擎(Google App Engine)云计算环境里面运行。

很奇怪的是,这些举措使得谷歌与位于雷德蒙的竞争对手关系融洽和睦。作为世界上最大的桌面软件开发商,微软对待C++的态度一直比许多公司更友好。可是近些年来,本地C/C++开发人员觉得自己受到了一点冷落,因为微软把大部分精力投入到了C#,这是面向.NET平台的受控代码C衍生语言。

但这种情形似乎在发生变化。Visual Studio 2010已经支持C++11的大部分功能特性。今年7月,微软在其Channel 9开发人员网站上发布了一个新的视频系列,名为“Going Native”(使用本地代码),专门介绍本地代码方面的发展,特别强调C++。与此同时,目光敏锐的观察人士注意到了微软在9月召开的Build大会前夕居然没有.Net方面的宣传。Build大会之前名叫专业开发者大会(PDC)。

本地代码永不没落

早在Java时代之前就懂得编程的那些人自然完全明白为何人们重新对本地代码产生了兴趣。传统的软件开发方法有着悠久的传奇历史,经过充分优化的本地二进制代码仍是有可能从处理器获取最高性能的最佳方法。

话虽如此,本地代码也有其缺点。首先是我之前提到的安全问题。由于与C#和Java等受控语言相比,C和C++等语言让开发人员可以更接近底层硬件,所以要认真考虑的问题就多得多,缺乏经验的编程员可能会造成严重破坏。

移植性是另一个问题。对于处在Wintel环境下的Windows开发人员来说,编写可以在多种处理器架构上编译的代码从来不是个大问题,甚至在过去也是如此。然而换成了Unix环境,情况就不一样了。

现在,谷歌的NaCl环境重新带来了同样一些问题。Web开发人员习惯于自己开发的应用程序在任何基本上符合标准的浏览器中运行,但是NaCl模块与特定的处理器架构死死地绑在一起。想让同一个模块在x86、x64和ARM等处理器上都可以运行,你就得编译这三个不同的版本,然后把这三个版本都放到Web服务器上。对于长期习惯使用PHP和Perl的开发人员来说,这就需要一番适应。

但要牢记的最重要的问题是,为手头的任务选择合适的工具。谁也不想回到以前的糟糕年代:面对使用由C编写的CGI脚本的Web,为文本数据而纠结。另一方面,不管手头的任务是什么,把每一个应用程序硬塞进同样的解释语言或受控代码环境同样不是正确的方法。

现在的计算机异常尖端先进、用途异常广泛、性能异常强大。要充分利用它们的功能,开发人员就应该使用尽可能广泛的工具。本地代码的卷土重来往正确方向迈出了一大步。
好的,下面是一份简单的Java代码示例,实现了成语接龙游戏的娱乐模式功能。在这个示例中,我们使用了一个预定义的成语库,并使用Java Swing库构建了一个简单的GUI界面。 ```java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.Random; public class IdiomGame extends JFrame implements ActionListener { private static final String[] idioms = {"风和日丽", "东山再起", "半途而废", "大言不惭", "百年树人", "画蛇添足", "口是心非", "老牛舐犊", "人山人海", "十年树木,百年树人"}; private static final int MAX_ROUND = 10; private static final int MAX_HINT = 3; private JLabel infoLabel; private JLabel scoreLabel; private JTextField inputField; private JButton submitButton; private JButton hintButton; private Random random = new Random(); private int round = 0; private int score = 0; private String currentIdiom; private int hintCount = MAX_HINT; public static void main(String[] args) { new IdiomGame().setVisible(true); } public IdiomGame() { super("成语接龙游戏"); setSize(400, 200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new BorderLayout()); infoLabel = new JLabel(); scoreLabel = new JLabel("得分: " + score); inputField = new JTextField(); inputField.addActionListener(this); submitButton = new JButton("提交"); submitButton.addActionListener(this); hintButton = new JButton("提示(" + hintCount + ")"); hintButton.addActionListener(this); JPanel topPanel = new JPanel(new GridLayout(2, 1)); topPanel.add(infoLabel); topPanel.add(scoreLabel); JPanel bottomPanel = new JPanel(new GridLayout(1, 3)); bottomPanel.add(inputField); bottomPanel.add(submitButton); bottomPanel.add(hintButton); add(topPanel, BorderLayout.NORTH); add(bottomPanel, BorderLayout.SOUTH); startNewRound(); } private void startNewRound() { round++; infoLabel.setText("第" + round + "轮,请接:" + currentIdiom); inputField.setText(""); hintCount = MAX_HINT; hintButton.setText("提示(" + hintCount + ")"); currentIdiom = idioms[random.nextInt(idioms.length)]; } private void showHint() { hintCount--; hintButton.setText("提示(" + hintCount + ")"); if (hintCount == 0) { hintButton.setEnabled(false); } String hint = currentIdiom.substring(currentIdiom.length() - 1); inputField.setText(hint); inputField.requestFocus(); } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == submitButton || e.getSource() == inputField) { String input = inputField.getText().trim(); if (input.isEmpty()) { JOptionPane.showMessageDialog(this, "请输入成语!"); return; } if (input.charAt(0) != currentIdiom.charAt(currentIdiom.length() - 1)) { JOptionPane.showMessageDialog(this, "回答错误!"); startNewRound(); return; } score++; scoreLabel.setText("得分: " + score); if (round == MAX_ROUND) { JOptionPane.showMessageDialog(this, "游戏结束!得分:" + score); System.exit(0); } startNewRound(); } else if (e.getSource() == hintButton) { showHint(); } } } ``` 在这个示例中,我们使用了一个字符串数组来存储预定义的成语库。在构造函数中,我们创建了一个包含文本标签、得分标签、文本输入框和两个按钮的GUI界面。在每个回合中,程序会从成语库中随机选择一个成语,并将其作为当前成语,然后在信息标签中提示用户接下来该回答什么成语。用户可以通过文本输入框输入他们的答案,并通过“提交”按钮提交它。如果答案是正确的,程序将增加用户的得分,并开始下一轮。如果答案是错误的,程序将重新开始当前回合。如果用户需要提示,他们可以点击“提示”按钮,程序将显示当前成语的最后一个字符,并减少提示计数器的值。 请注意,这只是一个简单的示例,实现了成语接龙游戏的娱乐模式。如果你想要实现更复杂的功能,如挑战模式或更高级的提示系统,你需要编写更复杂的代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值