C++ 能否成为你新的脚本语言? 已翻译 100%

oschina 投递于 2015/05/18 06:56 (共 8 段, 翻译完成于 05-28)
阅读 10298
收藏 41
2
加载中

一些背景

第一个我真正喜爱的编程语言是 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" 是我最喜欢的书。

社会主义好
社会主义好
翻译于 2015/05/20 13:55
1

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

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

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

社会主义好
社会主义好
翻译于 2015/05/23 22:11
1

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

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

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

tinyhare
tinyhare
翻译于 2015/05/27 02:20
1

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

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

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

溪边九节
溪边九节
翻译于 2015/05/27 20:05
1

C++ 涅槃

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

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

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

HappyBKs
HappyBKs
翻译于 2015/05/24 16:26
1

单词计算练习

这是一个简单的练习,使用 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::... 更多的是因为我喜欢较短的代码行。

eason02
eason02
翻译于 2015/05/18 10:37
1

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

第二,这是一个大问题:我们有自动导入(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 成功运行了,微软似乎终于赶上了在该领域的最新发展。

HappyBKs
HappyBKs
翻译于 2015/05/24 19:46
1

那么现在呢?

然而,并非所有事情都是那么美好。虽然 boost libraries 库上填补了很多空白,在构建模块时标准库也十分给力,但是它很难与用 Perl 和 CAPN 混合编写的那种跨平台、可移植代码时的便利性相提并论。

举个例子,我能到处找得到一个与平台无关的库,这个库可以为我解析或者创建 Excel 文件而不需要 Excel 应用?并且这个库可以像 clang,g++ 和 cl 那样方便编译?这显然找不到。

我确实非常感谢那些工作在标准委员会和那些开发编译器和库的人,因为有了他们我在写 C++ 代码时不是那么费力。

这让我感到十分舒服,与此同时我又能够尽情去折腾我的电脑。

正因为如此,我很感激。

你可以在 /r/cpp评论这篇文章

macsokolot
macsokolot
翻译于 2015/05/28 17:45
2
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(46)

一如当初
一如当初
静态类型的就别当脚本了。
梁选
梁选

引用来自“haitaosoft”的评论

delphi早已成为一种带gui的脚本语言了——因为它的编译速度极快,开发速度也与写脚本没什么差别了。。。。

引用来自“梁选”的评论

胡说,开发速度比得上Python?

引用来自“七液”的评论

是么?delphi可以开发windows驱动。你开发一个我看看?Delphi开发的桌面应用速度比Python更快。 delphi只需要一个绿色文件就可以执行。Python那一团包分分钟被拆解。 涉及到指针操作的时候~~Python丑陋尽显。还敢说速度快么?

引用来自“梁选”的评论

傻逼啊你,把运行速度当作开发速度,你竟然还有勇气学编程。。。

引用来自“七液”的评论

不管是运行速度和开发速度,这些都是开发成本的一部分。运行速度也是开发优势。全民编程的时代,不会编程会落伍的~编程的成本也在逐渐降低,现在不是智商问题能不能学会的问题,而是是否有勇气去学的问题了。。。年轻人不要出口成脏~ 不要会写几句python就觉得了不起,我用python和lua都写过服务端和逻辑控制部分,现在一直用python来写数据挖掘和SVM的代码。 任何语言都有自己的优势。不要觉得一种语言就顶天了。Delphi能做的事情Python未必做得到,再说~~~Delphi的外号是VB Killer。显然你找的比较对象错了

引用来自“梁选”的评论

行了,你说了那么多,然而并没有什么卵用

引用来自“七液”的评论

那是因为你没有卵用,而不是工具没有卵用。这才是重点。

引用来自“梁选”的评论

你说那么多还是不能证明你不是傻逼

引用来自“七液”的评论

我从头到尾只是在证明你是傻逼。你居然没看出来?
看你想了大半天,原来就回了这么一句
七液
七液

引用来自“haitaosoft”的评论

delphi早已成为一种带gui的脚本语言了——因为它的编译速度极快,开发速度也与写脚本没什么差别了。。。。

引用来自“梁选”的评论

胡说,开发速度比得上Python?

引用来自“七液”的评论

是么?delphi可以开发windows驱动。你开发一个我看看?Delphi开发的桌面应用速度比Python更快。 delphi只需要一个绿色文件就可以执行。Python那一团包分分钟被拆解。 涉及到指针操作的时候~~Python丑陋尽显。还敢说速度快么?

引用来自“梁选”的评论

傻逼啊你,把运行速度当作开发速度,你竟然还有勇气学编程。。。

引用来自“七液”的评论

不管是运行速度和开发速度,这些都是开发成本的一部分。运行速度也是开发优势。全民编程的时代,不会编程会落伍的~编程的成本也在逐渐降低,现在不是智商问题能不能学会的问题,而是是否有勇气去学的问题了。。。年轻人不要出口成脏~ 不要会写几句python就觉得了不起,我用python和lua都写过服务端和逻辑控制部分,现在一直用python来写数据挖掘和SVM的代码。 任何语言都有自己的优势。不要觉得一种语言就顶天了。Delphi能做的事情Python未必做得到,再说~~~Delphi的外号是VB Killer。显然你找的比较对象错了

引用来自“梁选”的评论

行了,你说了那么多,然而并没有什么卵用

引用来自“七液”的评论

那是因为你没有卵用,而不是工具没有卵用。这才是重点。

引用来自“梁选”的评论

你说那么多还是不能证明你不是傻逼
我从头到尾只是在证明你是傻逼。你居然没看出来?
梁选
梁选

引用来自“haitaosoft”的评论

delphi早已成为一种带gui的脚本语言了——因为它的编译速度极快,开发速度也与写脚本没什么差别了。。。。

引用来自“梁选”的评论

胡说,开发速度比得上Python?

引用来自“七液”的评论

是么?delphi可以开发windows驱动。你开发一个我看看?Delphi开发的桌面应用速度比Python更快。 delphi只需要一个绿色文件就可以执行。Python那一团包分分钟被拆解。 涉及到指针操作的时候~~Python丑陋尽显。还敢说速度快么?

引用来自“梁选”的评论

傻逼啊你,把运行速度当作开发速度,你竟然还有勇气学编程。。。

引用来自“七液”的评论

不管是运行速度和开发速度,这些都是开发成本的一部分。运行速度也是开发优势。全民编程的时代,不会编程会落伍的~编程的成本也在逐渐降低,现在不是智商问题能不能学会的问题,而是是否有勇气去学的问题了。。。年轻人不要出口成脏~ 不要会写几句python就觉得了不起,我用python和lua都写过服务端和逻辑控制部分,现在一直用python来写数据挖掘和SVM的代码。 任何语言都有自己的优势。不要觉得一种语言就顶天了。Delphi能做的事情Python未必做得到,再说~~~Delphi的外号是VB Killer。显然你找的比较对象错了

引用来自“梁选”的评论

行了,你说了那么多,然而并没有什么卵用

引用来自“七液”的评论

那是因为你没有卵用,而不是工具没有卵用。这才是重点。
你说那么多还是不能证明你不是傻逼
七液
七液

引用来自“haitaosoft”的评论

delphi早已成为一种带gui的脚本语言了——因为它的编译速度极快,开发速度也与写脚本没什么差别了。。。。

引用来自“梁选”的评论

胡说,开发速度比得上Python?

引用来自“七液”的评论

是么?delphi可以开发windows驱动。你开发一个我看看?Delphi开发的桌面应用速度比Python更快。 delphi只需要一个绿色文件就可以执行。Python那一团包分分钟被拆解。 涉及到指针操作的时候~~Python丑陋尽显。还敢说速度快么?

引用来自“梁选”的评论

傻逼啊你,把运行速度当作开发速度,你竟然还有勇气学编程。。。

引用来自“七液”的评论

不管是运行速度和开发速度,这些都是开发成本的一部分。运行速度也是开发优势。全民编程的时代,不会编程会落伍的~编程的成本也在逐渐降低,现在不是智商问题能不能学会的问题,而是是否有勇气去学的问题了。。。年轻人不要出口成脏~ 不要会写几句python就觉得了不起,我用python和lua都写过服务端和逻辑控制部分,现在一直用python来写数据挖掘和SVM的代码。 任何语言都有自己的优势。不要觉得一种语言就顶天了。Delphi能做的事情Python未必做得到,再说~~~Delphi的外号是VB Killer。显然你找的比较对象错了

引用来自“梁选”的评论

行了,你说了那么多,然而并没有什么卵用
那是因为你没有卵用,而不是工具没有卵用。这才是重点。
梁选
梁选

引用来自“haitaosoft”的评论

delphi早已成为一种带gui的脚本语言了——因为它的编译速度极快,开发速度也与写脚本没什么差别了。。。。

引用来自“梁选”的评论

胡说,开发速度比得上Python?

引用来自“七液”的评论

是么?delphi可以开发windows驱动。你开发一个我看看?Delphi开发的桌面应用速度比Python更快。 delphi只需要一个绿色文件就可以执行。Python那一团包分分钟被拆解。 涉及到指针操作的时候~~Python丑陋尽显。还敢说速度快么?

引用来自“梁选”的评论

傻逼啊你,把运行速度当作开发速度,你竟然还有勇气学编程。。。

引用来自“七液”的评论

不管是运行速度和开发速度,这些都是开发成本的一部分。运行速度也是开发优势。全民编程的时代,不会编程会落伍的~编程的成本也在逐渐降低,现在不是智商问题能不能学会的问题,而是是否有勇气去学的问题了。。。年轻人不要出口成脏~ 不要会写几句python就觉得了不起,我用python和lua都写过服务端和逻辑控制部分,现在一直用python来写数据挖掘和SVM的代码。 任何语言都有自己的优势。不要觉得一种语言就顶天了。Delphi能做的事情Python未必做得到,再说~~~Delphi的外号是VB Killer。显然你找的比较对象错了
行了,你说了那么多,然而并没有什么卵用
七液
七液

引用来自“haitaosoft”的评论

delphi早已成为一种带gui的脚本语言了——因为它的编译速度极快,开发速度也与写脚本没什么差别了。。。。

引用来自“梁选”的评论

胡说,开发速度比得上Python?

引用来自“七液”的评论

是么?delphi可以开发windows驱动。你开发一个我看看?Delphi开发的桌面应用速度比Python更快。 delphi只需要一个绿色文件就可以执行。Python那一团包分分钟被拆解。 涉及到指针操作的时候~~Python丑陋尽显。还敢说速度快么?

引用来自“梁选”的评论

傻逼啊你,把运行速度当作开发速度,你竟然还有勇气学编程。。。
不管是运行速度和开发速度,这些都是开发成本的一部分。运行速度也是开发优势。全民编程的时代,不会编程会落伍的~编程的成本也在逐渐降低,现在不是智商问题能不能学会的问题,而是是否有勇气去学的问题了。。。年轻人不要出口成脏~ 不要会写几句python就觉得了不起,我用python和lua都写过服务端和逻辑控制部分,现在一直用python来写数据挖掘和SVM的代码。 任何语言都有自己的优势。不要觉得一种语言就顶天了。Delphi能做的事情Python未必做得到,再说~~~Delphi的外号是VB Killer。显然你找的比较对象错了
梁选
梁选

引用来自“haitaosoft”的评论

delphi早已成为一种带gui的脚本语言了——因为它的编译速度极快,开发速度也与写脚本没什么差别了。。。。

引用来自“梁选”的评论

胡说,开发速度比得上Python?

引用来自“七液”的评论

是么?delphi可以开发windows驱动。你开发一个我看看?Delphi开发的桌面应用速度比Python更快。 delphi只需要一个绿色文件就可以执行。Python那一团包分分钟被拆解。 涉及到指针操作的时候~~Python丑陋尽显。还敢说速度快么?
傻逼啊你,把运行速度当作开发速度,你竟然还有勇气学编程。。。
拜仁慕尼黑
拜仁慕尼黑
lua不服求战
七液
七液

引用来自“haitaosoft”的评论

delphi早已成为一种带gui的脚本语言了——因为它的编译速度极快,开发速度也与写脚本没什么差别了。。。。

引用来自“梁选”的评论

胡说,开发速度比得上Python?

引用来自“七液”的评论

是么?delphi可以开发windows驱动。你开发一个我看看?Delphi开发的桌面应用速度比Python更快。 delphi只需要一个绿色文件就可以执行。Python那一团包分分钟被拆解。 涉及到指针操作的时候~~Python丑陋尽显。还敢说速度快么?

引用来自“化境”的评论

perl也能搞定windows驱动,效能很好。
show me
返回顶部
顶部