查看: 6852| 回复: 24
跳转到指定楼层
上一主题 下一主题
收起左侧

国内程序员说的“语义”到底是什么意思

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
和国内同学面试或者开会 都会接触到“语义”这个词, 有人知道对应英文中的什么单词吗? “context”?
举个例子,  曾经被问到kafka的 exactly once 是什么语义?

上一篇:C++值得花时间学吗
下一篇:2020Virtual GHC registration

相关帖子

全局:
Semantics

评分

参与人数 4大米 +10 收起 理由
gracy + 1 应该是这个 自然语言处理里面的
whdawn + 6
爱丽丝和鲍勃 + 2
hanscat2018 + 1 赞一个

查看全部评分

回复

使用道具 举报

推荐
magicsets 2020-8-2 13:26:15 | 只看该作者
全局:
Kafka的exactly-once semantics实际上是比较常见的滥用semantics这个词的情况,其大概意思就是你按照Kafka规定的某种方式去调用它的API,那么观察到的系统的输入输出会满足一些规律/约束(也就是exactly-once)。

一般我们说某某语言满足XXX-semantics,那么XXX实际上是描述该语言的语义的某种性质的形容词,而“语义”本身首先得有个形式上(formal)的定义。比如说数据库系统的SQL语言的语义可以是扩展的relational calculus with bag-semantics,而Kafka各种讨论exactly-once semantics的文章都没有给出一个Kafka semantics的定义 —— Kafka甚至都没有设计一个语言,只是提供了一堆API加参数设定而已。

那么所谓“语义”直观上到底长什么样?这里随便找个SQL语言的例子:https://homepages.inf.ed.ac.uk/libkin/papers/pvldb17.pdf
上面这篇文章里给出的一堆公式就是定义语义的例子。当然这里只是给个直观印象,可以不去理解它到底是在说什么,下面我会写一点更简单的解释。

首先,“语义”是与“语法”成对存在的概念,语法简单来说是指由字符构造字符串的规则,而语义则是解释所构造的字符串的意义。注意这里有个套娃:我们描述语法A的语义的时候也是要用某种语言B的,B一般是数学语言(各种字母、符号与运算符等等),就好像我们用C去写Python的解释器一样,

而Semantics这个词常用的领域有几个:
(1) 语言学(linguistics),一般是研究自然语言的语义
(2) 数理逻辑(mathematical logic),考虑的是形式语言(formal language)的语义
(3) 程序设计语言理论(programming language theory),考虑的是程序设计语言的语义

其中(1)、(2)这里就不讨论了。(2)是CS理论基石,比如著名的哥德尔完备性定理(Gödel's completeness theorem,注意还有个“不完备性定理”更著名)就是说在一阶谓词演算系统中,一个在所有模型中语义为真的公式一定可以通过语法层面的证明在有限步骤内推出。

(3)的相关知识一般在Programming language concepts(国内一般叫“程序设计语言原理”或者“程序设计语言概论”)这门课上会讲,主要分为三类:
(3.a) 过程语义(procedural semantics)
(3.b) 指称语义(denotational semantics)
(3.c) 公理语义(axiomatic semantics)

这三种语义理论上分别对应三大语言范式:过程式、函数式与逻辑式。不过在实践中都是混用的,我们也可以用指称语义去描述过程式语言中一个函数的行为,或者用过程语义去描述逻辑式语言的一段代码(例如Prolog里面的cut操作)。

其中(3.a)是最常用的理解一段代码行为的方式,程序员入门时一般都是学习的过程语义。也就是想象有台虚拟机一行一行执行代码,每执行一行代码会改变这台虚拟机的状态(也就是各种变量的值),然后控制流(control flow,例如if、for loop)会决定下一行要执行的代码是什么。过程语义的缺点是太复杂琐碎,理论上难以分析,除非是超级简化的情况如老祖宗图灵机 —— 学计算理论(theory of computation)这门课的时候会让你用过程语义去证明图灵机的一些性质。

(3.b)又叫数学语义(mathematical semantics),在理论以及实践中都很实用,经验丰富的程序员也会主动用denotational semantics去理解代码、设计抽象、架构系统。上面那个讲SQL语义的论文就是denotational semantics的例子。它主要是将一段代码的输入输出描述成数学对象,然后用数学语言表达代码的行为。比如说一个sum函数,其输入就是“数组”这么一个数学对象,而语义可以表达为“数组中元素之和”(Σ)这么一个数学算子(operator),我们不用关心这个“和”的计算过程:比如说,可以从第一个元素累加到最后一个元素,也可以倒过来从最后一个元素累加到第一个元素。

Denotation semantics的一个简单的例子是整数四则运算,可以看看这个:http://homepage.divms.uiowa.edu/~slonnegr/plf/Book/Chapter9.pdf

(3.c)的话在PL领域非常常见,PL论文一大俗就是要放点公理语义在上面。直观印象就是一堆大横线描述逻辑推导过程,还是上面那本书的例子:http://homepage.divms.uiowa.edu/~slonnegr/plf/Book/Chapter11.pdf

最后回到Kafka的讨论,如果Kafka要严谨地定义exactly-once semantics,那大概至少需要这三点:
(1) 列出Kafka的完整语法(各种API)。
(2) 在语法结构上定义出语义。使用denotational semantics的话,也就是要明确a domain of mathematical objects(对于Kafka来说应该是消息流加上一些分布式状态),以及将语法(调用API的代码字符串)映射到数学对象状态的函数集合S。
(3) 定义exactly-once semantics,其本质上是描述函数集合S某些性质的一个定理。


补充内容 (2020-8-3 06:56):
有一点说错了是没有“过程语义”这个词.. 应该是“操作语义”(operational semantics)

评分

参与人数 10大米 +14 收起 理由
zhangzitong001 + 1 赞一个
大蜜蜜 + 1 给你点个赞!
肥颓 + 2 给你点个赞!
nalzok + 1 赞一个
rewfaltq + 1 赞一个

查看全部评分

回复

使用道具 举报

全局:
Lexical 词法
Grammar 语法
Semantic 语义
Pragmatic 语用
回复

使用道具 举报

全局:
symantics
回复

使用道具 举报

全局:
syntax吧
回复

使用道具 举报

🔗
 楼主| zhangzitong001 2020-7-28 03:14:09 来自APP | 只看该作者
全局:
回复

使用道具 举报

全局:
我看问题 感觉就像是解释 exact once 的。

我也很不喜欢语义这个词,插眼等回复
回复

使用道具 举报

🔗
invisibili 2020-7-28 10:46:47 | 只看该作者
全局:
semantics就是对应含义 你知道一个名字 哪怕把它的定义背下来 也不一定就是真的理解它的含义了
回复

使用道具 举报

🔗
hitnoah 2020-7-28 12:02:22 | 只看该作者
全局:
semantics ? 搞自然语言处理的?
回复

使用道具 举报

🔗
 楼主| zhangzitong001 2020-7-28 12:20:49 来自APP | 只看该作者
全局:
个人更偏向于理解成 context 上下文  
翻译过来成为semantics还是理解不了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表