HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2025
0517
うしjavascriptのhsp変換10解決


うし

リンク

2025/5/17(Sat) 14:07:27|NO.103471

hspをjavascriptに変換できるのは、画期的だと思いました。

なら、
javascriptをhspに変換(相互命令置換?)できたらどうかな。

githubとかでは
メジャー言語のjavascriptのprogramをたくさん見ることができます。
これらの互換変換できれば、programの勉強にもなるし
hspの幅も広がるんじゃないかな。
hspの方がわかりやすい場合もあるし。



この記事に返信する


Y_repeat

リンク

2025/5/18(Sun) 00:41:25|NO.103472

例えばJavaScriptでオブジェクト機能を使ったら変換出来ないんじゃないすかね
でもHSP3はCにも変換出来るみたいですし
でもCで構造体使ったらCからHSP3には変換出来ないかも
変換しやすいのはHSP3の特徴かもです
HSP3の標準命令は変換出来ても
標準拡張DLLは変換出来ないっぽいす



zakki

リンク

2025/5/18(Sun) 10:48:35|NO.103473

hspのjs実行はEmscriptenを使っていて


class C { public: int a; double b; C() : a(0), b(0) {} double foo() { a++; b = (b + a) / 3.0; return a + b; } };
みたいなC++コードが

var buffer = new ArrayBuffer(16908288); var HEAP32 = new Int32Array(buffer); var HEAPF64 = new Float64Array(buffer); function __original_main() { var $2 = 0, $46 = 0; $2 = __stack_pointer - 32 | 0; __stack_pointer = $2; HEAP32[($2 + 28 | 0) >> 2] = 0; C__C_28_29($2 + 8 | 0 | 0) | 0; +C__foo_28_29($2 + 8 | 0 | 0); +C__foo_28_29($2 + 8 | 0 | 0); __stack_pointer = $2 + 32 | 0; return 0 | 0; } function C__C_28_29($0) { $0 = $0 | 0; var $4 = 0, $3 = 0, $23 = 0; $3 = __stack_pointer - 16 | 0; HEAP32[($3 + 12 | 0) >> 2] = $0; $4 = HEAP32[($3 + 12 | 0) >> 2] | 0; HEAP32[$4 >> 2] = 0; HEAPF64[($4 + 8 | 0) >> 3] = +(0 | 0); return $4 | 0; } function C__foo_28_29($0) { $0 = $0 | 0; var $4 = 0, $3 = 0, $57 = 0.0; $3 = __stack_pointer - 16 | 0; HEAP32[($3 + 12 | 0) >> 2] = $0; $4 = HEAP32[($3 + 12 | 0) >> 2] | 0; HEAP32[$4 >> 2] = (HEAP32[$4 >> 2] | 0) + 1 | 0; HEAPF64[($4 + 8 | 0) >> 3] = (+HEAPF64[($4 + 8 | 0) >> 3] + +(HEAP32[$4 >> 2] | 0 | 0)) / 3.0; return +(+(HEAP32[$4 >> 2] | 0 | 0) + +HEAPF64[($4 + 8 | 0) >> 3]); }

みたいなJavaScriptになります。
これをChatGPTにHSPに変換させて( https://chatgpt.com/share/68293c25-3f4c-8010-a3a8-6ae13e4f1534 )、エラーをちょこちょこ直すと


#module ; バッファサイズ定義 #const BUF_SIZE 16908288 #deffunc init_sys ; ヒープ領域を確保 dim HEAP32, BUF_SIZE ; 32bit 整数配列 ddim HEAPF64, BUF_SIZE ; 64bit 浮動小数点配列 ; スタックポインタの初期値(必要に応じて変更してください) __stack_pointer = BUF_SIZE return ;---------------------------------------- ; int __original_main() ;---------------------------------------- #defcfunc __original_main local sp, local tmp ; スタックフレーム確保 sp = __stack_pointer - 32 __stack_pointer = sp ; HEAP32[(sp + 28) >> 2] = 0 HEAP32((sp + 28) >> 2) = 0 ; C__C_28_29(sp + 8) tmp = C__C_28_29(sp + 8) ; +C__foo_28_29(sp + 8) tmp = C__foo_28_29(sp + 8) mes tmp ; +C__foo_28_29(sp + 8) の二回目 tmp = C__foo_28_29(sp + 8) mes tmp ; スタックフレーム解放 __stack_pointer = sp + 32 return 0 ;---------------------------------------- ; int C__C_28_29(int ptr) ;---------------------------------------- #defcfunc C__C_28_29 int ptr, local sp, local base ; スタックフレーム確保 sp = __stack_pointer - 16 ; 引数をローカルに保存 HEAP32((sp + 12) >> 2) = ptr ; base = ptr base = HEAP32((sp + 12) >> 2) ; HEAP32[ base >> 2 ] = 0 HEAP32(base >> 2) = 0 ; HEAPF64[(base + 8) >> 3] = 0.0 HEAPF64((base + 8) >> 3) = 0.0 return base ;---------------------------------------- ; double C__foo_28_29(int ptr) ;---------------------------------------- #defcfunc C__foo_28_29 int ptr, local sp, local base, local result ; スタックフレーム確保 sp = __stack_pointer - 16 ; 引数をローカルに保存 HEAP32((sp + 12) >> 2) = ptr ; base = ptr base = HEAP32((sp + 12) >> 2) ; HEAP32[ base >> 2 ] += 1 HEAP32(base >> 2) = HEAP32(base >> 2) + 1 ; HEAPF64[(base + 8) >> 3] = (HEAPF64[(base + 8) >> 3] + HEAP32[base >> 2]) / 3.0 HEAPF64((base + 8) >> 3) = (HEAPF64((base + 8) >> 3) + HEAP32(base >> 2)) / 3.0 ; result = HEAP32[base >> 2] + HEAPF64[(base + 8) >> 3] result = double(HEAP32(base >> 2)) + HEAPF64((base + 8) >> 3) return result #global init_sys r = __original_main() mes r
みたいなHSPコードになってHSPでクラスが使えるよやったねとなる用途とならない用途がありそうです。



うし

リンク

2025/5/18(Sun) 19:46:12|NO.103475

dxライブラリみたいな
「命令変換」じゃなうのかな。

hspでdxライブラリを使う時の
C++構造体の分解は、配列で一応できたけど。

そういうレベルとは違うのか。



うし

リンク

2025/5/18(Sun) 19:57:01|NO.103476

クラスとか構造体とか、いろいろあるのか。

やっぱり
自分で相互の命令を突き合わせて、にらめっこして、
変換移植するんだね。

勉強にもなるからね。



うし

リンク

2025/5/18(Sun) 22:21:13|NO.103477

zakkiさんのNO.103473の
変換プロセスはすごいね。(hsp−jsでなく、c++もかます?)

なら、こうしたらどうかな。
・importライブラリなど拡張は、はずす。
・クラスは、通常にする。(x−pxとかexとかに分解)
・structは、jsにあったけ?

javascriptの方を、このように整理(標準化)しておけば、
変換しやすくなるんじゃないかな。



zakki

リンク

2025/5/18(Sun) 23:13:29|NO.103478

A. 既存ソースコード資産活用
・可読性無視して完全性重視
・変換結果は人手で扱わずバイナリ的に扱う
・Emscriptenやそれを使ったhsp3dish.js

B. ソースコードの理解や移植支援
・可読性重視で完全性は求めず人手の修正前提
・ChatGPTなどのAI利用変換

C. マルチプラットフォーム対応
・既存資産利用じゃなくて言語のサブセットを定義して新規作成用途
・GWTとかScala.jsとか

みたいな感じで色々やりようはあると思います。
ただdish.js方式はA用なので、BやCの用途を主眼に置くと無理が目立ちそうです。

とりあえずJavaScriptで実装されたアルゴリズムをHSPでも似たことやりたいみたいな話なら、
ChatGPTとかClaudeを使ったパイプライン作ってみるのは悪くないと思います。



Y_repeat

リンク

2025/5/19(Mon) 23:58:36|NO.103479

結局、文法を制限すればzakkiさんなら
変換プログラムの作成が出来そうすね
後はzakkiさんがやってくれるかくれないか
みたいな


>githubとかでは
>メジャー言語のjavascriptのprogramをたくさん見ることができます。
>これらの互換変換できれば、programの勉強にもなるし

dish-jsならそのjavascriptのプログラムを切り貼りして利用出来そうすね

GENKIさんが、AIからjavascriptのプログラムにアドバイスもらったり
手伝ったりしてもらってるってどっかに書いてたよーな

そもそも変換しなくても共存出来るので
変換しないと動かないというのとちょっと違うかも



GENKI

リンク

2025/5/20(Tue) 01:56:03|NO.103480

> javascriptをhspに変換(相互命令置換?)できたらどうかな。
文法違いすぎて出来たとしても解読出来ない気がする。
低級言語から高級言語への変換は出来たとしても可読性が犠牲になりそう。
プログラムの勉強なら、変換して文法的意味が薄くなったスクリプトを見るより、JavaScriptの読み書きできるようになった方がいいです。

githubのJavaScript資産を活用したいなら、HSP3Dish.jsでそのまま直接使える場合もあります。センサー値を取得するとか、数値計算系ライブラリとか。描画系は無理そうですが。
描画系とかそのまま利用できないライブラリの場合は、変換出来ると便利なのかも?


> GENKIさんが、AIからjavascriptのプログラムにアドバイスもらったり
> 手伝ったりしてもらってるってどっかに書いてたよーな

自分で書いたコードのレビューしてもらったりしています。バグ見つけてくれたり、完成度を上げたりできます。
書いてもらうのもできますが、どこか間違っていることが多々あるので全行確認必要です。変換に使うのはちょっと難しいかも。



うし

リンク

2025/5/20(Tue) 14:23:57|NO.103481

ブラウザでhgimg4が動くのはびっくりした。

JSで3dをいろいろ試したけど
hgimg4並みの3d表現は、できないんじゃないかな。
three.jsとか。

だから、
jsはやめて、hspやってるけど。



GENKI

リンク

2025/5/20(Tue) 23:49:54|NO.103482

> hgimg4並みの3d表現は、できないんじゃないかな。

とりあえず、UnityのWebGL出力の作品とか、こちらのサイトとか。
https://henryegloff.com/examples-of-browser-based-games-using-three-js-javascript-and-webgl/

今の時代では、hgimg4の3D表現力はそれほどでもないのが現状です。ですが、HSP3で書ける手軽さは無二ですね。(Unityの方が楽なのかもですが、使わないのでわからない。)



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.103471への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2025(c) All rights reserved.