你好,哈布爾! 我向您展示 Stephen Wolfram 帖子的翻譯
Wolfram 語言一致性的先決條件
今天我們與程式語言一起站在了偉大成就的門檻上
Wolfram 函數儲存庫是由於 Wolfram 語言的獨特性質而成為可能,它不僅作為一種程式語言,而且作為一種
例如,Wolfram 函數儲存庫已包含
同樣超過
若要存取該頁面,請複製上述物件(函數 BLOB),將其貼上到輸入行中,然後運行該函數 - 它已內建於 Wolfram 語言中,並且預設支援從
這裡要注意的是,處理時
希望在大家的支持下
儲存庫中的函數可能包含用 Wolfram 語言編寫的小段或大段程式碼。 例如,這些可能是調用
Wolfram 特徵儲存庫的 shell 和程式設計結構的設計是為了讓每個人都能以最簡單、最方便的方式為共同事業做出貢獻 - 事實上,只需
這種方法有很多權衡和細節,但我們的目標是優化 Wolfram 功能儲存庫,既提高使用者體驗,也確保新的使用者功能對語言的開發做出有意義的貢獻。 隨著我們的成長,我毫不懷疑我們將不得不發明新的方法來處理和驗證儲存庫中內建的函數,尤其是組織大量函數並找到使用者需要的函數。 但令人鼓舞的是,我們選擇的道路是一個好的開始。 我個人
提高效率的同時降低成本
甚至在網路出現之前,就有了分享 Wolfram 語言程式碼的方法(我們的第一個主要集中式專案是
30 多年來,我們公司一直努力維護 Wolfram 語言結構的完整性,這對於確保 Wolfram 語言不僅成為一種程式語言,而且成為一種
每個函數的實作結構中都會發生各種計算過程。 這裡要注意的是,功能必須具有清晰、統一的外觀和使用者的視覺可讀性。 在這種情況下,Wolfram 語言的內建函數提供了超過 6000 個關於如何正確編程函數的連續範例(這些是我們的
創建一個實際上運作良好的儲存庫是一項有趣的元程式設計任務。 例如,程式中過多的限制將無法獲得演算法所需的統一性和通用性。 正如功能限制數量不足一樣,您將無法實現足夠正確的演算法執行順序。 先前我們公司實施的幾個實施這些方法折衷方案的範例運行得相當穩定 - 這些是:
所有上述範例都有一個基本特徵 - 專案中收集的物件和功能具有非常高的流程結構化和分佈程度。 當然,演示、神經網路或其他東西的結構細節可能會有很大差異,但任何目前儲存庫的基本結構始終保持不變。 那麼,親愛的用戶,您對創建這樣一個為 Wolfram 語言添加擴充功能的儲存庫有何看法? Wolfram 語言被設計得極其靈活,因此可以以任何方式擴展和修改。 這種情況對於使用 Wolfram 語言快速創建各種大型軟體專案的能力極為重要。 這裡要注意的是,隨著語言靈活性的提高,用這種語言實現的項目的成本必然會增加。 這是因為使用者使用這種語言越多,他獲得的專用功能就越多,但我們不應該忘記,這種方法也可能有負面影響,即無法確保程式模組的一致一致性。
傳統程式語言中的庫有一個常見問題 - 例如,如果您使用一個庫,程式碼將正常工作,但如果您嘗試使用多個庫,則無法保證它們能夠正確交互。 此外,在傳統的程式語言中(與成熟的計算語言不同),無法保證除基本結構之外的任何函數或資料類型存在一致的內建表示。 但事實上,問題比乍看之下還要嚴重:如果要建立大規模的垂直功能,那麼如果沒有我們投入 Wolfram 語言的集中式專案程式設計的巨大成本,就不可能實現一致性。 因此,所有軟體模組始終正確地協同工作非常重要。
因此,Wolfram 功能儲存庫背後的想法是透過更容易開發為連貫模組的各個功能,以相對較小的程式碼片段簡單地向語言添加擴展,從而避免上述問題。 話雖如此,有些程式設計功能無法透過單獨的函數來方便地實現(我們公司計劃在不久的將來發布優化的程式設計演算法,以幫助實現大規模軟體包)。 然而,基於 Wolfram 語言中已內建的函數,有許多基於單一函數實現的程式設計可能性。 這裡的想法是,用相對較少的程式設計工作就可以創建許多新的且非常有用的功能,這些功能將為設計提供足夠的一致性,它們將彼此很好地協調,而且除此之外,它們將來能夠在該語言中輕鬆且廣泛地使用。
當然,這種方法是一種妥協。 如果實現一個更大的包,可以想像一個全新的功能世界,它將非常強大且有用。 如果需要獲得與其他所有內容相適應的新功能,但您不願意花費大量精力來開發項目,那麼不幸的是,這可能會導致項目範圍縮小。 Wolfram 功能儲存庫背後的想法是為專案的定義部分提供功能;這種方法將添加強大的功能,同時更容易在程式設計專案中保持良好的一致性。
幫助將自訂函數新增至函數儲存庫
我們的團隊一直在努力讓使用者輕鬆為 Wolfram 儲存庫功能做出貢獻。 在桌面上(已經在
您需要執行兩個主要步驟:首先,實際寫下函數的程式碼,其次,寫下說明函數應如何運作的文件。
點擊頂部的“開啟範例”按鈕以查看您需要執行的操作的範例:
本質上,您正在嘗試創建類似於 Wolfram 語言中的內建函數的東西。 只是它可以做比內建函數更具體的事情。 同時,對其完整性和可靠性的期望也會低得多。
您需要為您的函數指定一個遵循 Wolfram 語言的函數命名準則的名稱。 此外,您還需要為您的函數開發文檔,類似於該語言的內建函數。 稍後我將更詳細地討論這一點。 現在,請注意在定義筆記本文件頂部的按鈕行中有一個按鈕
當您確定所有內容已正確填寫並且準備就緒後,請按一下「檢查」按鈕。 您還沒有弄清楚所有細節是完全正常的。 所以“檢查”功能會自動運行並進行大量的樣式和一致性檢查。 通常,它會立即提示您確認並接受更正(例如:“此行必須以冒號結尾”,並且會提示您輸入冒號)。 有時她會要求你自己添加或更改一些東西。 我們將持續在「檢查」按鈕的自動功能中新增功能,但基本上其目的是確保您提交到功能儲存庫的所有內容都已嚴格遵循盡可能多的樣式指南
因此,執行“檢查”後,您可以使用“預覽”。 「預覽」會建立您為函數定義的文件頁面的預覽。 您也可以為在您的電腦上建立的檔案或位於雲端儲存中的檔案建立預覽。 如果您由於某種原因對預覽中看到的內容不滿意,只需返回並進行必要的更正,然後再次按一下「預覽」按鈕即可。
現在您已準備好將函數推送到儲存庫中。 部署按鈕為您提供四個選項:
此步驟中重要的事情是您可以將函數提交到 Wolfram 函數儲存庫,以便任何人都可以使用它。 同時,您也可以為有限數量的使用者放置您的功能。 例如,您可以建立託管在您的電腦本機的函數,以便在您使用該特定電腦時可用。 或者您可以將其發佈在您的
假設您想要將函數實際提交到 Wolfram 函數知識庫。 為此,請點擊儲存庫的“提交”按鈕。 那麼現在發生了什麼事? 您的申請將立即排隊等待我們專門的策展人團隊的審核和批准。
當您的申請通過審批流程(通常需要幾天)時,您將收到有關其狀態的通訊以及可能對未來使用的建議。 但是,一旦您的功能獲得批准,它將立即發佈到 Wolfram 功能儲存庫,並可供任何人使用。 (這將出現在
儲存中應該有什麼?
需要指出的是,我們公司對完整性、可靠性和整體品質有非常高的標準,在過去 6000 多年裡我們已經內建到 Wolfram 語言中的 30 多個功能中,全部滿足上述要求。 Wolfram 函數儲存庫的目標是使用 Wolfram 語言中已有的所有結構和功能,以便添加盡可能多的輕量級函數(即更高效能的函數)。
當然,Wolfram 函數儲存庫中的函數必須符合 Wolfram 語言的設計原則 - 以便它們能夠與其他函數充分互動以及使用者對函數應如何正常運作的期望。 然而,這些功能不必具有同等的完整性或可靠性。
在 Wolfram 語言的內建函數中,我們努力使程式設計函數盡可能通用。 話雖這麼說,當您在 Wolfram 函數儲存庫中時,其中包含一個僅處理一些非常具體但有用的情況的函數並沒有什麼問題。 例如,函數
與內建功能相關的另一點是,我們公司盡力處理所有非典型情況,正確處理錯誤的輸入等等。 在函數儲存庫中,有一個特殊函數處理解決問題的主要情況並忽略所有其他情況是完全正常的。
顯而易見的一點是,最好擁有做得更多、做得更好的函數,但是函數儲存庫的最佳化(與Wolfram 語言的內建函數相反)應該將更多函數與更多函數捆綁在一起,而不是深入研究各個具體功能的實現流程。
現在讓我們來看一個在儲存庫中測試函數的範例。 對此類函數的一致性期望自然遠低於內建語言函數。 在函數依賴 API 等外部資源的情況下尤其如此,持續進行一致的測試非常重要,這會在驗證演算法中自動發生。 在 nb 檔案中,您可以明確指定定義(在「附加資訊」部分中)並指定由輸入和輸出字串或類型的完整字元物件定義的盡可能多的測試
因此,函數存儲庫將具有許多實作複雜性。 有些只是一行程式碼,其他的可能涉及數千或數萬行,可能使用許多輔助函數。 什麼時候值得加入一個需要很少程式碼來定義的函數? 基本上,如果對於一個函數有
函數儲存庫(顧名思義)的主要目的是向語言中引入新功能。 如果您想新增資料或
實際上有兩種方法。 您可能想要引入將在函數儲存庫中的新函數中使用的新物件類型。 在這種情況下,您始終可以寫下其符號表示形式,並在函數儲存庫中輸入或輸出函數時使用它。
但是,如果您想要表示一個對象,然後透過 Wolfram 語言中的現有函數定義您想要使用的對象,該怎麼辦? Wolfram 語言總是為此提供一個輕量級機制,稱為
那麼,函數儲存庫中的函數程式碼可能包含哪些內容呢?
Wolfram 功能儲存庫的所有程式碼都應該用 Wolfram 寫嗎? 當然,外部API內部的程式碼不應該用Wolfram語言寫,它甚至不構成語言程式碼。 事實上,如果您在幾乎任何外部語言或庫中找到一個函數,您可以建立一個包裝器,讓您在 Wolfram 函數儲存庫中使用它。 (通常您應該使用內建函數來實現此目的
那麼這樣做有什麼意義呢? 從本質上講,這允許您使用整個整合的 Wolfram 語言系統及其整套統一的軟體功能。 如果您從外部庫或語言獲得基本實現,則可以使用 Wolfram 語言豐富的符號結構來創建方便的頂級函數,使用戶可以輕鬆使用已實現的任何功能. 至少,在加載庫等的所有構建塊都存在的理想世界中,這應該是可行的,在這種情況下,它們將由 Wolfram 語言自動處理。 (需要注意的是,實際應用中可能會出現問題
順便說一句,當您第一次查看典型的外部庫時,它們通常看起來太複雜,無法僅使用幾個函數來涵蓋,但在許多情況下,大部分複雜性來自於創建庫所需的基礎設施以及所有功能。支援一下。 然而,當使用 Wolfram 語言時,基礎設施通常已經內建到套件中,因此不需要詳細公開所有這些支援函數,而只需為庫中「最頂層」的應用程式特定函數建立函數。
知識庫的“生態系統”
如果您編寫了經常使用的函數,請將它們提交至 Wolfram 函數儲存庫! 如果沒有產生更多的東西(語言開發),那麼即使這樣,您使用這些功能供個人使用也會方便得多。 然而,可以合理地假設,如果您定期使用這些功能,也許其他用戶也會發現它們很有用。
當然,您可能會發現自己處於無法或不想共享您的功能或無法存取私人資訊資源的情況。 即使在這種情況下,您也可以簡單地將功能部署在您自己的雲端帳戶中,
您提交到 Wolfram 函數儲存庫的函數不必是完美的; 它們必須是有用的。 這有點像經典 Unix 文件中的“錯誤”部分 - 在“定義部分”中有一個“作者註釋”部分,您可以在其中描述您已經了解的函數的限制、問題等。 此外,當您將功能提交至儲存庫時,您可以新增提交註釋,這些註釋將由專門的策展人團隊閱讀。
一旦功能發布,其頁面底部總是有兩個連結:“
有時您只想使用 Wolfram 函數儲存庫中的函數,例如內建函數,而不查看其程式碼。 然而,如果你想看看裡面,頂部總是有一個記事本按鈕。 單擊它,您將獲得提交到功能存儲庫的原始定義筆記本的副本。 有時您可以將其用作您需要的範例。 同時,您也可以自行開發修改此功能。 您可能希望將這些從儲存庫中找到的函數發佈到您的電腦或您的 aphid 雲端儲存帳戶中,也許您希望將它們提交到函數知識庫,也許作為原始函數的改進、擴展版本。
將來,我們計劃支援 Git 風格的功能存儲庫分叉,但現在我們試圖保持簡單,並且我們始終只為語言中內建的每個功能提供一個可接受的版本。 通常情況下(除非開發人員放棄維護他們開發的功能並響應用戶提交),該功能的原始作者控制其更新並提交新版本,然後進行審核,如果他們通過了審核流程,以該語言出版。
讓我們考慮一下開發功能的「版本控制」如何運作的問題。 現在,當您使用函數儲存庫中的函數時,其定義將永久儲存在您的電腦上(如果您使用雲,則儲存在您的雲端帳戶中)。 如果某功能有新版本可用,下次使用時您將收到一則訊息通知您。 如果您想將該功能更新至新版本,可以使用以下命令來完成
Wolfram 函數儲存庫的優點之一是任何地方的任何 Wolfram 語言程式都可以使用其中的函數。 如果程式出現在記事本中,則通常可以方便地將儲存庫函數格式化為易於閱讀的「函數二進位物件」函數(可能具有適當的版本集)。
您始終可以使用文字存取函數儲存庫中的任何函數
它是如何工作的呢?
在 Wolfram 儲存庫的函數內部,可以使用完全相同的函數
考慮
裡面可以看到一些使用函數的信息
如何設定資源功能? 最簡單的就是純粹的本地案例。 下面是一個範例,它採用一個函數(在本例中只是一個純函數)並將其定義為給定程式會話的資源函數:
定義完成後,就可以使用資源函數:
請注意,該函數 blob 中有一個黑色圖標 。 這意味著BLOB函數指的是為目前會話定義的記憶體資源函數。 永久儲存在您的電腦或雲端帳戶上的資源功能具有灰色圖標 。 Wolfram 功能存儲庫中的官方資源功能有一個橙色圖標 .
那麼當您使用定義筆記本中的展開選單時會發生什麼? 首先,它會取得記事本中的所有定義,並從中建立一個符號
使用以下命令從電腦上的儲存庫本機部署函數
如果按一下函數儲存庫的「提交」按鈕,其下方會發生什麼
預設情況下,提交是用與您的 Wolfram ID 關聯的名稱進行的。 但如果您代表開發團隊或組織提交申請,您可以
將任何函數提交到函數知識庫後,它將排隊等待審核。 如果您收到回覆評論,它們通常採用文字檔案的形式,並添加了額外的「評論儲存格」。 您可以隨時造訪以下網站查看您的申請狀態
工作中的一些微妙之處
乍一看,您似乎可以只需要一個定義筆記本並將其逐字放入函數存儲庫中,但是,實際上涉及很多微妙之處 - 處理它們需要進行一些相當複雜的元編程,處理符號處理作為定義函數的程式碼,以及記事本本身的定義。 其中大部分發生在內部、幕後,但如果您要為功能知識庫做出貢獻,它可能會產生一些值得理解的含義。
第一個直接的微妙之處:當您填寫定義筆記本時,您可以使用類似的名稱在任何地方簡單地引用您的函數 我的函數,它看起來像 Wolfram 語言中函數的常規名稱,但對於函數存儲庫文檔,它被替換
第二個微妙之處:當您從定義筆記本建立資源函數時,必須擷取並明確包含函數定義中涉及的所有相依性。 然而,為了確保定義保持模組化,您需要將所有內容放在一個唯一的
通常,您永遠不會看到任何用於配置此命名空間的程式碼的痕跡。 但是,如果由於某種原因您在函數內呼叫了未執行的符號,那麼您將看到該符號位於函數的內部上下文中。 然而,在處理定義記事本時,至少函數本身對應的符號是
函數存儲庫用於定義新函數。 並且這些功能可能有選項。 通常這些參數(例如,
大多數函數只是在每次呼叫時執行它們應該執行的操作,但有些函數需要在特定會話中運行之前進行初始化 - 為了解決這個問題,定義部分中有一個「初始化」部分。
儲存庫中的函數可以使用儲存庫中已有的其他函數;為了為包含兩個(或更多)相互引用的函數的函數儲存庫設定定義,您必須將它們部署在程式會話中,以便您可以像他們一樣參考
發展前景。 當儲存庫變得非常大時會發生什麼?
今天我們剛推出 Wolfram 特徵儲存庫,但隨著時間的推移,我們預計它的大小和功能可能會急劇增加,並且隨著它的發展不斷增長,我們已經預計可能會出現各種問題。
第一個問題涉及函數名稱及其唯一性。 函數儲存庫的設計方式與 Wolfram 語言中的內建函數一樣,您只需指定函數名稱即可引用任何給定函數。 但這不可避免地意味著函數名稱在整個儲存庫中必須是全域唯一的,因此,例如,只能有一個
乍一看,這似乎是一個大問題,但值得注意的是,這基本上與互聯網域或社交媒體句柄等問題相同。 事實上,系統只需要一個註冊器 - 這是我們公司將為 Wolfram 函數知識庫扮演的角色之一。 (對於儲存庫的私人版本,其註冊商可能是管理員。)當然,可以在沒有任何內容的情況下註冊Internet 網域,但在函數儲存庫中,只有在存在實際定義的情況下才能註冊函數名稱。功能。
我們在管理 Wolfram 函數知識庫方面的部分職責是確保為函數選擇的名稱在給定函數定義的情況下是合乎邏輯的,並且它遵循 Wolfram 語言命名約定。 我們在 Wolfram 語言中命名內建函數方面擁有 30 多年的經驗,我們的管理者團隊也將把這些經驗帶到函數儲存庫中。 當然,總有例外。 例如,對某些函數使用簡短的名稱似乎更可取,但最好使用更長、更具體的名稱來“捍衛”,因為您將來不太可能遇到想要創建類似函數名稱的人。
(這裡應該注意的是,簡單地添加一些成員標籤來消除函數歧義不會達到預期的效果。因為除非您堅持始終分配標籤,否則您將需要為任何給定函數定義預設標籤,並指派作者標籤,這又需要全球協調。)
隨著 Wolfram 函數知識庫的增長,可能出現的問題之一是函數的可發現性,系統為此提供了
對於 Wolfram 語言中的內建函數,有一個所謂的檢測層,由
Wolfram 函數儲存庫被配置為持久性函數儲存庫,其中的任何函數都將始終有效。 當然,新版本的功能可能會可用,我們預計某些功能當然會隨著時間的推移而過時。 如果這些函數在程式中使用,它們可以工作,但它們的文件頁面將連結到新的、更高級的函數。
Wolfram 功能儲存庫旨在協助您快速發現新功能並學習使用 Wolfram 語言的新方法。 我們非常樂觀地認為,功能性儲存庫中探索的一些內容最終將成為核心 Wolfram 語言的內建部分。 在過去的十年裡,我們有過類似的系列
這裡最重要的是,函數儲存庫中的函數現在可供每個使用者使用。 原生語言功能可能會更好、效能更高,但功能儲存庫將允許使用者立即存取所有新功能。 而且,最重要的是,這個概念允許每個人添加他們想要的任何新功能。
在Wolfram 語言歷史的早期,這個想法不會像現在這樣有效,但在現階段,人們在該語言上投入瞭如此多的努力,並且對語言設計原理有瞭如此深刻的理解,以至於現在看來非常有效。大型用戶社群可以添加保持設計一致性的功能,使其對廣泛的用戶有用。
Wolfram 語言使用者社群中有一種令人難以置信的人才精神(?)。 (當然,這個社區包括許多各個領域的領先研發人員。)我希望 Wolfram Feature Repository 能夠為釋放和傳播這種人才精神提供一個有效的平台。 只有共同努力,我們才能創造出能夠顯著擴展 Wolfram 語言計算範式的應用領域的東西。
30 多年來,我們在 Wolfram 語言方面取得了長足的進步。 現在,讓我們一起走得更遠。 我強烈鼓勵世界各地所有受人尊敬的 Wolfram 語言使用者使用函數儲存庫作為平台,以及新的軟體項目,例如面向開發人員的免費 Wolfram 引擎。
來源: www.habr.com