什么是编程习语?

Posted

技术标签:

【中文标题】什么是编程习语?【英文标题】:What is a programming idiom? 【发布时间】:2010-09-23 01:55:49 【问题描述】:

我看到“编程习语”这个短语被大家所理解。然而,在搜索结果和 *** 中,我看到了一切......

来自微:

增加一个变量 表示无限循环 交换变量值

到中等:

PIMPL RAII Format, comments, style...

到宏:

Programming paradigm or common library features as idiom Process model as idiom A collection of idioms equals a new paradigm

“编程习惯”是否有一个单一的通用定义?由于“编程习语”在许多范围内都有使用:

微观:句法细微差别或通用句法 中等:常见的风格和图案 宏:作为成语的编程范式

在这些范围内使用该短语是否有效?到目前为止,答案都集中在句法习语上。其他的也有效吗?

【问题讨论】:

编程习语是用编程语言编写的idiom。 【参考方案1】:

它来自idiomatic,编程中idiom这个词的含义可以概括为一个短语,其含义和含义超过了单词的总和。在编程中,大多数代码 sn-ps 实际上是惯用的。 '属于或符合一种语言的自然表达方式'

一个编程习语可以被认为是描述一类可转移到不同情况的解决方案。考虑while ... do while 这些是惯用的,它们包含相同的词,但排序带有重要区别。确切的措辞会因语言而异,但基本含义和含义会有所不同;例如do while 将始终执行一次,无论使用什么语言或语句来实现它。作为一个成语,它是一个想法的可转移形式。它可以在许多情况下使用,并用不同的词(语句/命令)表示,但基本结果总是相同的。

【讨论】:

【参考方案2】:

由于大型程序从小型程序发展而来,因此我们必须开发一套标准程序结构库,我们已经确定其正确性(我们称它们为惯用语),并学习使用以下组织技术将它们组合成更大的结构证明的价值。

程序员应该掌握好的算法和习语。

Alan J. Perlis - SICP Foreword

【讨论】:

【参考方案3】:

尽早进入常规:以相同的方式执行相同的过程。积累成语。标准化。莎士比亚和你的唯一区别(!)是他的成语列表的大小——而不是他的词汇量。

ALAN PERLIS,编程中的警句

http://www.cs.yale.edu/quotes.html

【讨论】:

【参考方案4】:

习语是一种“模式”,可以在多个地方进行识别。

我不会说它与特定的编程语言有任何关系。

Iterator foo;
foo.reset();
while (foo.next())

    print(foo.value());

这是我称之为“for each”成语的一个sn-p,它在多种语言中的表达方式略有不同。

另一个很好的习语例子是Socket。所有声称拥有套接字的平台,在概念上都以相同的方式工作,也就是说,它们都具有大致相同的接口。

【讨论】:

当我听到“Socket”时,我想到的是“I/O 模式”。我不认为它是一种习语——模式存在于不同的语言中,而(正如大多数其他回答者所描述的)习语往往是特定于语言的。 我没有给出我的具体答案,试图区分“成语”和“模式”,如果您阅读前五个单词应该清楚。这是一个信息丰富的解释性答案。【参考方案5】:

编程习惯是用特定语言编写任务的常用方法。例如,循环在 C 中通常是这样编写的:

for (i=0; i<10; i++)

php 会理解类似的结构:

for ($i = 1; $i <= 10; $i++)

但在 PHP 中不鼓励循环遍历数组。在这种情况下,您将使用:

foreach ($arr as $value)

而在 Ruby 中,您会使用:

(1..10).each

循环,或者:

array.each

用这些语言编写循环的可能性有很多。使用这个成语可以让有经验的读者立即识别它。然后他们可以把时间花在更重要的问题上。

【讨论】:

【参考方案6】:

见http://en.wikipedia.org/wiki/Programming_idiom

编程习惯是一种模式、算法或结构化代码的方式。谈论编程习语就是谈论那些在代码中频繁出现的模式或提出新的模式。

熟悉惯用语,尤其是较大的惯用语的好处是,在查看代码时,您可以看到几行代码,但由于它是一种熟悉的习惯用语,您可以在心理上将代码表示和思考为单一的习惯用语,而不必单独阅读和理解每一行。

说代码不是惯用的,就是说它本身的结构不能让人类读者有效地思考代码。

【讨论】:

【参考方案7】:

成语是一种表达特定语言特定内容的方式。例如这里有几个english idioms。

您可以推断这一点以将该概念应用到编程中。

【讨论】:

【参考方案8】:

(非编程)语言中的“成语”是特定语言独有的说法或表达方式。通常一些不遵循语言“规则”的东西,只是因为母语人士“知道”它的意思而存在。 (例如,在英语中我们说“in line”但“out of line”——这是惯用语)

将其转移到编程领域,我们得到如下内容:

 if(c=GetValue())
 ...

实际上的意思是:

 c = GetValue();
 if (c != 0)
 ....

每个 C/C++ 程序员都能理解,但会让来自不同编程语言的人完全感到困惑。

【讨论】:

-1 虽然习语可能会受到语法的影响,但我认为它们还有更多的意义。 我喜欢这个答案。在自然语言中,习语是其含义不能从其组成术语的含义中构建出来的东西。换句话说,它在语义上是一个不可分割的原子,尽管在句法上它可以被分割。所以在编程中,习语是你不会质疑的东西,只是死记硬背,可以提高效率。【参考方案9】:

成语是语言学的一个术语。它是一组字面意思不是字面意思的词。例如,当某人感觉不舒服时,说他们“不舒服”。这个特定的短语来自水手们谈论乘客,晕船的乘客会在船舶运动较少的“天气”甲板下方。但我们大多数人都不是水手,不知道这句话的字面意思。

在编程中,即使是大多数指令,即使是英文单词,普通大众也无法理解。例如“for循环”。虽然它们对程序员有意义,但对其大多数人却没有意义。

【讨论】:

-1:编程习语不同于非编程变体。 ...但事实并非如此。【参考方案10】:

来自WikiPedia:编程习语是一种用一种或多种编程语言表达重复结构的方法。

我猜你已经走上了这条路!

【讨论】:

这只是将问题委托给“什么是构造?”是微观的、中等的还是宏观的?

以上是关于什么是编程习语?的主要内容,如果未能解决你的问题,请参考以下文章

C++,使用模板编程的术语/习语

著名的同名编程技术[关闭]

是否有“从列表的开头选择并减少直到结果满足谓词”的函数式编程习语?

是否有教程教授经验丰富的程序员使用的常见 Ruby 编程习语,但对新手可能不明显? [关闭]

什么是模板<typename T, T t> 习语?

习语 | Spring fever 是什么意思