在java中重写Perl和shell脚本是否有意义?

时间:2009-01-27 17:28:19

标签: java perl shell

我有一堆脚本 - 一些在perl中,一些在bash中 - 用于:

  • 创建数据库(表,索引, 约束,观点)
  • 解析电子表格并将数据加载到数据库中
  • 获取有关一堆文件的信息并将其加载到中 数据库中。

这些脚本与一个用java编写的更大的应用程序一起使用,我的经理要求我用java重写脚本。他的理由是,如果全部使用一种语言,则更容易使用,移植,管理,理解和支持,并且太多单独的部分是设计问题。

我最初的反应是,这是一个坏主意。这些脚本非常简洁快速,脚本中的任务很简单 - 例如使用正则表达式来查找和替换无效值 - 在java中完成时会更加冗长和极慢。

脚本的一个缺点是,当它们在Windows上运行时,它们需要cygwin才能运行。因此,我想提出一个反对意见,即我将所有bash脚本移植到perl,以便它们可以在没有cygwin的情况下在Windows上运行,并且我花时间组织和记录脚本。

问题在于,“直觉反应”类型的反应不足以说服我的经理。我来自Linux背景,他来自Windows,我们在方法上有一些经典的linux与windows的差异。

所以我有两个问题:

  1. 我的“肠道反应”是否正确? java是否更慢,更冗长,更难以维护,以便进行数据库管理,电子表格解析,以及文件处理任务?
  2. 如果第一个问题的答案是肯定的,那么提出我案子的最佳方式是什么?

  3. 编辑:感谢大家的见解。我想澄清一下:脚本不是隐藏在混淆脚本中的完整应用程序。在大多数情况下,它们是手动完成的任务,我通过脚本自动完成,随后根据需求进行修饰。我使用脚本语言而不是java开始的原因是因为这些任务在脚本中更容易做到所以。例如,一个脚本运行一堆查询,格式化结果,并将它们输出到文件。您认为在java中需要多少LOC?

20 个答案:

答案 0 :(得分:27)

答案 1 :(得分:14)

这取决于。我发现Java中的文本处理可能比Perl中的代码量多8到9倍。如果需要将这些脚本紧密集成到应用程序中,那么我会同意您的经理,但如果只有后台任务,我会考虑在Windows上使用ActiveState并在Perl中重写bash脚本。

答案 2 :(得分:7)

就我个人而言,我发现数据库,文件管理更难用于java,但一旦编写它们可能更容易维护。

但值得吗?如果有效,请不要“修复”它。

我个人并不在乎 - 如果我要做的工作,我会与经理辩论利弊,如果她坚持,我会这样做并获得报酬。通常她会理解她的感官,并给我更重要的工作要做。

答案 3 :(得分:7)

我认为你的第一反应是正确的。一个论点是如果它有效,就不要“修复”它。另一个论点是,一个开发人员可以独立于使用的语言编写几乎相同数量的SLOC。如果您知道Java是如何详细的,那么听起来很奇怪,但想想您必须如何谨慎地设计Java代码以使用perl功能作为闭包,动态生成的代码,即时regexp等获得相同的结果。而现在当Java与Perl SLOC的比例相同时,结果大于10:1。您必须阅读,理解和维护的每一行代码。 Java更快。是。对于某些人认为数字运算和某种文本处理,Java更快。 Perl对于正则表达式和其他一些文本处理来说速度更快,而且远远高于Java。如果通过SLOC进行比较,则Perl的可维护性更差,但如果按功能进行比较,则与Java相同或更好。如果Perl是使用最佳实践编写的,并且保持编码风格,而不是在可维护性方面击败Java,特别是如果用于短脚本。

答案 4 :(得分:6)

我当然同意,如果你使用大多数人都知道的一套工具,对每个人来说都会更容易。但是,由于您同时拥有Java和Perl代码,我假设至少有一些人都知道这两个代码,因此老实说,我没有看到同时拥有Java和Perl代码的大问题。

如果Perl脚本按预期工作并且可以维护,我不会花时间在Java中重写它们。 Perl中的脚本比在Java imo中容易得多,所以除非你真的需要转换,否则我不明白这一点。我宁愿把时间花在真正为你正在做的事情增加价值的事情上。

你说脚本需要运行cygwin。我在Unix / Linux和Windows上都做了很多Perl,除非你做了很多特定的Unix工作,否则我的经验是脚本可以很容易地转换成在像ActiveState这样的Windows Perl下运行。也许这可能是你的选择。

答案 5 :(得分:5)

根据我自己的经验(包括在单个系统中混合Java和Perl),我建议如下:

1)“Java较慢”不一定是真的,但也不相关(即使是真的),除非额外的运行时间干扰了一些对时间要求严格的工作流程。

