我目前正在玩一个项目,该项目的语言远远超出了我目前的编程能力,而我在(C)中没有多少实际经验,我正在玩这个想法。使用我更熟悉的高级语言(例如Perl / Python / Ruby / C#)进行原型设计是否有价值,以便使整体设计顺利进行?
最终,最终产品是性能敏感的(它是一个数据库引擎),因此选择了C。但是,恐怕不太了解C会让我迷失森林。
在寻找类似问题时,我注意到一个人提到程序员曾经在Prolog中进行原型设计,然后在汇编器中进行原型设计。
我目前正在玩一个项目,该项目的语言远远超出了我目前的编程能力,而我在(C)中没有多少实际经验,我正在玩这个想法。使用我更熟悉的高级语言(例如Perl / Python / Ruby / C#)进行原型设计是否有价值,以便使整体设计顺利进行?
最终,最终产品是性能敏感的(它是一个数据库引擎),因此选择了C。但是,恐怕不太了解C会让我迷失森林。
在寻找类似问题时,我注意到一个人提到程序员曾经在Prolog中进行原型设计,然后在汇编器中进行原型设计。
Answers:
使用C不会自动使您的应用程序更快。当您有能力为平台选择其他编程语言时,强烈建议您使用。
优化正确的代码比纠正优化的代码容易。从长远来看,过早的优化实际上会阻碍优化。不必要的优化会使设计失真,破坏模块化和信息隐藏,并使代码难于修改。潜在的错误需要更长的时间才能找到。我们经常通过剖析或更改机器或编译器来发现我们误判了代码的计算工作量。你猜怎么了?现在,优化比以前要困难得多。
如果您真的可以预测性能问题,请考虑使用C ++。cprogramming.com说的很好:
但是,您可能会想,是否值得放弃C ++的可重用性以使C的性能得到少量提高,特别是当C ++可以在必要时以C编程风格编写时。
为了更好地回答您的实际问题:我将使用高级语言编写代码,而不仅仅是原型,并且在遇到性能问题时仅使用低级语言进行优化。
这样做没有什么价值,因为a)直接翻译成C的那些语言的部分不会更简单,并且b)不直接翻译成C的语言的部分比用C重写更加困难。如果您最初是用C编写的。
这不是一个明确的是或否答案的问题。请允许我介绍一下轶事。
例子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语言编写的项目,“这是出于动机”(这是最初的动机),但实际上,如果进行了分析,它表明它花费了大部分时间在等待其他系统(数据库,其他用Java编写的应用程序) Java,套接字上的“事件”。
如果使用错误的算法,也会在C语言中获得不好的性能(例如,如果对某个键进行线性搜索,“由于C没有哈希表,并且我们不想使用其他库”),则速度会比使用具有哈希表或类似代码(例如C ++,Java,C#,Python等)的语言来实现)。
如果由于某种原因而被迫使用C语言进行编程,那么对其他语言进行原型设计对我来说并不是一个坏主意,只有当您知道要执行实际C实现的“问题”的原型时,这很难您对C没有信心。(您很快就会发现C / C std库没有容器,只有“纯”数组;您需要非std库)。而且C不是OO,因此,如果您以OO方式进行原型设计,则难度会更大。
总而言之,最好的办法是使用“原型”语言进行实际的实现,然后,如果确实需要,请用C编写CPU密集型函数,但是如果只接受C,请在进行其他原型制作之前更好地学习它语言,当然还要在编写实现之前。
有许多使用高级语言编写的性能关键型应用程序。
我过去曾经使用Assembler和C进行编程,虽然感觉非常接近金属,但如今它们的使用非常有限。
有太多阻碍性能的因素,我怀疑您是否会碰到语言本身是限制因素的部分。考虑到这是C vs C#。
假设您通过该语言获得的性能提高了10%-15%。与实现正确算法的数量级增加相比,这没有什么。
当您使用C#进行编程时,您将有更多时间专注于算法/数据结构的体系结构和实现,从而带来更好的更高级别的优化。
在现实世界中,您总是会受到时间的限制,因此请花时间在项目的正确部分上。
有时会进行原型制作,以了解您要解决的问题。有时,如果您还不了解基础技术,则可以了解它们。
对于上述情况,您正在考虑使用脚本语言(例如python)进行原型制作,并使用C编写实际代码。
评估一些可能性:
1。您可以使用python建立原型,并使用C编写软件。
使用脚本语言进行原型制作可以帮助您快速地根据输入检查输出。如果您主要需要测试解决问题的逻辑,这将很有用。此外,如果您想快速为其他人编写演示,该功能也很有用。
您在python中编写的任何代码都不会在最终软件中使用。但是,如果将原型传递给可以阅读python并用C编写代码的人,这将有所帮助。在这里,原型设计可以帮助传达想法。
此方法适用于测试解决方案的逻辑可行性。
2。您可以使用C进行原型设计并使用C编写软件。
对您来说新的C语言原型有两个优点。一,在编写原型时,您将了解语言,库,API,陷阱等的相关部分。二,在构建最终软件时,您可以从原型本身开始,从而节省了时间并重用了代码。
此方法适合于测试解决方案的逻辑和技术可行性。
3。您可以根据眼前的问题考虑采用非编码方式进行原型制作。
如果您想使用一些逻辑和思想作为原型;纸上的伪代码,流程图和框图也很好。
如果它是UI原型,请考虑使用一些UI模拟工具,或者再考虑一些论文。
对于高性能数据库引擎,您大概需要:
您选择的算法对性能至关重要。
一般建议是从高级语言开始,然后仅将需要优化的位迁移到较低级语言。
然而,您选择的高级语言必须能够支持您需要编写的算法:而这里的高效算法最终可能会受到线程控制,高效使用内存以及使用最佳低级文件系统操作的支配可用。因此,如果最终目标是性能,则不能使用不支持需要使用的原语的语言进行原型设计。
如果您需要测试原型(或者其他人需要根据其接口开发软件),则还需要使用支持所需API的语言进行工作。然后,您可以允许其他人测试他们的代码并在优化的同时进行自己的回归测试。
在这种情况下,这些考虑因素可能会排除许多语言用于高级原型制作-可能还包括您提到的所有语言(可能是C#)。但是,您当然可以使用任何语言(包括英语)的伪代码,并且,如果需要,可以使用您喜欢的语言为项目的各个部分(例如排序功能)建立原型。
C ++和C之间的密切关系(以及可忽略的性能差异)意味着在最终产品中几乎没有理由不喜欢C ++。
(我的回答是假设您出于特定目的需要高性能的数据库引擎:如果您的意图比较适中,那么大概您会选择现成的引擎)。
我认为C的声誉是当之无愧的,因为宏伟的产品Unix是用C编写的。但是,与最了解C的人相比,我对为什么应该使用C表示怀疑。据说Ken Thompson(用汇编语言编写了Unix的第一个版本之后)开始用Fortran编写Unix,但是一周或一个月后就放弃了,并开始使用由其同事Ken Ritchie在同时。
最近我很惊讶地读到Fortran比C和C ++快。
理查德·穆林斯