色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是函數式編程?使用函數式編程為什么會有幫助呢?

中科院半導體所 ? 來源:悅智網 ? 2023-03-28 10:04 ? 次閱讀

你可能認為軟件產品生命周期中耗時最長、費用最高的階段是系統的初期開發階段,因為所有美妙的功能都是在這一階段構想出來的。而事實上,最困難的部分是后期的維護階段。在這個階段,程序員將為自己在開發過程中走的捷徑付出代價。那么,程序員為什么要走捷徑?可能性有很多:也許他們沒有意識到自己在“投機取巧”;只有代碼被許多用戶部署并執行時,隱藏的漏洞才會暴露出來;開發人員時間緊,也可能導致缺陷;此外,產品上市時間的壓力幾乎肯定會讓軟件包含更多的錯誤。

大多數公司維護代碼的難題導致了第二個問題:脆弱性。添加到代碼中的每個新功能都會增加代碼的復雜性,從而增加程序中斷的機會。軟件變得越來越復雜,開發人員因為害怕出現程序中斷,如非絕對必要,都盡量避免改動軟件,這是很普遍的現象。在許多公司中,整個開發團隊的工作不是為了做任何新的開發,而只是為了保持現有系統的運行。你可能會說,這就像是軟件版本的紅皇后效應,奮力奔跑只是為了停在原地。

這種現狀令人遺憾。然而,軟件行業目前的發展趨勢就是復雜度越來越高、產品開發時間越來越長、運行系統的脆弱性越來越高。公司一般只能投入更多人力來解決這些問題:更多的開發人員、更多的測試人員、更多的技術人員在發現系統漏洞時及時干預。

當然,一定有更好的方法。越來越多的開發人員認為這一問題的答案可能是函數式編程。本文中,我描述了什么是函數式編程,使用函數式編程為什么會有幫助,以及我為何如此熱衷于函數式編程。

為更好地理解函數式編程的基本原理,我們先回顧半個多世紀前發生的事情。20世紀60年代后期,為了提高代碼質量,減少所需的開發時間,一種編程范式應運而生,稱為結構化編程。

各種語言的出現促進了結構化編程的發展,為了更好地支持結構化編程,一些已有的語言被修改。結構化編程語言最顯著的特征之一,是消除了一個長期存在的特征:GOTO語句。

GOTO語句用于程序執行的重新定向。程序流不是按順序執行下一條語句,而是重定向至其他某個語句,即GOTO行中指定的語句,通常需滿足某些條件。

取消GOTO語句是基于程序員在使用GOTO的過程中學到的教訓——它讓程序非常難以理解。帶有GOTO語句的程序通常被稱為“意大利面代碼”,因為指令序列執行可能就像一碗意大利面,難以單鏈跟隨。

開發人員無法理解自己的代碼是如何工作的,或者為什么代碼有時不工作,這是一個復雜的問題。那個時代的軟件專家認為,GOTO語句造成了不必要的復雜性,因此必須消除這些GOTO語句。

這在當時是頗為激進的想法,許多程序員拒絕消除自己一直依賴的語句。相關爭論持續了十多年,最終,GOTO不存在了,今天也沒人主張它再次回歸。這是因為在高級編程語言中消除GOTO語句大大降低了復雜度,提高了生產軟件的可靠性。這是通過對程序員的限制實現的,其結果是程序員更容易推理自己編寫的代碼。

盡管軟件行業已經從現代高級語言中消除了GOTO語句,但軟件的復雜度和脆弱性仍在繼續上升。如果想看看還能修改哪些編程語言以避開一些常見的陷阱,你會很奇怪地發現,軟件設計師往往能在硬件同行那里找到靈感。

在設計計算機硬件時,電阻不能共用,比如鍵盤和顯示器電路就不能共用電阻。但程序員在軟件中卻一直在做這種共用,也就是全局狀態共享:變量不由某一個進程所有,而可由任意數量的進程進行更改,甚至可以同時更改。

現在,想象一下,你每次使用微波爐時,洗碗機的循環設置會從一般程序變為瓶罐清洗程序。當然,這在現實世界中并不會發生,但在軟件中,這樣的情況卻一直出現。程序員編寫調用一個函數的代碼,期望執行單個任務。但是許多函數都有副作用,會改變共享的全局狀態,從而導致意想不到的后果。

