什么是超越編程(逾編程)(元編程?)

????? 超越編程(逾編程)(元編程?)(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”中譯為“超越”更為合理,如果用一個字表達表就使用“逾”。即譯為“逾編程”。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70415.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70415.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70415.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于Martin的全國基礎底圖實現

概述 前面有文章基于Martin實現MapboxGL自定義底圖分享了Martin的使用,本文使用網絡收集的數據實現了全國基礎數據的收集和基礎底圖。 實現后效果 實現 1. 數據準備 實例中包含如下數據: 邊界線和九段線數據省邊界面數據省會城市點數據市邊界面數據…

新版Tomcat MySQL IDEA 安裝配置過程遇到的問題

一、IDEA閃退 打不開了 IDEA環境變量路徑不對 二、Tomcat 一閃而過 主要是JDK環境變量不對 三、MySQL 重新安裝、是否備份以及默認盤問題 看清楚教程基本沒問題:Windows 安裝配置及卸載MySQL8超詳細保姆級教程_mysql8卸載-CSDN博客

鏈表_兩兩交換鏈表中的節點

鏈表_兩兩交換鏈表中的節點 一、leetcode-24二、題解1.引庫2.代碼 一、leetcode-24 兩兩交換鏈表中的節點 給你一個鏈表,兩兩交換其中相鄰的節點,并返回交換后鏈表的頭節點。你必須在不修改節點內部的值的情況下完成本題(即,只能…

DAY08 List接口、Collections接口、Set接口

學習目標 能夠說出List集合特點1.有序2.允許存儲重復的元素3.有帶索引的方法(練習 add,remove,set,get) 能夠使用集合工具類Collections類:static void sort(List<T> list) 根據元素的自然順序 對指定列表按升序進行排序。static <T> void sort(List<T> lis…

Zookeeper(58)如何在Zookeeper中實現分布式鎖?

在 Zookeeper 中實現分布式鎖是一種常見的用例。Zookeeper 提供了強一致性、高可用性的分布式協調服務&#xff0c;使得它非常適合用來實現分布式鎖。以下是詳細的步驟和代碼示例&#xff0c;展示如何在 Zookeeper 中實現分布式鎖。 1. Zookeeper 分布式鎖的基本原理 Zookeep…

帆軟報表FineReport入門:簡單報表制作[擴展|左父格|上父格]

FineReport幫助文檔 - 全面的報表使用教程和學習資料 數據庫連接 點擊號>>JDBC 選擇要連接的數據庫>>填寫信息>>點擊測試連接 數據庫SQLite是帆軟的內置數據庫, 里面有練習數據 選擇此數據庫后,點擊測試連接即可 數據庫查詢 方法一: 在左下角的模板數據集…

后臺管理系統-項目初始化

認識vue-admin **核心交付:** 為什么要基于現成架子二次開發 什么是二次開發:基于已有的代碼(項目工程,腳手架)開進行新功能的開發 所以看懂已有的框架中的既有代碼,變得很重要了 1. 背景知識 后臺管理系統是一種最常見的應用模式,不同的管理系統之間有很多相似的地方…

DAY07 Collection、Iterator、泛型、數據結構

學習目標 能夠說出集合與數組的區別數組:1.是引用數據類型的一種2.可以存儲多個元素3.數組的長度是固定的 int[] arr1 new int[10]; int[] arr2 {1,2,3};4.數組即可以存儲基本類型的數據,又可以存儲引用數據類型的數據int[],double[],String[],Student[]集合:1.是引用數據類…

VLM(視覺語言模型)與DeepSeek R1(獎勵機制)如何結合

VLM&#xff08;視覺語言模型&#xff09;與DeepSeek R1&#xff08;獎勵機制&#xff09;如何結合 flyfish VLM的傳統訓練依賴于監督學習&#xff08;直接擬合問答對&#xff09;&#xff0c;而規則獎勵函數通常用于強化學習&#xff08;通過試錯和獎勵反饋優化策略&#xf…

從零開始構建一個語言模型中vocab_size(詞匯表大小)的設定規則

從零開始構建一個語言模型就要設計一個模型框架,其中要配置很多參數。在自然語言處理任務中,vocab_size(詞匯表大小) 的設定是模型設計的關鍵參數之一,它直接影響模型的輸入輸出結構、計算效率和內存消耗。 本文是在我前文的基礎上講解的:從零開始構建一個小型字符級語言…

計算機網絡之物理層——基于《計算機網絡》謝希仁第八版

(??? )&#xff0c;Hello我是祐言QAQ我的博客主頁&#xff1a;C/C語言&#xff0c;數據結構&#xff0c;Linux基礎&#xff0c;ARM開發板&#xff0c;網絡編程等領域UP&#x1f30d;快上&#x1f698;&#xff0c;一起學習&#xff0c;讓我們成為一個強大的攻城獅&#xff0…

實時股票行情接口與WebSocket行情接口的應用

實時股票行情接口與WebSocket行情接口的應用 實時股票行情接口是量化交易和投資決策的核心工具之一&#xff0c;行情接口的種類和功能也在不斷擴展。介紹幾種常見的行情接口&#xff0c;包括實時股票行情接口、Level2行情接口、WebSocket行情接口以及量化行情接口&#xff0c;…

圖論 之 BFS

文章目錄 3243.新增道路查詢后的最短距離1311.獲取你好友已觀看的視頻 BFS:廣度優先搜索&#xff08;BFS&#xff09; 是一種常用的算法&#xff0c;通常用于解決圖或樹的遍歷問題&#xff0c;尤其是尋找最短路徑或層級遍歷的場景。BFS 的核心思想是使用隊列&#xff08;FIFO 數…

ollama stream“:True django如何返回數據

在使用 Django 框架開發 Web 應用時&#xff0c;如果你想要通過 Ollama 流式返回數據&#xff0c;你可以通過 Django 的 HttpResponse 或者 StreamingHttpResponse 來實現。Ollama 主要用于處理文本生成任務&#xff0c;如聊天機器人、自動完成等&#xff0c;通常這些任務會產生…

為什么要用 const 和 let,而不是 var?

JavaScript 中有三種方式聲明變量&#xff1a;var、let 和 const。其中&#xff0c;var 是早期版本的 JavaScript 中的標準&#xff0c;但隨著 ECMAScript 6&#xff08;ES6&#xff09;引入了 let 和 const&#xff0c;var 的種種問題也顯現出來。今天&#xff0c;我們將探討為…

從零開始玩轉TensorFlow:小明的機器學習故事 2

你好&#xff0c;TensorFlow&#xff01;——從零開始的第一個機器學習程序 1. 為什么要寫這個“Hello, TensorFlow!”&#xff1f; 無論學習什么新語言或新框架&#xff0c;“Hello World!”示例都能幫助我們快速確認開發環境是否就緒&#xff0c;并掌握最基本的使用方式。對…

【Java八股文】10-數據結構與算法面試篇

【Java八股文】10-數據結構與算法面試篇 數據結構與算法面試題數據結構紅黑樹說一下跳表說一下&#xff1f;LRU是什么&#xff1f;如何實現&#xff1f;布隆過濾器怎么設計&#xff1f;時間復雜度&#xff1f; 排序算法排序算法及空間復雜度 數據結構與算法面試題 數據結構 紅…

Docker換源加速(更換鏡像源)詳細教程(2025.2最新可用鏡像,全網最詳細)

文章目錄 前言可用鏡像源匯總換源方法1-臨時換源換源方法2-永久換源&#xff08;推薦&#xff09;常見問題及對應解決方案1.換源后&#xff0c;可以成功pull&#xff0c;但是search會出錯 補充1.如何測試鏡像源是否可用2.Docker內的Linux換源教程 換源速通版&#xff08;可以直…

華為云deepseek大模型平臺:deepseek滿血版

華為云硅基流動使用Chatbox接入DeepSeek-R1滿血版671B 1、注冊&#xff1a; 華為云deepseek大模型平臺注冊&#xff1a;https://cloud.siliconflow.cn/i/aDmz6aVN 說明&#xff1a;填寫邀請碼的話邀請和被邀請的賬號都會獲得2000 萬 Tokens&#xff1b;2個帳號間不會與其他關聯…

抓包工具是什么?

抓包工具是一種用于捕獲和分析網絡數據包的軟件或硬件設備。它可以幫助用戶監控網絡通信過程&#xff0c;查看網絡中傳輸的數據內容、協議類型、源地址、目的地址等信息。以下是關于抓包工具的一些詳細解釋&#xff1a; 1. 主要功能 捕獲數據包&#xff1a;抓包工具能夠實時捕…