2)长期可维护性是一个合法的问题。有例如不必用两种语言维护的单个DAO层可以长期回报。您需要修改多少Java代码和当前脚本(两次)来覆盖数据库中的重构?

3)如果你真的喜欢轻量级表示法,但是你的经理想要Java,那么你是否可以在Java库(从前一点)上与在JVM上运行的可互操作的类似脚本的语言之间进行妥协可以共享您编写的标准库的使用,例如数据库访问?我正在考虑JRuby-Groovy-Scala-Jython谱中的一些东西。

答案 6 :(得分:5)

一般而言,我了解您的经理希望最大限度地减少和标准化您环境中使用的不同语言/平台。

然而,某些任务,其脚本语言比Java之类的语言更适合。如果您觉得脚本被要求重写,可能而不是建议使用Perl作为此特定任务的一次性语言,您可以建议采用Perl(或者如果您认为自己采用其他脚本语言)获得更好的买入作为脚本任务的“支持”语言。

那就是说,取决于“与...结合使用”的意思(即,不同位的紧密耦合程度),可能只是这些任务更有意义地写为Java库由应用程序的其余部分调用。

答案 7 :(得分:5)

转换为所有Perl

您认为Java Regexp的速度较慢的权利。 Perl的{​​{1}}变体已进行了许多更改,以确保它尽可能快。

Regexp转换为BASH应该很容易实现,Perl可以轻松完成您在Perl中所做的工作。

通过删除BASH文件,您还可以摆脱Cygwin。

答案 8 :(得分:4)

他们应该改写吗?那要看。你的老板最强有力的论点是应用程序的其余部分是用Java编写的,听起来可能就像组织的发展方式一样。减少组织必须支持的不同语言的数量实际上是一个非常明智的长期决策。我知道,我知道,这是正确工作的正确工具,但从成本的角度来看,完全有可能会让组织花更多的钱来雇用一个既懂PERL又懂JAVA而不仅仅是Java的人。即使脚本很漂亮,它们仍然需要得到支持,这意味着他必须至少让一个人知道如何做到这一点。这是他(和组织)在一天结束时不得不担心的另一件事。

答案 9 :(得分:3)

我可以看到你在说什么,但简短而简洁并不总是可维护的 - 有时候冗长和明确是可维护的。

此外,一旦完全使用Java,您将更有可能获得UI /控制台感觉,这可能是一种改进。

如果你真的喜欢脚本语言的感觉,也许你可以反对提议groovy。它的语法非常容易让Java程序员学习并且它是100%java兼容的(包括在groovy等中扩展java类),但它是一种脚本语言 - 与任何一样强大 - 具有所有功能和缺乏编译这意味着。

顺便说一句,Java处理正则表达式很好。

顺便说一句,如果您编写了所有这些脚本并且是唯一熟悉它们的脚本,那么您可能需要开始寻找新的工作。很抱歉这么说,但要求你让你的“特殊小技巧”记录下来并且可以维护,这通常是他们在裁员之前不会考虑的事情。

答案 10 :(得分:3)

就像你说的那样:将你的shell转换为Perl并记录它

您提到的代码似乎不是应用程序的一部分,它似乎是“设置”代码或“维护”代码。作为一个回答通知,“一个工作=一个工具”:

  • 适用于您的应用,它是Java,
  • 用于打包您的应用,它是蚂蚁或专家或制作,
  • 用于设置环境,填写数据库,从日志生成报告,它是一种脚本语言(Perl,Python,shell)。

说服你的老板:

  1. http://en.wikipedia.org/wiki/Golden_hammer
  2. 从一种语言迁移到另一种语言是有风险的:您将不得不花费大量时间来检查回归错误
  3. 根据我的经验,一行Perl = 20行Java(尝试一下:迁移一个Perl脚本)。因此,代码库将乘以20,并且需要维护更多代码更多的内容
  4. Perl将所有模块和doc保存在同一个地方(cpan.org)。对于Java,没有“参考点”。你将不得不在网上浪费时间在java电子表格解析器之间做出选择,学会使用它(希望文档没问题),并制作一些java-cryptic-glue-code:

    SheetHolder = ParserFactory                   .newInstance(Configuration.asProperties())                       .parse(SheetReader.asStream());

答案 11 :(得分:2)

只有一点。在许多方面,他有一个观点,但是......

Perl(或bash脚本)是一种粘合语言。它是坚持系统并使其更好地工作的最佳语言之一。 Perl是一种完全解释的语言,它为运行时代码重写和更动态的编程风格提供了强大的功能。您可以将perl代码块作为数据传递,并将其修改,直到您在字符串上调用“eval”为止。无论是否有嵌入perl的本机java功能,您都可以轻松地自己创建这样的嵌入,从而构建一个非常强大的系统。

