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

      超越编程(逾编程)(元编程?)(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.mzph.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;抓包工具能够实时捕…