題:
是否發布可運行代碼而不是偽代碼?
Björn Lindqvist
2019-12-03 18:30:02 UTC
view on stackexchange narkive permalink

在計算機科學中,使用偽代碼而不是真實代碼來描述算法更可取嗎?如果是這樣,為什麼?

我已經和一些學者這樣討論,但我不明白為什麼。我聽到的一些參數:

  1. “偽代碼更短。” 給定像Clojure或Python這樣的現代語言,實際代碼通常不會更長。即使是這樣,(電子)紙也很便宜。
  2. “並不是每個人都可以用Python編寫代碼。”偽代碼。另外,Python是標準化的-並不是別人的個人偽代碼。
  3. “在CS中,我們專注於算法-而不是實現。” 正確,但也顯示了實現並沒有
  4. “它偏愛一種語言而不是另一種語言。” 是的,但這是我作為作者的權利,不是嗎?
  5. “它看起來很業餘。” 這是主觀的。
  6. ol>

    使用真實代碼的主要優點是您可以運行它並自己查看是否有效。您不必懷疑在實現偽代碼方面是否犯了錯誤。

    那麼偽代碼的參數是什麼?

    要弄清楚我所說的 real runnable代碼是什麼意思,請參閱以下文章中的代碼:

第一個和第二個包含C代碼。 Helsgaun聲稱它是“ C風格的偽代碼”,但在我看來它與真正的C代碼幾乎沒有區別。我看到的區別是它使用α,β和∞作為變量名。第三個包含C ++代碼。

