Chapel から bash on windows で X-window 利用
Julia 言語が Ver.1.0 になったとかで、記念にマイナー言語の Chapel をいじります。Chapel は coarray Fortran と同じく PGAS 言語です。同じ PGAS 仲間のよしみでいじります。
Chapel には、最近は Rust 言語のように transaction 的なメモリー管理も導入されているようですが、よく分かりません。
Chapel: Productive Parallel Programming
C言語との混成もできるようになったようなので、X-Window で図形を描くことに挑戦してみました。
Fortran の時と同じようにやってみました。ただ乱数ルーチンを調べるのが面倒なので、丸を書いてお茶を濁しました。
fortran66.hatenablog.com
コンパイル&ゴー
まず、gcc で C 言語のルーチンをコンパイルしてオブジェクトを生成しておきます。
それを chapel に渡します、Xwindow のライブラリなどを認識させるためリンカ―・オプション -lX11 をつけます。警告メッセージが沢山出ますが何とかなります。
実行は、マルチロケール対応版にしてあるので、ロケール数を指定してやります。(-nl 1 は1個)
O@HP8:~$ gfortran -c plot3.c O@HP8:~$ chpl plot3.o plot3.chpl -lX11 In file included from /tmp/chpl-O-4402.deleteme/_main.c:43:0: /tmp/chpl-O-4402.deleteme/plot.c: In function ‘chpl_user_main’: /tmp/chpl-O-4402.deleteme/plot.c:32:1: warning: implicit declaration of function ‘X_open’; did you mean ‘open’? [-Wimplicit-function-declaration] X_open(((int32_t)(INT64(800))), ((int32_t)(INT64(600)))); ^~~~~~ open /tmp/chpl-O-4402.deleteme/plot.c:42:1: warning: implicit declaration of function ‘X_point’; did you mean ‘isprint’? [-Wimplicit-function-declaration] X_point(call_tmp_chpl4, ((int32_t)((INT32(300) + i_chpl)))); ^~~~~~~ isprint /tmp/chpl-O-4402.deleteme/plot.c:59:1: warning: implicit declaration of function ‘X_close’; did you mean ‘pclose’? [-Wimplicit-function-declaration] X_close(); ^~~~~~~ pclose O@HP8:~$ ./plot3 -nl 1 X-window plot 1 O@HP8:~$
コンパイルは遅いです。
出力図
ソース・プログラム
C plot3.c
窓が立ち上がるまで1秒ほど時間をおいています。
#include <X11/Xlib.h> #include <X11/Xutil.h> #include <unistd.h> // unistd.h -> sleep() static Display* d; static Window w; static GC gc; unsigned long white, black; void X_open(int nx, int ny){ // Open a display. d = XOpenDisplay(0); if ( !d ) return; // white = WhitePixel(d, DefaultScreen(d)); black = BlackPixel(d, DefaultScreen(d)); // Create the window w = XCreateSimpleWindow(d, DefaultRootWindow(d), 0, 0, nx, ny, 0, black, white); XMapWindow(d, w); gc = XCreateGC(d, w, 0, 0); XFlush(d); sleep(1); } void X_point(int ix, int iy){ XDrawPoint(d, w, gc, ix, iy); XFlush(d); } void X_flush(){ XFlush(d); } void X_close(void){ XFreeGC(d, gc); XDestroyWindow(d, w); XFlush(d); XCloseDisplay(d); }
chapel plot3.chpl
デフォルトの整数型が 64bit 整数のため、X-windowの 32bit 引数と合わず、型変換がうるさくなりましたが、無視しても大丈夫な模様です。コンソールからの入力は例外処理を強要させれるのですが、適当にごまかしました。
extern proc X_open(nx: int(32), ny: int(32)); extern proc X_point(ix:int(32), iy: int(32)); extern proc X_close(); module plot { proc main() { var i, ix, iy : int(32); var x, y: real; X_open(800, 600); writeln("X-window plot"); for i in 0:int(32)..100:int(32) { y = i:real; x = sqrt(100.0**2-y**2); ix = 400:int(32) + x:int(32); iy = 300:int(32) + i; X_point(ix, iy); iy = 300:int(32) - i; X_point(ix, iy); ix = 400:int(32) - x:int(32); iy = 300:int(32) + i; X_point(ix, iy); iy = 300:int(32) - i; X_point(ix, iy); } try! {i = read(int(32));} // pause X_close(); } }