計算機語言是有局限性的么?
我所謂的局限性是指的是它的東西不能做,或者做的不完美。
因為在看cpp的虛函數發現,只是有一句話這樣寫到"當指針指向不同對象時執行不同的操作,要實現此功能,需要引入虛函數的概念" 我發現了這樣一個問題,就是我們是從需求出發,改進語言,來更好的進行編程,這就相當於封裝。我們把需求進行封裝,當封裝達到一定規模,這樣就會限制我們的操作,這樣我們就有了局限性,所以我推測計算機語言是有局限性的,不知道對不對呢?
幾乎所有語言的局限性都是一樣的,譬如說你無法寫一個程序,判斷隨便兩個什麼語言的函數,是否在實際上幹了一樣的事情,而且對於任意一對函數都能給出確切的結果。
當然有啊,所有的語言都無法寫出計算忙碌海狸函數的程序。
當然有了
首先,不管啥語言,歸根結底都是需要計算的。每個語言都有一個對應的計算模型,這個語言是無法突破該模型計算的上限的。模型里註定無法解決的問題這語言就沒轍,此乃先天限制。
其次,從語言層面來說,語言也是有局限的。每個語言都是一大堆語言特性的集合。大部分特性都是有所擅長同時有所不足的,這些不足的地方就是該語言在某些狀況下的局限性了。不過這樣的局限性一般都是做起來非常麻煩,但往往可以通過各種方法做出來@vczh和@Belleve分別給了一個不可判定問題和一個不可計算函數……它們都是任何編程語言的極限。
當然我覺得你的本意是抽象的語言特性是不是總是有遮不住細節的時候。回答是當然是的。最明顯的問題就是性能需求。一個語言可以抽象掉各種底層實現,但是它抽象不掉你因為抽象而帶來的性能損失。
既然你在看C++,那麼你就會注意到C++里讓你選擇聲明每個方法是不是虛的,而如果一個類的所有方法都不虛,這個類就沒有vtable了。為什麼要這麼做呢?就是因為它不希望它提供的抽象成為你的唯一選擇,如果它給你提供的抽象不滿足你的需求了,你可以自己重新造一遍輪子。這是C++的哲學的一部分,即「你不需要為你用不到的功能而付費」。
很多其他編程語言在設計的時候哲學是相反的(比如幾乎所有的帶垃圾回收器的語言),你在編程語言內是沒辦法不用它提供的抽象自己硬造輪子的,但是因為大部分這種語言都能調用C語言的代碼,你仍然可以做類似的事情,只是要把硬造輪子的事情丟到語言外面做而已。
總之- 編程語言提供的抽象未必伴隨著額外的限制,只要它給你一種在必要的時候繞開抽象自己硬幹的辦法就行了。
- 開始一個項目的時候的確需要考慮編程語言提供的抽象跟你的需求是否吻合,否則的話你的精力都花在造輪子上了。
當然是有局限的,確定型圖靈機是現在已知的計算能力最強大的機器(註:計算能力並不是指運算速度快慢, 而是指可以完成的計算),因此,圖靈機不可能完成的計算,目前的計算機也是無法完成的。《計算的本質》第8章不可能的程序中有講到一些例子。比如:
1 可判定性
圖靈機無法判定某個程序是否在任何輸入下,都能在有限的時間內給出結果2 停機問題圖靈機不能判斷一個程序是否會無限循環下去大部分計算機語言都是圖靈完備的,所以以上局限也適用於大部分計算機語言有的。目前計算機的最高能力的語言是達到「圖靈完備性」的語言,所以就都限制在「圖靈完備性」上面;舉個限制的栗子:產生「真隨機數「,「真隨機數「!
我來補充一點,可能性。現在語言都是確定的,比如大於,等於,小於,但是沒有可能大於,可能等於。比如我們看電視的時候,看到某人物出場,從打扮觀眾會有個猜想,這個人看起來窮凶極惡,可能是壞人。隨著劇情的發展,這個可能性在觀眾心裡一直在變,到最後可能發現這個是個好人,警察卧底啥的。又比如挑選種子,什麼是好種子呢?顆粒飽滿的,可能是好的,發黑的可能是壞的。現在的編程語言不支持這樣的邏輯開發。或許以後會有。
所有圖靈完備的語言局限都是一樣噠。。。
強推這本書——《哥德爾艾舍爾巴赫集異璧之大成》哥德爾不完備定理,停機問題。
是計算機
突然想發這個 別問我為什麼
先說結論吧,我認為語言的局限性是有的,不能做的事情,圖靈完備的語言大家都一樣,但是優雅不優雅區別很大。
換一種表達,就是做一些特定的事情,使用某一些語言有他天然的優勢,而另一些有天然的劣勢在裡面。
比如,題主提到的c++虛函數的概念,為了解決使用基類指針或者引用調用子類的方法的問題。換做別的方法,能不能解決這個問題?能啊,我可以一連串if else判斷一下類型,我也可以額外加上一個function pointer。但是,你有了虛函數,一個virtual關鍵字就夠了。剩下的你通通不要管,管他什麼vptr,vtable,只要知道我寫的這個代碼能夠產生我想要的結果,就足夠了。
再比如,我想寫一個網站,放著世界上最好的語言不用,偏要用c++來cout。這麼做行不行呢?當然可以,但是你的付出和你的回報是不相稱的。
都說要站在巨人肩膀上,小碼農做事情選擇語言也要站在巨人肩膀上呀。有一些語言的產生就是為了解決一些特定問題,順手,好用。特定語言做合適的事情,省下來的時間喝喝咖啡,泡泡妹紙,多美好.最大的局限就是無法直接new出一個叫女朋友的實體對象。
隨機數
當然!因為只有計算機能識別嘛!
果殼,計算的極限系列文章。
計算機語言都有局限性。因為:
- 一般情況下,任何一門非彙編語言都存在的局限性是——不能做到彙編語言能做到的所有事情。
- 彙編語言也有局限性。
所以,所有計算機語言都有局限性!
---------------------------------------------
其實計算機做的不完美的地方有很多。eg:
1. 隨機函數
雖然我們在各種編程語言中都能看到隨機函數,但那些函數的實際名稱為「偽隨機函數」。2. 人工智慧、手寫識別等
如果不信,你試試!3. ……(此處略去一萬字)推薦閱讀:
※如何理解c++中的引用摺疊?
※extern C裡面能有C++代碼嗎?
※該如何設計實現一個telnet bbs?
※C++ 中對 main 函數的地址賦值會怎樣?
※關於2048局面的價值判斷及ai思路?