評論不作進一步討論;此對話已[移至聊天](https://chat.stackexchange.com/rooms/101814/discussion-on-question-by-bjorn-lindqvist-is-publishing-runnable-code-instead-of)。
我會進一步說,我們應該完全從以pdf(或LaTeX)文檔的形式發布文章,而轉向諸如Jupyter或識字的Haskell等可運行文檔格式。可執行書的一個很好的例子是[Agda中的編程語言基礎](https://plfa.github.io/)。但這恐怕不是主流觀點...
提交“真實的”程序作為工件:https://www.acm.org/publications/artifacts
[您可以提供**偽代碼和實代碼**,並獲得兩者的好處,而沒有任何缺點**。](https://academia.stackexchange.com/a/141077/349)
作為*非常*相關的主題,數學家應該用單詞來解釋他們的論文。毫無疑問,他們編寫的數學證明很有用,但它們也可以用言語進行解釋,這在最大程度上降低了語法錯誤的風險。
對於那些沒有意識到的問題,我想指出Python使用空格作為一種重要的語言功能來創建代碼塊。似乎僅此一項就成為出版物的一個可疑選擇,您可能並不總是對其格式擁有完全控制權。另外,Traveling Salesman論文似乎具有偽代碼和“可運行”代碼,因為它們使用無窮大等特殊符號,因此無法運行。
您知道,如果我想很好地演示為什麼可運行代碼比偽代碼差,那麼第二個鏈接將是一個完美的例子
“編寫良好的Python代碼比偽代碼更難讀”:很抱歉,但這不是真的。我一直在聽到Python人士的來信,但是作為一個來Python比較晚的人,我可以向您保證情況並非如此。我認為太多的Python員工只是忘記了他們已經內化了該語言的語法,而不再意識到它並不像他們想像的那麼明顯。因此,是的,對於非初始用戶而言,python比其他一些語言更易於閱讀,但它不如偽代碼那麼明顯。差遠了。
@JackAidley我同意。作者可能也看到了,這就是為什麼他們不得不在代碼的每一行中添加註釋。嘗試將註釋與代碼分開。將所有註釋放在一起,然後將所有代碼放在一起。哪一個告訴您更多有關如何解決問題的信息?
@DmitrySavostyanov我不理解您對評論的投訴。您認為它們使代碼更難理解嗎?
-1
-1
-1
“任何傻瓜都可以編寫計算機可以理解的代碼。優秀的程序員可以編寫人類可以理解的代碼”。-馬丁·福勒(Martin Fowler),2008年。
十三 答案:
ObscureOwl
2019-12-03 19:57:00 UTC
view on stackexchange narkive permalink

在某些情況下,最好使用實碼,而最好使用偽代碼。您不應該依賴簡單的固定規則,而應根據對情況的適當判斷。

需要考慮的一些事情:

編程語言來來往往。在60年代,Fortran被認為是一種非常好的可讀性編程語言,比Assembly更容易閱讀。但是,如果您使用Fortran代碼示例而非peudocode撰寫了一篇文章,那麼現在對我們來說將更難閱讀。現在,Python對我們來說看起來不錯,但是將來看起來仍然很好嗎?如果我向您提供了一段包含以下代碼的Python代碼:

  a = 3/2  

的值是什麼一個?是1還是1.5?因為Python 2和3處理整數除法的方式不同。現在,我或多或少地使用了Python 3進行本機編程,因此實際上我必須查找Python 2和3中的除法運算中的哪些是不同的,哪些沒有。只是為了向您展示,在紙張中使用真實代碼可能會降低紙張的保質期。

偽代碼可讓您將內容抽像出來 / p>

 沒有達到停止標準DO(東西) 

然後在您的論文的後面,您可以為算法考慮不同的可能停止標準。您也可以使用實際的Python代碼來執行此操作,但結果基本上是您在扭曲Python代碼以執行偽代碼本質上的功能。

您可以在偽代碼中相當標準化地只需使用LaTeX的各種算法排版選項即可。

您可以在偽代碼中使用數學符號。使用數學集符號比依賴所有讀者更為通用了解Python設置操作。考慮:

  a = set([1、2、3])b = set([1、2])c = 1,如果b.issubset(a)否則為0  

  A←{1,2,3} B←{1,2} C = 1,如果B⊆A 0否則 

不熟悉Python的人第一個例子會令人疑惑:[1、2、3]是...還是列表?好吧,列表[1、2、3]與列表[1、2]不同,因此集合A和集合B包含不同的元素,因此B不能是A的子集。

算法與實現假設在2019年,您將使用一些最新的庫在Python 3中編寫一個有趣的算法。在2025年,我針對Go中的相同問題提出了另一種算法,希望通過比較性能來證明您的算法更好。為了獲得公平的比較,我將不得不在Go中實現我的算法,或者在Python中實現您的算法。假設那時沒有人將Python用於高性能的東西了,因為Go可以做得更好。 (可能不知道,我不知道。)現在,我必須研究您使用的已有七年曆史的庫,以確切地找到所使用的功能以及與它們等效的Go功能。那很難。因此,很可能我對您的算法執行的Go實現不會那麼好。大驚喜!我的算法基準測試比您更好!

現在,如果您使用了算法的與實現無關的描述,那麼對於您的出版物來說可能會更好。


因此使用真實代碼的兩個主要弊端是:它限制了出版物的保質期,並且受眾較少。

那麼應該何時使用真實代碼?

  • 當您的論文的主題不是算法,而是實現或編程語言時。也許您正試圖證明Python是解決問題X的一種非常好的語言,因為有了Y和Z庫,您將獲得一種簡單而有效的實現。

  • 絕對建議您將您的真實代碼作為附錄發布,或者更好的是,在人們可以下載您的代碼並提出改進建議的存儲庫中發布。一個非平凡的算法可能太大了,無法通過手動打字或什至從紙張上粘貼粘貼來進行複制。一旦開始使用新的深度學習算法之類的東西,您可能正在查看多個文件甚至嵌套的程序包。

關於Python(及其他)代碼的討論已[移至聊天](https://chat.stackexchange.com/rooms/101857/discussion-on-answer-by-obscureowl-is-publishing-runnable-code-instead-of-pseudo)。請閱讀[this](https://academia.meta.stackexchange.com/questions/4230/why-do-the-moderators-move-comments-to-chat-and-how-should-i-behave-afterwards)在發布其他評論之前。
確實。我會寫出來的是,偽代碼大部分*應該*處於比真實代碼更高的抽象級別(因此在論文中使用)。如果不是在更高的抽象級別,那麼它可能是不必要的詳細信息,這會使讀者分神,使論文更加混亂。難以閱讀。
這些都是非常好的要點!在我的領域(數據科學)中,通常會用偽代碼描述一種新算法,然後用R或Python實現它。這使讀者兩全其美。
Dmitry Savostyanov
2019-12-03 19:24:30 UTC
view on stackexchange narkive permalink

在研究中,我經常編寫算法,其中可能包含如下語句:

  • 以相對準確度 A 的顯性子空間>Ɛ。
  • 找到該方程式/不等式系統的非負解。
  • 將這些特徵值按模數從大到小排序,丟棄小的特徵值並重新排列特徵向量

對於使用數值線性代數的任何人,無論他們喜歡哪種編程語言,這些指令都非常簡單明了。我認為沒有理由在本文中使用特定的編程語言,並且沒有限制讀者人數的風險。我相信自然語言的閱讀和理解速度更快。特別是,它使我可以清楚地談論每個步驟的目的,而不是如何實現。通常有不止一種方法,例如“求解線性系統”,使用偽代碼可以區分“以某種方式求解”和“使用此特定算法求解”。因此,我使用偽代碼使我可以更好地表達這種細微差別。

我總是在開放存儲庫中的論文旁邊提供實際代碼,讀者可以克隆和瀏覽它們,從而省去了重新輸入代碼的麻煩pdf /印刷版代碼中的代碼。

您可以編寫一個方法調用,以其名稱進行操作,然後在附錄中僅顯示該方法。這樣,它是有效的代碼,無需實際執行即可說明其作用。在某些語言中,甚至可以在方法名稱中使用空格。
@findusl,然後您又被限制在某種特殊的表示法中,並且必須將參數拖到調用等中。閱讀和使用起來不太方便。
我可以使用@findusl,但是可以說它會使人類更難閱讀,也很難用作計算機程序。您的想法似乎是兩個世界之間的折衷,而我建議為人類讀者提供該算法的單獨描述(偽代碼或您如何稱呼它),為計算機提供單獨的代碼(存儲庫),而不是一概而論。
Jack Aidley
2019-12-03 20:06:15 UTC
view on stackexchange narkive permalink

偽代碼永遠存在;真實的語言一直在變化。

如果您在兩天內用Python在Python中發布了算法的論文,那麼很有可能您編寫的“可執行”代碼會如果人們在最新版本下運行它將無法正常運行,即使在不太戲劇性的情況下,新庫和算法的進步也可能會使讀者對您的過時選擇感到困惑。想像一下40年前的論文是否使用了當今的語言。您了解一些Fortran或Pascal代碼的微妙之處嗎?然後,程序員就您對Python的可理解性提出了相同的主張。

因此偽代碼更好,因為在一百年內同樣可以清晰地表達關鍵思想。

偽代碼比真實語言更好地表達了代碼的意圖

為了編寫工作代碼,我幾乎必須總是執行一些步驟才能使程序正常工作不需要進行設置,格式化或進行任何其他操作,這些步驟可以用偽代碼忽略或簡化以傳達重要信息。

此外,在真實語言中,我必須決定數據的存儲方式,採用哪種算法進行排序等,這些都是本文討論的算法附帶的。通過在算法描述中包括這些偶然的選擇,您可以指導實施者做出可能不是最佳的選擇,或者是因為現在可以使用更好的選擇,或者因為您做出的選擇不適合其目標環境。

關於語言變化的要點。舉一個例子,許多算法取決於整數和浮點除法之間的差異。在Python 2中,變量類型用於確定執行了哪個操作“ /”。在Python 3中,這些操作實際上具有不同的符號(`/`相對於`//`)。在某種意義上不了解Python瑣事的人可能會在某些Python 3代碼中看到`/`並假定要使用整數除法,而在Python 3中,它總是浮點除法。
人類語言也發生變化。但是沒有編程語言那麼快。(儘管我對我一生中發生的從“我說”到“我去”到“我喜歡”的演變感到驚訝)。
@WGroleau:是的,是的,所以也許“永遠”會誇大此事。即便如此,我閱讀一百年前的生物學論文也沒有遇到任何重大困難。
@WGroleau:我不同意。亞文化總是有其語,這種語通常會消失而不會影響標準語言。一種類似的編程語言版本,有時甚至是語言本身。我回想起作為本科生時回想起的有關Snobol,Forth和Prolog之類的語言的學習,但是今天誰在使用呢?確實,當時的主要教學語言是Pascal,而C是您自己學習的奇怪東西。
嘗試閱讀原始版本的Chaucer失敗(更不用說幾門研究生語言學課程了),我會堅持我的說法,包括“不那麼快”的部分。
+1,最近我有理由閱讀一些非常古老的論文。我非常感激作者沒有認為我能夠閱讀或執行FORTRAN77。
偽代碼是永遠的–敬請期待!
運行Fortran 77的@Affe:沒問題。GCC包含一個完美可用的編譯器,並且仍然有很多運行代碼。現在,如果您要使用Fortran 66或更早的版本...那麼,直到您試圖找出包含已分配和計算的GOTO的代碼之前,您還沒有真正開始過:-)
但是偽代碼的規則是什麼?如果作者聲明所有示例都在Python 3中,則可以查找它。使用偽代碼,我必須猜測3/2是1還是1.5。
Coder
2019-12-03 19:07:32 UTC
view on stackexchange narkive permalink

您聽到的論點可能都是正確的。我曾經是許多計算機科學文章的審稿人和作者,我想以自己的方式和自己的方式回答這個問題。

偽代碼較短。給定像Clojure或Python這樣的現代語言,實際代碼通常不會更長。即使是這樣,(電子)紙也很便宜。

偽代碼很短而且很容易理解。與整個代碼相比,偽代碼有助於非常清晰地解碼想法。我不會花幾個小時來理解您的代碼。例如,要根據第三列對CSV文件進行排序,您可能已經寫了3行,我並不在乎。我只需要了解該文件必須進行排序即可。其次,如果我不喜歡編寫代碼的語言該怎麼辦。這種審查和興趣可能會有很大的偏差。

並非所有人都可以使用Python進行編碼。的確,但編寫得當的Python代碼並不比偽代碼難讀。另外,Python是標準化的,而不是某人的個人偽代碼。

這只是Python社區適合所有人的主張。許多其他語言也是如此:Matlab腳本,R腳本,Java腳本;有些人(例如我自己)也喜歡UNIX Shell腳本。

在CS中,我們專注於算法,而不是實現。是的,但也顯示了實現並不能脫離這一重點。

我同意這一點。但是,查看整個代碼沒有任何意義。閱讀第一點。

相對於另一種語言,它偏愛一種語言。是的,但這是我作為作者所擁有的權利,不是嗎?

您應該了解您是在為“除您之外的世界”撰寫論文。因此,您不在目標讀者群中。您應該寫一些讀者不會討厭的東西。

看起來很業餘。這是主觀的。

確實。

判決: 您始終可以在論文中提供完整的代碼(如在附錄或補充材料中)。但是,您必須在主要論文中給出算法/偽代碼。

+1表示“如果我不喜歡該語言會怎樣...”,我們拒絕了一篇論文,審稿人明確指出他們認為,由於我們的實現是用X語言表示的,因此很難理解。儘管這可能不是拒絕它們的真正原因,但是使用偽代碼不會使我們容易受到攻擊。
@deckeresq除非他們決定,否則他們不喜歡偽代碼的格式/樣式。
@JAB哈,很真實!
syn1kk
2019-12-05 03:03:16 UTC
view on stackexchange narkive permalink

我現在喜歡當前的三個最佳答案(@ObscureOwl和@DmitrySavostyanov和@JackAidley)。但是我覺得沒有一個選項無法代表。

您可以同時提供偽代碼和實代碼。

  • 最有可能是真實代碼,代碼太長而無法在論文中在線提供。
  • 因此您將在論文中提供偽代碼。
  • 然後將真實代碼作為附錄或補充-download或URL。

同時提供這兩個功能可為您提供AND和AND的所有好處。

  • 您將擁有偽代碼的所有好處。
  • 您擁有實代碼的所有優點。
  • 因此,您的讀者可以通過閱讀偽代碼和理解意圖來更輕鬆地理解您的論文,然後,如果他們非常認真,他們可以
  • 該代碼更容易理解,因為它們已經具有解釋底層實現的偽代碼。

最後提供了兩者都確保長期的理解(偽代碼不會過時)和短期/中期的研究成果

  • 更多的短期採用/使用/複製意味著更長期的對他人的影響和更多的長期使用。

示例1

https://academia.stackexchange.com/a/140990/349是一個很好的示例,其中的偽代碼是更具可讀性/可理解性/意圖-很明顯...在代碼中實現此操作將花費很多代碼行,並且可能很快變得醜陋並佔用紙張過多的空間...因此您肯定希望使用偽代碼,代碼...但是如果您是認真的並且想使用本文...擁有真實代碼將為我節省很多時間...在某些情況下,可以節省許多小時/幾週/幾天/幾月的重新創建偽代碼。 / p>

示例#2

這是另一個例子。 http://www.fftw.org/fftw-paper-ieee.pdf FFTW算法用於計算傅立葉變換。本文討論了算法,但實現也非常重要。因此,本文主要提供了偽代碼和少量代碼。而且,如果您需要來源,可以作為補充下載獲得。

確實,這是一個xy問題!在論文中編寫偽代碼,並附上真實代碼作為補充。就那麼簡單。這應該是答案。
確實。一個不錯的折衷辦法是使用非常乾淨的純偽代碼來解釋算法的原理。同時,在您的實際代碼實現中,您花了全力以赴對其進行優化,並在基準測試中表現出色。
@ObscureOwl [@Dmitry的解決方案](https://academia.stackexchange.com/a/140990/349)確實促使我寫出我的答案,因為我全都是為了看代碼...但是他的例子很棒代碼何時真正真正拖到紙上的示例(在代碼中實現他的3個要點將佔用30-200行python / matlab ...並且會大大降低紙的可讀性)。
@ObscureOwl,但與此同時...閱讀本文後仍未提供該代碼可能意味著沒有人可以重現其結果,也沒有人可以使用他的想法,因為秘密之處不在偽代碼中,而是在偽代碼中。實施。例如,也許有些偽閾值不在偽代碼中。
作為一名開發人員,在閱讀已發表的論文時,兩者都很棒。我習慣於閱讀代碼。對我來說要容易得多。
jakebeal
2019-12-03 19:09:57 UTC
view on stackexchange narkive permalink

根據我作為作者和讀者的經驗,在可能的情況下,最好使用真實代碼而不是偽代碼。當我使用真實代碼而不是偽代碼時,從來沒有出現審閱者投訴。

此外,真實代碼的優勢不僅在於讀者可以自己運行它,而且還因為 author 可以運行它,並確保它們的演示文稿中沒有錯誤。

但是,要使真正的可執行代碼作為一種算法很好地呈現,通常仍然很困難:

p>

  • 正確的可執行代碼不一定可理解。需要仔細清理,註釋和安排。
  • 如果本文包含分析,則代碼變量需要與分析變量匹配,這對於更複雜的數學符號(“ x_hat_sub_i_prime”)可能會產生問題/ li>
  • 行長通常需要短得多才能適合紙質列,這會增加重新格式化的格式,並且常常很醜陋。
  • 通常有“無趣的”但必要的代碼部分,例如打包
  • 代碼經常與依賴項,環境和上下文糾纏在一起。
  • 某些語言似乎天生就是“羅word的”,很難用這些語言編寫緊湊的清單

考慮到所有這些,我認為許多作者可能會發現,將一些虛假的偽代碼組合在一起比較容易,而不是試圖使真實代碼既可呈現又可正確。

如果不是您的第一段,我可能會以此為答案,以支持偽代碼而非真實代碼。您提供了至少6個為什麼可以使用偽代碼的理由,但是只有一個理由可以支持真實代碼-您可以運行它。只要您可以編寫沒有錯誤的偽代碼,使用偽代碼描述算法並提供補充的實際代碼有多個優點,並且零缺點。
我同意你的看法。我應該指定代碼格式正確,而不是“轉儲”到文章中。:)就像我添加到問題中的示例鏈接一樣。
@NuclearWang我不了解您,但是我有信心幾乎所有未經測試的代碼都有錯誤,包括偽代碼。我當然也花了很多時間試圖從其他人的論文中找出錯誤的偽代碼。因此,在我看來,“一個理由”遠遠超過了所有其他理由。
好。幾乎所有經過測試的代碼可能仍然包含錯誤。那就是我作為軟件測試員可以說的。是的,您的答案更像是假性而非實現。
@jakebeal可以肯定的是,作者擁有自己的可運行代碼-他們已經用它產生了結果。偽代碼僅僅是經過測試和使用的代碼的摘要。如果您不信任他們為他們的代碼編寫正確的摘要,那麼您就沒有理由信任他們的文本,方程式,結果或其他任何內容-所有這些都可能包含偽代碼甚至實際代碼等嚴重問題。
我剛剛開始編寫Python偽代碼調試器...我會變得有錢的!
@ZizyArcher在發表了數十篇關於算法的論文之後,我可以絕對肯定地說,對於任何一種算法,我都沒有,也從未擁有過可運行的代碼。我的大多數同事也不使用他們的算法。
quarague
2019-12-03 19:46:44 UTC
view on stackexchange narkive permalink

偽代碼使您可以專注於算法的重要部分並總結其餘部分。

實際代碼通常從加載一些庫開始,讀取一些數據,然後按照所需的方式對其進行格式化/重新排列,而在偽代碼中則不需要。

您的算法可能包含多個單獨的步驟,其中一些步驟是標準的,易於理解且令人厭煩的,其他步驟則是本文的關鍵創新。在偽代碼中,無聊的位只是描述需要發生的事情的一線。多汁的位會根據需要進行詳細說明。在真實代碼中,某些標準細節將比實際重要的部分更長。

因此,總而言之,在偽代碼中,讀者可以輕鬆地看到代碼中重要部分的位置,而在真實代碼中,這是更難(不是不可能,只是更難)。

我想把無聊的內容抽像出來,但我想你說的更好。
xuq01
2019-12-04 00:21:59 UTC
view on stackexchange narkive permalink

我想說這是更常規的做法,因為這似乎與字段密切相關。在“組合”離散算法論文中,我幾乎從未見過真正的代碼。好吧,一個明顯的例外是Don Knuth的TAoCP,但不是每個人都是Don Knuth,對嗎? 。許多研究實際上都是依賴於語言的,因此不足為奇,但是即使是與語言無關的工作(例如,純功能數據結構)也通常使用諸如標準ML或Haskell之類的真實功能編程語言來呈現。有時這確實會造成一些混亂,但是由於函數式編程作為一個領域(儘管可以說仍然大部分是TCS的一部分)是完全面向實現和編程的,所以大多數人實際上是想看真正的程序。 p>

因此,IMO這實際上比任何事情都更加慣例,這實際上取決於領域。大多數組合主義者都在很大程度上關注算法本身以及算法的複雜性,但是功能程序員(或者也許是“邏輯學家”)非常在意算法是否可以正確,優雅地實現,因此存在差異。

allo
2019-12-04 21:28:47 UTC
view on stackexchange narkive permalink

不必有明確的區別。

偽代碼最重要的部分是,應該清晰易讀。因此,您不想處理不屬於實際算法的結構,也不想處理語法結構,這些結構在編程語言中很有用,但在您不了解編程語言時不容易理解。

這是偽代碼還是真實代碼?

 如果a == b:a = a%b  

這是有效的python代碼。但這也是一些可讀的偽代碼。

那該怎麼辦?

 在範圍(10)中的i:print(i) 

我會說這不是(好的)偽代碼,因為 for 的構造並不明顯。

您也許可以為我獲取 部分,但是 range(10)的作用是什麼?即使 range(0,10)也不是很清楚,因為 10 不在範圍之內並不明顯。
此外,您需要保持請記住,數學和計算機科學通常在以0或1開頭的索引上有所不同。

所以我想說這要清楚得多,但是沒有有效的代碼:

  for i = 0 .. 9:print(i) 

還有其他表達for循環意圖的方法,這些方法相似且清晰易讀。在這裡,您可以嘗試使用C語法 for(int i = 0; i < 10; i ++),甚至可以省略 int

  int i = 0; i:= i + 1返回i;  

而是使用

  //輸入:// i:應該增加的整數//算法:o:= i + 1 //輸出:// o:增加1的整數 

請注意,我避免重複使用 i 來存儲結果,而是使用了僅用於存儲輸出的變量 o 。這也可以省略 return 語句,因此讀者無需考慮返回的內容以及返回的位置與算法無關。

與開頭的示例形成對比,我使用了:= 進行賦值,從而更加明顯地表明這是一種賦值運算,沒有數學方程式。您對乾淨的偽代碼有很多看法。如果不確定,您可能希望緊貼LaTeX中的不同偽代碼包,並以類似於其文檔中示例的方式使用它們。

除此之外,我會盡量避免在單個“ =”表示比較還是賦值方面存在歧義。
確實。我在上一個偽代碼示例中已經有`:=`,但是現在我在帖子的開頭在python / pseudo代碼示例中使用了“ =`時,在本示例中添加了* why *的註釋。
Owen Reynolds
2019-12-04 14:55:59 UTC
view on stackexchange narkive permalink

曾經有一段時間偽代碼是明確的選擇,因為編程語言是如此粗糙。 60年代和70年代,但要晚一些-安全地假設一種語言是普遍使用的語言需要時間,而那時,不使用偽代碼只是覺得很奇怪。我記得偽代碼包括“空中”結構,例如:“ foreach”,for循環,完全循環(與帶有反向GOTO的IF相對),2D數組(如果帶有else的函數,帶有參數的函數,變量)名稱超過2個字母,即工作字符串庫。從本質上講,偽代碼是一種更好的高級語言。

一些學者編寫的代碼不那麼多,並且可能擁有與我相同的記憶,其中“將這種偽代碼轉換為FORTRAN程序”不是一個好主意。 -瑣碎的任務。就我而言,我記得在2010年左右(老習慣)寫出偽代碼,意識到使用99%的代碼可以使用C ++,而偽代碼已不再是一回事。您只是在用自己喜歡的編程語言進行思考和編寫,這裡到那裡都有一些快捷方式。

但是我最喜歡的編程語言是_is_偽代碼!
das-g
2019-12-05 08:44:25 UTC
view on stackexchange narkive permalink

是否發布可運行代碼而不是偽代碼?

我不知道,但這可能取決於相應領域的特定亞文化。

在計算機科學中,使用偽代碼而不是真實代碼來描述算法是更好的選擇嗎?

是(請參閱歐文的答案),有時仍然可以(請參閱下面的注意事項)。

如果是這樣,為什麼?

[...]

那麼偽的參數是什麼?代碼嗎?

許多其他答案都已經說明:除了天真的可運行代碼外,偽代碼旨在易於 易於閱讀和理解,而又不會對讀者造成不重要的影響(針對呈現的方面)詳細信息。 而且通常可以成功實現這些目標。

正如您自己所言,可運行代碼也有其好處。因此,讓我迴避這個問題,聲稱

只需付出一些努力,您就可以同時受益於

(並且無需實際提供偽代碼和 separate 可運行代碼,如 syn1kk建議。)

論文中的理想代碼(如果可行,在其他地方)是 pseudo -pseudo code:該代碼具有偽代碼的所有積極特性,但恰好是可運行的(並且實際上可以執行看上去應有的功能)。

我堅信所有編寫得很好的可運行代碼代碼與偽代碼沒有區別:如果有人能說某些(實際上可運行的)代碼不是偽代碼,因為它不像偽代碼那樣易讀易懂,那麼該可運行代碼的結構就不好

如何獲取偽偽代碼

如何實現與偽代碼一樣易於閱讀的可運行代碼?

要考慮多個方面,實現所有這些方面可能並不總是容易或可行的,有時甚至是不可能的。 (這可能是使用實際的非可運行偽代碼而不是可運行偽偽代碼的正當理由。)

選擇正確的語言

哪種語言最合適取決於幾種事情:

  • 問題領域
  • 您的解決方案
  • 您的聽眾
  • 語言為(重新)提供的可能性構建代碼

請注意,對於這些組合的一些編程語言可能(甚至有時甚至是不存在)允許您編寫足夠好的代碼。出於明顯的實際原因,您還必須考慮各種語言的命令(應用技巧)。

使代碼非常簡潔:重構,重構,重構

如果有實現細節使您正在描述的算法的核心思想模糊不清,請提取它們(例如提取為常量,變量,方法或函數),以便您可以通過以下方式替換它們的“方式”(其實現):他們的“什麼”(新提取的代碼名稱)。如果合適,請選擇不在書面代碼摘錄中顯示提取的實現或分配。在命名提取的內容時要格外小心,以使它們的目的(不一定是它們的實現)從它們的名稱和調用簽名來看非常清楚。

另一方面,如果算法之間過於分散為了易於理解代碼的不同部分,您可能不得不選擇內聯代碼。

所有這些都旨在將每個代碼單元(例如函數)的抽像水平設為單一級別,或者至少將正確的抽象級別呈現為最佳,以最好地展示和解釋該算法。儘管只能謹慎地使用一些與之相關的單一責任原則:過度應用該原則(或將“單一責任”解釋得過於狹窄)可能會分散並混淆您的算法。請注意,在這方面,論文中要呈現的代碼的正確平衡與(待維護的)軟件產品中代碼的正確平衡很可能會有所不同。

進行了充分的優化編譯器或解釋器,這些重構都不會對性能產生不利影響。但是,當重點是提出一種算法而不是在生產系統中實現該算法時,無論如何這都不應該太在意。

使您的代碼易於理解

對偽偽代碼的正確解釋不應依賴於了解所選的編程語言或其版本,變體或方言。因此,請警惕您使用的語言功能。

許多編程語言(聽眾都知道)共有的每種語言功能,並且所選語言具有與許多其他編程語言相似的語法,除非所選的編程語言對其具有不尋常且非顯而易見的語義,否則它也是偽代碼方言的特徵,因此可以在偽偽代碼中使用。如果其語義從語法和關鍵字及其與自然語言的關係足夠明顯,那麼即使是不太常見或特定於語言的功能,也可以使用語法不太常見的功能。

最好省略非顯而易見的語言功能,但可以與代碼註釋或論文的散文中的解釋結合使用。 (就像適用於所選偽代碼方言的非顯而易見特徵一樣。)

針對特定語言的習慣用法也是如此:避免或解釋它們,如果您不得不期望它們對聽眾不明顯。

替代方法:使偽代碼可運行

以上兩節假定您從可運行的代碼開始。當然,您也可以從偽代碼開始,然後將其修改為可以使用合適的編程語言實際運行(並希望做看起來似乎可以做的事情)。但是請注意,您最終可能會以這種方式獲得針對目標語言的非常慣用的代碼,而這可能並不是您想要的。當然,重構通常可以解決該問題。

解釋您的代碼

就像您必須解釋(在散文,代碼註釋或標註中)代碼的某些方面(如果是)

偽偽代碼的優點

  • 像偽代碼一樣可讀易懂

    li>

  • 如果指定了使用的語言(包括版本,變體或方言,如果適用):
    • 它是可運行且可用的
    • 它可通過手動和自動方式進行測試測試
    • 它是可配置的

其中一些優點使您作為作者受益,例如,您可以確保提出的算法實際上是正確的。其他使您可能希望評估您的算法的聽眾受益

這些好處是否值得實現偽偽代碼所需的大量工作,而僅僅是偽代碼,或者編寫得不夠好的可運行性代碼,由您決定。

哦,別忘了道德上的好處:由於“熟練”,無論“看起來是否業餘”,您都可以確信它不是和艱苦的工作。

如果您可以使偽代碼可運行或使代碼像偽代碼一樣易於理解,那應該是最佳解決方案。但我相信,這通常是不可能不失簡潔或清晰性或兩者兼而有之的。例如,計算機友好的E_dagger_x(x_i,y_i,z_i)的可讀性遠不及典型的數學形式,甚至可能使您困惑,無論您將E_dagger_x作為E的單獨實體還是對E進行轉換。而且,算法通常具有許多步驟,例如“ A的特徵向量”:主代碼確實與偽代碼相同,但是如果不添加該功能就無法運行。
您已經提出了一個奇妙的論據,說明為什麼大多數作者_不_除了偽代碼之外還包括真實代碼-太多的工作卻帶來的利益太少(可感知的)。
stephen taylor
2019-12-05 17:59:14 UTC
view on stackexchange narkive permalink

在60年代後期,CACM要求文章中的算法應使用Algol編寫。當人們發現人們正在提交使用其他語言開發的算法並且未在Algol中進行測試時,他們放棄了該要求(因為他們碰巧沒有在其站點上安裝Algol編譯器。)這種行為的結果是,幾乎沒有已發布的算法是可編譯的,並且其中許多包含由於作者對Algol語義的誤解而導致的實質性錯誤。

我認為CACM編輯器在設置要求時就意識到了編譯器的情況,但希望存在一個明確的定義。

無論如何,該示例顯示:*即使有描述它的大型標准文檔,偽代碼也很難編寫*質量控制更易於使用可執行代碼。

Sina Madani
2020-03-21 21:17:02 UTC
view on stackexchange narkive permalink

我這樣說並不是無視任何人的意思,但是許多學者並不熱衷於程序員-他們不喜歡編程,也不關心細節。編程不是他們簽約的目的,也不是他們工作的重點。他們可能將代碼視為“必要的邪惡”,而不是其貢獻或欣賞其設計。該代碼被認為是不重要且低級的。當然,這都是主觀的:我可能只佔少數,但是我個人發現Java代碼比UML圖更易於理解。

在我看來,整個討論都是關於語法的。有一個原因,您可以復制粘貼Python代碼,而沒人會蒙上眼睛(提示:即使是業餘愛好者也廣為人知),而您不能使用學習曲線更陡峭,更細微差別的語言。碰巧的是,當人們看到他們不喜歡的代碼(或者更可能是無法理解,可能部分是由於不熟悉語法)時,他們可能會錯過很大一部分貢獻。

偽代碼是為需要簡單構造IMO的過程算法而設計的。有時,根據您所演示的內容,編寫可執行代碼可能更具表現力。而且,這意味著您不必發明自己的語法,因為大多數偽代碼“標準”僅具有基本的命令性構造。

當今的“酷”語言不會在50年後出現。如果您以為是,那麼您的FORTRAN IV怎麼樣?你的COBOL?
@Buffy雖然我同意語言會隨著時間的推移而發展(通常朝著更高層次的構架發展),但必須記住,給定工作/研究的貢獻在其時間段內是適當的,並使用可用的工具來表達。如果您的工作在很大程度上取決於某些編程範例,語言結構或您試圖證明的是某種編程風格,那麼使用實際代碼當然可以嗎?對我而言,偽代碼僅適用於數學家和抽象理論著作,而不是真正的軟件
如今,Edsger Dijkstra的偽代碼已完全可以理解。與Algol不同。而且,“真實的”軟件(例如Python)是由編譯器翻譯成可實際運行的偽代碼。您在這裡有點天真。
-1
而且,如果“真實代碼”只是您所說的偽代碼,那麼為什麼我們有那麼多語言?為什麼不只有一個偽代碼標準?顯然,在大多數情況下,大多數偽代碼中的簡單構造都無法充分錶達。這就是為什麼我們擁有使用不同工具的語言的原因,這就是為什麼我們擁有DSL和語言工程的原因。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 4.0許可。
Loading...