-
1 # 天天Python
-
2 # python愛好者
python是可以開發python解析器的,比如c語言的gcc編譯器也是用c語言寫的
解析過程:
1、先對python程式的文字檔案進行詞法分析。
這個過程需要編寫一個詞法分析器。
2、把分析後的結果生成一個抽象語法樹。
透過語法分析,使可以執行的關鍵字和運算子按優先順序生成樹形結構,值作為葉子 節點,優先順序越高的關鍵字和運算子節點距離葉子節點越近。
3、遍歷這個語法樹,把語法樹編譯成指令集。
這時原來的文字檔案已經轉換成一個可以執行的位元組碼檔案。
4、讀位元組碼檔案,把位元組碼中的指令對映成python真實的指令執行。
可以用任何語言寫這個對映執行過程的。
用python開發python直譯器,執行效率要慢一些,但是可以幫助更好的理解python的執行過程。
-
3 # Bean蠶豆
我的理解是Python可以實現python的直譯器。我們先了解一下這個問題,為什麼需要直譯器?當我們編寫好程式碼後,我們會以py為後輟命令該檔案,要執行此檔案,就需要一個直譯器去解釋執行。由於整個Python語言從規範到直譯器都是開源的,所以理論上來說,只要你水平夠高,編寫python直譯器都不是問題,下面我們來了解一下目前市場上存在的直譯器。
Cpython一款C語言開發的直譯器,速度是有保障的當我們安裝python後,系統會自帶一種直譯器,那就是CPython,這個直譯器是C語言開發的,所以叫CPython,在命令列下輸入Python就啟動python直譯器。此直譯器是目前使用最為廣泛的直譯器。
IPython,基於CPython直譯器基礎上的一款互動式直譯器IPython是基於CPython的基礎上的個互動式直譯器,也就是說在此基礎上有所互動式增強,執行的時候還是和CPython是一樣的,好比現在很多的瀏覽器都是基於IE核心一樣。
PyPy直譯器的目標是執行速度PyPy採用JIT技術,對程式碼進行動態編譯,可以顯著提高程式碼的執行速度,這也是此直譯器的出發點-提高程式碼的執行速度。
Jython,是執行在Java上的python直譯器Jython是執行在java上的一款python直譯器,可以直接將Python程式碼編譯成java節碼執行
python的編譯器很多,但是使用最為普遍的是CPython,如果說你對python的瞭解掌握程度達到很高的程度,透過Python寫一個直譯器也是行的通的。 -
4 # 水滴的三體
c一開始是用b寫的,然後用c寫了c的編譯器;rust還是go,一開始也是c寫的,然後用該語言本身實現了編譯器,額,應該是rust。感覺系統級的程式語言才能實現自編譯,好像沒看過什麼指令碼語言自編譯的,倒是聽說過用awk編寫lisp編譯器。
-
5 # 你看我獨角獸嗎
在最低級別,原始記憶體分配器確保私有堆中有足夠的空間透過與作業系統的記憶體管理器互動來儲存所有與Python相關的資料。在原始記憶體分配器之上,幾個特定於物件的分配器在同一堆上執行,並實現適合於每種物件型別的特性的不同記憶體管理策略。例如,整數物件在堆內的管理方式與字串,元組或字典不同,因為整數意味著不同的儲存要求和速度/空間權衡。因此,Python記憶體管理器將一些工作委託給特定於物件的分配器,但確保後者在私有堆的邊界內執行。
重要的是要理解Python堆的管理是由直譯器本身執行的,並且使用者無法控制它,即使它們經常操作物件指標到該堆內的記憶體塊。 Python記憶體管理器透過本文件中列出的Python / C API函式按需執行Python物件和其他內部緩衝區的堆空間分配。
為了避免記憶體損壞,擴充套件編寫器不應該嘗試使用C庫匯出的函式對Python物件進行操作:malloc(),calloc(),realloc()和free()。這將導致C分配器和Python記憶體管理器之間的混合呼叫帶來致命的後果,因為它們實現了不同的演算法並在不同的堆上執行。但是,可以使用C庫分配器為各個目的安全地分配和釋放記憶體塊,如以下示例所示:
在此示例中,I / O緩衝區的記憶體請求由C庫分配器處理。 Python記憶體管理器僅涉及作為結果返回的字串物件的分配。
但是,在大多數情況下,建議從Python堆中分配記憶體,因為後者受Python記憶體管理器的控制。例如,當使用C編寫的新物件型別擴充套件直譯器時,這是必需的。使用Python堆的另一個原因是希望通知Python記憶體管理器有關擴充套件模組的記憶體需求。即使請求的記憶體專門用於內部的,高度特定的目的,將所有記憶體請求委託給Python記憶體管理器也會使直譯器整體上有更準確的記憶體佔用影象。
因此,在某些情況下,Python記憶體管理器可能會或可能不會觸發適當的操作,如垃圾收集,記憶體壓縮或其他預防性過程。請注意,透過使用前面示例中所示的C庫分配器,I / O緩衝區的已分配記憶體完全脫離了Python記憶體管理器。
回覆列表
當然能實現;Python直譯器有好幾種,應用於不同的語言開發,每個直譯器都有各自的特點,但都可以正常執行Python程式碼,接下來我們就嘗試用subprocess去寫一個線上執行python的網站。
Python直譯器?
Python是一門編譯程式語言,程式碼要執行,就需要一個翻譯, 把Python語言翻譯成計算機CPU能聽懂的機器指令語言,讓計算機執行Python程式時,這個翻譯就是 Python直譯器。
沒有它,我們的Python程式碼是沒有辦法執行的。
初始 Subprocess模組
在呼叫一些系統內部的命令和傳不定引數時都能用該模組
Subprocess 模組有很多執行額外的程序。Subprocess 子程序模組旨在替換 os.system(), os.spawnv()等函式,os 和 popen2 模組中 popen()的變體,以及 commands()模組
用subprocess寫Python
首先建立pyol.py檔案匯入包import os,sys,subprocess,tempfile,tim
獲取python編譯器的位置:sys模組裡的executable方法EXEC=sys.executable
定義編碼方式:def decode(s):
try:
return s.decode("utf-8")
except UnicodeDecodeError:
return s.decode("gbk")
寫入python程式碼,用subprocess 的check_output方法返回子程序的輸出結果在主函數里定義執行方法outdata =
decode(subprocess.check_output([EXEC, fpath],stderr=subprocess.STDOUT, timeout=5))
r["output"] = outdata
try:
os.remove(fpath)
except Exception as e:
exit(1)
這樣我們的python就寫好了