将Fortran转换为Javascript

4

我对这个问题感到非常困扰。我编写了一个解释器和转换器,将Fortran转换为Javascript。但是每次都卡在按引用传递变量的问题上。

如你所知,在Fortran中,传递方式无论是按引用还是按值,语法都是相同的。然而,在Javascript中,只有通过传递对象才能实现按引用传递。

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了吗?顺便说一句,在这里询问关于库的问题是离题的。 - Vladimir F Героям слава
当然Fortran中有按值传递的方式,正如你在例子中看到的,调用PYTHAGORAS(B,H,E)时B和H是按值传递,但E是按引用传递。我知道Emscripten,但还没有尝试过。我认为将Fortran转换为C++,然后再转换为Javascript会更加复杂。 - Kamal
2
不,它们都是通过引用传递的。要按值传递,必须使用Fortran 2003中引入的VALUE关键字。 - Vladimir F Героям слава
有道理,我也要尝试这样做。非常感谢@VladimirF。 如果有任何更改,我会再回来。 - Kamal
1个回答

4

一种懒惰的方法是将传递给函数的变量系统地嵌入到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

这个IDE很棒,但还是行不通,因为正如我所提到的,E应该通过引用传递,并且在PYTHAGORAS中会被更改为K(或obj.K)。因此,在返回true之前,E应该是12而不是0。 - Kamal
你说得对。请查看我编辑后的答案中的备选版本。 - Arnauld
1
谢谢@Arnauld,obj.val的想法太棒了!我会尝试你的解决方案。 - Kamal
@kamal,我们在哪里可以看到你的转译器? - Chef Gladiator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接