Re: [分享] Taipei.py - CPython 如何執行 python

作者: uranusjr (←這人是超級笨蛋)   2014-04-16 02:00:15
※ 引述《timTan (用口頭禪區分年記)》之銘言:
推 QQ29:可否借問一下,c裡面使用python有什麼好處嗎? 04/15 23:46
→ QQ29:想學python,但想瞭解他的好處尤其是跟c配合~ 04/15 23:48
→ azureblaze:讓使用者可自訂行為、程式不用重開重compile就可改code 04/15 23:57
說是和 C 配合, 其實這包含兩件不太一樣的事情:
* 在 Python 裡寫 C, 以及
* 在 C 裡寫 Python。
你一開始問的是後者, 所以先講這邊好了。為什麼要在 C 裡寫 Python... 嗯, 因為
我可以? :p
程式界有句很靠北的名言:[1]
任何足夠複雜的 C 或 Fortran 程式, 都包含一個將就、定義不標準、滿是
臭蟲、緩慢的 Common Lisp 部分實作。
如果你寫過不止一個 C 專案(寫完就扔的玩具不算), 或許會發現每個專案裡面其實
都包含了很多差不多的 utilities。資料結構啊排序啊甚至簡單的字串處理等等。都
是重造的輪子。Python(或者應該說任何高階語言與/或函式庫)的存在意義就是把這
些有的沒有的東西抽出來, 讓你能專注在你真正想做的事情上面, 而不是一直造新輪
子。
以下內容當然不只適用於 Python 與 C, 不過原推文是問它們, 所以我就直接寫了。
請不要講什麼○○和××語言沒講是偏頗之類的垃圾話。我都聽到了, 謝謝指教。
一個在 C 裡用 Python 的狀況可能是 prototyping。可能你想要試試看某個新功能要
如何實作比較好, 那麼與其直接用 C 刻兩個版本再選, 先用 Python 實作某個部分,
決定之後再 port 回 C(或甚至就直接用了, 如果它 good enough™[2])可以省下很
多開發時間。
另一個可能性是做 plugin system, 其實也就是 azureblaze 講的用法。Python 程式
碼可以直接改, 在這用途上應該也滿方便的。我沒這樣用過就是了。
不過其實上面兩種都沒那麼常見, 至少就我所知。比較常見的反而是顛倒, 用 C 來輔
助 Python。這通常就是要嘛你想連結既存的 C 函式庫, 要嘛你覺得 Python 不夠快
想把某部分改寫成 C 來用。加速這種目的沒什麼好解釋的, 跳過。可以用既存 C 函
式庫代表兩件事情:
1. 只要某個功能有 C 函式庫, 就可以接到 Python 上;
2. 可以補足 Python 因為跨平台而沒有內建一些 OS-specific 功能的特點。
這也就代表你即使要用到 Python 沒有的函式庫, 也不見得要整個程式都寫成 C。這
在很多情況下都可以在大幅縮短開發時間的情況下產生 good enough™ 的成品。
如果你正在考慮要不要學新的高階語言/函式庫, 要考慮的不應該是「它的功能我現在
能不能做到」(通常可以), 而是「它能不能讓我的做法更快更好」。
[1] http://en.wikipedia.org/wiki/Greenspun's_tenth_rule
[2] http://en.wikipedia.org/wiki/Principle_of_good_enough
推 QQ29:那這樣python code有辦法不要明碼嗎,好處只有方便改code嗎 04/16 00:33
這和上面完全是另一個問題了, 而且說真的我不是很想討論這個問題, 明碼是有什麼不
好 Zzz。其實以 CPython 而言, 在進直譯器之前有一個及時編譯階段, 會把 Python
源碼轉成 opcode, 後者才餵給直譯器, 所以大部份的 Python 程式只要提供 opcode
檔案就可以了, 不需要有源碼。但是這其實 disassemble 起來沒有很難。
當然 C 程式也是可以 disassemble 啦。不過如果你需要讓程式好像面目全非才能有安
全感, 我也沒什麼意見, 單純就是 scripting languages 不適合你罷了。
作者: QQ29 (我愛阿蓉)   2014-04-15 23:46:00
可否借問一下,c裡面使用python有什麼好處嗎?想學python,但想瞭解他的好處尤其是跟c配合~
作者: azureblaze (AzureBlaze)   2014-04-15 23:57:00
讓使用者可自訂行為、程式不用重開重compile就可改code
作者: QQ29 (我愛阿蓉)   2014-04-16 00:33:00
那這樣python code有辦法不要明碼嗎,好處只有方便改code嗎

Links booklink

Contact Us: admin [ a t ] ucptt.com