我可以在代码上强制执行哪些类型的模式,以便更轻松地转换为另一种编程语言? [关闭]

2024-03-15

我正着手做一个业余项目,其目标是将代码从一种编程语言翻译成另一种编程语言。我开始使用的语言是 PHP 和 Python(Python 到 PHP 应该更容易上手),但理想情况下我能够(相对)轻松地添加其他语言。计划是:

  • 这是针对网络开发的。原始代码和目标代码将位于框架之上(我也必须编写框架)。这些框架将采用 MVC 设计模式并遵循严格的编码约定。这应该会让翻译变得更容易一些。

  • 我还在研究 IOC 和依赖注入,因为它们可能会使翻译过程更容易并且更不容易出错。

  • 我将使用Python的解析器模块 http://docs.python.org/library/parser.html,这让我可以摆弄抽象语法树。显然我能用 PHP 得到的最接近的是token_get_all() http://php.net/manual/en/function.token-get-all.php,这是一个开始。

  • 从那时起我就可以构建 AST、符号表和控制流。

然后我相信我可以开始输出代码了。我不需要完美的翻译。我仍然需要检查生成的代码并修复问题。理想情况下,译者应该标记有问题的翻译。

在你问“这到底有什么意义?”之前答案是……这将是一次有趣的学习经历。如果您对如何减轻这种困难有任何见解,请告诉我。


EDIT:

我更感兴趣的是知道我可以在代码上强制执行哪些类型的模式,以便更轻松地翻译代码(即:IoC、SOA?),而不是如何进行翻译。


我去过构建工具(DMS 软件重组工具包) http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html自 1995 年以来,在强大的计算机科学家团队的支持下,进行通用程序操作(语言翻译是一个特例)。 DMS 提供通用解析、AST 构建、符号表、控制和数据流分析、翻译规则的应用、带注释的源文本重新生成等,所有这些都通过计算机语言的显式定义进行参数化。

完成此操作所需的机械数量well是巨大的(特别是如果您希望能够以通用方式对多种语言执行此操作),然后您需要可靠的解析器来处理具有不可靠定义的语言(PHP 就是一个完美的例子)。

你考虑构建一个语言到语言的翻译器或尝试它并没有什么问题,但我认为你会发现对于真正的语言来说这是一个比你预期的更大的任务。我们仅在 DMS 上就投入了约 100 个人年,在每种“可靠”语言定义(包括我们为 PHP 辛苦构建的语言定义)上又投入了 6-12 个月的时间,对于 C++ 等讨厌的语言则投入更多。这将是一次“地狱般的学习经历”;这对我们来说是好事。 (您可能会发现上述网站上的技术论文部分对于快速开始学习很有趣)。

人们经常尝试从他们熟悉的某些技术开始构建某种通用机械,这些技术可以完成部分工作。 (Python AST 就是一个很好的例子)。好消息是部分工作已经完成。坏消息是,机器内置了无数的假设,其中大部分假设只有在你尝试让它做其他事情时才会发现。那时你会发现这台机器是用来做它最初做的事情的,并且会非常非常抵制你让它做其他事情的尝试。 (我怀疑尝试使用 Python AST 来建模 PHP 将会很有趣)。

我最初开始构建 DMS 的原因是为了构建很少内置此类假设的基础。它有一些让我们头疼的问题。到目前为止,还没有黑洞。 (过去 15 年我工作中最困难的部分就是努力防止此类假设的蔓延)。

许多人还错误地认为,如果他们能够解析(并且可能获得 AST),他们就可以很好地完成一些复杂的事情。惨痛的教训之一是您需要符号表和流程分析来进行良好的程序分析或转换。 AST 是必要的,但还不够。这就是 Aho&Ullman 的编译器书没有停在第 2 章的原因。(OP 拥有这项权利,因为他计划在 AST 之外构建额外的机制)。有关此主题的更多信息,请参阅解析后的生活 http://www.semanticdesigns.com/Products/DMS/LifeAfterParsing.html.

“我不需要完美的翻译”这句话很麻烦。弱翻译者所做的就是转换“简单”的 80% 代码,而将困难的 20% 留给手工完成。如果您打算转换的应用程序非常小,并且您只想将其转换一次,那么 20% 就可以了。如果您想要转换许多应用程序(甚至是同一个应用程序,随着时间的推移进行微小的更改),这并不好。如果您尝试转换 100K SLOC,那么 20% 就是 20,000 行原始代码,这些代码在您已经不理解的另外 80,000 行翻译程序的上下文中很难翻译、理解和修改。这需要付出巨大的努力。在百万行级别,这在实践中根本是不可能的。 (令人惊讶的是,有些人不信任自动化工具并坚持手动翻译百万行系统;这甚至harder他们通常会因为长时间的延误、高昂的成本和经常的彻底失败而痛苦地发现。)

翻译大型系统必须追求百分之九十的高转化率,否则您可能无法完成翻译活动的手动部分。

