使用高级语言进行原型制作常见吗?[关闭]


18

我目前正在玩一个项目,该项目的语言远远超出了我目前的编程能力,而我在(C)中没有多少实际经验,我正在玩这个想法。使用我更熟悉的高级语言(例如Perl / Python / Ruby / C#)进行原型设计是否有价值,以便使整体设计顺利进行?

最终,最终产品是性能敏感的(它是一个数据库引擎),因此选择了C。但是,恐怕不太了解C会让我迷失森林。

在寻找类似问题时,我注意到一个人提到程序员曾经在Prolog中进行原型设计,然后在汇编器中进行原型设计。


4
我听说有人会编写汇编程序,首先要用C编写他们想要的代码,然后反汇编并手动调整生成的汇编。
user16764 2011年

9
不要忘记性能常常会归结为正确的算法选择和实现,为难以解决的并行问题编写并行代码以及良好的数据表示形式。在正确设计之前,不必担心C。
彼得·史密斯

1
@ user16764:确实做到了。除了语言是Fortran。但是,我们完全按照您的描述手动调整了编译器的输出。
S.Lott

C不一定更快。特别是在性能受到IO限制的情况下。即使对于CPU受限的性能,如果您不是C专家,那么经过优化的VM可能也会胜过您自己编写的任何内容。
jiggy

我经常使用这种原型技术:问题以其最自然的语言表达,最终被实现为DSL。然后,当原型完成时,我改进了该DSL编译器的实现,直到性能可以接受,而不是将DSL部分重新编码为较低级的语言。
SK-logic

Answers:


27

使用C不会自动使您的应用程序更快。当您有能力为平台选择其他编程语言时,强烈建议您使用。

正如Bill Harlan所说

优化正确的代码比纠正优化的代码容易。从长远来看,过早的优化实际上会阻碍优化。不必要的优化会使设计失真,破坏模块化和信息隐藏,并使代码难于修改。潜在的错误需要更长的时间才能找到。我们经常通过剖析或更改机器或编译器来发现我们误判了代码的计算工作量。你猜怎么了?现在,优化比以前要困难得多。

如果您真的可以预测性能问题,请考虑使用C ++。cprogramming.com说的很好

但是,您可能会想,是否值得放弃C ++的可重用性以使C的性能得到少量提高,特别是当C ++可以在必要时以C编程风格编写时


为了更好地回答您的实际问题:我将使用高级语言编写代码,而不仅仅是原型,并且在遇到性能问题时仅使用低级语言进行优化。


25
+1:此外,Perl,Python和Ruby可以调用C函数,因此如有必要,您可以用C编写对性能敏感的部分。
拉里·科尔曼

我已经用Java原型化了机器视觉代码。事实证明它足够快。重新编码为C会非常容易(您只需像C那样编写;使用原始固定反模式即可)
Tim Williscroft 2011年

我已经用Java编写了实时代码。在那个特定的项目中,文件访问是使用C ++完成的,而实时代码是用Java编写的-太疯狂了!但是,实时代码非常快。它不是很复杂,但是确实可以立即处理大量数据。因此,我想肯定您可以对性能敏感的应用程序使用高级语言。
配置器

@Tim Williscroft:我在Google上搜索“原始注视反模式”时似乎只打开了此页面。那是什么?
SingleNegationElimination 2011年

@TokenMacGuy:原始的迷恋有更多的命中(相同的反模式)
Tim Williscroft

7

这样做没有什么价值,因为a)直接翻译成C的那些语言的部分不会更简单,并且b)不直接翻译成C的语言的部分比用C重写更加困难。如果您最初是用C编写的。


+1-尤其是因为如果您不熟悉OO语言,很难将OO代码转换为C,否则,如果以程序方式编写,使用高级语言将变得更加尴尬。
2011年

对,就是这样。我担心我可能仍在思考那些不易转换为C的高级概念,例如,如果我使用太多的魔术或糖。
Mark Canlas

4

这不是一个明确的是或否答案的问题。请允许我介绍一下轶事。

