是否有用于 Octave 和 Scilab 的 C 类预处理器指令用于互兼容代码?

Posted

技术标签:

【中文标题】是否有用于 Octave 和 Scilab 的 C 类预处理器指令用于互兼容代码?【英文标题】:Are there C like pre-processor directives for Octave and Scilab to be used for intercompatible code? 【发布时间】:2019-03-12 01:38:30 【问题描述】:

在 C / C++ 语言中,可以使用宏或所谓的“每处理器指令”来指示编译器应如何读取代码。 #def#ifdef#ifndef#else#endif ...这些简单的命令使编译器能够检查操作系统、编译器和其他环境信息。我知道 Octave 和 Scilab 是解释性语言,但我想知道是否有任何方法可以告诉解释器在加载脚本时替换部分脚本?例如,我是否可以编写一个基于 Scilab 语法 // 注释的代码,然后指示解释器将它们作为 Octave 的注释语法读取为 #%?这似乎是 Scilab Octave 间兼容性的主要问题之一。

如果有办法指示口译员检查口译员的信息 Scilab/ScicoLab/Octave/FreeMat,Julia... 和版本... 然后根据该信息有一些 #ifdef @987654333 @blocks...然后可以编写与上述多个解释器兼容的代码。如果您能告诉我加载时间指令是否可行,我将不胜感激,如果不可行,是否/如何编写与 Octave 和 Scilab 兼容的代码?

P.S.1不同的方法是:

    拥有常规的if then elseif else end 语句,包括跨不同解释器的有效语法,并具有独特的结果。正如以下答案中所建议的那样。 从 Scilab 端使用getsexecexecstr 加载.m 文件。可以做一些正则表达式来清理代码。 Octave 确实有像#<include>...</include> 这样的xml 有一个量身定制的 import 函数,如 this one,用于将 MATLAB 代码导入 Octave

P.S.2 Octave 有version() 函数,Scilab /ScicosLab 有getversion(),Julia 有versioninfoVERSIONFreeMat 也有version 函数。也许也可以使用。

P.S.3 scilab 已经有 Matlab/Octave Compatibility toolbox。还有Sci cosim 可以使用 TCP 端口将变量从 Scilab 工作区导入 Octave。

【问题讨论】:

您想编写在 Scilab、ScicoLab、Octave/FreeMat、Julia... 上运行的代码?您可以使用预处理器指令编写与 C++ 和 Java 兼容的代码吗? 好吧,主要是 Octave 和 Scilab。混合编程是可能的。例如 Fortran 和 C/C++。虽然不在同一个文件中。您可以从 C 调用 Fortran 子例程,反之亦然……但 Octave 和 Scilab 在某种程度上都是相同语言(即 MATLAB)的复制品。预计它们是兼容的。 MATLAB 在开始解释之前解析整个 M 文件。这是 JIT 的一部分。这意味着您不能在 if/else 构造中隐藏非法语法。 Octave 还没有 JIT,但我听说这项工作正在进行中。如果是这样,您唯一的办法就是以与平台无关的方式创建代码,并将其“编译”为 Octave 代码或 Scilab 代码。 【参考方案1】:

我想换个角度回答。也就是说,如果您觉得需要比较预处理器指令,您可能会认为 scilab 和 octave 都错了。在 C 和 C++ 中需要预处理指令的原因是因为它们是编译语言。预处理器指令在编译发生之前对将要编译的实际代码进行更改。

在 matlab、scilab 和 octave 这样的解释型语言中,这种事情是多余的。因此,一个简单的“if / else”块执行充分区分三种环境的测试就足够了。

倍频程手册suggests a way to distinguish between octave and matlab 不会带来严重的性能损失。我没有安装 scilab 来提供等效的测试,但我确信 scilab 也存在一个简单的测试。

因此,在通过检测正确的环境来运行不同代码的上下文中,这是完全可能的。

在模仿 #include 策略的上下文中,由于脚本是按顺序运行的,因此您可以实现一个“if / else”块,它只是在正确的时间运行不同的基本脚本。

PS。 Matlab 一直在对脚本的解释方式进行一些更改,因此如果执行“嵌套”错误检查而不是表面错误检查,这可能会导致问题。但是,即使发生这种情况,您也可以使用run filename 语法代替直接调用脚本,或者在更糟糕的情况下使用eval 来调用脚本。

【讨论】:

理想情况下应该有importScilabImportScicosLabimportOctaveimportFreematimportJulia... 对于所有这些语言,因此人们可以只导入脚本而不必担心兼容性和不同的语法。 顺便说一句,Julia 是一种完全不同的语言,将其包含在此列表中毫无意义。它与其他部分有 10% 的相似性,但仅此而已。至于导入脚本,这就是我想说的,这是不切实际或不可取的。 可能是用所有其他语言通用的特定语言子集编写,并在必要时重定向“专用”代码。但最好是,如果我必须为这些平台编写代码,我会为每个平台编写显式代码。在最坏的情况下,我会拆分“通用”位并提供专门的包装器。 在这个讨论之后,我认为解释语言的世界需要像 Pandoc 这样的标记语言。 IMO 更容易。【参考方案2】:

你可以定义一个函数isscilab

function [out] = isscilab()
        out = length(zeros(2)) == 1;
endfunction

并用它来有条件地执行代码:

if isscilab()
    do scilab...
else
    do octave...
end

但我认为最好的选择是你应该为 Octave .m 和 Scilab .sce 实现不同的文件并执行你想要的每一个。

【讨论】:

太棒了。 octave 是否有 C inlcude 或 Python 导入之类的东西?文件扩展名限制很烦人。 octave 确实有 #<include> .... </include>,也许我们可以有一个特殊的导入函数,比如 MATLAB 的那些。 C 中的包含是纯文本包含,但 python 中的导入是导入更高级的包含模块。 C 和 c++ 没有这样的模块系统。在 MATLAB 中,您可以导入包的内容(包含代码的文件夹),但此功能尚未在 octave 中实现。相反,您需要将函数放置到相关的 m 文件中,然后您可以将包含文件的目录添加到 octave 路径,以便该函数可用。根据您的需要,您可以选择其他选项。 #<include> .... </include>。是某种类型的 cmets 和标记,不包含代码。 Octave 和 Scilab 的支持几乎已经开始 a year ago。但我认为要让这段关系成为真正的婚姻,还需要做很多工作!

以上是关于是否有用于 Octave 和 Scilab 的 C 类预处理器指令用于互兼容代码?的主要内容,如果未能解决你的问题,请参考以下文章

有人用过octave吗?能替代matlab吗

链接xcos和scilab gui以实时控制模型参数

在 Scilab 中复制obj

建模工具都有哪些

如何从 GTK+2 C 代码中调用 matlab/octave 函数

关于开源金融计算学习的总结(截至2017年1月3日)