我的目标是将C ++程序转换为.pexe文件,以便稍后在远程计算机上执行。 .pexe文件将包含一些要在远程计算机上计算的数学公式或函数,因此我基本上将使用远程计算机的计算能力。对于所有这些,我将使用带有Pepper库的nacl_sdk,如果有人能为我澄清一些事情,我将不胜感激:
任何建议都将受到赞赏。
答案 0 :(得分:0)
您是否在浏览器中使用.pexe?这是通常的情况。
我建议使用nacl_io在浏览器中模拟POSIX(同时查看file_io。这样您就可以在本地保存文件,以您想要的任何格式检索它们。
要发送输出,请使用浏览器的常用功能,例如XMLHttpRequest。您需要PNaCl与JavaScript交谈,您可能需要查看some of the examples。
普通的网络服务器会做,这实际上取决于你正在做什么。
答案 1 :(得分:0)
从我尝试的内容来看,似乎你无法捕捉到你的pexe写给stdout的东西 - 它只是去浏览器的标准(它花了我几个小时才意识到它确实发生了在某个地方 - 我遵循了一个糟糕的教程让我相信pexes stdout将被发布到javascript端并且想知道为什么它"什么都不做")。
我目前正在将我的东西移植到.pexe,结果很简单,但这与我编写程序的方式有关:
我编写了我的(C ++)程序,使得所有代码部分仅从std::istream
对象读取输入,并将其输出写入某个std::ostream
对象。然后我将std::cin
和std::cout
传递给顶级调用,并可以在shell中以交互方式使用该程序。但是我可以轻松地交换顶级调用以使用std::ifstream
和std::ofstream
来使用该程序进行批处理(没有来自cat
的管道并重定向到文件,这可以在某些情况下很麻烦。)
由于我编写了类似的程序,我可以像
一样实现消息处理程序class foo : public pp::Instance {
... ctor, dtor,...
virtual void HandleMessage(const pp::Var& msg) override {
std::stringstream i, o;
i << msg.AsString();
toplevelCall(i,o);
PostMessage(o.str());
}
};
所以我从浏览器获得的数据被放入一个字符串流中,其余代码可用于输入。它获得另一个字符串流,其余代码可以将其输出写入。然后我将该输出发送回浏览器。 (在你看到结果之前你必须等待程序完成 - 你可以从ostream派生一个类并直接将&lt;&lt;操作符发布到浏览器... nacl应该附带一个类这样做 - 我不知道它是否真的......)
在html / js方面,你可以有一个textarea
和一个pre
(我喜欢称之为stdin和stdout ;-))和一个发布textarea内容的按钮到pexe - 并有一个eventhandler将来自pexe的消息写入pre
这样的
<embed id='pnacl' type='application/x-pnacl' src='manifest.nmf' width='0' height='0'/>
<textarea id="stdin">Type your input here...</textarea>
<pre id='stdout' width='80' height='25'></pre>
<script>
var pnacl = document.getElementById('pnacl');
var stdout = document.getElementById('stdout');
var stdin = document.getElementById('stdin');
pnacl.addEventListener('message', function(ev){stdout.textContent += ev.data;});
</script>
<button onclick="pnacl.postMessage(stdin.value);">Submit</button>
恭喜!您的程序现在在浏览器中运行!
我没有通过移植我的编译器,但似乎这甚至适用于使用flex&amp; amp; bison(你只需要将FlexLexer.h复制到pnacl sdk的include目录中,并忽略关于&#34; register&#34;存储位置说明符的警告: - )