程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 《C++的設計與演化》讀書筆記

《C++的設計與演化》讀書筆記

編輯:C++入門知識

<<C++的設計與演化>>原文摘錄與自己翻譯及注解
原文1:
1.Even though support of concurrency and Simula-style simulations was a primary aim of C with Classes,the language contained no primitives for expressing concurrency;................

I considered it crucial--as I still do-- that more than one notion of  concurrency should be expressible in the language.There are many applications for which support for concurrency is essential,but there is no one dominant model for concurrency support;thus,when support is needed,it should be provided through a library or a special-purpose extension so that a particular form of concurrency support does not preclude other forms.

雖然設計帶類的C最初的目的是支持並發和模仿Simula的風格,但是帶C的類中並沒有包含實現並發的原語支持.我覺得這樣的種觀念是至關重要的(我現在仍然這樣認為):在語言中應該支持多種並發性的概念.支持並發性對許多應用來說是必不可少的,但是在語言中並沒有提供一種占主導的並發支持.我們應該通過提供一個類庫或者特定的擴充來支持某種並發,這樣的話對一種特殊形式的並發的支持才不會導致排斥其他形式的並發.

 

注解:

C++剛出來的時候叫作帶類的C,它設計之初並不是想弄成一個全新的語言,而只要想當作一個擴充C的功能的輔助工具.但是在帶類的C中的一些設計思想繼續延續到了C++中.上面多次提到了並發,我覺得現在使用的多線程應該就算是一種並發吧.隨著多核處理器的普及,並發會成為越來越重要的個概念.以前的多線程並發在一個CPU上只是假象,實際上是通過分割CPU時間片斷來模擬了並發.而在多核中有個多個CPU,那就是真正的並發了啊.

上面講到C++中沒有對並發的原語支持,啥叫原語支持?可以這樣的簡單理解吧.像C中沒有某個類型叫字符串,而是通過char數組來模擬字符串,所以可以說C中沒有字符串的原語支持.而C#中有string這樣的基本類型了,就是原語支持.

其實提不提供對某個特定功能的原語支持是有好處也有壞處的.如果你的語言是作為一種通用的程序語言,想要適用於盡量多的領域,就要少做一些原語的支持.而如果只想針對某個特定領域就要提供該領域的很多原語性支持.比如Matlab對數學方面提供了非常多的原語支持.可以很方便的使用矩陣之類的啊.所以如果要做個數學研究方面的開發工作用matlab就絕對比C,C++這樣的語言更有優勢了啊.另外Lisp也一樣,設計之初重點關注人工智能,所以在人工智能領域相較其他語言也有得天獨厚的優勢.

另外stroustrup還提到了如果想實現某種形式的並發要用類庫來支持.所以很多時候我們要實現一些功能,類庫也是挺重要的,類庫幫我們做了很多工作,我們只要拿來用就行.所以選擇一門程序語言時,除了語言本身設計的好不好,編譯器好不好外,還得看有沒有很多關於該語言的第三方類庫.

 

原文2:
2.C with Classes could be used for whatever C could be used for.This implied that in addition to matching C in efficiency ,C with Classes could not provide benefits at the expense of removing "dangerous" or "ugly" features of C...........

帶類的C應該能適用於C適用的所有領域.這意味著帶類的C要取得跟C差不多的效率,不能去掉C中一些"危險的" 或者"丑陋的"特性,因為去掉這些特性會帶來性能損失.

 

注解:

我們看到C++差不多把C中所有特性都保留下來了.關於上面提到的哪些特性算是C中的"危險的"或者"丑陋的"呢?我覺得允許各種數值類型可以隱式的互相轉換就算一個.比如unsigned int,long,float,double之前都可以任意的隱式互相轉換.做這樣的轉換帶來的結果有時只是精度的不同,而如果存在帶符號和不帶符號的話可能是完全錯誤的結果.實際上是可以在運行時做一些檢查,如果轉換存在精度的損失和出錯的可能就當作錯誤處理.這樣做雖然安全很多了,但做多余的檢查肯定會導致損耗一定的空間和時間效率.所以C++在數值類型檢查這一塊沒做啥改進.而C#中關於數值類型轉換就有做檢查了.會出現精度損失時就不讓隱式轉換.

所以我們使用一些高級語言時,看起來有些地方安全了,方便了.但實際上往往是以犧牲一部分效率為代價的.隨著電腦硬件資源越來越廉價,有些時候這樣的性能代價是可以承擔的.但出於通用性的考慮,就不能承受這樣的代價.比如要用到資源緊缺的嵌入式上的話.

 

 

原文3:
3.In C with Classes(as in C++) ,a class is a type.This is a key notion in C++.When class means user_defined type in C++,why didn't I call it type? I chose class primarily because i dislike inventing new terminology and found Simula's quite adequate in most cases.

在帶類的C中(在C++中也一樣),一個class就是一種type.這是C++中的一個關鍵性的概念.那既然在C++中class是用戶自定義的type,為什麼不直接把class叫作type呢?我之所以選擇class做為關鍵字最主要的原因一個是我討厭發明新術語,二是我發現Simula中的class在用在絕大部分情景中是適合的.

 

注解:

在Simula語言中class已經被做為關鍵字了,而我們平時雖然常提到type,但它實際上沒做為關鍵字用了.stroustrup講他沒有把type引進來做關鍵字是因為他不想發明新術語.我覺得這樣的思想是一種比較務實的,很替用戶考慮的.人總是愛偷懶的,能少記些東西就想少記.而且對一些完全陌生的事務帶有排斥心理(當然實際上人心理是復雜的,對陌生事物是排斥心理和好奇,接近心理並存). 所以很多學C++的人剛接觸MFC,碰到一堆堆的陌生關鍵字和術語時會極度反感.可能接觸久了才會慢慢習慣. 另外我們會發現講一些比較專業性的東西時,水平不高的人往往是滿口讓人難懂的術語.而那些大師級的人才能做到深入淺出,不用晦澀難懂的術語,而只用些通俗易懂的話語就能講明白.

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved