Re: [分享] Taipei.py - CPython 如何執行 python
看板C_and_CPP作者uranusjr (←這人是超級笨蛋)時間11年前發表 (2014/04/15 18:00), 11年前編輯推噓0(0推 0噓 0→)留言0則, 0人參與討論串4/4 (看更多)
※ 引述《timTan (用口頭禪區分年記)》之銘言:
推
04/15 23:46,
04/15 23:46
→
04/15 23:48,
04/15 23:48
→
04/15 23:57,
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
推
04/16 00:33,
04/16 00:33
這和上面完全是另一個問題了, 而且說真的我不是很想討論這個問題, 明碼是有什麼不
好 Zzz。其實以 CPython 而言, 在進直譯器之前有一個及時編譯階段, 會把 Python
源碼轉成 opcode, 後者才餵給直譯器, 所以大部份的 Python 程式只要提供 opcode
檔案就可以了, 不需要有源碼。但是這其實 disassemble 起來沒有很難。
當然 C 程式也是可以 disassemble 啦。不過如果你需要讓程式好像面目全非才能有安
全感, 我也沒什麼意見, 單純就是 scripting languages 不適合你罷了。
--
糟糕這篇好像和 C_and_CPP 關聯有點低...
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.161.94.175
※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1397584819.A.78D.html
※ 編輯: uranusjr (218.161.94.175), 04/16/2014 02:02:15
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 4 篇):