关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » C/C++ »C++ 能否成为你新的脚本语言?

    C++ 能否成为你新的脚本语言?

    2015-05-30 00:00:00 出处:alaclp的专栏
    分享

    一些背景

    第一个我真正喜爱的编程语言是 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;
            eval {
                $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 <cerrno>
    #include <cstdio>
    #include <cstdlib>
    #include <fstream>
    #include <iostream>
    #include <numeric>
    #include <unordered_map>
    #include <string>
    #include <vector>
    
    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<string, int> > 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) {
        errno = 0;
        ifstream fp(file);
        {
            // Does fp.fail() preserve errno 
            int save_errno = errno;
            if (fp.fail()) {
                throw("Cannot open '" + string(file) + "': " + strerror(save_errno));
            }
        }
    
        unordered_map<string, int> word_count {};
        string word;
    
        while (fp >> word) {
            word_count[word] += 1;
        }
    
        fp.close();
    
        return accumulate(
            word_count.cbegin(),
            word_count.cend(),
            0,
            [](int sum, auto& el) { return sum += el.second; }
        );
    }

    20 行代码用于 #include 和 using 声明可能看起来有点多,但是我抬眼 using namespace std,也讨厌不断地输入 std::… 更多的是因为我喜欢较短的代码行。

    首先要注意的是没有看得见的显式的内存分配。容器集装箱管理自己的内存。

    第二,这是一个大问题:我们有自动导入(autovivification)!

    unordered_map<string, int> word_count {};
    string word;
    
    while (fp >> word) {
        word_count[word] += 1;
    }

    第三,我们有 lambda 表达式:

    return accumulate(
        word_count.cbegin(),
        word_count.cend(),
        0,
        [](int sum, auto& el) { return sum += el.second; }
    );

    在这背后,accumulate 将内部变量初始化为 0,并调用一个匿名函数,其最后一个参数指定为当前值,以及word_count的下一个元素。

    现在,我不得不承认,我不知道这些特性是如何实现的,但是 Microsoft Visual C++ 2015 RC 成功运行了,微软似乎终于赶上了在该领域的最新发展。

    现在的情况

    然而,一切都不乐观。尽管 boost libraries 填补了许多空白,而且标准库提供了令人印象深刻的构件,但是也很难战胜 Perl 和 CPAN 结合带来的那种编写可在任何地方完美运行的可移植代码的便利性。

    例如,我能找到一个平台无关的库,可以让我在不需要 Excel 的情况下解析或创建 Excel 文件吗?这个库能够用 clang、g++ 和 cl 轻易地编译出来吗?好像不太可能。

    我真的非常感谢标准委员会的人们的辛勤工作,和那些开发编译器,众多库的人们。它们让我不必在编写 C++ 程序时辛苦的思考。

    这让我在真正控制我的计算机时还能感觉舒适。

    在这里,我真的非常感谢。

    你可以在/r/cpp评论本文。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    Edge浏览器百度被劫持/篡改怎么办,地址后边跟着尾巴#tn=68018901_7_oem_dg

    Google Chrome 在 iPhone 上新增了 Safari 数据导入选项

    Windows 11专业版 KMS工具激活产品密钥的方法

    DEDECMS安全策略官方出品

    Microsoft Text Input Application 可以关闭吗?

    新版本QQ如何关闭自带的浏览器?

    C++编程语言中continue的用法和功能,附举例示范代码

    c++ map 的数据结构、基本操作以及其在实际应用中的使用。

    C语言如何避免内存泄漏、缓冲区溢出、空指针解引用等常见的安全问题

    C语言中的break语句详解

    IT头条

    马斯克2026最新采访总结:2040年,全球机器人数量将突破100亿台

    23:52

    专家解读|规范人工智能前沿业态健康发展的新探索:解读《人工智能拟人化互动服务管理暂行办法》

    00:54

    用至强 6高存力搞定MoE卸载!

    17:53

    美国将允许英伟达向中国“经批准的客户”出售H200 GPU

    02:08

    苹果与微信就15%手续费达成一致?腾讯未置可否

    22:00

    技术热点

    PHP 和 Node.js 的10项对比挑战

    Javascript闭包深入解析及实现方法

    windows 7、windows 8.1手动增加右键菜单功能技巧

    MYSQL出错代码大汇总

    windows 7假死机怎么办 windows 7系统假死机的原因以及解决方法

    Ubuntu(Linux)下配置IP地址的方法

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。