您可能希望向您的主管明确说明,如果删除perl,您将失去什么潜在的可能性。在我上一份工作中,两位开发人员将IronPython添加到我们的“法律语言列表”中,这样​​我们就可以实现库并通过数据库轻松传递它们进行大规模自动化项目,这个项目变成了一个非常简单,非常小的项目,用一堆python代码粘合并粘贴到已编译的模块上。

总而言之,有时候有一百万行Java不能做10行Bash脚本。那就是你想要使用它的时候。剩下的时间,你的老板是对的,只要你有时间做这件事。

答案 12 :(得分:2)

在过去的项目中,Perl代码被移植到Java,导致速度显着提高。该公司主要是Java程序员,我们的工具Eclipse,Ant,JUnit和Maven不适合Perl开发。我在许多公司看过Perl代码,但大部分时间它只是作为临时解决方案,快速修复,原型,演示等。重写是有意义的,但你应该在个案业务上看一下,有时候时间或人力不允许。

答案 13 :(得分:2)

你考虑过蚂蚁吗?我不得不承认我从未尝试过,但总是希望将我的脚本移植到Ant。文件操作很简单,甚至还有创建SQL语句的任务。当然,如果您的脚本更像程序,即许多循环结构,那么这不是可行的方法。只是一个建议。

答案 14 :(得分:2)

如果你建造一个棚子并且在80-90%的时间内使用锤子,那么你是否应该只使用锤子来建造棚屋?不,就像你做的那样,你为工作的每个部分使用最合适的工具!

近年来,IT劳动力的平均技能/经验水平也有所提高。例如。这个SO Poll表明中等SO程序员已有30多年的经验。

你老板在招聘具有广泛技能和经验的程序员方面没有问题。

答案 15 :(得分:1)

记住Java并不是唯一的JVM语言 - 或许像GroovyJython这样的妥协可以让每个人都开心。

答案 16 :(得分:1)

“对于操纵文件和移动内容,你需要操作系统在你身边”

在不了解正确背景的情况下,请小心遵循此建议!

操作系统支持编程API,如man(2)和(3)以及用户命令man(1)。

以Perl脚本为例驱动一个man(1)序列不会运行得那么快 作为JVM有效地发出man(2)或man(3)的序列。

考虑这个例子:

在我加入的公司,我发现他们有一个Perl模块在循环中调用Java实用程序 - 这是make / perl / java混合构建装置的一部分。

从表面上看,将perl读入元数据并执行/调用JVM来完成繁重工作(在perl循环中合并文件的专有形式)似乎是合理的。

这种多进程方法的开销(设置/拆除)非常重要,在Windows操作系统下尤其糟糕。

必须解决性能问题。

团队通过“重用”java程序处理了perf问题 将它托管在servlet中并创建一个协议,将命令从perl发送到java servlet。现在,循环中的迭代JVM设置/拆除减少了,每个人都很高兴,直到有一些边缘用例,例如超时问题,团队将睡眠添加到混合中。

文化鼓励工具团队使用perl和服务团队来使用Java。 使用Java替换perl并消除所有开销的最佳方法是失去了所有人或政治力量影响了rube-goldberg解决方案......

使用ANT或Maven等JVM语言进行构建可以避免这一切。

再次,请注意: - )

答案 17 :(得分:0)

现在这已经很多年了,但我刚刚用一些Perl脚本来转换bash脚本。我将系统改写为Java应用程序,我还添加了Groovy。 Java和Groovy很好地协同工作。

  • groovy运行普通的java代码。
  • 我可以在groovy中访问和操作我的所有java对象/结构/数据。我调用groovy脚本来操作运行java程序中的数据。
  • groovy有一些不错的简写语法。我可以轻松打开一个文件并用一个内容写入。
  • groovy也有一些简短的正则表达式语法。
  • groovy脚本文件在运行时被编程,所以当我的java程序仍在运行时,我可以更改我的groovy脚本代码,下次调用文件时它会使用新代码。

答案 18 :(得分:-1)

  

我的“肠道反应”是否正确?是java   更慢,更冗长,更难   维护数据库管理,   电子表格解析,&文件处理   任务?

没有。

看起来你的经理正在任命错误的人来做这件事。很明显,你不习惯编写Java并且你不应该这样做。为什么“java方面”的开发人员不会帮助你?

答案 19 :(得分:-4)

对我而言,这取决于Perl写得多么糟糕(我从未见过Perl我会说“写得好”),以及你是否需要阅读Perl。

Perl通常是Write Once,Read Never语言。如果一切正常,你不太可能需要改变它,我会说不要碰它。