例子1

我的任务是将用Java编写的游戏移植到Flash,AS3中。从表面上看,这有可能进行得比较顺利。毕竟,您可以认为这样的工作比一般的客户工作更为明确,因为您已经以源游戏的形式获得了完全内置的功能规范。Java和AS 3都是高级语言,并且AS3与Java共享许多特性,例如包结构,单继承/多接口,(选择加入)强类型以及公共/受保护/私有变量的概念和函数声明。那时,我对Java还是很陌生,对原始源代码库来说是全新的。所以我只想看看我能找到什么,希望它能快速,轻松地完成。

事实证明,代码的作者曾试图创建一个抽象引擎,该引擎可以从Java移植到一些未定义的其他环境中。这给了我希望移植会很简单。不幸的是,我发现的是我正在寻找在Flash之上重新发明Flash本身的前景,而没有Threads的好处。事实证明,一个字面意义上的端口根本不是一个好主意……性能上的噩梦。最重要的是,该游戏实现了自己的自定义外部脚本语言,如果我希望使用所有原始源数据文件,那将意味着为该语言创建解析器和词法分析器。

最后,由于时间和预算的限制,原始源代码并没有太大帮助。关于它的最有用的部分是,我知道如何精确模拟游戏逻辑的控制流程...但是我真的需要这个原始来源吗?可能不会。

但是该示例可能不那么相关,因为它与您的情况有点相反。我希望使用我当时不知道的语言来使用我未编写的代码库,以加快在我非常熟悉的环境中的开发速度。所以这是一个不同的例子

例子2

注意到Java开发人员在尝试创建可移植代码库时所做的工作,我开始在Flash工作中为自己做类似的事情……编写不那么依赖扩展flash.display。*类的代码,并使用合成来创建视图。不必过于依赖flash.event。*,而是编写自己的轻量级消息传递系统,而不必特别依赖于某种语言或平台。我最近使用上述框架完成了一个游戏,并希望了解将Unity 3D项目移植到C#(我知道的一种语言,与Java和AS3类似,是否容易)。事实证明,这要成功得多!因为我认为在AS3中比在C#中更流畅,所以已经编写算法可以节省大量时间。我要做的就是简单地更改语法,即

因此,仅凭我个人的经验,我不能说答案总是肯定的。您应该考虑您在选择的高级语言中碰巧对特定语言习惯有多大依赖,以及重新创建这些习惯在C语言中是容易还是困难。


您的第二个故事说明了我的感受。我将尝试使原型实现不受泛型和魔术/魔术的影响,以便大多数(即使不是全部)想法都可以翻译成C。说起来容易做起来难,但是我认为它仍然足够高。显然,细节在于魔鬼。
Mark Canlas

@马克·坎拉斯(Mark Canlas)“魔鬼在细节中”。绝对。我认为,如果您从未在语言或环境之间移植过代码,那么您的第一次尝试可能会出错,因为您很难在遇到所有潜在问题之前就预见到所有潜在问题。
scriptocalypse'7

2

我认为从伪代码开始很有价值。用另一种语言编写原型似乎是浪费时间,因为您的高级语言不太可能像伪代码那样转换为“ C”。

另外,通过使用伪代码,您将更好地了解系统的实际工作方式。

在处理伪代码的同一时间段内,您应该学习C。然后,当您完成计划时,您可能已经准备好实际实现它了。

由于您提议用另一种语言编写代码的原因是为了帮助进行设计,因此您可能想使用一些UML图或类似性质的内容来入门。


2

您可以对算法进行原型设计-使用绝对“非常高级”的语言(例如Matlab,也许是Ruby)消除核心逻辑的设计错误。使用它来证明您的算法有效并且可以正常工作,然后以“低级”语言从头开始实施它。

如果选择C ++甚至Java或C#作为“高级”,而选择C作为“低级”,则不会获得太多收益,因为可读性不会显着提高,并且“翻译”仍然会非常痛苦并且存在很多错误,易于。这个想法很重要,在高层实现中,项目的引擎不应占据一两个屏幕以上,易于掌握,易于阅读,并且所有警告都非常痛苦-本质上,这是一个可运行的,可运行的块图。


2

数据库引擎主要是关于以最佳方式处理低级I / O和有效处理b-tree和链表之类的复杂结构。

因此,这肯定是C / C ++问题,尽管那里有一些相当不错的Java实现。

使用高级语言,开发性能良好的正确算法要容易得多。通常是尝试几种变体并比较结果的情况。然后,您可以将“获胜”算法转换为C。

一种折衷的解决方案是用一种较高级别的JVM语言(想到的是Jython,Groovy)编写初始实现,然后在实现稳定后将类逐级移至Java。


2

我不认为这很常见,但是已经完成了。我曾经与之合作的最聪明的架构师之一曾经在Python中进行过建模,然后在C ++中实现了该代码。

总的来说,要使之有价值,我认为您确实必须执行复杂且高度可优化的算法,而这些算法很难用目标语言简单地表达出来。对于大多数“现实世界/业务”情况,用我们所针对的相同语言来表达高级意图相对容易,并且以该语言实现的内容可以满足我们的性能要求,因此无需/不希望在更高的层次上建模语言。

考虑到您的情况,您对高级语言有更好的了解,我认为这种方法在短期内效果很好。它不仅为您提供了保持进度的路线图,而且如果您有问题,也可以更精确地提出问题。


1

目前,我正在从事一个用C语言编写的项目,“这是出于动机”(这是最初的动机),但实际上,如果进行了分析,它表明它花费了大部分时间在等待其他系统(数据库,其他用Java编写的应用程序) Java,套接字上的“事件”。