在硬件中,這種情況不會發生,因為物理定律限制了這種可能性。當然,硬件工程師也可能會搞砸,但不像軟件那樣有太多的可能,且有好有壞。

另一個潛藏在軟件“沼澤”中的復雜怪物被稱為空引用,即引用內存中某個位置根本不指向任何內容。一旦嘗試使用此引用,就會出現錯誤。因此,程序員必須牢記,在嘗試讀取或更改引用的內容前,需檢查該引用是否為空。

當今幾乎所有流行的語言都存在這一缺陷。先驅計算機科學家托尼?霍爾(Tony Hoare)早在1965年就在ALGOL語言中引入了空引用,空引用后來被納入許多其他語言?;魻柦忉屨f,自己這樣做“僅僅是因為它很容易實施”,但今天他認為這是一個“數十億美元的錯誤”。因為當程序員期望的是有效引用而實際上是空引用時,便會導致無數錯誤。

軟件開發人員需要非常自律,才能避免此類陷阱,但有時他們沒有采取足夠的預防措施。結構化編程的架構師知道GOTO語句確實是陷阱,未給開發人員留下任何逃避的借口。為保證無GOTO語句的代碼獲得預期的清晰度改善,他們知道必須在結構化編程語言中完全消除GOTO語句。

歷史證明,刪除危險特征可大大提高代碼的質量。今天,許多危險的習慣做法損害了軟件的魯棒性和可維護性。幾乎所有現代編程語言均有某種形式的空引用、全局狀態共享和帶有副作用的函數,這些要比GOTO語句糟糕得多。

如何消除這些缺陷?事實證明,答案已經存在幾十年:純函數式編程語言。

第一個流行的純函數式語言稱為Haskell,創建于1990年。因此,軟件開發領域如今依舊面臨的棘手問題早在20世紀90年代中期便已有了解決方案。遺憾的是,當時的硬件通常不夠強大,無法使用該解決方案。但今天的處理器已經能夠輕松管理Haskell和其他純函數式語言的需求。

事實上,基于純函數的軟件特別適合現代多核CPU。這是因為純函數僅靠輸入參數運行,因而不同函數間不可能存在交互。這使我們可以對編譯器進行優化,生成在多個內核上高效、輕松運行的代碼。

顧名思義,純函數式編程意味著開發人員只能編寫純函數,既然是純函數,便不會產生副作用。這種限制提高了穩定性,打開了編譯器優化的大門,最終生成的代碼更容易推理。

但若是函數需要知道或操作某個系統的狀態,又該如何?這種情況下,狀態會由一長串“組合函數”進行傳遞——一個函數將其輸出傳遞給下一個函數作為輸入。將狀態自一個函數傳遞至另一個函數,每個函數都可以訪問該狀態,且不會出現另一個并發程序線程對該狀態進行修改——這是在太多程序中發現的常見且代價高昂的脆弱性。

函數式編程亦可解決霍爾的“十億美元錯誤”:空引用。解決的方法是不允許值為空。另外,有一種結構通常稱為Maybe(或某些語言中的Option)。Maybe的值可以是Nothing或Just。使用Maybe結構,開發人員不得不始終考慮這兩種情況。在這件事上他們別無選擇,每一次遇到Maybe時都必須處理Nothing的情況。這樣做可以消除空引用可能造成的許多錯誤。

7d264e62-ccae-11ed-bfe3-dac502259ad0.jpg

函數式編程還要求數據不可變,這意味著一旦將變量設置為某個值,該值就永遠不變。變量更像是數學中的變量。

例如,要計算方程y= x2+ 2x - 11,需要為x選擇一個值,并且在計算y的過程中,x都不會取不同的值。因此,計算x2時使用的x值與計算2 x時所用的x值是相同的。在大多數編程語言中沒有這樣的限制。可以使用一個值計算x2,然后在計算2 x之前更改x的值。不允許開發人員將賦值更改(變異),他們可以使用與中學代數課相同的推理過程。

