在我工作的公司,我们做了很多基于文件的事务处理。处理的中心是在众多公司之间转换文件,以适应众多公司的众多系统。
处理几乎总是涉及XML
阶段,可以包括大量的文本解析,数据库查找,数据转换和数据验证。
目前执行所有这些任务的程序都是用C++
编写的,并且它们在一台普通服务器上运行得非常快。我正在研究使用更新的研究生程序员更熟悉的“现代”语言的可能性。 (C++
中正确的内存分配似乎会导致很多新的程序员出现问题)
根据提供的简要信息,python等语言是否会提供所需的功能和性能,以及解决内存分配(以及其他各种C++
相关的)问题?
我喜欢每次进行更改时都不需要编译程序的想法。我理解解释的语言可能不会达到我们目前所获得的相同性能。
我们的系统基于Linux
,也限制了一些选项。
对Python
提供的功能和性能的评论或替代语言的建议将不胜感激。
答案 0 :(得分:19)
我喜欢每次进行更改时都不需要编译程序的想法。我理解解释的语言可能不会达到我们目前所获得的相同性能。
这是最大的问题;你能忍受性能打击吗?您可以尝试使用Python和extending it with your current C++ modules来表现性能较高的部分。尽管如此,如果唯一的原因是缺乏C ++人才,那么切换整个系统似乎是一件很大的努力。雇用了解C ++的人似乎是更便宜的选择。
答案 1 :(得分:10)
哪个更重要,快速让程序运行,或让程序快速运行?
如果你正在处理大量的大文件,那么你可能最好不要使用C ++并教你的研究生程序员指针是什么(!)
否则我强烈建议您查看基于脚本的解决方案,因为一旦您加快速度,这些开发速度会快得多。如果我们诚实,至少对大多数人来说,更有趣。
如果每个记录的处理负载不高,您可能会惊讶于丢失的性能很小:文件IO几乎肯定会在编译(C)库中处理,因此解释器开销可能相对较低。值得一试,我建议。
在命令式语言中,Perl是一个显而易见的选择,Python很受欢迎,Ruby也很受欢迎(并且可能比前两个更清晰的OO功能)。然后是函数式语言的稍微,呃,深奥的领域,但我没有资格评论这些。
答案 2 :(得分:6)
Python可能会删除您在应用程序中使用的大多数低级别内容。内存分配不再是问题。此外,至少我的大学似乎将Python作为一种编程语言,因为学生不必编写所有正式的东西来开始。你唯一的问题就是性能部分,因为Python可能永远不会像编译的C ++程序那么快。
我建议你花几周的时间来了解你正在考虑的编程语言。我也看看Ruby。也许玩Haskell有点玩?
据我所知,Python似乎已经准备好处理你所谈论的一切。 XML,数据库查找,验证,解析。它通常是一个安全的选择,不仅仅是因为简单而有趣的编程体验,而且如果你被困在那里,那就是一个很棒的语言社区,他们很乐意提供帮助。
答案 3 :(得分:5)
另一种方法是在您的C ++程序中嵌入Python。您可以保留大部分应用程序,并调用Python以获取经常更改的部分,或者需要脚本语言提供的灵活性。
前几章讨论了如何进行 扩展Python,即如何扩展 Python的功能 将C函数库附加到 它。它也可以这样做 另一种方式:丰富你的C / C ++ 通过在其中嵌入Python来实现应用程序。 嵌入提供您的应用程序 有能力实施一些 您的应用程序的功能 在Python而不是C或C ++中。这个 可用于多种用途;一 例如,允许用户 根据需要定制应用程序 通过在Python中编写一些脚本。您 也可以自己使用它 功能可以写入 Python更容易。
答案 4 :(得分:3)
我不想这么说,但是如果你想要一些你熟悉的开发人员熟悉的东西,请选择Java。 Java是最近毕业生最熟悉的语言。您仍然需要编译,但编译时间将短于C ++。它将在Linux上运行,几乎在其他任何地方运行。它有一个很好的垃圾收集器。这很快。我提到你的开发人员会熟悉它吗?不,它不像Python那样“酷”,但它是一种非常可靠的语言。
老实说,我怀疑你有很多传入的开发人员用C ++吮吸,但无论如何都会很棒。使用Python的人倾向于使用手动内存管理。对内存管理不好的人实际上对所有语言都不好。
我确实发现,如果开发人员对内存管理非常糟糕以至于您想要切换语言,那就太令人担忧了。这是一个表明问题的迹象,但我不确定问题是否与语言有关。
答案 5 :(得分:3)
如果您对使用编译语言保持良好状态,我会继续使用C ++并建议选择一组好的库并教授新手正确使用和遵守实体模式。
如果你设法找到一套令人愉快的图书馆,那么新手很容易学会编写可靠的代码。我(当前)的个人偏好是Qt类库,因为它使内存处理变得简单和安全,并且使用起来很愉快。它还支持XML解析和生成,内置regexp,网络功能,跨平台,......并且对非GUI系统也非常有用。
对我来说,使用普通的C ++,std库和STL以及使用像Qt这样强大的库之间存在巨大差异。也许,看看助推器好东西也非常值得。
答案 6 :(得分:2)
我建议尝试groovy。 XML支持很好,解析和数据验证应该不难。
然而有些人指出,迁移可能不是最明智的想法。难道你不能试图将常见的东西分解为“macher对象”和“验证对象”,以便新程序员使用你的C ++库而不是尝试编写容易出错的新代码,只复制现有的片段吗?
另外请确保在C ++中使用现代文件IO(iostreams)而不是像IO一样,这应该有很多内存问题。
另外,查看boost库可能会有所帮助。
答案 7 :(得分:2)
Python中的性能可能是一个非常大的问题。一旦我不得不在任务列表上创建涉及优化算法的程序。我从Python开始,创建它超级快速和干净,然后看到它需要很长时间才能提供结果。将其逐行重写为C ++会导致 100x 速度提升超过......
因此,有时候您可以看到5-10%的性能损失。您应该在您的情况下进行调查(可能很少测试?)。
答案 8 :(得分:0)
或者应该尝试将解析规则存储在数据库中,而不是将它们硬编码到代码中。正如Ken Downs正确引用minimize code, maximize data。这样,每当微小规则发生变化时,您就不需要重新编译。
答案 9 :(得分:0)
如果您可以使用Python,Ruby,Groovy或Perl与C ++,那么最好使用其中一种更高级别的语言。生产力将大大提高。如果您发现需要更高性能,那么请使用Java。每个人都应该知道并使用至少一种动态类型的语言。
答案 10 :(得分:0)
应该转移到languange使网络成为可能的python
答案 11 :(得分:0)
如果您正在进行的项目的性质允许您甚至考虑这样的移动,那么请移动(假设您有一些线索)。然而,在许多C ++项目中,您唯一的选择是将向下移动一个或两个抽象级别(例如,移动到C或汇编)。
答案 12 :(得分:0)
我同意其他人的观点,你应该坚持使用C ++。切换到非编译语言是一个倒退。虽然许多程序员可能在处理语言的某些麻烦方面(例如指针)时遇到困难,但至少大多数程序员已经接触过某些C ++。我建议您花时间和金钱改进代码库和程序员,而不是切换语言。
至于其他语言,你可能想要关注GO语言。我的一个朋友相当广泛地使用它。这是一种现代编译语言。它往往是清晰,简洁和现代的。 GO应用程序的运行速度通常与用C ++编写的速度相当,并且可以很好地与Web连接。目前还不是很成熟,但看起来很有希望。
祝你好运!