理論上不是一定的。
一個例子
比如最早期的lisp語言,這是一種函數式編程語言,不知道題主知不知道,現在的python的設計思想就很接近lisp的設計思想了。先上一個定義。
函數式語言(functionallanguage)一類程序設計語言,是一種非馮·諾伊曼式的程序設計語言。函數式語言主要成分是原始函數、定義函數和函數型。這種語言具有較強的組織數據結構的能力,可以把某一數據結構(如數組)作為單一值處理;可以把函數作為參數,其結果也可為函數,這種定義的函數稱為高階函數,程序就是函數,程序作用在結構型數據上,產生結構型結果。
那么從這個定義上來說,就可以看出,lisp本身就類似于AST的結構,所以它理論上連AST都可以不需要,就可以直接解釋執行。
為什么很多編譯器都要加上一個IR
因為這么設計很多功能更容易實現。比如rust編譯器,它的靜態分析功能如果是基于控制流程圖(cfg)和數據流圖(dfg)來做會比基于抽象語法樹(AST)方便得多,所以加入這個設計有利于編譯器的實現。
相關的答案,可以在翻一翻編譯原理的書。