另一个关键考虑因素是要翻译的代码的大小。即使使用良好的工具,构建一个可用的、强大的翻译器也需要花费大量的精力。虽然构建一个翻译器而不是简单地进行手动转换似乎很性感且很酷,但对于小型代码库(例如,根据我们的经验,最多约 100K SLOC),从经济角度来看根本不合理。没有人喜欢这个答案,但如果你真的只需要翻译 10K SLOC 代码,那么你最好还是硬着头皮去做。是的,这很痛苦。

我认为我们的工具非常好(但是,我有很大的偏见)。而培养一名优秀的翻译人员仍然非常困难;我们大约需要 1.5-2 人年的时间,并且我们知道如何使用我们的工具。不同的是,有了这么多机器,我们succeed http://www.semdesigns.com/Products/Services/NorthropGrummanB2.html比我们失败的次数要多得多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以在代码上强制执行哪些类型的模式,以便更轻松地转换为另一种编程语言? [关闭] 的相关文章

  • 在 PHP 字符串中格式化 MySQL 代码

    是否有任何程序 IDE 可以在 PHP 字符串中格式化 MySQL 代码 例如 我使用 PHPStorm IDE 但它无法做到这一点 它对 PHP 和 MYSQL 执行此操作 但不适用于 php 字符串内的 MYSQL 我已准备好使用新的
  • SQLALchemy .query:类“Car”的未解析属性引用“query”

    我有一个这里已经提到的问题https youtrack jetbrains com issue PY 44557 https youtrack jetbrains com issue PY 44557 但我还没有找到解决方案 我使用 Pyt
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • AWS EMR Spark Python 日志记录

    我正在 AWS EMR 上运行一个非常简单的 Spark 作业 但似乎无法从我的脚本中获取任何日志输出 我尝试过打印到 stderr from pyspark import SparkContext import sys if name m
  • 添加不同形状的 numpy 数组

    我想添加两个不同形状的 numpy 数组 但不进行广播 而是将 缺失 值视为零 可能最简单的例子是 1 2 3 2 gt 3 2 3 or 1 2 3 2 1 gt 3 2 3 1 0 0 我事先不知道形状 我正在弄乱每个 np shape
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • 使用PHP从doc、xls文件中读取数据

    我想知道是否可以从 doc 和 xls 文件中读取数据并将 将内容读取到图像文件中 创建文档的页面样本 例如 我有一些文件希望我的客户购买 所以我需要自动创建小图像 例如我的文档样本 我们将不胜感激您的帮助 对于读取 xls 文件 我真的推
  • 如何在Python中对类别进行加权随机抽样

    给定一个元组列表 其中每个元组都包含一个概率和一个项目 我想根据其概率对项目进行采样 例如 给出列表 3 a 4 b 3 c 我想在 40 的时间内对 b 进行采样 在 python 中执行此操作的规范方法是什么 我查看了 random 模
  • PHP 中的 -> 和 :: 有什么区别?

    这个东西困扰我好久了 一直找不到 在 php 中使用 和 gt 之间的类有什么区别 让我举个例子 想象一个名为 MyClass 的类 该类中有一个函数 myFunction 使用有什么区别 MyClass myclass new MyCla
  • PHP 检查当前日期是在设定日期之前还是之后

    我从数据库中提取一个日期 其格式为 dd mm YYYY 我想做的是检查当前日期 如果当前日期早于数据库中的日期 则需要打印数据库日期 如果是在之后 则需要打印 继续 有人能指出我正确的方向吗 if strtotime database d
  • 雄辩的第一个 where 子句

    我想知道 Laravel 如何实现雄辩的语法 以便可以静态调用第一个 where 子句User where User where id 23 gt where email email gt first 他们有吗public static f
  • 向 Altair 图表添加背景实心填充

    I like Altair a lot for making graphs in Python As a tribute I wanted to regenerate the Economist graph s in Mistakes we
  • session_start():无法解码会话对象

    我有时在使用 CodeIgniter 时遇到以下问题 错误 2019 03 05 19 57 26 gt 严重性 警告 gt session start 无法解码会话对象 会话已被销毁 system libraries Session Se
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • Laravel 搜索关系

    我有两个相关的模型 我正在尝试在产品中进行搜索 并且仅显示实际搜索结果 而不是找到该产品的类别的所有产品 我不想搜索任何类别 因为无论搜索什么或找到什么 类别都会始终显示 Example I have the following categ
  • 矩形超出边界是什么意思

    PPB Graphics2D PaintImageData 矩形超出界限是什么意思 我几乎在我检查的每一段代码中都看到了它 最新的代码是 define my consumer key define my consumer secret oa
  • 如何计算 pandas 数据帧上的连续有序值

    我试图从给定的数据帧中获取连续 0 值的最大计数 其中包含来自 pandas 数据帧的 id date value 列 如下所示 id date value 354 2019 03 01 0 354 2019 03 02 0 354 201
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • PHP更改小数点分隔符

    在某些情况下 PHP 会在操作后更改小数点分隔符 下面是一个示例 为什么小数点分隔符变成 这是一个多语言网站 在西班牙语版本中 区域设置设置为西班牙语 es ES 小数点分隔符为 这就是为什么正在改变 解决方案是强制 LC NUMERIC

随机推荐