如果使用错误的算法,也会在C语言中获得不好的性能(例如,如果对某个键进行线性搜索,“由于C没有哈希表,并且我们不想使用其他库”),则速度会比使用具有哈希表或类似代码(例如C ++,Java,C#,Python等)的语言来实现)。

如果由于某种原因而被迫使用C语言进行编程,那么对其他语言进行原型设计对我来说并不是一个坏主意,只有当您知道要执行实际C实现的“问题”的原型时,这很难您对C没有信心。(您很快就会发现C / C std库没有容器,只有“纯”数组;您需要非std库)。而且C不是OO,因此,如果您以OO方式进行原型设计,则难度会更大。

总而言之,最好的办法是使用“原型”语言进行实际的实现,然后,如果确实需要,请用C编写CPU密集型函数,但是如果只接受C,请在进行其他原型制作之前更好地学习它语言,当然还要在编写实现之前。


1

有许多使用高级语言编写的性能关键型应用程序。

我过去曾经使用Assembler和C进行编程,虽然感觉非常接近金属,但如今它们的使用非常有限。

有太多阻碍性能的因素,我怀疑您是否会碰到语言本身是限制因素的部分。考虑到这是C vs C#。

假设您通过该语言获得的性能提高了10%-15%。与实现正确算法的数量级增加相比,这没有什么。

当您使用C#进行编程时,您将有更多时间专注于算法/数据结构的体系结构和实现,从而带来更好的更高级别的优化。

在现实世界中,您总是会受到时间的限制,因此请花时间在项目的正确部分上。


0

我对您打算在C中实际创建它的计划感到好奇吗?您是否打算制作原型,然后学习C,然后用C重新编码?在我看来,这有点像谚语“眼睛比肚子大”,我认为很多程序员在学习新技术时都会陷入困境(我知道我拥有)。我的意思是,您正在尝试设计对性能非常敏感的产品,甚至还不知道最终需要使用哪种语言来编写它,而基本上您想在开始之前就已经开始设计C应用程序知道C的时间可能比先学习C更好,然后您可能会对如何编写所需的应用程序有更多的了解。也许我误解了这个问题,而您打算把这个问题交给另一个程序员来用C来构建程序,


有时“不要那样做”。正确的答案,“我如何做X?”
拉里·科尔曼

0

有时会进行原型制作,以了解您要解决的问题。有时,如果您还不了解基础技术,则可以了解它们。

对于上述情况,您正在考虑使用脚本语言(例如python)进行原型制作,并使用C编写实际代码。

评估一些可能性:

1。您可以使用python建立原型,并使用C编写软件。

使用脚本语言进行原型制作可以帮助您快速地根据输入检查输出。如果您主要需要测试解决问题的逻辑,这将很有用。此外,如果您想快速为其他人编写演示,该功能也很有用。

您在python中编写的任何代码都不会在最终软件中使用。但是,如果将原型传递给可以阅读python并用C编写代码的人,这将有所帮助。在这里,原型设计可以帮助传达想法

此方法适用于测试解决方案的逻辑可行性。

2。您可以使用C进行原型设计并使用C编写软件。

对您来说新的C语言原型有两个优点。一,在编写原型时,您将了解语言,库,API,陷阱等的相关部分。二,在构建最终软件时,您可以从原型本身开始,从而节省了时间并重用了代码

此方法适合于测试解决方案的逻辑和技术可行性。

3。您可以根据眼前的问题考虑采用非编码方式进行原型制作。

如果您想使用一些逻辑和思想作为原型;纸上的伪代码流程图框图也很好。

如果它是UI原型,请考虑使用一些UI模拟工具,或者再考虑一些论文。


0

我认为您应该使用您熟悉的语言(Pytho / Ruby / C#不会)原型化,以便:

  1. 您可以充分利用该语言提供的功能/库。
  2. 您花时间决定设计选择而不是语言限制。

以后,您可以使用配置文件工具来查找瓶颈区域。在C / C ++中重新实现。重复上述步骤几次,谁知道您的原型可能“足够快”!


0

我认为您所描述的方法并没有使您有所收获,而且有好几个人已经详细描述了原因。

我参与的一个项目使用了这种方法:针对Cell / BE和Power7架构的数学库开发。这些函数在Haskell中建模(使用CoCoNUT),输出函数针对特定目标体系结构进行了优化组装。

在这种情况下,目标是通过调整后的组装指令实现高性能,并具有针对多种体系结构的能力。

虽然食物,但我希望你不要饿死:)


0

对于高性能数据库引擎,您大概需要:

  • 多线程
  • 显式的内存管理
  • 异步通知
  • 信号量或同步原语,
  • 轻松访问低级文件系统功能。

您选择的算法对性能至关重要。

一般建议是从高级语言开始,然后仅将需要优化的位迁移到较低级语言。

然而,您选择的高级语言必须能够支持您需要编写的算法:而这里的高效算法最终可能会受到线程控制,高效使用内存以及使用最佳低级文件系统操作的支配可用。因此,如果最终目标是性能,则不能使用不支持需要使用的原语的语言进行原型设计。

如果您需要测试原型(或者其他人需要根据其接口开发软件),则还需要使用支持所需API的语言进行工作。然后,您可以允许其他人测试他们的代码并在优化的同时进行自己的回归测试。

在这种情况下,这些考虑因素可能会排除许多语言用于高级原型制作-可能还包括您提到的所有语言(可能是C#)。但是,您当然可以使用任何语言(包括英语)的伪代码,并且,如果需要,可以使用您喜欢的语言为项目的各个部分(例如排序功能)建立原型。

C ++和C之间的密切关系(以及可忽略的性能差异)意味着在最终产品中几乎没有理由不喜欢C ++。

(我的回答是假设您出于特定目的需要高性能的数据库引擎:如果您的意图比较适中,那么大概您会选择现成的引擎)。


-2

我认为C的声誉是当之无愧的,因为宏伟的产品Unix是用C编写的。但是,与最了解C的人相比,我对为什么应该使用C表示怀疑。据说Ken Thompson(用汇编语言编写了Unix的第一个版本之后)开始用Fortran编写Unix,但是一周或一个月后就放弃了,并开始使用由其同事Ken Ritchie在同时。

最近我很惊讶地读到Fortran比C和C ++快。

理查德·穆林斯


1
这如何回答所提问题?
2013年
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.