2022年10月21日金曜日

ブラウザでC/C++のプログラムを動かす

 最近、TensorFlow.jsとかOnnxRuntimeなど、C/C++言語で書かれた機械学習のライブラリが何故かブラウザで動きます。

調べてみると、emscriptenを使ってC/C++のソースをコンパイルすると、WebAssemblyのバイナリーができて、C/C++等で書かれたプログラムがブラウザで動くようです。

ブラウザはJavaScriptしか動かないと思っていたら、いつの間にかブラウザで動くすごいアプリはみんなC/C++で書かれている・・・。

おじさんの大好きなC/C++で書かれている。


PythonもOpenCVもffmpegもみんなWebAssemblyで動くようにコンパイルされたバイナリーがあります。

それをHTMLに組み込むと、ブラウザでPythonもOpenCVもffmpegも動くのね。

ゲームのエミュレータやLinuxなどのOSもWebAssemblyで動くようです。


すげー。


https://dev.classmethod.jp/articles/cpp-webassembly-emscripten/


とってもすごいんだけど、emscriptenのインストールとか開発環境がとっても不便。

でもこれでプログラムを作れば、スマホやPCなど、すべてのデバイスでプログラムが動く。


ぼくもとりあえずhello.cppを作ってみました。

2022年10月5日水曜日

AIでプログラムしてみた。

最近はAIがプログラムしてくれるようになったらしいです。

おじさんのような人がコードを書かなくてもAIが自動でコードを書いてくれるらしいです。

おじさんがコード書いたことにしてお金もらえないかなぁ。


前からやってみたかったのですが、プログラムするAIを学習させるのがとても大変で誰かやってくれないかなぁとおもっていたら、やってくれた人がいました。




https://aiprogrammer.hashlab.jp/


--------------------

nまでの素数を求めるプログラム

--------------------

#include <iostream>

#include <math.h>


using namespace std;


int main()

{

int i, j;

int n;

int prime;


cout << "nを入力してください:";

cin >> n;


for (i = 2; i <= n; i++) {

prime = 1;

for (j = 2; j <= sqrt(i); j++) {

if (i%j == 0) {

prime = 0;

break;

}

}

if (prime == 1) {

cout << i << " ";

}

}


cout << endl;


return 0;

}

--------------------

おーあってる。
ちゃんとコンパイルして動くし。


--------------------

高速にnまでの素数を求めるプログラム

--------------------

#include <iostream>

#include <vector>


using namespace std;


vector<int> primeNumbers(int n) {

vector<int> res;


for (int i = 2; i <= n; i++) {

bool isPrime = true;

for (int j = 2; j * j <= i; j++) {

if (i % j == 0) {

isPrime = false;

break;

}

}

if (isPrime) res.push_back(i);

}


return res;

}


int main() {

int n;

cin >> n;

vector<int> res = primeNumbers(n);

for (int i = 0; i < res.size(); i++) {

cout << res[i] << endl;

}


return 0;

}

--------------------


おーこれもあっている。
しかも高速に求めてるし。
ニュートン法とかいけるのかな?


--------------------

ニュートン法で平方根を求めるプログラム

--------------------

#include <iostream>

#include <cmath>

using namespace std;


double NewtonMethod(double x)

{

double result = x;

double prevResult;

double epsilon = 1.0e-6;

int i = 0;

do

{

prevResult = result;

result = result - (result - x / result) / 2;

i++;

} while (fabs(result - prevResult) > epsilon && i < 100);

return result;

}


int main()

{

double input;

cin >> input;

cout << NewtonMethod(input) << endl;

return 0;

}

--------------------


すげー、情報系の大学2年生くらいのレベルはありそうですね。
マクローリン展開とかもできるのでしょうか?


--------------------

マクローリン展開でsinを求めるプログラム

--------------------

#include <iostream>

#include <cmath>


using namespace std;


int main()

{

double x;

cin >> x;


double result = 0;

for (int i = 0; i < 10; i++)

{

result += pow(-1, i) * pow(x, 2 * i + 1) / (2 * i + 1);

}


cout << result << endl;


return 0;

}

--------------------

マクローリン展開もできてる。
あらーすごい。
これは大学のレポート作成にもってこいだわ。
海外の大学だとアルバイトにお金払えば大学の宿題とかレポートやってくれるんですが、お金払わなくていいじゃん!



だけど、まだオープンソースとか作れるプロのプログラマーレベルではないみたい。
数値計算はとっても得意だけれどエスケープ処理とか文字列とかの細かい処理が苦手?