将 Fortran 转换为 Javascript
Posted
技术标签:
【中文标题】将 Fortran 转换为 Javascript【英文标题】:Converting Fortran to Javascript 【发布时间】:2016-07-05 09:42:53 【问题描述】:我对这个问题失去了理智。我写了一个解释器,然后写了一个转译器来。但是每次我都被引用传递变量的问题所困扰。
正如您所知道的,在 Fortran 中,按引用传递或按值传递之间的语法没有区别,看起来都一样。然而,在 javascript 中,如果变量在 Object 中传递,则只能通过引用传递。
Fortran 示例代码:
REAL FUNCTION PYTHAGORAS (A,B,K)
REAL A,B,K
K = 12 // E <=> K in GEOMETRIE()
PYTHAGORAS = SQRT(A**2+B**2)
END FUNCTION PYTHAGORAS
LOGICAL FUNCTION GEOMETRIE (H,B,D)
REAL H,B,D,E
B = 12
H = 7
// E is pass by reference, it's gonna be changed in PYTHAGORAS()
D = PYTHAGORAS(B, H, E)
GEOMETRIE = .TRUE.
END FUNCTION GEOMETRIE
我做了很多研究,但直到现在,我都没有找到任何有用的结果。
我想知道,是否有任何库可以完成这项工作(客户端/NodeJS)。我无法想象,直到现在,之前没有人试图失去这个问题。
【问题讨论】:
现代 Fortran 中存在值传递,但在这里并不重要。你不能在列表中传递变量吗?你看过 Emscripten 吗?顺便说一句,在这里请求图书馆是题外话。 当然在Fortran中是传值的,在例子中可以看到,PYTHAGORAS(B,H,E)的调用// B和H都是传值,但是 E 是通过引用传递的。 我知道 Emscripten,但还没有尝试过。我认为将 Fortran 转换为 C++ 再转换为 Javascript 会更复杂。 不,它们不是,都是通过引用传递的。要按值传递,您必须使用 Fortran 2003 中引入的VALUE
关键字。
有道理,我也要试试这个方法。非常感谢@VladimirF 我会回来进行任何更改。
【参考方案1】:
一个懒惰的技巧是将传递给函数的变量系统地嵌入到一个 JS 对象中:
function PYTHAGORAS(obj /* A B K */)
obj.K = 12;
return Math.sqrt(obj.A * obj.A + obj.B * obj.B);
function GEOMETRIE(obj /* H B D */)
var E;
obj.B = 12;
obj.H = 7;
obj.D = PYTHAGORAS(A:obj.B, B:obj.H, K:E);
return true;
var res = H:0, B:0, D:0;
GEOMETRIE(res);
console.log(res);
输出:
Object H=7, B=12, D=13.892443989449804
在原始列表的自动翻译假设中,这可能工作得相当好,并且生成的 JS 代码很容易与原始 FORTRAN 代码进行比较。
现在,它会变得不必要的冗长和超载,而不是完全手动重写。
编辑:具有真正分离变量的替代版本
function PYTHAGORAS(A, B, K)
K.val = 12;
return Math.sqrt(A.val * A.val + B.val * B.val);
function GEOMETRIE(H, B, D)
var E = ;
B.val = 12;
H.val = 7;
D.val = PYTHAGORAS(B, H, E);
console.log('E = ' + E.val);
return true;
var H =
, B =
, D = ;
GEOMETRIE(H, B, D);
console.log('H = ' + H.val + ', B = ' + B.val + ', D = ' + D.val);
输出:
E = 12
H = 7, B = 12, D = 13.892443989449804
【讨论】:
idee 很棒,但仍然无法工作,因为正如我所提到的,E 应该通过引用传递,它将在 PYTHAGORAS 中更改为 K(或 obj.K)。所以在返回 true 之前; E 应该是 12 而不是 0。 你是对的。请在我编辑的答案中查看替代版本。 感谢@Arnauld,obj.val 的想法太棒了!我要试试你的解决方案。 @kamal 我们在哪里可以看到您的转译器?以上是关于将 Fortran 转换为 Javascript的主要内容,如果未能解决你的问题,请参考以下文章
使用优化模块的 Scipy 错误。将数组转换为 fortran 失败