编程术语及其翻译
本文档为个人学习过程中遇到的编程相关的易混淆术语或是翻译不佳术语的集合, 旨在帮助初学编程的人解清疑惑,欢迎各位多多补充。
编程语言相关
以下为编程语言相关术语:
强类型与弱类型
编程语言常被分为:强类型(Strongly Typed)语言和弱类型(Weakly Typed)语言。
以下引用自知乎用户 vczh 的回答:
强类型:偏向于不容忍隐式类型转换。譬如说 haskell 的 int 就不能变成 double
弱类型:偏向于容忍隐式类型转换。譬如说 C 语言的 int 可以变成 double
举例来说,在 C 语言中,以下语句是合法的,故其是弱类型:
int a = 1;
char b = '2';
a + b;
在 Python 中,以下语句是不合法的,故其是强类型:
a = 1
b = '2'
a + b
NOTE: 强、弱类型并不是指在定义变量时要加上类型名, 这种行为应该称为 显式 、隐式 类型。
静态类型与动态类型
编程语言常被分为:静态类型(Statically Typed)语言和动态类型(Dynamiclly Typed)语言。
以下引用自知乎用户 vczh 的回答:
静态类型:编译的时候就知道每一个变量的类型,因为类型错误而不能做的事情是语法错误。
动态类型:编译的时候不知道每一个变量的类型,因为类型错误而不能做的事情是运行时错误。譬如说你不能对一个数字a写a[10]当数组用。
NOTE: 强、弱类型并不是指在定义变量时要加上类型名,这种行为应该称为 显式、隐式 类型。
函数(function)与方法(method)
function 常被翻译为函数,method 常被翻译为方法。
从宏观意义上来说,两者都代表一段可复用的代码,但在某些语言中,两者具有不同的含义:
一般认为,函数不属于类或对象,而方法属于类或对象。 因为 C 语言是一门面向过程的语言,其不含类与对象,所以其只有函数,没有方法; 而 Java 是一门纯的面向对象的语言,所以其只有方法,没有函数。
倘若,有一个函数/方法为 upper()
,其作用是使字符串全大写,
若为函数,则调用形式为 upper(str)
,
若为方法,则调用形式为 str.upper()
。
define 与 declare
define 常被翻译为 定义 ,declare 常被翻译为 声明 。
field 与 property
field 常被翻译为 字段 或者 域 ,property 常被翻译为 属性 。
面向对象编程的主要工作是创造类和使用类,而类中则包含了众多成员, 其中主要有 成员变量 和 成员方法 , 成员变量定义了这个类有什么,而成员方法则定义了这个类能干什么。
从某种意义上来说,以上所说的成员变量就等同于字段。
面向对象的三大特征之一就是 封装,封装具体指: 字段(成员变量)应该 私有 化, 此外定义一些 公共 的方法以便从外部访问私有的字段(成员变量)。
以 Java 为例:
class Phone{
private int size;
public getSize(){
return size;
}
public setSize(int size){
this.size = size;
}
}
这难免有些麻烦,因为每写一个字段,都要实现相应的 getter/setter 方法, 而属性就是为此而设计的,使用属性的 C# 示例如下:
class Phone{
public int size {get; set}
}
所以,请记住,Java 中没有属性!
overload 与 override
overload 常被翻译为 重载 ,override 常被翻译为 重写 或者 覆盖 。
重载的核心在于“ 一物多用 ”,而重写的核心在于“ 覆盖 ”。
重载一般分为 方法重载 和 运算符重载 ,其实运算符的本质也是方法。 让我们以方法重载为例,即 相同的方法名可以具有不同的参数列表 , 具体而言,不同的参数列表指参数的 类型 、 个数 、 顺序 不同。 请注意,方法重载的参数类型可能会出现 隐式类型转换 ,此时结果会产生混淆。
WARNING: 不能以方法的返回值来区分方法重载,原因很简单,有时我们是为了副作用而调用方法,这时会忽略其返回值。
在大多数 OOP 语言中,迫使语法支持方法重载这一特性的一个主要原因是构造器的出现,因为构造器的名字与类名相同, 要想有多个构造器,就必须用到方法重载。
parameter 与 argument
按照直译,parameter 与 argument 都可翻译为参数,但在编程语言中,两者略有不同:
parameter 通常指 形参 (形式参数,formal parameter),即定义函数时括号里的变量; 而 argument 通常指 实参 (实际参数,actual argument),即函数调用时使用的值。
在 K&R 那本著名的 C 语言圣经中谈到过这个问题,如下:
"We will generally use parameter for a variable named in the parenthesized list in a function definition, and argument for the value used in a call of the function. The terms formal argument and actual argument are sometimes used for the same distinction."
-- 《The C Programming Language》Section 1.7 K&R
pointer 与 reference
pointer 常被翻译为 指针 ,reference 常被翻译为 引用 。
数组(array)与列表(list)
array 常被翻译为 数组,list 常被翻译为 列表。
从宏观意义上来说,两者都属于常用的数据结构,但在某些语言中,两者具有不同的含义:
一般认为,数组中存储的数据类型必须相同,且数组一经确定,大小即固定不变;而列表中的元素类型可不同,列表的大小也不固定。
NOTE: 在 Python 中要想使用数组,可以使用
array
模块中的array
类。 在 Java 中要想使用列表,可以使用ArrayList
泛型类。
多重继承(Multiple inheritance)与多层继承(Multilevel inheritance)
Multiple inheritance 常被翻译为 多重继承 或 多继承,Multilevel inheritance 常被翻译为 多层继承。
多重继承指一个类同时继承多个类,而多层继承指一个类继承了多个层次。
以 Python 为例来说,多重继承的示例如下::
class A(B, C):
pass
多层继承的示例如下::
class B(C):
pass
class A(B):
pass
NOTE: 有的文章将 多重继承 解释为 多层继承,这是有问题的。
时刻记住,多重继承 和 多继承 是一个东西。
SEEALSO: https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)
compile 与 build
compile 常被翻译为 编译 ,build 常被翻译为 构建 。
property 与 attribute
按照直译,property 与 attribute 都可翻译为 属性 , 严格来说,property 是“个人财产”里的“财产”,是属于主体的另一个东西,是“大主体”的一部分。 attribute 是“属性值”里的“属性”,是对主体的一个测量,纯语义来说是只读的, 实际工程中允许修改的属性都实际是在修改属性背后的某种东西。
以下引用自知乎用户 invalid s 的回答:
property更偏重“拥有实体物质的所有权”这种含义,偏向于“外在属性”,比如谁是百万富翁、谁是豪车车主之类。
而attribute更侧重“个体特质”含义,偏向于“内在属性”,比如谁非常聪明、谁很强壮之类。
打个比方的话,玩游戏,你的角色的强壮是180,这个强壮180就是“attribute”;同时,你的角色拥有一把屠龙刀,是“屠龙刀玩家”,这个“屠龙刀玩家”就是property。
微软的WPF文档里面有这样一句话,说它的xaml支持 “map property to attribute” ;而对应的中文资料直接说成 “把属性映射为属性” ……
典型场景里,property指的是“给画布一支紫色的画笔”这个动作,即必须先
new
一个pen
,设置pen
的color
为紫色,再把这个pen
传给画布。这个过程有明确的所有权转移(在外部new
了一个pen
、然后把这个pen
对象的所有权赋予画布对象)。而通过“map property to attribute”,就可以直接设置画布的
pen color
为紫,就好像设置一个attribute一样,隐藏了所有权转移这个动作。所以,我倾向于把它翻译成 “把‘传递对象’这个动作映射为‘设置属性’” 。
static
operator
operator 可被翻译为 操作符 或 运算符,但个人习惯称其为 运算符。
宏(macro)
在计算机科学中,宏一般指一段可以被替换的文本。
在编程语言中,使用宏可以减少重复、简化代码。
将宏替换成相应内容的过程称为 宏展开。
计算机网络相关
以下为计算机网络相关术语:
proxy 与 agent
按照直译,proxy 与 agent 都可翻译为代理,但在计算机网络中, proxy 更倾向于表示 服务器代理 这种动作, 而 agent 则表示 代理服务器 这种物质。
以下引用自知乎用户 invalid s 的回答:
proxy 是牵线木偶,你说一句它做一句。 比如,喂,你现在马上去交易所,帮我买 100支 微软股票,然后把我名下 200 股 Facebook 股票以 xx 元的价格挂上去卖掉。 这个跑腿的家伙就是 proxy。
agent 拥有独立思考/行动能力,可以代替你做一些决定。 比如,这是我的管家/律师,合同的事你和他谈。他的决定就是我的决定。 这个得到了授权、可以独立以你的名义完成某个任务、必要时允许他根据情况做出自主决定的,就是 agent。
所以个人倾向于把 proxy 翻译成代理,agent 则根据语境翻译成助手/代办之类会好理解一些(比如office里面的“大眼夹”就是agent,中文叫“office小助手”;苹果的siri微软的小娜等等也是agent)。
socket
操作系统相关
以下为操作系统相关术语:
同步与异步
同步(synchronize,sync):指一个进程在执行某个请求时,若该请求需要一段时间才能返回信息, 那么,这个进程将会一直等待下去,直到收到返回信息才继续执行下去。 比如两个人打电话
异步(asynchronous,async):指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态, 当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。 比如两个人发短信
阻塞与非阻塞
阻塞(blocking):
非阻塞(nonblocking):
并发与并行
并发(concurrent):在某个时间段内有多个程序在执行
并行(parallel):在某个时间点有多个程序在执行
并发是伪并行,真正的并行需要多个核心。由于现代计算机的核心是有限的,但通常运行的进程远大于核心数,所以在计算机科学中,并发往往是探讨的重点。
以下引用自 Go 语言的创造者之一 Rob Pike 所做的演讲 并发不是并行(并发更好):
并发是指一次处理多件事。
并行是指一次做多件事。
二者不同,但是有联系。
一个关于结构,一个关于执行。
并发用于制定方案,用来解决可能(但未必)并行的问题。
进程与线程
程序:存储在硬盘上的源代码
进程(process):在内存中动态执行的程序, 每个进程有各自的内存地址空间
线程(thread):是进程的一部分,与进程共享内存地址空间
stack 与 heap
stack 常被翻译为 栈,heap 常被翻译为 堆。
栈通常有两种含义,一种是指 数据结构,另一种是指 内存区域, 与此相对的,堆也一样。
当指数据结构时,栈的特点是 先进后出,而堆的特点是
当指内存区域时,栈的特点是 整洁有序,而堆的特点是 杂乱无章。
NOTE: 在一些老旧的翻译文章中,常会见到将 stack 翻译为 堆栈, 个人不赞同这种翻译,因为这会让人分不清究竟指的是堆和栈这两种不同的东西,还是栈这一种东西(虽然译者本意是如此)。
磁盘
磁盘(disk)一般分为两类:
- 硬盘(hard disk)
- 软盘(floppy disk)
注意:磁盘不等于硬盘。
directory 与 folder
directory 常被翻译为 目录,folder 常被翻译为 文件夹。
从宏观意义上来说,目录与文件夹是一回事。 但在命令行界面中,更倾向于使用 目录 一词; 在图形界面中,更倾向于使用 文件夹 一词。 这是因为文件夹有明显的图形色彩。
所以,在 Windows 或 macOS 中,更常见于文件夹一词; 而在 Linux 中更常见于目录一词。
值得注意的是,目录 比 文件夹 要更具备计算机科学含义。
RAM 与 ROM
RAM:随机存储器,可读可写,但必须带电存储,关机后存储的内容丢失
ROM:只读存储器,只能读取不能写入,关机后其中的内容不丢失