我可以在代码上实施哪些类型的模式,以使其更容易翻译成另一种编程语言?[关闭]

2024-12-24 08:55:00
admin
原创
139
摘要:问题描述:我正在着手做一个业余项目,目标是将代码从一种编程语言翻译成另一种编程语言。我最开始使用的语言是 PHP 和 Python(从 Python 到 PHP 应该更容易入门),但理想情况下,我可以(相对)轻松地添加其他语言。计划是:这是针对 Web 开发的。原始代码和目标代码将位于框架之上(我也必须编写框...

问题描述:

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

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

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

  • 我将使用 Python 的解析器模块,它让我可以摆弄抽象语法树。显然,我能用 PHP 获得的最接近的方法是token_get_all(),这只是一个开始。

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

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

在你问“这到底有什么意义?”之前,答案是……这将是一次有趣的学习经历。如果你对如何让这件事不那么令人生畏有任何见解,请告诉我。


编辑:

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


解决方案 1:

自 1995 年以来,我一直在开发工具(DMS 软件再工程工具包)来进行通用程序操作(语言翻译是特殊情况),这得到了强大的计算机科学家团队的支持。DMS 提供通用解析、AST 构建、符号表、控制和数据流分析、翻译规则的应用、带注释的源文本再生等,所有这些都由计算机语言的明确定义参数化。

要做好这件事,你需要大量的机器(特别是如果你希望能够以通用的方式对多种语言做到这一点),然后你需要为具有不可靠定义的语言提供可靠的解析器(PHP 就是一个完美的例子)。

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

人们经常尝试从他们熟悉的某项技术入手,构建某种通用机制,让其完成部分工作。(Python AST 就是一个很好的例子)。好消息是,部分工作已经完成。坏消息是,机制中内置了无数假设,其中大部分你只有在尝试让它做其他事情时才会发现。到那时,你会发现机制被设计成做它原本要做的事情,并且会非常非常地抵制你让它做其他事情的尝试。(我猜想尝试让 Python AST 模拟 PHP 会很有趣)。

我最初开始建立 DMS 的原因是为了建立很少包含此类假设的基础。它有一些让我们头疼的假设。到目前为止,还没有黑洞。(过去 15 年,我工作中最困难的部分就是试图防止此类假设悄悄出现)。

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

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

翻译大型系统时,你必须努力实现百分之九十的高转换率,否则你很可能无法完成翻译活动的手动部分。

另一个关键考虑因素是要翻译的代码大小。即使使用良好的工具,构建一个可以正常工作的、强大的翻译器也需要花费大量精力。虽然构建翻译器而不是简单地进行手动转换似乎很性感很酷,但对于小型代码库(例如,根据我们的经验,最多约 100K SLOC),经济效益根本无法证明这一点。没有人喜欢这个答案,但如果你真的只需要翻译 10K SLOC 的代码,那么你最好还是咬紧牙关,坚持下去。是的,这很痛苦。

我认为我们的工具非常好(不过,我有点偏见)。但要打造一款优秀的翻译器仍然非常困难;我们大约需要 1.5-2 个人年的时间,而且我们知道如何使用我们的工具。不同之处在于,有了这么多机器,我们成功的次数远远多于失败的次数。

解决方案 2:

我的回答将解决解析 Python 以便将其翻译成另一种语言的具体任务,而不是 Ira 在他的回答中很好地解决的更高级别的方面。

简而言之:不要使用解析器模块,还有更简单的方法。

自 Python 2.6 开始提供的模块ast更适合您的需求,因为它为您提供了现成的 AST 供您使用。我去年写过一篇关于此的文章,但简而言之,使用parse的方法ast将 Python 源代码解析为 AST。该parser模块将为您提供解析树,而不是 AST。请注意差异。

现在,由于 Python 的 AST 非常详细,因此有了 AST,前端工作就不难了。我想您可以很快为某些功能准备好一个简单的原型。但是,获得完整的解决方案将需要更多时间,主要是因为语言的语义不同。语言的简单子集(函数、基本类型等)可以轻松翻译,但一旦进入更复杂的层次,您将需要重型机器来在另一种语言中模拟一种语言的核心。例如,考虑 Python 的生成器和列表推导,而 PHP 中不存在这些(据我所知,当涉及 PHP 时,这确实很差)。

最后再给你一个建议,考虑一下2to3Python 开发人员创建的将 Python 2 代码转换为 Python 3 代码的工具。从前端来看,它拥有将 Python 转换为其他语言所需的大部分元素。但是,由于 Python 2 和 Python 3 的核心相似,因此不需要模拟机制。

解决方案 3:

编写翻译器并非不可能,特别是考虑到乔尔的实习生在一个夏天就完成了这件事。

如果你想做一种语言,这很容易。如果你想做更多,那就有点困难了,但也不会太难。最难的部分是,虽然任何图灵完备语言都可以做另一种图灵完备语言能做的事情,但内置数据类型可以极大地改变一种语言的功能。

例如:

word = 'This is not a word'
print word[::-2]

需要大量的 C++ 代码来复制(好吧,你可以用一些循环结构来相当短地完成它,但仍然如此)。

我想,这有点题外话了。

您是否曾经编写过基于语言语法的标记器/解析器?如果没有,您可能想学习如何编写,因为这是该项目的主要部分。我要做的是提出一个基本的图灵完备语法 - 类似于 Python 字节码。然后创建一个词法分析器/解析器,它采用语言语法(可能使用BNF),并基于语法将语言编译成中间语言。然后您要做的就是反向操作 - 基于语法创建一个从您的语言到目标语言的解析器。

我看到的最明显的问题是,一开始你可能会创建非常低效的代码,特别是在使用像 Python 这样更强大*的语言时。

但如果你这样做,那么你可能会找到方法来优化输出。总结一下:

  • 阅读提供的语法

  • 将程序编译为中间(但也是图灵完备的)语法

  • 将中间程序编译成最终语言(基于提供的语法)

  • ...?

  • 利润!(?)


*强大是指它只需要 4 行:

myinput = raw_input("Enter something: ")
print myinput.replace('a', 'A')
print sum(ord(c) for c in myinput)
print myinput[::-1]

如果你能向我展示另一种能在 4 行代码内完成类似操作的语言,我就能向你展示一种与 Python 一样强大的语言。

解决方案 4:

有几个答案告诉你不要费心。好吧,那有什么用呢?你想学?你可以学。这就是编译。碰巧你的目标语言不是机器码,而是另一种高级语言。这一直都在发生。

有一个相对简单的入门方法。首先,访问http://sourceforge.net/projects/lime-php/(如果您想使用 PHP)或类似网站,然后浏览示例代码。接下来,您可以使用一系列正则表达式编写词法分析器,并将标记提供给您生成的解析器。您的语义操作可以直接以另一种语言输出代码,也可以构建一些数据结构(想想对象,伙计),您可以对其进行处理和遍历以生成输出代码。

PHP 和 Python 是你的幸运,因为从很多方面来说,它们都是同一种语言,只是语法不同。难点在于克服语法形式和数据结构之间的语义差异。例如,Python 有列表和字典,而 PHP 只有关联数组。

“学习者”的方法是构建一些适用于语言的受限子集的东西(例如,仅打印语句、简单数学和变量赋值),然后逐步消除限制。这基本上就是该领域的“大人物”们所做的。

哦,由于 Python 中没有静态类型,最好编写并依赖 PHP 函数(如“python_add”),它根据 Python 的方式添加数字、字符串或对象。

显然,如果你放任不管,它可能会变得更大。

解决方案 5:

我赞同 @EliBendersky 关于使用 ast.parse 而不是 parser 的观点(我之前不知道)。我还强烈建议您查看他的博客。我使用 ast.parse 来执行 Python->JavaScript 转换器(@ https://bitbucket.org/amirouche/pythonium )。我通过查看其他实现并自行尝试,想出了 Pythonium 设计。我从https://github.com/PythonJS/PythonJS分叉了 Pythonium ,这也是我开始的,它实际上是一次完全重写。整体设计灵感来自 PyPy 和http://www.hpl.hp.com/techreports/Compaq-DEC/WRL-89-1.pdf论文。

我尝试过的一切,从开始到最好的解决方案,即使它看起来像 Pythonium 营销但实际上并非如此(如果某些东西看起来不符合网络礼仪,请毫不犹豫地告诉我):

  • 使用原型继承在普通旧式 JavaScript 中实现 Python 语义:据我所知,使用 JS 原型对象系统无法实现 Python 多重继承。我后来尝试使用其他技巧(参见 getattribute)来实现。据我所知,JavaScript 中没有 Python 多重继承的实现,现有的最佳实现是单继承 + mixins,我不确定它们是否能处理菱形继承。有点类似于 Skulpt,但没有 google clojure。

  • 我尝试使用 Google clojure,就像 Skulpt(编译器)一样,而不是真正阅读 Skulpt 代码 #fail。无论如何,由于基于 JS 原型的对象系统仍然不可能。创建绑定非常困难,您需要编写 JavaScript 和大量样板代码(参见https://github.com/skulpt/skulpt/issues/50,我是其中的幽灵)。当时没有明确的方法来将绑定集成到构建系统中。我认为 Skulpt 是一个库,您只需要在要执行的 html 中包含您的 .py 文件,开发人员无需完成编译阶段。

  • 尝试过 pyjaco(编译器),但创建绑定(从 Python 代码调用 Javascript 代码)非常困难,每次都要创建太多样板代码。现在我认为 pyjaco 更接近 Pythonium。pyjaco 是用 Python 编写的(ast.parse 也是),但很多是用 JavaScript 编写的,并且使用原型继承。

我实际上从未成功运行过 Pyjamas #fail,也从未尝试再次阅读代码 #fail。但在我看来,PyJamas 正在执行 API->API 转换(或框架到框架),而不是 Python 到 JavaScript 的转换。JavaScript 框架使用页面中已有的数据或来自服务器的数据。Python 代码只是“管道”。之后我发现 pyjamas 实际上是一个真正的 python->js 转换器。

我仍然认为可以进行 API->API(或框架->框架)转换,这基本上就是我在 Pythonium 中所做的,但在较低级别。Pyjamas 可能使用与 Pythonium 相同的算法...

然后我发现 brython 完全用 Javascript 编写,就像 Skulpt 一样,不需要编译,也不需要很多代码……但是用 JavaScript 编写的。

自从在这个项目过程中写下第一行代码以来,我就知道了 PyPy,甚至 PyPy 的 JavaScript 后端。是的,如果你找到它,你可以直接从 PyPy 生成一个用 JavaScript 编写的 Python 解释器。人们说,这是一场灾难。我没有读到任何原因。但我认为原因是他们用来实现解释器的中间语言 RPython 是 Python 的一个子集,专门用于翻译成 C(也可能是 asm)。Ira Baxter 说,你在构建某些东西时总是会做出假设,并且可能会对其进行微调,以便在 PyPy 的情况下能够最好地完成它的任务:Python->C 翻译。这些假设在其他情况下可能不相关,更糟糕的是它们可以推断出开销,否则直接翻译很可能总是更好。

用 Python 编写解释器听起来是个(非常)好主意。但我对编译器更感兴趣,因为性能原因,而且将 Python 编译为 JavaScript 实际上比解释它更容易。

我创建 PythonJS 的初衷是将 Python 的一个子集组合起来,这样我就可以很容易地将其转换为 JavaScript。起初,由于过去的经验,我甚至懒得去实现 OO 系统。我实现的可以转换为 JavaScript 的 Python 子集包括:

  • 函数在定义和调用时都具有完整的参数语义。这是我最自豪的部分。

  • 当/如果/elif/否则

  • Python 类型被转换为 JavaScript 类型(不存在任何类型的 Python 类型)

  • for 只能迭代 JavaScript 数组(for a in 数组)

  • 透明访问 JavaScript:如果您在 Python 代码中编写数组,它将被转换为 JavaScript 中的数组。这是可用性方面相对于竞争对手的最大成就。

  • 您可以将 Python 源代码中定义的函数传递给 javascript 函数。将考虑默认参数。

  • 它添加了一个称为 new 的特殊函数,该函数被转换为 JavaScript new,例如:new(Python)(1, 2, spam, "egg") 被转换为“new Python(1, 2, spam, "egg")。

  • “var” 由翻译器自动处理。(Brett(PythonJS 贡献者)的发现非常好。)

  • global 关键字

  • 闭包

  • lambda 表达式

  • 列表推导

  • 通过 requirejs 支持导入

  • 通过 classyjs 进行单一类继承 + mixin

这看起来很多,但实际上与 Python 的完整语义相比非常狭窄。它实际上是具有 Python 语法的 JavaScript。

生成的 JS 非常完美,也就是说,没有任何开销,无法通过进一步编辑来提高性能。如果您可以改进生成的代码,也可以从 Python 源文件中进行改进。此外,编译器不依赖于http://superherojs.com/编写的 .js 中的任何 JS 技巧,因此可读性非常高。

PythonJS 这一部分的直接后代是 Pythonium Veloce 模式。完整实现可在https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced3 ​​92f1c369afd746c25d7/pythonium/veloce/veloce.py?at=master 793 SLOC + 与其他翻译器共享的约 100 SLOC 代码中找到。

pystones.py 的改编版本可以在 Veloce 模式下翻译,参见https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced3​​92f1c369afd746c25d7 /pystone/?at=master

在设置了基本的 Python->JavaScript 转换之后,我选择了另一条路径,将完整的 Python 转换为 JavaScript。glib 处理基于面向对象类的代码的方式除了目标语言是 JS 之外,因此您可以访问数组、类似映射的对象和许多其他技巧,并且所有这些部分都是用 Python 编写的。如果我没记错的话,Pythonium 翻译器中没有编写的 javascript 代码。获得单一继承并不困难,以下是使 Pythonium 完全兼容 Python 的困难部分:

  • spam.egg在 Python 中总是被翻译成getattribute(spam, "egg")我没有特别分析这一点但我认为这会浪费很多时间而且我不确定我是否可以用 asm.js 或其他任何东西来改进它。

  • 方法解析顺序:即使使用 Python 编写的算法,将其转换为 Python Veloce 兼容代码也是一项艰巨的任务。

  • getattributre:实际的 getattribute 解析算法有点棘手,并且它仍然不支持数据描述符

  • 基于元类的类:我知道在哪里插入代码,但是仍然......

  • 最后但并非最不重要的一点是:some_callable(...) 总是被翻译成“call(some_callable)”。据我所知,翻译器根本不使用推理,因此每次调用时,您都需要检查它是哪种类型的对象,以便按照预期的方式调用它。

这部分已考虑到https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced3 ​​92f1c369afd746c25d7/pythonium/compatible/runtime.py?at =master 它是用与 Python Veloce 兼容的 Python 编写的。

实际兼容的转换器https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced3 ​​92f1c369afd746c25d7/pythonium/compatible/compatible.py?at=master 不会直接生成 JavaScript 代码,最重要的是不会执行 ast->ast 转换。我尝试了 ast->ast 操作,但 ast 即使比 cst 更好用,即使使用 ast.NodeTransformer 也不太好用,更重要的是我不需要执行 ast->ast。

至少在我看来,将 python ast 转换为 python ast 可能会提高性能,因为我有时会在生成与其相关的代码之前检查块的内容,例如:

  • var/global:为了能够对某些内容进行 var,我必须知道我需要什么,而不是 var。我没有生成一个块来跟踪在给定块中创建了哪些变量并将其插入到生成的函数块的顶部,而是在实际访问子节点以生成相关代码之前,在进入块时查找相关的变量赋值。

  • 到目前为止,生成器在 JS 中有一个特殊的语法,所以当我想写“var my_generator = function”时,我需要知道哪个 Python 函数是生成器

因此,我实际上不会在翻译的每个阶段访问每个节点一次。

总体过程可以描述如下:

Python source code -> Python ast -> Python source code compatible with Veloce mode -> Python ast -> JavaScript source code

Python 内置函数是用 Python 代码编写的(!),IIRC 有一些与引导类型相关的限制,但您可以访问在兼容模式下可以转换 Pythonium 的所有内容。请查看https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced3 ​​92f1c369afd746c25d7/pythonium/compatible/builtins/?at=master

可以理解阅读符合 Pythonium 规范的 JS 代码,但源地图将有很大帮助。

根据这次经历,我可以给你一些宝贵的建议:

  • 广泛回顾文献和现有闭源或免费项目中的主题。当我回顾不同的现有项目时,我应该投入更多的时间和动力。

  • 问问题!如果我事先知道 PyPy 后端由于 C/Javascript 语义不匹配导致的开销而毫无用处。我可能早在 6 个月前,甚至 3 年前就想到了 Pythonium 的想法。

  • 知道自己想做什么,有目标。对于这个项目,我有不同的目标:练习一点 javascript,学习更多 Python 知识,并能够编写可在浏览器中运行的 Python 代码(更多信息见下文)。

  • 失败也是一种经验

  • 一小步就是一大步

  • 从小事做起

  • 梦想远大

  • 做演示

  • 迭代

仅使用 Python Veloce 模式,我就非常开心了!但在此过程中,我发现我真正想要的是将我和其他人从 Javascript 中解放出来,但更重要的是能够以舒适的方式进行创作。这让我想到了 Scheme、DSL、模型以及最终的领域特定模型(参见http://dsmforum.org/)。

Ira Baxter 的回应如下:

这些估算毫无帮助。我花了差不多 6 个月的空闲时间来开发 PythonJS 和 Pythonium。所以我可以期待从 6 个月的全职工作中获得更多。我想我们都知道在企业环境中 100 人年意味着什么,也完全不意味着什么……

当有人说某件事很难或者通常是不可能的时,我的回答是“找到一个不可能的问题的解决方案只需要时间”,否则就没有什么是不可能的,除非它被证明是不可能的,在这种情况下是一个数学证明……

如果没有证明是不可能的,那么就留下了想象的空间:

  • 找到一个不可能的证据

  • 如果不可能的话,可能存在一个可以解决的“次等”问题。

或者

  • 如果不是不可能的话,找到解决办法

这不仅仅是乐观的想法。当我开始 Python->Javascript 时,每个人都说这是不可能的。PyPy 也不可能。元类太难了。等等……我认为,PyPy 超越 Scheme->C 论文(已有 25 年历史)的唯一革命是一些自动 JIT 生成(我认为是基于在 RPython 解释器中编写的提示)。

大多数说某件事“很难”或“不可能”的人都没有提供理由。C++ 很难解析?我知道,但他们仍然有(免费的)C++ 解析器。细节决定成败?我知道。仅仅说它不可能是没有用的,甚至比“没有用”更糟糕的是,它令人沮丧,有些人就是想打击别人。我是通过https://stackoverflow.com/questions/22621164/how-to-automatically-generate-a-parser-code-to-code-translator-from-a-corpus听说这个问题的。

对你来说,什么才是完美的?这就是你定义下一个目标并可能达到总体目标的方式。

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

我认为没有任何模式不能至少以不太完美的方式从一种语言翻译成另一种语言。既然语言之间的翻译是可能的,你最好先瞄准这一点。因为,我认为根据http://en.wikipedia.org/wiki/Graph_isomorphism_problem,两种计算机语言之间的翻译是树或 DAG 同构。即使我们已经知道它们都是图灵完备的,所以...

Framework->Framework,我将其形象化为 API->API 转换,这仍然是您可能要牢记的,以改进生成的代码。例如:Prolog 是非常具体的语法,但您仍然可以通过在 Python 中描述相同的图形来进行类似 Prolog 的计算……如果我要实现 Prolog 到 Python 的转换器,我不会在 Python 中实现统一,而是在 C 库中实现统一,并提出一种对 Pythonist 来说非常易读的“Python 语法”。最后,语法只是我们赋予其意义的“绘画”(这就是我开始计划的原因)。邪恶在于语言的细节,我不是在谈论语法。语言getattribute hook 中使用的概念(没有它您也可以生存)但所需的 VM 功能(如尾递归优化)可能很难处理。您不关心初始程序是否不使用尾递归,即使目标语言中没有尾递归,您也可以使用 greenlets/event 循环来模拟它。

对于目标语言和源语言,请寻找:

  • 宏伟而具体的想法

  • 微小而常见的共享理念

由此将会出现:

  • 容易翻译的东西

  • 难以翻译的事情

您或许还能知道什么将被翻译成快速代码和慢速代码。

还有 stdlib 或任何库的问题,但没有明确的答案,这取决于您的目标。

惯用代码或可读生成的代码也有解决方案......

由于您可以提供缓慢和/或关键路径的 C 实现,因此针对 PHP 这样的平台比针对浏览器要容易得多。

鉴于您的第一个项目是将 Python 转换为 PHP,至少对于我所知道的 PHP3 子集而言,自定义 veloce.py 是您的最佳选择。如果您可以为 PHP 实现 veloce.py,那么您可能将能够运行兼容模式...此外,如果您可以将 PHP 转换为可以使用 php_veloce.py 生成的 PHP 子集,则意味着您可以将 PHP 转换为 veloce.py 可以使用的 Python 子集,这意味着您可以将 PHP 转换为 Javascript。只是说说而已...

您还可以查看这些库:

您可能还对这篇博文(和评论)感兴趣:https ://www.rfk.id.au/blog/entry/pypy-js-poc-jit/

解决方案 6:

您可以查看Vala 编译器,它将 Vala(一种类似 C# 的语言)翻译成 C。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用