iT邦幫忙

3

初學JS後,想問為何C++要這麼多限制?

  • 分享至 

  • xImage

最近剛從C++轉到JS
覺得C++為何要有這麼多限制?

靜態語言的特性就先不說

像是不須string x = 'hello'
可以直接let x = 'hello',便知道它是字串

另外陣列的變大
JS:
let x = [1, 2, 3]
x[3] = 4
x就變成[1, 2, 3, 4]了
用在物件更是方便

這點C++就完全無法

再來是函式

function hello(name){
    console.log('hello ' + name)
}

如果有人的name是純數字或是字串的話,使用上都可通用

這點C++也是無法

因為C++大部分自學的,尚無法理解它的精神何在
也沒學過更精深的計算機底層課程
請問C++為何要這麼多限制呢?

看更多先前的討論...收起先前的討論...
win895564 iT邦新手 1 級 ‧ 2022-12-26 16:34:18 檢舉
先撇除其他的 有些時候 效能還是最重要的
效能應該還是目前主流程式語言中算前幾名的了
限制多其中一樣也是為了debug方便
JS 是前端語言 C++ 是後端語言,單單以WEB 應用來說是這麼分別的,你說JS 比 C++ 好,那是因為你的碼還沒達到跟 C++ 一樣嚴謹的階段,等你的JS 也可以跟 C++ 一樣嚴謹的時候,你就是全端工程師了,而不是只能當前端,因為你會問這個問題,等於你從來沒有用C++開發過完整的後端站台,還有別忘了 PHP 也是從C++ 發展過來的,講了JS,PHP摸了沒 JSP 摸了沒 ASP.NET呢,還有NODE JS 呢,如果你不打算學C++,不妨考慮 NODE JS
froce iT邦大師 1 級 ‧ 2022-12-26 16:59:20 檢舉
你被動態語言婊過一次,你就不會覺得字串加數字能跑是好事了。科科

動態語言debug困難,ide要做自動提示也困難,不熟悉會有一堆你根本想不透的bug。
變數名稱會用單字數字會用保留字的都是很神的,因為他們要DEBUG會花很多很多的時間,尤其是在學習其他語言的時候那個習慣很難改,然後就會造成一堆問題,然後就開始怪那個語言很爛,從來不思考自己的問題,能說什麼呢 ....
c++是不允許使用匿名型態變數,就是初始化時就要明確使用的變數是什麼型態,就算是字串,也要是一個長度固定的char* 或char[] ,而js這類高階語言,做的這麼難,你想嚇跑誰啊?
首先澄清一下,C++或C不叫做後端語言喔~~並非所有語言都能粗暴的用前、後端區分的。
C++與C都是現今作業系統的發展基礎語言,其功能的強大是JS、Python、Swift、Dart、PHP、ASP.NET這些語言望塵莫及的,效能更不用說。
光看宣告的方式就能理解,運用C++或C操作硬體非常注重對指標的認識,指標的操作就是他們能提高效能的手段,也就是說,你知道要存什麼型態的資料,要用多少記憶體,能夠清楚掌握,你就能設計出很有效能的資料結構或物件。而要想達到這個目的,當然要嚴格的規範各種型態所占用的記憶體大小啊~~~
就您的例子來說:
String x = 'hello';
這句話,你知道hello這個字串在你的電腦上硬體中占用多少記憶體嗎?JS一定無法給你答案,但C或C++就可以。
因為JS的運作環境是在瀏覽器上,並不是在實機上,早期必須仰賴瀏覽器的既有的函式庫來支援其運作,但現在有node.js來輔助,才變得比較像在寫需編譯的程式。
C++與C語言的套件較少,甚至很多的設計是case by case的,許多函式或演算法需要自己設計,因此學習C++或C需要對程式、資料結構與計算機組織有相當程度的認識,才能運用自如,也才能體會它的強大。
程式語言的水很深的~~~
這一串釣到好多大佬wwww
PPTaiwan iT邦好手 1 級 ‧ 2022-12-27 12:08:08 檢舉
活這麼大了,第一次看到有人會拿 C++ 與 JS 來做一個討論也!! 然後再去說 C++ 為何這樣子,怎麼不學學 JS 來做改變

真好奇,你是如何自學?? 學成這樣子?? 這並不是指責你,而是人在創造一種程式語言並非是要去做 "相互比較誰比較好" ,而是這程式語言是用在什麼地方,他的目的到底是什麼??

可能這也是網路世代的問題,以前都還是買書來研究程式語言,程式碼不斷的 KEYIN 而現在只要上網看 COPY 下來就可以了..
你如果學了python,會更有這種強弱型別,甚至是匿名型別,動態型別這種東西給驚嚇到的感覺,但說真話,快速開發,代價就是效能低落,動不動一堆漏洞,一堆更新不完的支援庫(java jre/ .NET..諸如此類),還有時不時就要被淘汰的風險
eric2494 iT邦新手 3 級 ‧ 2022-12-28 14:24:18 檢舉
布蘭登艾克:我在發明 JS 時從沒想過它可以活那麼久,所以僅花了十天時間就把原型設計出來了
liuc772 iT邦新手 5 級 ‧ 2022-12-28 17:58:21 檢舉
這個問題的目標在於,如果要設計一種程式語言,有可能兼具效能與開發速度嗎?
開發速度要怎麼定義?
熟練的語言開發就快,不熟練的開發就慢。
況且現在的系統需求,很少靠單一語言就能達成的
請問你的需求是寫一個網站,是用C++快還是html+js快?
如果你要寫的是電子電路控制或是系統程式,你能用js寫嗎?
至於「設計程式語言」?我是不知道站內或國內有沒有這樣的大神啦~~~~
我想這種人應該可以去嗆唐鳳了吧~~~
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
YC
iT邦研究生 2 級 ‧ 2022-12-26 16:58:41

當你覺得被JavaScript的弱型別打開新世界大門的時候,
有一群人卻特意的套上一層叫TypeScript的枷鎖

2
黃彥儒
iT邦高手 1 級 ‧ 2022-12-26 17:00:19

???你說的都可以阿,幹嘛去嘴10年以前的C++

像是不須string x = 'hello'
可以直接let x = 'hello',便知道它是字串

你可以用 auto 關鍵字阿

另外陣列的變大

你可以用vector阿

如果有人的name是純數字或是字串的話,使用上都可通用

你可以用 函數模版

看更多先前的回應...收起先前的回應...
liuc772 iT邦新手 5 級 ‧ 2022-12-26 17:16:44 檢舉

STL我還在初學,不過就覺得...

比方說有vector後,那我一開始學的陣列就顯得非常不實用?

黃彥儒 iT邦高手 1 級 ‧ 2022-12-26 17:19:55 檢舉

是,但這東西就是為了相容而保留的,所以現代程式碼少用記憶體不安全的東西。
況且若是在比較特殊的使用情境下,用陣列可以搾出效能

如果只會用套件,不算真的學會程式語言,況且vector本身就是一個物件,說穿了就是鏈結串列的實作。
如果真的要踏入軟體設計領域,真心建議你去研習物件導向、資料結構與演算法、作業系統這四門課,不知道可以上各大學資工系的磨課師,你的問題就有答案了。

恕刪~~

4
EN
iT邦好手 1 級 ‧ 2022-12-26 17:03:14

其實原 PO 提出的幾點跟前端後端沒有太大的關聯度,會有這些差異是因為 C++/C 的開發者需要自己管理/回收記憶體,C/C++ 的開發者可以操作變數的記憶體位址(& operator),而 JS 全都幫你管理好了(所以也需注意資料的深淺複製問題)。
如果對系統程式有興趣但又覺得 C++/C 很不方便,也可以考慮學習帶有 GC(Garbage Collection)的程式語言,像是 Rust 和 Golang。

題外話:其實 C++ 相較於 C 已經方便很多了,原 PO 提出的問題基本上都可以用 STL(Standard Template Library)解決。JS 在初學階段確實很爽,但到了系統開發階段就會發現 JS 的型別設計其實跟 ? 一樣(這也是 TypeScript 被廣泛使用的原因)。

基本上任何程式語言被發明都有創立者自己想要解決的問題,不同的設計就會有不同的取捨,我常常看到很多初學者問第一個語言該學什麼,但其實應該要問問自己想要摸索的是什麼才對。

看更多先前的回應...收起先前的回應...
EN iT邦好手 1 級 ‧ 2022-12-26 17:06:29 檢舉

然後就像樓上回答的一樣,原 PO 的問題對於 Modern C++ 來說都不是問題,記憶體管理問題也可以使用 smart pointer 改善。

liuc772 iT邦新手 5 級 ‧ 2022-12-27 13:24:27 檢舉

請問想學習系統程式有什麼入門方式嗎?

EN iT邦好手 1 級 ‧ 2022-12-29 23:29:58 檢舉

liuc772
推薦這個:https://github.com/angrave/SystemProgramming
中文翻譯:https://github.com/ENSREG/SystemProgramming-zh

1

您想了解的,其實只是區分為強型態及弱型態語言。

但這並不代表強型態語言就不好。
弱型態語言就感覺很好。

就如其它大大們說的。當您被弱型態語言,給婊過一次後。
你就會覺得強型態語言的好。

依目前的PHP來說,它是屬於後端語言的一種。其也算是屬於弱型態語言的代表。
但就目前新的版本來說,也開始再追求強型態語言的配置處理了。
原因為何?
因強型態語言有其它的好處存在。

就目前來說,無論是JS或是PHP等弱型態語言。我個人都已經養成習慣,會去宣告變數類型。
免得 1+1 變成了 「11」 而不是 「2」

真的真的習慣寫java的人,跑來PHP與JS的世界,閱讀程式變得非常痛苦啊

1
japhenchen
iT邦超人 1 級 ‧ 2022-12-27 07:55:33

我現在用js也盡量不使用

let i = 1 ;
alert(i+'1') ; 

到底是2還是11的混淆自己還有接手程式的人的眼睛的事

自從有新的string imterpolation字串插補特性出現,現在再也不用那麼累了

以下保証輸出11,而不是2(我以為的是2)

let i = 1 ;
alert(`${i}1`) ;  

上例一定會有人看了會說,幹嘛弄那個字串插補多打${}不累嗎?當你的JS裡出現一堆單雙引號跟+時,你就懂了
以下的寫法,不明確嗎?

let csstable2 = 
    `<div class='boxshadow roundbox smallertext myworklist' style='vertical-align:top;'>
        <div class='csstable'>
            <div class='csstr'>
                <div class='csstdx WRM'>即將到來</div><div class='csstd'>${comingWorks}</div>
            </div>
        </div>
    </div>`;

不管是文字變數,還是時間數值,統統比照辦理(還可以FORMAT),這樣不更可讀?但假設你不是想搞神秘的話

強型別有強型別的好處,執行效能,記憶體管理,開發者閱讀難易度,都會比弱型別的來的好很多,很多,至少不用猜,猜這個變數到底是幹嘛用的,影響範圍有多大

5

首先澄清一下,C++或C不叫做後端語言喔~~
並非所有語言都能粗暴的用前、後端區分的。
C++與C都是現今作業系統的發展基礎語言,其功能的強大是JS、Python、Swift、Dart、PHP、ASP.NET這些語言望塵莫及的,效能更不用說。
光看宣告的方式就能理解,運用C++或C操作硬體非常注重對指標的認識,指標的操作就是他們能提高效能的手段,也就是說,你知道要存什麼型態的資料,要用多少記憶體,能夠清楚掌握,你就能設計出很有效能的資料結構或物件。而要想達到這個目的,當然要嚴格的規範各種型態所占用的記憶體大小啊~~~
就您的例子來說:
String x = 'hello';
這句話,你知道hello這個字串在你的電腦上硬體中占用多少記憶體嗎?JS一定無法給你答案,但C或C++就可以。
因為JS的運作環境是在瀏覽器上,並不是在實機上,早期必須仰賴瀏覽器的既有的函式庫來支援其運作,但現在有node.js來輔助,才變得比較像在寫需編譯的程式。
C++與C語言的套件較少,甚至很多的設計是case by case的,許多函式或演算法需要自己設計,因此學習C++或C需要對程式、資料結構與計算機組織有相當程度的認識,才能運用自如,也才能體會它的強大。
程式語言的水很深的~~~

liuc772 iT邦新手 5 級 ‧ 2022-12-28 17:56:44 檢舉

是阿 一直很想問,當很多人再討論前後端語言的時候,卻沒有把C/C++放進來,原來是不能這麼分類的

3
海綿寶寶
iT邦大神 1 級 ‧ 2022-12-28 11:23:08

我覺得這問題可能不太需要認真討論
因為
樓主
2022-11-07/2022-11-15 還在問 HTML/CSS
2022-11-17 就開始初學 C++
2022-12-26 就初學 JS
照這速度看來
過年前應該會再換另一個語言
/images/emoticon/emoticon10.gif

揮揮手 iT邦研究生 5 級 ‧ 2022-12-28 11:25:21 檢舉

感覺下一個是python

liuc772 iT邦新手 5 級 ‧ 2022-12-28 17:53:16 檢舉

其實C++已經學過一陣子了,只是之前都是使用IDE而已,而且這問題課本和網路上似乎也都很少談到?至少我是沒看過

gn015643 iT邦新手 5 級 ‧ 2022-12-28 18:22:56 檢舉

欸. 不要以人廢言阿XD 是說你的回答也沒有什麼建設性阿,你應該也是非本科的吧,不像是瞭解原理的人,才能在這邊混到大神

畢竟IT邦本來就是以技術含量較低的Web和應用資訊系統為主阿XD

0
bill0704
iT邦新手 5 級 ‧ 2023-01-02 14:15:01

我個人非本科的想法

我覺得動態語言應該要感謝摩爾定律跟Google的v8等直譯器的優化,在十幾年前很難想像我們可以這樣浪費記憶體跟效能,不先確認變數型別還能做直譯

我也認同動態語言是趨勢,不僅寫起來直觀方便,讓很多非本科不需要很高的學習成本就能應用,但也不是所有的領域都不必追求速度跟效能,例如微晶片或韌體bios這些,所以C/C++依然不會消失

但我猜以後可能會出現AI編譯語言來一統江山,開發時你可以像python直譯測試你的code,但要部署時AI會幫你決定變數間最佳的型別跟記憶體用量,並編譯成高效能(給電腦看的)的機器語言,來兼具兩者的優點,我覺得這會是未來的趨勢

0
打雜工
iT邦研究生 1 級 ‧ 2023-01-21 09:21:12

要有更深入的控制,並須付出更嚴謹的代價,很多系統底層的運作,不嚴謹不行,很多作業系統及驅動程式都是透過嚴謹的程式語言開發的,這樣的結果就見怪不怪了

0
JamesDoge
iT邦高手 1 級 ‧ 2023-02-11 11:07:49

之前有一篇問題python想控制鍵盤滑鼠 寫遊戲外掛
https://ithelp.ithome.com.tw/questions/10211943

我說...因為遊戲開發商可能有特別的保護措施,防止外部程式控制鍵盤和滑鼠。
你用高階語言就當然會被一起擋掉
如果你用的程式語言越低階,越有機會不被偵測到
舉個例子
假設你買一隻巨集鍵盤滑鼠
他控制鍵盤滑鼠連點 走的是驅動程式,就可以用。
驅動程式通常是C或C++寫的
所以你會發現遊戲外掛都是C++寫的,甚至搭配一些組合語言來破解
如果一定要由python開發
您可以尋找看看pytho有沒有底層一些的第三方鍵鼠函式庫(C/C++)
但也不能保證在所有情況下都能正常工作。

C++有很多限制是因為它是一種靜態類型語言,它在編譯時對類型進行嚴格檢查,以保證程式碼的正確性。例如,它需要嚴格的定義類型,以及明確的定義數組的大小。這些限制幫助開發人員在編碼過程中儘早發現錯誤,並有助於保證程式碼的可靠性。

然而,這些限制也帶來了一些編碼的麻煩,因此,動態語言如JavaScript就誕生了。它更加靈活,不需要靜態的類型聲明,允許在運行時進行類型檢查。這使得JavaScript在快速原型開發中非常有用,但是它的程式碼不如C++等靜態語言的程式碼可靠。

JavaScript的靈活性是為了提高開發效率。
當你沾沾自喜的時候....就只能寫寫上層簡單一點的東西...

我要發表回答

立即登入回答