與大多數語言不同,函數式編程語言深深植根于數學。這種邏輯極為嚴密的數學血統正是函數式語言最大的優勢。

為何是這樣?因為人們研究數學的歷史已有數千年之久。它牢不可破。而大多數編程范式(如面向對象的編程)背后的歷史最多只有60年,相比之下顯得粗糙且不成熟。

不妨通過一個例子來說明編程與數學相比有多“草率”。通常情況下,我們會告訴編程新手在第一次遇到語句x = x + 1時忘記自己在數學課上學的東西。在數學中,這個方程為零解。但在當今的大多數編程語言中,x = x + 1不是一個等式。它是一個語句,命令計算機讀取x的值,將其加1后,放回名為x的變量中。

在函數式編程中,沒有語句,只有表達式。我們在用函數式語言編寫代碼時可以使用在中學學到的數學思維。

由于函數的純粹性,我們可以使用代數替換來推理代碼,從而幫助降低代碼復雜性,就像回到代數課上,降低方程復雜性一樣。在非函數式語言(命令式語言)中,則并無同等機制來推理代碼是如何工作的。

純函數式編程刪除了編程語言中的危險特征,解決了我們行業中的許多大問題,開發人員也不容易出現“搬起石頭砸自己的腳”的問題。這些限制起初可能看來很極端,我可以肯定地說,20世紀60年代開發人員對消除GOTO也有相同感。但事實是,使用函數式語言既不失自由,功能又強大,以至于當今幾乎所有最流行的語言都包含了函數功能,盡管它們本質上仍然是命令式語言。

這種混和編程方法的最大問題在于它仍然允許開發人員忽略語言的函數性質。如果50年前保留GOTO作為一個選項,我們可能至今仍面臨著“意大利面代碼”的困境。

要獲得純函數式編程語言的全部好處,就不能妥協。需要使用從一開始就符合這些原則設計的語言。只有這樣,才能獲得本文闡述的許多益處。

7d684fce-ccae-11ed-bfe3-dac502259ad0.jpg

但函數式編程并非易事,要有所付出。學習使用此類函數范式編程幾乎就像從頭再學編程一樣。許多情況下,開發人員必須學習那些學校里不曾教過的數學知識。所需的數學并不難,但是新知識,而且對于數學恐懼癥人群來說很可怕。

更重要的是,開發人員需要學習一種新的思維方式。因為不熟悉,起初這會讓人感到有負擔。但隨著時間的推移,新的思維方式習慣成自然,與舊的思維方式相比,最終減少了認知成本,效率也就會大幅提升。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19265

    瀏覽量

    229684
  • 編程語言
    +關注

    關注

    10

    文章

    1942

    瀏覽量

    34714
  • 編譯器
    +關注

    關注

    1

    文章

    1624

    瀏覽量

    49111
  • 函數式編程
    +關注

    關注

    0

    文章

    11

    瀏覽量

    2062

原文標題:函數式編程減少漏洞的新方法

