面向语言的编程实用吗?


12

我阅读了有关面向语言的编程的文章。他指出了现代程序/ OOP编程方法中的一些弱点,并提出了可以解决这些问题的新编程范式

我只想了解那些松散耦合的小型程序部分:最好学习很多小的东西,而您只需要一点点地使用它们,而不是几个大的东西。

阅读这篇文章后,我觉得作者正在推广以下两项内容之一:

  • 多种易于创建的脚本语言
  • 单一的,易于扩展的语言,可以自行重写以满足程序员的需求

如果他建议第二个,我将回答“已经完成!” 并以Lisp为例。正如保罗·格雷厄姆(Paul Graham)所建议的,无论如何语言似乎一直在朝着这个方向发展

就第一个而言,我认为这是一个好主意,如果有将它们紧密联系在一起的基本语言。在我看来,这是薄弱环节:语言之间的交流。您会使用过程概念或消息传递的调用方式,使我想起进程间通信吗?如果很容易同时使用它们,我欢迎有机会使用特定于小型领域的语言。这种方法(LOP)是否可行?


它肯定具有巨大的打击潜力。

2
对我来说,尚不清楚此范例解决了什么问题。顺便说一句,LISP并不是成功语言的例子。
mouviciel 2011年

7
@mouviciel在很大程度上取决于您“成功”的确切含义。大多数程序员都使用它吗?否。已经使用了很长时间了吗?是的-50年,而且还在继续。大多数现代语言是否从中窃取了一堆有用的功能?是。(语言可以从Lisp语言中窃取更多吗?是的!)
Frank Shearar 2011年

2
广泛使用的语言和有用的语言之间是有区别的。通常不会使用探索新领域的语言,但从长远来看可能会为所有人做出贡献。另一方面,Java是没有用的,因为它不会给表带来任何新的变化(即使从所有角度来看它绝对是一种成功的语言)。
Matthieu M.

1
我会发现掌握Lisp比掌握Cobol更有用。
glenatron 2011年

Answers:


8

我提倡DSL已有很长时间了,但是我担心当好主意成为潮流时会发生什么。制作了宣传“好主意”的产品,承诺您要做的就是获得“一个好主意”,而您将成为团队中的一员,而不必仔细考虑它的含义。

什么是语言?这是一个可以传达含义的词汇和语法,对吗?每次声明变量,编写函数,定义类时,都在通过向现有语言添加名词和动词来构建新的语言。现在您可以在其中说出您以前无法做到的事情。

我认为使领域特定语言成为自然地表达所传达的心理概念的程度,并且我认为有一个简单的度量方法。基本上,如果有一个简单的独立需求X(可以包含在程序中也可以不包含在其中),则其正确的实现需要一组代码插入,删除和替换Y。可以显示一个简单的前后差异Y。此类更改的数量N衡量语言的特定领域。对于典型的要求,N越小越好。

它不一定取决于复杂的语法,控制结构,消息传递或您拥有什么。它所依赖的是它如何精确地实现需​​求。许多工具都声称可以做到这一点,但声明并非现实。它必须是真实的

有时,一个不寻常的技术必要的。这是我最喜欢的例子。 如果是的话,它说明了程序员可能需要努力才能理解它。因此,领域专有性(和可维护性)与可读性根本不一样。

因此,我同意第二种方法,即一种好语言是一种可以轻松让人们在其基础上构建必要语言的语言。(这就是我对Lisp所喜欢的。)但更重要的是,程序员需要知道如何构建语言以匹配他们所工作的领域,并愿意攀登此类语言的学习曲线。

我真的看不到这种情况。取而代之的是,它们陷入“程序=算法+数据结构”中,或者“名词变成类而动词变成方法”。他们没有就如何运用思想领域和语言化以达到最大程度的简洁性进行工作。


在浪潮部分,您肯定会同意您的观点:“尖头的上司知道应该用哪种语言编写。Java。另一个问题是乔尔所说的“建筑宇航员”。我还可以看到DSL相互堆叠在广告adfitium(sp?)中。我想这可以归结为程序员->软件工程师->计算机科学家。
Michael

而且,如果不需要花力气去理解的话,那么就真的不值得这样做:)
Michael K

4

这就是Ruby的方法。

  • 保持核心语言简单并通过gem扩展
  • 通过猴子补丁为特定域创建Ru​​by的方言。ig Ruby on Rails。

我不知道这是否更好,但我想这很实用。


7
RoR不是Ruby的方言。
back2dos

4
@ back2dos:我在思考元编程。当然,RoR 不是另一种编程语言。方言我的意思是,即使Rails下方的所有内容都是Ruby,从开发人员的角度来看,他仍在更高级别的抽象水平上使用Ruby。域。方言。他使用视图,模型,控制器,并且正在使用类似于另一种语言(可以说方言)的语法对它们进行编程。这就是像Ruby这样强大的脚本语言的美。
尼尔安

我认为重要的是要真正看到差异。AspectJ是Java的方言,而AspectR只是Ruby库。真正的区别是语言。Ruby旨在提供灵活性和表现力,而Java则不是。两种语言都可以视为通用语言,不同之处在于,Ruby通常具有足够的表现力,可以消除任何通用用途的实际DSL需求,而Java则没有,即使您通常使用视图,模型和控制器也是如此。
back2dos

1

LOP方法非常实用。请记住,您不一定必须实现“脚本语言”-该方法同样适用于eDSL,并且通常可以对其进行有效地编译。实际上,我在所有开发工作中都使用了这种方法。


请原谅我的无知-eDSL可能是花药语言的预处理器,对吗?
Michael K'2

@Michael,是的,可以以这种方式实现eDSL,例如参见CamlP4。但是,更常见的是,eDSL是基于语言自身的功能(例如Lisp宏,C ++模板等)构建的。
SK-logic

1

从现在正在谈论领域的人的角度来看,将来我们会看到更多有关领域特定语言的信息-我注意到Martin Fowler也谈论了很多,以及Lambda The Ultimate上有关该主题的一些有趣的文章,其中。

这向我暗示,这绝对是编程语言设计和编程平台的风向标。在某种程度上,它已经存在了一段时间-Ruby的优势(正如已经观察到的)是,它使创建DSL变得容易,但是实际上,在我们已经使用的应用程序和编程库中有大量的DSL。


您可以在FoF中添加用于开发Barrelfish多内核驱动程序。一种开发DSL的语言:)
Matthieu M.

0

每当单独编程时,我都会使用LOP。我发现在某些项目中,没有其他方法可以满足时间表。简单来说,人们可以将LOP等同于电动工具。如果您独自在车间工作,则无法手动完成任务并在截止日期之前完成。如果有其他人陪同,协调使用这些电动工具对于提高效率和安全性至关重要。
在团队模式下,LOP需要进行组织准备,以避免Babel塔灾难。

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.