将语言编程为*与用Ruby编写C代码


10

代码完成规定您应该跳投码一门语言,而不是代码它。他们的意思是

不要将您的编程思想仅局限于语言自动支持的概念。最好的程序员考虑他们想要做什么,然后他们评估如何使用可供使用的编程工具来实现其目标。(第34.4章)

不管手头语言的优点和缺点如何,这是否会导致在每种语言中使用一种编程风格?

或者,以更易回答的格式提出问题:

您是否建议人们应该尝试使用一种语言的特征尽可能整齐地编码一个问题,还是应该整体上搜索最优雅的解决方案,即使那意味着您需要实现本机不存在的可能尴尬的构造用自己的语言?


5
+1好问题。此时,我可以用六种不同的语言用Perl编写。
丹·雷

@Dan Ray-很奇怪!我总是在Perl中写C。
James Anderson

Answers:


7

有一个更好的方法:根本不用理会您可悲的固定编程语言。使用您刚发明的语言对问题进行编码,该语言是从相关问题领域的术语衍生而来的,并尽可能自然地对其进行编码,然后才考虑实现这种新的编程语言或将代码笨拙地限制在现有语言。

这种方法称为面向语言的编程。有许多技术可以有效地实现特定领域的语言,这是Ruby社区特别热门的话题。


1
Haskell社区还包含特定于域的语言,Haskell编程语言特别适合于实现它们。
tdammers

基于Lua或Tkl等嵌入式语言实施量身定制的脚本系统是否被认为是编写DSL?如果是这样,您如何应对Lua等缺陷?
bastibe 2012年

@Paperflyer,在某些情况下,在诸如Lua之类的语言上实现语言是有意义的(特别是如果是Metalua的话),但是为大多数典型的DSL编写合适的编译器会更容易。
SK-logic

@tdammers,是的,Haskell和Scala都是关于DSL的。但是我来自部队的黑暗面:我首选的方法是元编程。我相信,临时解释器几乎总是不如编译器。
SK-logic

2
@tdammers,实际上是在高级功能之上实现的DSL,是一个特殊的解释器。您不能像扩展Lisp一样扩展Haskell语法。即使使用模板Haskell。这是实现DSL的一种完全不同的方式(我想说是一种有限的方式)。在很多情况下都可以,但是对于任何真正复杂的事情,它都会导致完全不可读的实现,而无论您的DSL有多大,多级元编程都是微不足道的。
SK-logic

2

我相信正确的答案,而本书所打算的是:

一个人应该尝试用一种语言的细节尽可能整齐地编码一个人的问题

通过编程为一种语言,我一直认为这是使用语言正常样式之外的技术,否则会带来好处。这是在所有语言中以一种风格写作的主要区别。

例如,学习Haskell大大提高了我使用高阶函数的技能。现在,使用c#进行编程时,我会更频繁地使用各种IEnumerable方法,例如Select,与使用for循环相比,使用这些方法可以使代码更简洁。Func<int, int>由于我有haskell的经验,我也倾向于更频繁地使用传递和使用函数(即)。由于这个原因,我对继承的使用有所下降,并且在大多数情况下,结果是更简单的代码。

但是,我没有在C#中使用诸如monads或代数数据类型的概念。这是因为两者在C#中都不是可清楚表示的,并且以许多晦涩难懂的方式带来的收益也很小。

因此,我使用语言工具来充分发挥我所拥有的技能。我相信这是编程到语言中。


0

您是否建议人们应该尝试使用一种语言的特征尽可能整齐地编码一个问题,还是应该整体上搜索最优雅的解决方案,即使那意味着您需要实现本机不存在的可能尴尬的构造用自己的语言?

问题的关键是,优秀的程序员没有一个语言。该书中的引言谈到“可供使用的编程工具”-这意味着,如果您了解perl和Java,那么也许应该使用perl进行快速的字符串操作。编程语言不是限制我们的盒子,而是我们用来解决问题的工具。这就是“代码完成”的含义。不要在编程语言/环境框中进行编码,而是将最佳解决方案放入适合您,您的问题和解决方案的最佳编程语言/环境中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.