編程和音樂的相似之處


編程和音樂

很多大師都會把編程比作建築,比如架構、設計模式,基本就是用的建築的語言,其實我個人覺得編程和音樂也是極其類似的。比如最近在斷斷續續在看的一本《代碼大全》,里邊提到了變量的“跨度”,這就非常像音樂中的“音程”。

從通俗角度來說:
亂寫的程序跑不起來或全是bug,亂彈的音符則擾人心弦。
編程和音樂都有相應的原理支撐,兩者都或多或少依賴一些數學知識。

從專業角度對比,網上搜索了下,貌似還沒有寫這個的,那叔叔就簡單總結一下兩者相通的地方吧。

下面由偉大的詩人chenqionghe給你簡單類比一下,are you ok ?

先來一張康定斯基的音樂抽象畫《構成第七號》開場
image

音符

比如四分音符、二分音符、全音符、八分音符、十六分音符、三十二分音符
image

基本規律就是二進制,編程語言就是靠二進制玩的,這不用說了吧。
舉個例子:int32 int64 float32 float64

休止符

休止符和音符一樣也是基於二進制的,比如有四分休止符、二分休止符、全休止符、八分休止符、十六分休止符、三十二分休止符
image

這就類似編程語言中的:break、sleep、return

音名

比如有:
C D E F G A B
這基本就可以理解成編程語言中的變量,變量被組織成了程序,各種音被組織成了音樂。

音程

image
比如幾度音程,簡單理解成包含了幾個音

代碼有一個類似的概念:
跨度:衡量一個變量的不同引用點的靠近程度,即兩個引用點之間相隔的行數。

image

在這段代碼里,a變量的跨度是3,因為它最開始引用和結束引用占用了3行。

音色

image

雖然音的高低、長短、強弱可以都一樣,但是由不同樂器演奏的音色不同,比如有:鋼琴、小提琴、琵琶、二胡、古箏等等
編程一樣,雖然最終呈現的都是一樣的結果,但可以是由不同的語言寫的,比如有:C、GO、Java、Python、PHP、JavaScript等等。

image

反復

image
音樂中有的N種反復,基本就可以理解成編程中的循環了:for、do-while、whie
image

跳音/重輕音/升降記號等

image

這樣的特殊處理,就可以理解成編程中的if了。
if 遇到這個音符或者語句,特殊操作

if a == ".":
   # 跳音
if b == ">"
   # 重音  
if c == "<"
   # 輕音
if d == "#"
   # 升調
if e == "b"
   # 降調

小節

image

可以理解成一個函數,比如下面是一個簡單的c函數

def c():
    print("chen")

樂句

image
可以理解成大函數中調用了N個小函數。

比如這里有三小節,一個小節可以理解成下面函數的一個子函數

def cqh():
    c()
    q()
    h()

def c():
    print("chen")

def q():
    print("qiong")

def h():
    print("he")

可以理解成樂句cqh包含了c、q、h三個小節

樂曲

image
比如,這是一首《river flows in you》的樂曲,樂曲中包含了多個樂句、小節。可以理解成一個程序的一個類,或者一個包。執行類或包相應的入口方法,會發生后邊一系列的函數調用,運行出一個完整的應用。

比如下面是一個完整的包,當執行main函數時,會觸發樂句cqh和chenqionghe的執行

if __name__ == '__main__':
    cqh()
    chenqionghe()

和弦、聯彈、交響等

image

多種音同時發出、多種樂器同時演奏,基本就可以理解成編程中的並發、並行了。
比如當我們使用APP或網頁,執行一整套流程的操作時,背后是N種編程語言的共同協作下完成的,這不正是類似於交響樂中各種樂器的結合嗎。

既然網絡世界是由各種編程語言“交響”出來,那再用一幅應景的交響樂抽象畫《構成第八號》收個尾
image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM