????? 超越編程(逾編程)(元編程?)(meta-programming)
目錄
1.? meta- 的詞源
2.? 逾編程(meta-programming) 的直實含義
2.1? 定義
2.2? 說明
3.? 翻譯成“元編程”應該是一種錯誤
1.? meta- 的詞源
???????? 這是一個源自希臘語的構詞元素,其有三種含義:
(1) ?在……之后(after),在…… 后面(behind); 在……之中(among), 介于……之間(between)。??
(2) ?變更(changed), 改變(altered)。
(3) ? "higher, beyond;" from Greek?meta?(prep.) "in the midst of; in common with; by means of; between; in pursuit or quest of; after, next after, behind," in compounds most often meaning "change" of place, condition, etc. ?(“更高,超越,”來自希臘語“meta”(介詞),“在……之中;與……相同;通過……的方式;介于……之間;追求或尋求;在……之后,緊隨……之后,”,在復合詞中經常指地點、條件、等的“改變”。)
??? The notion of "changing places with" probably led to the senses of "change of place, order, or nature," which was a principal meaning of the Greek word when used as a prefix (but it also denoted "community, participation; in common with; pursuing"). (“交換位置”的概念可能導致“改變地點、秩序或性質”的感覺,這是該希臘詞用作前綴時的主要含義(但它也表示“社區、參與;共同;追求”)。)
??? The third, modern, sense, "higher than, transcending, overarching, dealing with the most fundamental matters of," is due to misinterpretation of?metaphysics?(q.v.) as "science of that which transcends the physical." This has led to a prodigious erroneous extension in modern usage, with?meta-?affixed to the names of other sciences and disciplines, especially in the academic jargon of literary criticism:?Metalanguage?(1936) "a language which supplies terms for the analysis of an 'object' language;"?metalinguistics?(by 1949);?metahistory?(1957),?metacommunication, etc.? (第三個現代意義是“高于、超越、統領、處理……的最基本的問題”,這是由于形而上學(有形事物之上的學問)被誤解為“超越物理的科學”。這導致了現代用法中出現了巨大的錯誤擴展,將“meta”附加到其他科學和學科的名稱上,尤其是在文學批評的學術術語中:元語言(1936 年)“一種為分析‘對象’語言提供術語的語言”;元語言學(1949 年);元歷史(1957 年)、元交流等。)
2.? 逾編程(meta-programming) 的直實含義
2.1? 定義
Metaprogramming?is a?computer programming?technique in which?computer programs?have the ability to treat other programs as their?data. It means that a program can be designed to read, generate, analyse, or transform other programs, and even modify itself, while running.[1][2]?In some cases, this allows programmers to minimize the number of lines of code to express a solution, in turn reducing development time.[3]?It also allows programs more flexibility to efficiently handle new situations with no recompiling.
逾編程是一種計算機編程技術,計算機程序能夠將其他程序視為自己的數據。這意味著程序可以設計為在運行時讀取、生成、分析或轉換其他程序(譯注:這里指其它程序代碼,也就是讓程序本身也可以生成代碼),甚至修改自身。[1][2] 在某些情況下,這允許程序員最大限度地減少表達解決方案的代碼行數,從而縮短開發時間。[3] 它還允許程序更靈活地高效處理新情況而無需重新編譯。(譯注:也就是說,這種編程技術所寫出的代碼,可以做程序員做的事情,這是越超了原來的編程只實現程序本身的功能,這正是meta-programming 的本來含義。)
2.2? 說明
??? 傳統程序主要是操縱數據結構并產生輸出的代碼。例如,sqrt() 函數以整數(即數據結構)作為輸入,對其進行操縱,然后輸出其平方根。當然,數據結構可能比簡單的整數或雙精度數復雜得多,但這是程序(program)的一般概念。
在另一方面,編譯器是一個程序,它將源代碼(同樣是數據結構)作為輸入,將其轉換為一堆可以更好地理解的數據結構,并產生可能是二進制代碼、字節碼或中間語言等格式/結構的輸出。解釋器大致就是每次運行代碼時執行此過程的編譯器。
??? 現在,如果我們可以編寫操縱數據結構的代碼,并編寫將人類編寫的代碼視為數據結構的編譯器,為什么我們不能寫出編寫或操縱其他代碼的代碼呢?事實證明,我們可以!而且這已經持續了很長一段時間! Lisp 于 1958 年推出,是首批具備此類功能的語言之一。原因是 Lisp 使用 S 表達式作為語法和數據結構。因此,Lisp 代碼可以作為輸入數據結構輸入到 Lisp 程序中,并由它們進行操作!這在某種程度上是 Lisp 首創的。其他通用語言使用的語法比 S 表達式更易讀。在現代語言中,逾編程以不同的方式表示。C++ 中的模板是編譯時逾編程的一種形式。其他語言使用 eval、goto、自動編程和其他技術在運行時提供逾編程功能。一類特別鼓勵逾編程的語言是動態語言。這類語言通常是動態類型的,通常非常靈活。Ruby 和 Python 就是這類語言的很好例子。
現在,所有這些都很好,但為什么首先要使用動態編程呢?你可能會想,編寫代碼的代碼?誰需要它?我為什么不自己寫代碼呢?!這些都是合理的問題,所以讓我們舉一個真實的例子來說明它的用法。在 Ruby on Rails 中(注:一個 Web 應用程序框架,包含根據模型-視圖-控制器 (MVC) 模式創建數據庫支持的 Web 應用程序所需的一切),數據庫表(例如“學生”表)由類表示。所以現在您有一個剛剛從該類實例化的“學生”對象,并且想要查找 GPA 低于 3.0 的所有大三學生,您會怎么做?您可以隨時編寫 Sql 查詢,但說真的,您該怎么做?!如果您使用 Rails,那么您只需調用 student.find_all_by_year_and_gpa() 并向其傳遞您的條件!但是等等,誰定義了該方法?!Rails 團隊不能只定義世界上所有可能的方法嗎?畢竟,其他人可能會做 student.find_all_by_name_and_year(),甚至只是反過來,如 student.find_all_by_gpa_and_year()!員工表怎么樣?或者產品表?這太瘋狂了!您可以看到,即使 Rails 團隊知道我們的數據庫列的名稱,這里也有無限的可能性和排列!那么這是怎么發生的呢?好吧,Rails 使用 Ruby 的逾編程功能來提供如此出色的功能。事實證明,Ruby 有一個名為“method_missing?”的方法,它可以攔截對對象上未定義方法的調用,并對其進行處理!換句話說,您剛剛調用的方法在您調用它之前并不存在!Rails 攔截了對不存在的 find_by_year_and_gpa() 方法的調用并解析了它的名稱。它以“find_by_”開頭,后跟“xxx_and_yyy”,因此它知道您正在嘗試使用其兩個列在數據庫表中查找某些內容。因此,它只需獲取“xxx”和“yyy”并檢查是否可以找到具有相同名稱的數據庫列,如果可以,它會調用 define_method(),該方法會為您編寫一個構造該查詢的方法,在 Student 類上定義它,最后返回結果!現在,每次您在該學生對象上調用 find_all_by_year_and_gpa() 時,都會調用新定義的方法,而不是每次都經歷整個過程!當然,您可以只在 method_missing?() 中處理請求,但每次都經歷這個過程效率低下。如果我們有一個循環,每次迭代都調用此方法會怎么樣?這只是您可以使用逾編程做什么的一個例子!它很有意義,在許多情況下非常需要!您只需要花時間了解它是什么以及如何以及何時使用它。
3.? 翻譯成“元編程”應該是一種錯誤
???????? 在漢語中,“元”的詞義有很多,最常見的詞義有:
(1)? 頭、首、始、大:~兇。~首。~旦。~年。~勛。~帥。狀~(科舉考試第一名)。
(2) ?基本:單~。~件。~氣(精氣,根本)。~素。~音。
(3) ?同“圓”。
(4)? 未知數:一~二次方程。
(5) ?中國朝代名:~代。~曲。
(6) ?姓。
(7) ?古同“玄”,清代避康熙皇帝(玄燁)名諱,以“元”代“玄”。
但是,以上詞義沒有一個與“meta-programming”所要表達的思想貼合。為什么翻譯成“元編程”可能是因為在最初網頁設計中有一種元素放在文件頭部,以方便搜索引擎進行搜索,而這種元素稱“meta”元素,這時候翻譯成“元”是合理的。但后來但凡在編程界出現“meta-”就統統譯為“元”則是錯誤的。
???????? 綜合以上說明,我認為這個“meta-”在“meta-programming”中譯為“超越”更為合理,如果用一個字表達表就使用“逾”。即譯為“逾編程”。