編譯器如何處理 printf 這種語言自帶的函式?

時間 2021-05-07 03:05:54

1樓:豆芽

語言其實是個規範。如果要讓使用某個語言開發的程式要跑起來,除了編譯器,還得有工程技術支援,和語言擴充套件(庫)。

工程技術,比如程式執行時支援、程序載入技術、os介面對接等等

2樓:

從題主的描述來講,我懷疑題主書都沒看就上來問問題。

首先,printf不是語言自帶的函式。

然後在parser之後的過程中,

在建立起抽象語法樹後,摘取出所有能摘取的元資訊,建立map。用到時再查符號。

總的來說:

1.查表

2.查表,然後做型別檢查

3.自己的作業自己做

3樓:那個老高了

什麼函式處理方式都是一樣的。

編譯好的函式放在磁碟的某個檔案裡,可能是可執行檔案,可能是動態庫。儲存的格式是cpu可以直接理解的指令(指令集或者說組合語言)。

執行的時候,會把檔案讀入記憶體。

函式名對應著檔案中的乙個相對位址,當執行函式的時候,會把引數放到cpu的暫存器裡,然後跳轉到函式的位址繼續執行,執行後把結果扔到結果暫存器中,然後再跳轉回去。

4樓:你好像有點喜歡我

第乙個問題比較複雜,涉及到電腦科學中比較多的概念和理論,比如說喬姆斯基體系、詞法分析、語法分析,不是三言兩語能講清楚的。但是簡單的說就是一堆switch case,規定在特定的狀態下遇到特定的字元就把它當做是某一種token,語法分析差不多也是這樣,輸入不再是字元流了,而是上面生成的token流。具體可以參考《編譯原理》。

第二個問題同樣也涉及到編譯原理中的一部分內容以及計算機的定址方式。展開講又能講很多。

第三個問題…emmm

如果答主是真的想搞懂這些問題,建議不要翹課(逃

5樓:

你這學的一知半解,就不要如此肯定地提問,錯漏百出,貽笑大方。

printf不是什麼內建函式,而是標準庫里的乙個標準函式,和普通函式是一樣的性質,編譯器根本不對其特殊處理。

6樓:峰峰真人

如果說問題是關於printf的處理和其他一般函式有什麼區別的話,printf 是標準庫裡面定義的,所以編譯器可以做點兒額外的事情,

檢查格式字串和後面的引數是否匹配,例如%s對應字串引數等等如果沒有除了格式串以外的引數,可以優化成puts 這個看起來簡單,有時候還是很有用的

如果使用者重定義原型,會檢查是否匹配

可能還可以做點兒安全檢查之類的,這個我不熟悉

7樓:

你include stdio.h的時候,stdio.h裡有告訴編譯器有printf是什麼。另外還有printf不是需要自帶的,他是c標準庫里的。

8樓:吶吶啵

詞法分析和語法分析本質上是解析一串有序的字串行,所以識別到底是函式定義還是函式呼叫,或者是普通變數,都要結合上下文環境,不能任意擷取中間的一段序列去解析。

比如 int main,如果後面是;,main就是變數,如果是(,main就是函式,如果是在引號內,那他就是字串的一部分。

可以去讀一些簡單的parser原始碼,很容易就理解了。

9樓:靈劍

printf明明就是個標準的函式,你要舉例子也應該用sizeof這樣的操作符吧……

但是也沒有什麼區別啊,無非有個keyword表,分詞遇到keyword就特殊處理罷了

10樓:開源醬

雖然 printf 不是「語言自帶」的,我就當你問的是一般意義上的 primitive 操作吧

第一種方法:你可以在 tokenizer 的階段就寫死,把所有你想作為內建運算子的直接變成特殊的 token,就像看見 "+" 吐出 Token(BINOP.PLUS) 一樣,很多語言裡的 if / while / for 之類的就是這麼幹的,比如 Python 2 裡的 print

第二種方法:你可以在你的頂層作用域裡把你的標準庫函式們繫結上,比如通過在編譯器 / 直譯器啟動的時候載入乙個 prelude,然後在編譯 / 解釋的時候就當作一般的函式去對待,比如 Python 3 裡的 print()

至於怎麼找到對應函式就是看你的 scope 怎麼設計,lookup 怎麼實現,反正基本就是打表 + 查表

請自行完成作業

11樓:

你既然都學到編譯器了,怎麼會不知道標頭檔案和函式宣告。。。還有C語言什麼時候有自帶函式,printf不是標準庫(stdio.h)裡裡的函式嗎。。。

設計類Python編譯器時如何處理tab和space縮排?

Belleve ptl 裡面的做法是這樣,維護乙個 stack,然後對每乙個可能作為語句分隔符的行首 如果行首的空白序列和棧頂相同,判定為相同的縮排塊 如果棧頂記錄的縮排序列是行首空白序列的真字首,則判定為縮排,當前行首空白壓棧 否則,嘗試退棧並和新的棧頂比對,若退到某一級棧頂和當前行空白相同了,則...

編譯器內部是如何處理 C 語言 typedef 關鍵字的?

甄爍華 你知道貝塞斯達嗎?就是做輻射系列和上古卷軸的那個遊戲公司。他裡面專門有乙個招的職位就是C工程師。之前還嘗試過STM8標準下的C語言開發 英文直翻不知道這樣稱呼是否準確 做乙個能自動包裝的機器。這個project現在還在做。做下來的感覺就是在操控硬體 顯示全部 阿爾伯特 編譯器內部是如何處理這...

程式編譯器是否存在這種機制?

SuperFashi 這個描述很有迷惑性,我們換個思路來看這個問題就好了。如何讓乙個程式在其隨時都有可能被終止的情況下記錄資料庫,保證要麼完全更改要麼完全不更改?就會發現這就是個普通的一次性提交而已。簡單來講,就是先花時間把東西放到那裡,最後再以很短的時間做乙個生效的指令,這個生效指令所花時間極短以...