将 Fortran 语言转换为 Javascript
Converting Fortran to Javascript
我对这个问题失去了理智。我写了一个 Interpreter,然后是一个 Transpiler,将 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)。我无法想象,直到现在,还没有人试图解决这个问题。
一个懒惰的 hack 是系统地将传递给函数的变量嵌入到 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
我对这个问题失去了理智。我写了一个 Interpreter,然后是一个 Transpiler,将 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)。我无法想象,直到现在,还没有人试图解决这个问题。
一个懒惰的 hack 是系统地将传递给函数的变量嵌入到 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