Python運行過程

一、什麼是Python?


  Python是一種計算機程序設計語言。是一種面向對象的動態類型語言,最初被設計用於編寫自動化腳本(shell),隨着版本的不斷更新和語言新功能的添加,越來越多被用於獨立的,大型項目的開發。
在這裏插入圖片描述

1.1、程序設計語言是什麼?


  要讓計算機按照人的意思去運行,那就必須使計算機懂得人的意圖,接受人類輸入的命令。人要和計算機交換信息,就必須要解決一個語言的問題,這個時候人們給計算機設計了一種特殊的語言,那麼這就是程序設計語言。程序設計語言是一種形式語言。程序設計語言是人們根據實際問題的需要而設計的。目前可以分爲三大類:一是機器語言。它是用計算機的機器指令表達的語言;二是彙編語言。它是用一些能反映指令功能的助記符表達的語言;三是高級語言。它是獨立於機器、接近於人們使用習慣的語言。

電子計算機語言分爲三類:

  • 機器語言:它是用二進制數0、1的不同排列來傳遞信息,是目前的電子計算機惟一能直接接受的語言。這種語言程序難編、難讀、難記、難改,但卻能充分發揮機器的作用。
  • 符號語言:它是以符號化的碼子代替二進制碼。符號語言比機器語言容易記憶,但仍難編、難讀。對於初學者和一般使用計算機的人,可以不必學習機器語言和符號語言。
  • 高級語言:這種語言比較接近人們的自然語言和數學語言,比較直觀、易編、易讀,而且通用性強。
    PS:來自:https://zhidao.baidu.com/question/758425352002075084.html

1.2、什麼是解釋型語言?


  相對於編譯型語言存在的,源代碼不是直接翻譯成機器語言,而是先翻譯成中間代碼,再由解釋器對中間代碼進行解釋運行。

機器語言:它是用二進制數0、1的不同排列來傳遞信息,是目前的電子計算機惟一能直接接受的語言。這種語言程序難編、難讀、難記、難改,但卻能充分發揮機器的作用。

C語言(編譯型語言)

C語言是可以直接編譯成爲操作系統可識別執行的機器語言,不經過第二次編譯,所以C語言是編譯型語言;

  計算機不能直接理解高級語言,只能直接理解機器語言,所以必須要把高級語言翻譯成機器語言,計算機才能執行高級語言編寫的程序。

  一個是編譯,一個是解釋。兩種方式只是翻譯的時間不同。編譯型語言寫的程序執行之前,需要一個專門的編譯過程,把程序編譯成爲機器語言的文件,比如exe文件,以後要運行的話就不用重新翻譯了,直接使用編譯的結果就行了(exe文件),因爲翻譯只做了一次,運行時不需要翻譯,所以編譯型語言的程序執行效率高,但也不能一概而論,部分解釋型語言的解釋器通過在運行時動態優化代碼,甚至能夠使解釋型語言的性能超過編譯型語言。

  解釋則不同,解釋性語言的程序不需要編譯,省了道工序,解釋性語言在運行程序的時候才翻譯,比如解釋性basic語言,專門有一個解釋器能夠直接執行basic程序,每個語句都是執行的時候才翻譯。這樣解釋性語言每執行一次就要翻譯一次,效率比較低。解釋是一句一句的翻譯。

編譯型與解釋型,兩者各有利弊

  前者由於程序執行速度快,同等條件下對系統要求較低,因此像開發操作系統、大型應用程序、數據庫系統等時都採用它,像C/C++、Pascal/Object Pascal(Delphi)等都是編譯語言,而一些網頁腳本、服務器腳本及輔助開發接口這樣的對速度要求不高、對不同系統平臺間的兼容性有一定要求的程序則通常使用解釋性語言,如Java、JavaScript、VBScript、Perl、Python、Ruby、MATLAB 等等

1.3、Python與其他語言對比

  • Python 是一種解釋型語言,它排除了在執行程序之前編譯代碼的需要,因爲 Python 在後臺進行編譯。因爲 Python 是一種高級編程語言,所以它從編程代碼中抽象出許多複雜的細節。Python 非常關注這種抽象,大多數新手程序員都可以理解它的代碼。
  • Python 代碼往往比可比代碼短。儘管 Python 提供了快速的開發時間,但它在執行時間方面略有滯後。與完全編譯 C 和 C ++等語言相比,Python 程序執行速度較慢。當然,由於目前計算機的處理速度,速度差異通常只在基準測試中觀察到,而不是在實際操作中觀察到。在大多數情況下,Python 已經包含在 Linux 發行版和 Mac OS X 計算機中。

1.4、Python應用領域


  • Web 和 Internet開發
  • 科學計算和統計
  • 人工智能
  • 教育
  • 桌面界面開發
  • 軟件開發
  • 後端開發

二、Python程序執行過程


PyCodeObject & pyc

PyCodeObject:PyCodeObject則是Python編譯器真正編譯成的結果。

當python程序運行時,將編譯的過程結果存放至內存中的PyCodeObject中,當程序運行結束後,python解釋器將PyCodeObject回寫到.pyc文件中。 當python程序第二次運行時首先會去硬盤中尋找.pyc文件,如果找到則直接載入,否則就再次重複以上過程。

PS:每次加載模塊時,如果同時存在.py和.pyc,Python會嘗試使用.pyc,如果.pyc的編譯時間早於.py的修改時間,則重新編譯.py並更新.pyc。

也就是.pyc文件是PyCodeObject的一種持久化保存方式。

start:

#!/usr/bin/env python

def print_hello(test):
    print(f"this is a {test}")

if __name__ == "__main__":
    print_hello("hello world")

stop:

#!/usr/bin/env python

from start import print_hello
if __name__ == "__main__":
    print_hello("hello world")

stop_running…
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

start.cpython-36.pyc文件中存放着在程序運行時內存中PyCodeObject回寫的數據。當下一次運行程序時,優先尋找硬盤中的start.cpython-36.pyc此文件。

回寫寫入過程(不確定。mark)

#!/usr/bin/env python

import py_compile
import imp
import os

def pycodeobject2pyc(pyobj, pycfile):
    with open(pycfile, 'wb') as fc: 
        fc.write("\0\0\0\0")
        timestamp = long(os.fstat(fc.fileno()).st_mtime)
        py_compile.wr_long(fc, timestamp)
        marshal.dump(pyobj, fc)
        fc.flush()
        fc.seek(0, 0)
        MAGIC = imp.get_magic()
        fc.write(MAGIC)

pycodeobject2pyc(b"x00x0x0x0x00x0x0", "a.pyc")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章