新聞中心
一些背景

創(chuàng)新互聯(lián)公司于2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站制作、網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元六枝做網(wǎng)站,已為上家服務(wù),為六枝各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792
***個(gè)我真正喜愛的編程語(yǔ)言是 C。我花了不少時(shí)間才找到它:當(dāng)我還是一個(gè)孩子,我就開始在珍貴的ZX Spectrum上使用 Z80 匯編。那些日子是你能夠真正掌握你的電腦的時(shí)候,你不需要蘋果,谷歌,微軟或者其他任何人的允許就能寫一個(gè)程序。我在漂亮的128K ZX Spectrum +2上學(xué)習(xí)了在超出 CPU 尋址空間時(shí)對(duì)內(nèi)存塊分頁(yè)。直到我進(jìn)入大學(xué),我才擁有一臺(tái) IBM PC 機(jī) 。我玩遍了電子表格,試圖修復(fù)現(xiàn)存的 Fortran 程序,用土耳其字符給鍵盤驅(qū)動(dòng)打補(bǔ)丁,還學(xué)了點(diǎn) Pascal 語(yǔ)言。之后,在我就職于土耳其中央銀行期間,我又學(xué)習(xí)了 SQL 和 APL。
我一直對(duì) C 語(yǔ)言有所耳聞,但我一直沒有接觸到一款C語(yǔ)言編譯器。直到我到康奈爾大學(xué)擁有了一個(gè)Unix 賬號(hào)之后,我編譯了我人生中的***個(gè) hello.c 文件,不久之后,我有了***臺(tái)電腦……我在 DOS 分區(qū)上安裝了 DJGPP 編譯器,構(gòu)建了我人生中***個(gè) Linux 內(nèi)核(我***個(gè)發(fā)行版是 Debian),并且開始學(xué)習(xí) C 語(yǔ)言。Plauger 的 “Standard C Library” 是我最喜歡的書。
當(dāng)我開始享受用 C 編程的時(shí)候,C++ 已經(jīng)廣泛應(yīng)用超過(guò)十年了。所以,我下一步使用 C++ 看起來(lái)是很自然的一步了。
除了……好吧,除了 C++ 是一片混亂。那段時(shí)間,所有人都被繼承層次深深吸引了,每個(gè)人都在編寫精心設(shè)計(jì)的字符串類。大多數(shù)硬盤都太慢,不能再有限的時(shí)間內(nèi)編譯出可靠的 C++ 庫(kù)(好吧,我有點(diǎn)夸張了),大部分 CPU 都在試圖實(shí)例化模板中融化了,大部分人,那些假裝 C++ 程序員的 C 程序員們,差點(diǎn)就把 malloc 的返回值給扔了。
在那時(shí),我正忙于試圖建立定制化的網(wǎng)絡(luò)經(jīng)濟(jì)實(shí)驗(yàn),看起來(lái) Java 似乎很有優(yōu)勢(shì)。至少,它不需要麻煩地拼湊出一個(gè)對(duì)話框。產(chǎn)生少量的 socket 連接,并且使你的應(yīng)用編譯和運(yùn)行在多種多樣的系統(tǒng)上。當(dāng)然,AWT 和 Swing 都很丑陋且笨重,但對(duì)我的目的來(lái)說(shuō),那沒關(guān)系。
但是,僅僅是因?yàn)椴荒茉趯?shí)驗(yàn)室之外運(yùn)行我的實(shí)驗(yàn)(因?yàn)樵趯?shí)驗(yàn)室已經(jīng)配置了所有電腦,java應(yīng)用程序運(yùn)行不會(huì)有問(wèn)題)。所以我快速的把 FreeBSD部署到了一臺(tái)擁有100Mhz奔騰處理器,16Mb內(nèi)存,在角落里收集灰塵的機(jī)器上,并搭建了一個(gè)擁有perl模塊(mod_perl)的 Apache服務(wù)器,然后就能工作了。那就是我愛上Perl的時(shí)候。
那份愛完全起源于實(shí)用的原因,我并不是認(rèn)為Perl特別的***,并且那時(shí)候我認(rèn)為包括其他許多語(yǔ)言都不是很***,他們中的每一個(gè)都有自己的瑕疵。
Perl總是能減少我必須解決的特別問(wèn)題的工作的數(shù)量,有些是因?yàn)檎Z(yǔ)言特性,但大部分是因?yàn)?nbsp;CPAN。
舉例來(lái)說(shuō),作為一個(gè) Perl 程序員,解析 HTML 作為 HTML 是一個(gè)解決方案。我必須決定,要么就構(gòu)造整個(gè)樹, 或者使用流化的方式。在某些情況下,前者是具有優(yōu)勢(shì)的,但后者的好處是可以使內(nèi)存的需求降至***,即使是在這個(gè)年代,如果你處理 HTML 文檔以兆字節(jié)方式還是可以奏效的。不論哪種方式,這些工具都不會(huì)在無(wú)效的 HTML 上被卡住,并在非 XML 的有效 HTML 上運(yùn)作良好。
還有,Perl 提供可移植性。如果我不需要操作系統(tǒng)特定的功能,不用任何修改地方,我的 perl 代碼就可以運(yùn)行。
當(dāng)我寫了一些類,并為它們做了封裝,也不會(huì)有復(fù)雜的架構(gòu)。
C++ 涅槃
在過(guò)去的數(shù)年,C++如獲新生。許多聰明人已經(jīng)開始意識(shí)到須要向C++程序員提供同時(shí)涵蓋 work of the ISO committee和 boost的構(gòu)建模塊。
在真實(shí)環(huán)境下,仍然有90%的菜鳥生成C++程序員就是沒有意識(shí)到new是一個(gè)合法符號(hào)的C程序員。在這方面,C++與Perl非常相似:大部分人寫過(guò)Perl代碼的人也沒有意識(shí)到Perl不是C、Java、Python、shell、Awk或者其他你可以列舉的語(yǔ)言。
但是,當(dāng)你看到新C++標(biāo)準(zhǔn)中的新東西,以及編譯器不斷實(shí)現(xiàn)浙西特性的新聞時(shí),我們無(wú)法抑制住內(nèi)心的興奮和好奇。
單詞計(jì)算練習(xí)
這是一個(gè)簡(jiǎn)單的練習(xí),使用 C++ 或者 Perl 并且不依賴外部庫(kù),所以這是一個(gè)很好的起點(diǎn)。
這是 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;
- }
而且,這是我***的付出在轉(zhuǎn)化 Perl 到現(xiàn)代風(fēng)格的 C++ 上面。我沒有嘗試寫特別搞笑的代碼:只是和 Perl 一樣,我把重點(diǎn)放在寫代碼上面,使得我感到非常自然,同時(shí)確保兩個(gè)程序都做大致相同的事情。
- #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) {
- 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
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 聲明可能看起來(lái)有點(diǎn)多,但是我抬眼 using namespace std,也討厭不斷地輸入 std::… 更多的是因?yàn)槲蚁矚g較短的代碼行。
首先要注意的是沒有看得見的顯式的內(nèi)存分配。容器集裝箱管理自己的內(nèi)存。
第二,這是一個(gè)大問(wèn)題:我們有自動(dòng)導(dǎo)入(autovivification)!
- unordered_map
word_count {}; - string word;
- while (fp >> word) {
- word_count[word] += 1;
- }
第三,我們有 lambda 表達(dá)式:
- return accumulate(
- word_count.cbegin(),
- word_count.cend(),
- 0,
- [](int sum, auto& el) { return sum += el.second; }
- );
在這背后,accumulate 將內(nèi)部變量初始化為 0,并調(diào)用一個(gè)匿名函數(shù),其***一個(gè)參數(shù)指定為當(dāng)前值,以及word_count的下一個(gè)元素。
現(xiàn)在,我不得不承認(rèn),我不知道這些特性是如何實(shí)現(xiàn)的,但是 Microsoft Visual C++ 2015 RC 成功運(yùn)行了,微軟似乎終于趕上了在該領(lǐng)域的***發(fā)展。
現(xiàn)在的情況
然而,一切都不樂(lè)觀。盡管 boost libraries 填補(bǔ)了許多空白,而且標(biāo)準(zhǔn)庫(kù)提供了令人印象深刻的構(gòu)件,但是也很難戰(zhàn)勝 Perl 和 CPAN 結(jié)合帶來(lái)的那種編寫可在任何地方***運(yùn)行的可移植代碼的便利性。
例如,我能找到一個(gè)平臺(tái)無(wú)關(guān)的庫(kù),可以讓我在不需要 Excel 的情況下解析或創(chuàng)建 Excel 文件嗎?這個(gè)庫(kù)能夠用 clang、g++ 和 cl 輕易地編譯出來(lái)嗎?好像不太可能。
我真的非常感謝標(biāo)準(zhǔn)委員會(huì)的人們的辛勤工作,和那些開發(fā)編譯器,眾多庫(kù)的人們。它們讓我不必在編寫 C++ 程序時(shí)辛苦的思考。
這讓我在真正控制我的計(jì)算機(jī)時(shí)還能感覺舒適。
在這里,我真的非常感謝。
你可以在/r/cpp評(píng)論本文。
分享文章:C++能否成為你新的腳本語(yǔ)言?
路徑分享:http://www.dlmjj.cn/article/dhehdjo.html


咨詢
建站咨詢
