什么是语义学?

13

所以有复制语义,移动语义和可能还有我不知道的其他语义。我读过关于这两种语义的文章,但我仍然没有一个清晰的定义"semantics"的好方法。按照名称,移动语义与移动东西有关,但为什么被称为移动语义

更清晰版本:在编程上下文中,语义的意义是什么?例如:移动和复制语义。


12
"semantics" = "意义、含义、语义" - Will Ness
1
https://en.wikipedia.org/wiki/Semantics#Computer_science - MB-F
语义:形容词 涉及语言或逻辑中的含义。 - Passer By
4
"移动语义" = "移动某物的含义是什么?如何完成?在什么情况下使用?它的前置条件和后置条件是什么?'移动'某物意味着什么?" - Will Ness
6
这个问题为什么会被认为是“过于宽泛”?它只有一个明确的答案。 - Galik
显示剩余6条评论
3个回答

18

语义学基本上意味着“含义”。

为了解释这个术语,查看一个更熟悉的例子可能会有所帮助。

考虑:

int a = 3;
int b = 5;

int c = a + b;

a + b的值为8,因为+ 运算符的语义是获取其操作数的数字和。

现在考虑这个:

std::string a = "hello";
std::string b = "world";

std::string c = a + b;
< p > < code >a + b 的值为"helloworld",因为+运算符的语义是将其操作数连接在一起。

当使用std::string+运算符时,它具有不同的语义,与数字类型的使用方式不同。

它有着不同的含义

现在考虑复制移动语义:

std::string a = "hello";
std::string b;

b = a; // b receives a copy of a's value

b = std::string("hello"); // the temporary value is moved into b

我们有相同的运算符=,但在不同情况下具有不同的意义。同样,我们说它具有不同的语义

第一种情况具有复制语义,而第二种情况具有移动语义


你的例子可以扩展到 int operator+(int, int)std::string operator+(std::string, std::string) 不同的情况,例如 int d = b + a; assert(c == d);std::string d = b + a; assert(c != d) - Caleth
谢谢。所以,“移动语义”只是指“与移动有关的事情”吗?还是我漏掉了什么? - user8221510
非常好。这是我的接受答案。 - Ignorant

7
语义(Semantics)是用来描述某个事物的基本含义。当一个操作将对象状态从一个对象转移到另一个对象时,您可以说该操作具有移动语义(move semantics)。实际上,在计算机中,一些指针可能会被复制,但从语义上讲,您的对象已经被移动了。
另一个例子是所有权转移,这时最重要的是移动的责任(即释放某些资源的承诺)。在这种情况下,从计算机的角度来看,几乎什么都没有发生,但从语义上讲,所有权已经转移了。
同样适用于拷贝语义(copy semantics):当您将对象传递给函数时,您可以说该对象具有拷贝语义,即您的对象将被复制,并且该函数将获得一个带有自己生命周期的独立副本。
另一方面,语法(syntax)是指按照语言规则描述您想要的内容的方式。C ++具有非常灵活的语法-重载运算符、用户定义的转换、宏等,因此几乎可以将任何期望的语义附加到任何特定的语法中。

3
语义学是关于某些东西的含义。move-semantic则是关于移动对象的含义。具体而言,在这个上下文中,它告诉你在C++中如何移动某些东西的含义。 移动的语义涉及到移动操作期间所涉及的所有内容。
将move-semantic理解为:在C++程序中,移动一个对象意味着什么,有哪些影响(以及如何实现)?
以下是一个很好的答案,可能会有所帮助: 什么是移动语义?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接