当前位置: 首页 > news >正文

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

      超越编程(逾编程)(元编程?)(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”中译为“超越”更为合理,如果用一个字表达表就使用“逾”。即译为“逾编程”。

相关文章:

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

超越编程(逾编程)(元编程?)(meta-programming) 目录 1. meta- 的词源 2. 逾编程(meta-programming) 的直实含义 2.1 定义 2.2 说明 3. 翻译成“元编程”应该是一种错误 1. meta- 的词源 这是一个源自希腊语的构词元素,其有三种含义&#xff…...

netcore libreoffice word转pdf中文乱码

一、效果 解决: cd /usr/share/fonts/ mkdir zhFont cd zhFont #windows系统C:\Windows\Fonts 中复制/usr/share/fonts/zhFont sudo apt update sudo apt install xfonts-utils mkfontscale mkfontdir #刷新字体缓存 fc-cache -fv #查看已安装的字体列表 fc-list :…...

【练习】【回溯:组合:一个集合 元素可重复】力扣 39. 组合总和

题目 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重…...

Mac 清理缓存,提高内存空间

步骤 1.打开【访达】 2.菜单栏第五个功能【前往】,点击【个人】 3.【command shift J】显示所有文件,打开【资源库】 4.删除【Containers】和【Caches】文件 Containers 文件夹:用于存储每个应用程序的沙盒数据,确保应用程序…...

数据结构——二叉树经典习题讲解

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连,小编尽全力做到更好 欢迎您分享给更多人哦 大家好,我们今天来学习java数据结构的二叉树 递归很重要的一些注意事项: 1:递归你能不能掌握在于&#xff1…...

神经网络八股(三)

1.什么是梯度消失和梯度爆炸 梯度消失是指梯度在反向传播的过程中逐渐变小,最终趋近于零,这会导致靠前层的神经网络层权重参数更新缓慢,甚至不更新,学习不到有用的特征。 梯度爆炸是指梯度在方向传播过程中逐渐变大,…...

堆、优先队列、堆排序

堆: 定义: 必须是一个完全二叉树(完全二叉树:完全二叉树只允许最后一行不为满,且最后一行必须从左往右排序,最后一行元素之间不可以有间隔) 堆序性: 大根堆:每个父节点…...

vue 学习-vite api.js

/** 整机管理 * */ // 整机分类 列表 export const wholeMachineServersType params > ajaxGet({url: wholeMachine/serverstype/,params}) // 整机分类 新增 export const wholeMachineServersTypeAdd params > ajaxPost({url: wholeMachine/serverstype/,params}) /…...

java练习(35)

ps:题目来自力扣 整数反转 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号&#xff09…...

PW_Balance

目录 1、 PW_Balance 1.1、 getDocumentsTypeID 1.2、 getShouldAmount 1.3、 setOptimalAmount 1.4、 setRemark PW_Balance package com.gx.pojo; public class PW_Balance { private Integer BalanceID; private Integer PaymentID; private Integer ReceptionID…...

【Linux-网络】HTTP的清风与HTTPS的密语

🎬 个人主页:谁在夜里看海. 📖 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长,行则将至 目录 📚 引言 📚 一、HTTP 📖 1.概述 📖 2.URL &#x1f5…...

【前端框架】vue2和vue3的区别详细介绍

Vue 3 作为 Vue 2 的迭代版本,在性能、语法、架构设计等多个维度均有显著的变革与优化。以下详细剖析二者的区别: 响应式系统 Vue 2 实现原理:基于 Object.defineProperty() 方法实现响应式。当一个 Vue 实例创建时,Vue 会遍历…...

CMake管理依赖实战:多仓库的无缝集成

随着软件复杂度的增加,单个项目可能需要依赖多个外部库或模块。这些依赖项可能是来自不同的代码仓库,如ATest和BTest。为了实现高效的依赖管理,CMake提供了多种方式来处理这种多仓库的情况。下面我们将详细介绍几种常见的方法,并通…...

Touchgfx 编写下载算法文件(.stldr)

一)下载算法文件主要参考官方的STM32 ST-LINK Utility模板:(文件所在位置如下:) C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ExternalLoader\M25P64_STM3210E-EVAL\Project\MD…...

回不去的乌托邦

回不去的乌托邦 坐在电脑面前愣神间已至深夜,依然睡意不起。 相比于带着疲惫入睡,伏案发呆更令人惬意。想起最近在自媒体上看到的一句话“最顶级的享受变成了回不去的乌托邦”。 “这是兄弟们最后一次逛校园了,我拍个照”。我的记忆力总是用在…...

如何在 SpringBoot 项目使用 Redis 的 Pipeline 功能

本文是博主在批量存储聊天中用户状态和登陆信息到 Redis 缓存中时,使用到了 Pipeline 功能,并对此做出了整理。 一、Redis Pipeline 是什么 Redis 的 Pipeline 功能可以显著提升 Redis 操作的性能,性能提升的原因在于可以批量执行命令。当我…...

Linux----线程

一、基础概念对比 特性进程 (Process)线程 (Thread)资源分配资源分配的基本单位(独立地址空间)共享进程资源调度单位操作系统调度单位CPU调度的最小单位创建开销高(需复制父进程资源)低(共享进程资源)通信…...

实现rolabelimg对于dota格式文件的直接加载和保存

在本篇博客中,我们将讲解如何修改roLabelImg.py文件,使其能够直接加载和保存Dota格式的标注文件(txt)以替换掉复杂的xml文件。通过对源代码的修改,我们将实现支持加载并保存Dota格式标注数据,以便与roLabel…...

bboss v7.3.5来袭!新增异地灾备机制和Kerberos认证机制,助力企业数据安全

ETL & 流批一体化框架 bboss v7.3.5 发布,多源输出插件增加为特定输出插件设置记录过滤功能;Elasticsearch 客户端新增异地双中心灾备机制,提升框架高可用性;Elasticsearch client 和 http 微服务框架增加对 Kerberos 认证支持…...

华为昇腾服务器固件Firmware、驱动Drive、CANN各自的作用与联系?

文章目录 **1. 固件(Firmware)****2. 驱动(Driver)****3. CANN(Compute Architecture for Neural Networks)****三者关系****典型问题定位** 华为昇腾服务器的固件、驱动和CANN是支撑其AI计算能力的核心组件…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage)&#xff1a…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

浅谈不同二分算法的查找情况

二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Bean 作用域有哪些?如何答出技术深度?

导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答&#xff0c…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...

Linux操作系统共享Windows操作系统的文件

目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...