设为首页 加入收藏

TOP

C++ 能否成为你新的脚本语言?(一)
2015-07-16 12:56:07 来源: 作者: 【 】 浏览:9
Tags:能否 成为 脚本 语言

第一个我真正喜爱的编程语言是 C。我花了不少时间才找到它:当我还是一个孩子,我就开始在珍贵的ZX Spectrum上使用 Z80 汇编。那些日子是你能够真正掌握你的电脑的时候,你不需要苹果,谷歌,微软或者其他任何人的允许就能写一个程序。我在漂亮的128K ZX Spectrum +2上学习了在超出 CPU 寻址空间时对内存块分页。直到我进入大学,我才拥有一台 IBM PC 机 。我玩遍了电子表格,试图修复现存的 Fortran 程序,用土耳其字符给键盘驱动打补丁,还学了点 Pascal 语言。之后,在我就职于土耳其中央银行期间,我又学习了 SQL 和 APL


我一直对 C 语言有所耳闻,但我一直没有接触到一款C语言编译器。直到我到康奈尔大学拥有了一个Unix 账号之后,我编译了我人生中的第一个 hello.c 文件,不久之后,我有了第一台电脑……我在 DOS 分区上安装了 DJGPP 编译器,构建了我人生中第一个 Linux 内核(我第一个发行版是 Debian),并且开始学习 C 语言。Plauger 的 "Standard C Library"?是我最喜欢的书。


当我开始享受用 C 编程的时候,C++ 已经广泛应用超过十年了。所以,我下一步使用 C++ 看起来是很自然的一步了。


除了……好吧,除了 C++ 是一片混乱。那段时间,所有人都被继承层次深深吸引了,每个人都在编写精心设计的字符串类。大多数硬盘都太慢,不能再有限的时间内编译出可靠的 C++ 库(好吧,我有点夸张了),大部分 CPU 都在试图实例化模板中融化了,大部分人,那些假装 C++ 程序员的 C 程序员们,差点就把 malloc 的返回值给扔了。


在那时,我正忙于试图建立定制化的网络经济实验,看起来 Java 似乎很有优势。至少,它不需要麻烦地拼凑出一个对话框。产生少量的 socket 连接,并且使你的应用编译和运行在多种多样的系统上。当然,AWT Swing 都很丑陋且笨重,但对我的目的来说,那没关系。


但是,仅仅是因为不能在实验室之外运行我的实验(因为在实验室已经配置了所有电脑,java应用程序运行不会有问题)。所以我快速的把FreeBSD部署到了一台拥有100Mhz奔腾处理器,16Mb内存,在角落里收集灰尘的机器上,并搭建了一个拥有perl模块(mod_perl)的Apache服务器,然后就能工作了。那就是我爱上Perl的时候。


那份爱完全起源于实用的原因,我并不是认为Perl特别的完美,并且那时候我认为包括其他许多语言都不是很完美,他们中的每一个都有自己的瑕疵。


Perl总是能减少我必须解决的特别问题的工作的数量,有些是因为语言特性,但大部分是因为?CPAN


举例来说,作为一个 Perl 程序员,解析 HTML 作为 HTML 是一个解决方案。我必须决定,要么就构造整个树, 或者使用流化的方式。在某些情况下,前者是具有优势的,但后者的好处是可以使内存的需求降至最低,即使是在这个年代,如果你处理 HTML 文档以兆字节方式还是可以奏效的。不论哪种方式,这些工具都不会在无效的 HTML 上被卡住,并在非 XML 的有效 HTML 上运作良好。


还有,Perl 提供可移植性。如果我不需要操作系统特定的功能,不用任何修改地方,我的 perl 代码就可以运行。


?


当我写了一些类,并为它们做了封装,也不会有复杂的架构。


C++ 涅槃


在过去的数年,C++如获新生。许多聪明人已经开始意识到须要向C++程序员提供同时涵盖?work of the ISO committee?boost的构建模块。


在真实环境下,仍然有90%的菜鸟生成C++程序员就是没有意识到new是一个合法符号的C程序员。在这方面,C++与Perl非常相似:大部分人写过Perl代码的人也没有意识到Perl不是C、Java、Python、shell、Awk或者其他你可以列举的语言。


但是,当你看到新C++标准中的新东西,以及编译器不断实现浙西特性的新闻时,我们无法抑制住内心的兴奋和好奇。


单词计算练习


这是一个简单的练习,使用 C++ 或者 Perl 并且不依赖外部库,所以这是一个很好的起点。


这是 Perl 版本,供您参考:


#!/usr/bin/env perl
?
use strict;
use warnings;
?
run(\@ARGV);
?
sub run {
? ? my $argv = shift;
? ? my @counts;
?
? ? for my $file ( @$argv ) {
? ? ? ? my $count = -1;
? ? ? ? eva l {
? ? ? ? ? ? $count = word_count($file);
? ? ? ? ? ? 1;
? ? ? ? } or warn "$@";
?
? ? ? ? push @counts, {
? ? ? ? ? ? file => $file,
? ? ? ? ? ? word_count => $count,
? ? ? ? };
? ? }
?
? ? for my $result (@counts) {
? ? ? ? printf "%s: %d words\n", $result->{file}, $result->{word_count};
? ? }
}
?
sub word_count {
? ? my $file = shift;
? ? my %words;
?
? ? open my $fh, '<', $file
? ? ? ? or die "Cannot open '$file': $!";
?
? ? while (my $line = <$fh>) {
? ? ? ? my @words = split ' ', $line;
? ? ? ? $words{ $_ } += 1 for @words;
? ? }
?
? ? close $fh;
?
? ? my $word_count;
? ? $word_count += $_ for values %words;
? ? return $word_count;
}


而且,这是我最大的付出在转化 Perl 到现代风格的 C++ 上面。我没有尝试写特别搞笑的代码:只是和 Perl 一样,我把重点放在写代码上面,使得我感到非常自然,同时确保两个程序都做大致相同的事情。


#include
#include
#include
#include
#include
#include
#include
#include
#include
?
using std::accumulate;
using std::cerr;
using std::cout;
using std::endl;
using std::ifstream;
using std::make_pair;
using std::pair;
using std::strerror;
using std::string;
using std::unordered_map;
using std::vector;
?
int word_count(const char *const file) noexcept(false);
?
int main(int argc, char *argv[]) {
? ? vector< pair > counts {};
?
? ? for (auto i = 1; i < argc; i += 1) {
? ? ? ? try {
? ? ? ? ? ? counts.push_back(make_pair(argv[i], word_count(argv[i])));
? ? ? ? } catch (const string& e) {
? ? ? ? ? ? cerr << e << endl;
? ? ? ? ? ? counts.push_back(make_pair(argv[i], -1));
? ? ? ? }
? ? }
?
? ? for (auto& result : counts) {
? ? ? ? cout << result.first << ": " << result.second << " words" << endl;
? ? }
?
? ? return 0;
}
?
int
word_count(const char *const file) noexcept(false) {
? ? err

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇如何在Bash Shell脚本中显示对话框 下一篇Linux C语言Select函数使用求解释

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: