Java和C#最大的不同是什么?
我覺得除了語法,最重要的是對底層的掌控能力不同。
雖然C#一開始借鑒了Java,但其目的根本不是為了構建一個更好的Java,而是為了構建一個更好的C,游戲引擎更喜歡C#就是這個原因。
例如,在C#中可以做什么:
上面的代碼會輸出10,為什么?因為數組的長度。NET存儲在數組第一個元素之前的8字節內存中。如果您隨后輸出*(long*)p-2),您將直接獲得該對象的TypeHandle地址:
然后拿著這個指針,就可以訪問對象的MethodTable了。
此外,您可以在堆棧上手動分配空間:
然后,您希望繞過GC,直接手動分配堆內存:
以上調用相當于C語言中你調用的malloc,此外還有AllocAligned,Realloc,AllocZeroed等等,可以直接控制內存對齊。
接下來,您希望創建一個具有顯式內存布局的結構Foo:
那么你就成功模擬了C的一個并集,之所以會有上面的輸出,是因為單精度浮點數1的二進制表示是0x01111111000000000000000000000000,在小終端模式存儲后占用了4個字節,分別是0x00000000000、0x0000000000、0x000000000。
此外,您可以直接從內存數據構造對象,而無需任何復制開銷:
甚至像這樣:
從堆內存中創建自然很好:
再比如,此時你有一個用C寫的庫,里面有這樣一段代碼:
然后我們編寫下面的C#代碼:
上面的代碼做了什么?我們把C#的函數指針傳入C代碼,然后在C端調用C#函數生成一個字符串wwwww,然后把字符串返回給C#端。它不使用委托而不是函數指針并不重要,因為函數指針在。網。
即使我們沒有。;我不想要。NET要導入foo.dll,而我們想自己決定動態庫的生命周期,我們也可以寫:
以上都不是特定于Windows和導入的。所以還有。Linux和macOS上的dylib是完全不可能的。
此外,我們有一些數據,我們想計算,但我們想使用SIMD進行處理,所以我們只需要寫:
您可以看到在X86平臺上生成了什么代碼:
平臺判斷的分支會被JIT自動淘汰。但事實上,除了手動編寫SIMD,代碼,前兩個分支可以不寫,只留:
因為在這個階段,當循環邊界條件是向量長度時,。NET會自動為我們做定向量化,擴展循環。
然后繼續,我們還有ref,in和out來傳遞引用。
假設我們有一個大的struct,為了避免傳遞時的復制,我們可以直接使用in進行只讀引用傳遞:
對于小型結構,為。NET有特殊的優化來幫助我們完全消除內存分配,并將結構完全放在寄存器中,如下面的代碼:
上面的代碼GetDistance被認為是一個熱路徑,所以我添加了它來指示JIT有保證地內聯這個函數,最后生成了下面的代碼進行測試:
整個過程沒有訪問內存的指令,效率非常高。
我們也可以借用ref的引用語義來做就地更新:
它甚至可以用于指針和手動分配內存:
與Java不同,C#中的泛型真正專門化了所有的類型參數(雖然運行時分布用于引用類型的共享實現),這意味著性能可以得到最大程度的保證,對應的類型根據類型參數的大小有專門的內存布局。還是上面的點例子,我們將下面的數據int替換為泛型參數t,并對值類型number進行泛型約束:
無論是Test1還是Test2,生成的代碼都很優秀,不僅沒有打包和解包,而且沒有訪問操作:
然后,我們有時為了高性能想暫時中止GC恢復,就一句簡單的話:
如果你還能分配128mb的內存,你可以告訴GC不要回收,然后一段時間后,即使我們在這個預算中分配內存,也不會發生GC。它甚至可以防止在內存分配不足時阻塞完全垃圾收集:
代碼執行完畢,最后一次調用a:
您可以恢復GC行為。
此外,我們還可以指定GC在運行時的模式,以最大限度地提高性能:
此外,我們甚至可以直接在堆內存中執行代碼,創建一個JIT。NET中,直接從內存中創建一個可執行區,然后在其中插入一段代碼來添加兩個32位整數:
除此之外,C#還有無數底層的編寫方法與操作系統交互,甚至使用C#的編譯器解除與自身標準庫的鏈接,直接從0開始構建基本類型,然后通過NativeAOT編譯出完全無GC、可以在裸機硬件上執行引導系統的EFI固件也是沒有問題的。
此外,還有ILGPU,它允許您直接在GPU和嵌入式設備上運行C#代碼。我可以直接操作I2C,PWM,GPIO等等,就不多舉例了。
而C#已經進入了roadmap的后續更新:允許引用字段的聲明,增加類型表示定長內存,允許傳遞數組時消除數組分配,允許棧上任何對象的分配等等。,所有這些都在改善這些基礎性能設施。
那個這是我認為C#和Java最大的區別。
在C#中,當你不t需要這些東西,它們好像從來不存在,允許動態類型,不斷吸收各種功能特性,各種語法糖加持。簡單性和靈活性。;甚至不會失去Python,所以你可以愉快而簡單地編寫各種代碼。一旦你需要,你就可以擁有從上到下幾乎完全的控制能力,而這些能力會讓你在必要的時候不用思考各種奇怪的變通方法,直接把機器榨干,達到C和C的性能,甚至因為運行時PGO而超過C和C的性能。
哪種計算機編程語言更適合未來技術:人工智能,大數據,機器人?
肖曉峰仔細分析道,大數據、人工智能、機器人其實是息息相關的,所以被稱為AI時代頭號語言的Python無疑是首選語言。
機器人實現的核心是人工智能。而人工智能則是依靠大數據收集和分析,通過各種算法進行深度學習,最終達到目的。Python在這里每個領域都有很強的優勢。
1.大數據的收集和分發離不開【爬蟲】和【云計算】。Python在爬蟲領域幾乎是霸主。無論是自動化、高性能異步IO、爬蟲策略、分布式爬蟲,Python都是最好的解決方案。云計算方面,曾經流行的OpenStack,底層是Python。如果想高度定制,當然用Python。
2.隨著5G時代的到來,通信和網絡都上了一個新臺階,網絡編程是一個重點。Python在協議、封裝和解包的底層都有成熟的機制和技術。被稱為Python網絡框架的四大天王(Django、Tornado、Flask、Twisted),已經足夠出名了。
3.科算和分析,Python還是比較強的,大量復雜的科算形成了基于Python的各種庫,比如SciPy,NumPy,Matplotlib等等。此外,Python在需要繪制2D和3D圖像時沒有壓力。
4.說到深度學習,不得不提一個高端職業:算法工程師。Python逐漸成為算法工程師的標準語言。在深度學習領域開始火熱的PyTorch甚至比TensorFlow還要兇猛,直接決定了Python人工智能時代的頂級語言地位。
5.機器在人類編程領域,你應該聽說過ROS。被稱為暴發戶的Python已經成為ROS的兩大編程語言之一,趕上了C/C膠水"語言使Python和C/C能夠無縫集成。目前越來越多的電子產品開始開箱支持Python。
在自動化運維、桌面軟件、游戲開發等領域也有不少表現。我贏了。;這里就不一一列舉了。
其實就像我們建筑師大大說的,每一種語言都有自己的特點,用好了就能發揮出最大的價值。Python,Java,C/C,新時代的舞臺,都會有他們的影子。另外,最受歡迎的Rust可能也是一匹黑馬。
回答完畢,望采納!讓攜手進入人工智能新時代!!!