文章出處:【微信號:bdtdsj,微信公眾號:中科院半導體所】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Golang函數編程簡述

    函數編程(Functional Programming / FP)作為一種編程范式,具有無狀態、無副作用、并發友好、抽象程度高等優點。目前流行的
    發表于 08-09 12:32 ?490次閱讀

    前端開發之函數編程實踐

    函數編程是一種編程范式,它將程序抽象為函數和數據結構,通過函數調用來實現程序的功能,并且
    發表于 06-05 10:19 ?459次閱讀
    前端開發之<b class='flag-5'>函數</b><b class='flag-5'>式</b><b class='flag-5'>編程</b>實踐

    在Java中應用函數編程請小心!

    a這并不是要對令人畏懼的函數編程進行譴責,而是對編程中很容易發生的一些錯誤進行警醒。高階函數函數
    發表于 01-13 15:39

    函數編程有什么優勢

    為什么要函數編程
    發表于 04-22 08:44

    函數編程思維

    函數編程思維
    發表于 09-07 14:57 ?7次下載
    <b class='flag-5'>函數</b><b class='flag-5'>式</b><b class='flag-5'>編程</b>思維

    現代C函數編程

    導讀:本文作者從介紹函數編程的概念入手,分析了函數編程的表現形式和特性,最終通過現代C++的
    發表于 09-30 16:43 ?2次下載

    函數編程的基本特性

    本文簡單介紹了一下函數編程的各種基本特性,希望能夠對于準備使用函數編程的人起到一定入門作用。
    發表于 10-10 10:23 ?0次下載

    函數編程,性能,測試,編碼規范談Python

    個程序員能將這四個方面的內容知識都吸收消化,那他/她不管怎樣都會有巨大的收獲。 函數編程 命令編程
    發表于 10-12 17:27 ?0次下載

    函數編程語言、編程和程序驗證

    函數編程是一種編程范型,它把計算看作是對數學函數的求值,避免了狀態和易變數據結構,函數是構造程
    發表于 04-03 11:01 ?3次下載

    正在使用的區塊鏈函數編程語言協議有哪些?

    在區塊鏈平臺開發中使用的一些最著名的編程語言是面向對象的語言。到目前為止,像C++、Python和Ruby這樣的語言已經主導了區塊鏈的發展場景。 如果最近的發展有什么可說的,那么非函數編程
    發表于 10-15 11:18 ?1439次閱讀

    為什么函數編程正在上升函數編程語言有哪些

    編程范例是一個術語,用于描述編寫命令的方法。 語言的真正思想是建立在其編程范例之上的。 最著名的三種范例是面向對象的程序設計,命令程序設計和函數
    的頭像 發表于 02-24 15:06 ?3764次閱讀

    基于標準庫函數與基于HAL庫函數的stm32編程方式對比

    以實例程序(串口通信),分析基于標準庫函數與基于HAL庫函數的stm32編程方式的差異一、基于標準庫函數的stm32編程方式二、基于HAL庫
    發表于 12-28 19:09 ?30次下載
    基于標準庫<b class='flag-5'>函數</b>與基于HAL庫<b class='flag-5'>函數</b>的stm32<b class='flag-5'>編程</b>方式對比

    深入理解函數編程(上)

    函數編程是一種歷史悠久的編程范式。作為演算法,它的歷史可以追溯到現代計算機誕生之前的λ演算,本文希望帶大家快速了解函數
    的頭像 發表于 11-02 11:48 ?721次閱讀

    深入理解函數編程(下)

    函數編程是一種歷史悠久的編程范式。作為演算法,它的歷史可以追溯到現代計算機誕生之前的λ演算,本文希望帶大家快速了解函數
    的頭像 發表于 11-02 11:49 ?795次閱讀

    Python的函數編程介紹

    代碼的時候,拆成不同的函數,可以大大的提高代碼易讀性。 函數編程 函數
    的頭像 發表于 09-27 16:54 ?1097次閱讀
    主站蜘蛛池模板: 欧美白妞大战非洲大炮| 久久一er精这里有精品| 国产精品婷婷久青青原| 国产亚洲精品97在线视频一| 亚洲第一成年人网站| 亚洲AV无码乱码A片无码蜜桃 | 调教玩弄奶头乳夹开乳震动器| 扒开校花粉嫩小泬喷潮漫画| 最近韩国HD免费观看国语| 97午夜精品| 成人在线不卡视频| free高跟丝袜秘书hd| 成人a毛片久久免费播放| 国产精品国产三级国产专区53| 果冻传媒免费观看| 久久亚洲国产精品亚洲| 日本wwwxx| 日本边添边摸边做边爱边| 伸到同桌奶罩里捏她胸h| 亚洲精品视频在线免费| 2022国产精品不卡a| 中文字幕午夜乱理片| good神马电影伦理午夜| 国产精品人妻系列21P| 久草青青在线| 国产在线视频在线观看| 快插我我好湿啊公交车上做| 日韩高清特级特黄毛片| 亚洲色大成网站www久久九九| 99精品热视频30在线热视频 | 91九色麻豆| 国产成人a v在线影院| 久久99AV无色码人妻蜜| 琪琪色在线播放| 欧美整片华人play| 亚洲高清视频一区| 99久久中文字幕伊人情人| 国产午夜精AV在线麻豆| 欧美大片免费观看| 亚洲精品成人在线| good神马电影伦理午夜|