a25_buntan02
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* buntan-pc #2
-(by [[K]], 2025.04.11)
** (0)
-https://github.com/buntan-pc/
-これにかかわる開発の話
** 2025.04.11 Fri #0
-今のbuntan-pcにはuasという専用のアセンブラがあるのだけど...
-そのために、どういうソースを渡せばどういうバイナリがでて...
-uchanさんに、「・・・ということでテストセットを3組くらい...
-uas.exeを作っていたらコンパイルエラーが出た。「//」のコ...
-上記のコメント問題を直したら、7個の警告が出るだけでビル...
-なるほどね、MS-Cには「/utf-8」っていうオプションがあるの...
-次はucc.exe。
-まずmakeを用意するのが面倒だったので以下のucc.cを作って...
#include "main.c"
#include "ast.c"
#include "insn.c"
#include "symbol.c"
#include "token.c"
#include "type.c"
-問題は2つ。
--libgen.hがないので、dirname()がない。
--以下の記述を嫌がる。
struct GenContext gen_ctx = {
parse_ctx.scope,
0, 0, 0, {}, {-1, -1}, 0, {}, print_ast, 0
};
-さてどうしたものか。
0, 0, 0, {0}, {-1, -1}, 0, {0}, print_ast, 0
--にしたらとりあえず文句を言わなくなった。
-じゃあ残るはdirname()だけだな。どこかに落ちてないかな。
--なるほど、こういう仕様なのか。 https://surf.st.seikei.a...
-Cursorさんに「<libgen.h>のdirnameを作ってください。」っ...
#include <stdio.h>
#include <string.h>
char* my_dirname(char* path) {
static char buffer[256];
char* last_slash;
// パスがNULLまたは空の場合、"."を返す
if (path == NULL || *path == '\0') {
return ".";
}
// パスをコピー
strncpy(buffer, path, sizeof(buffer) - 1);
buffer[sizeof(buffer) - 1] = '\0';
// 最後のスラッシュを探す
last_slash = strrchr(buffer, '/');
// スラッシュが見つからない場合、"."を返す
if (last_slash == NULL) {
return ".";
}
// スラッシュの後ろを終端文字に置き換える
if (last_slash != buffer) {
*last_slash = '\0';
} else {
// ルートディレクトリの場合
*(last_slash + 1) = '\0';
}
return buffer;
}
--とりあえずこれでいけそうだな。
-これでucc.exeはビルドできるようになったけど、できたucc.e...
-いやでも、uas.exeは問題なく動いているっぽいし、ucc/tests...
** 2025.04.11 Fri #1
-ある程度テストしてみたところ、手元でビルドしたuas.exeは...
** 2025.04.14 Mon #0
-とりあえずK版のアセンブラは半分くらいできた。
-今のところ、289行。
-本家は section .data の次に section .text を書くというル...
** 2025.04.15 Tue #0
-array.sくらいならアセンブルできるようになった!(かも)。
-まだ出力部を書いてないので、メモリの中でアセンブルできて...
-数値計算を本家よりは頑張ったので、 push lb3-lb2+1 くらい...
-今は356行。
** 2025.04.15 Tue #1
-db命令にも対応して、サンプルの.sファイルは全部アセンブル...
-あとは出力部をかかないとな・・・。
** 2025.04.15 Tue #2
-出力部もできた。ちょっとバクもあったけど、それも直して、...
-今は408行。まあでも行数はそんなに重要じゃない。1行に詰め...
-一番苦戦したデバッグは、fopen(exe, "wb")が失敗してNULLを...
--BZエディタで開いているファイルをfopenで書き込みオープン...
--これに気づくまでに30分くらい悩んだ。まさかここで失敗し...
-あとは些細な問題として、途中から本家が出力している実行フ...
-やったね!(明日upload予定)
** 2025.04.16 Wed #0
-今回アセンブラを作るために使ったaclminiというライブラリ...
Ai intptr_t のtypedef (頻出なので短く書けるようにし...
Ap void * のtypedef
Av void のtypedef
Auc unsigned char のtypedef
Asc signed char のtypedef
AStr char * のtypedef
As static の#define
AClass(Abc) { ... }; → structしてtypedefしてくれるマクロ
aSz(Abc) (intptr_t) sizeof(Abc) の代わり (sizeofはuns...
AMlc : AMalloc - 汎用メモリアロケータ・インター...
AMlcStd : AMlc Standard - malloc/free/reallocを使っ...
AMlcStdNumSz : AMlcStd Number/Size - mallocしたブロック...
ATokenMgr : ATokenManager - 文字列に対して出現順に0,1...
AExpMem : AExpandableMemory - 可変長配列
-aSzはASzにした方がいいかもしれない。そうすればAで始まる...
--(追記)ということで aSz は廃止して ASz にした。
** 2025.04.16 Wed #1
-https://essen.osask.jp/files/kuas00a.zip (4.79KB)
--ソースファイルのみです。書いてないけどライセンスはKL-01...
--コンパイルの際は、 kuas.c のみコンパイルすればいいです...
--うわー、ソースコードだけでzip化すると5KB未満かー。小さ...
-今回かなり短期間で書けたわけですが、それで思ったのは、も...
** 2025.04.16 Wed #2
-「--pmem」「--dmem」オプションに対応してほしいと言われた...
-https://essen.osask.jp/files/kuas01a.zip (4.92KB)
--ソースファイルのみです。書いてないけどライセンスはKL-01...
--コンパイルの際は、 kuas.c のみコンパイルすればいいです...
** 2025.04.18 Fri #0
-const-expr.sにも対応してほしいと言われたので対応しました...
-https://essen.osask.jp/files/kuas02a.zip (5.13KB)
--ソースファイルのみです。書いてないけどライセンスはKL-01...
--コンパイルの際は、 kuas.c のみコンパイルすればいいです...
** 2025.04.19 Sat #0
-今日はkuasには直接関係しない話を書きます。
-インタプリタやコンパイラを作っていると、式の評価の処理が...
-私が上記の処理を書いたのは2021年で、その後、数回の改良を...
-とはいえ、言語を作るたびに似たような処理を書くというのは...
-まずどのくらいの汎用性を持たせるかを考えました。
--パースのアルゴリズムは規定しないで、言語側に裁量を持た...
--演算子の優先順位について。C言語に規定されている演算子に...
--とはいえ、bitAndやbitOrなどのbit演算は比較演算子よりも...
--だから演算子の追加が自由かつ低コストでできればよい。
--どんな型をどうサポートするのかは言語側の裁量なので、こ...
-そういうことを考えて、適当にいい感じに作ってみました。
-結局こんな感じになりました。
AClass(ExprDriver) {
// これはExprDriverの内部状態を保持するためのクラス.
const char *s, *s0; // もっともシンプルに行くなら、...
};
AClass(ExprObject) { intptr_t typ; ... }; // 言語側で好...
ExprObject *ExprDriver_func(ExprDriver *driver, intptr_t...
int main(int argc, const char **argv)
{
if (argc >= 2) {
ExprDriver driver;
driver.s = argv[1];
ExprObject *result = (ExprObject *) AExpr(ExprDr...
// ここでresultを表示.
}
return 0;
}
-これだけで行けます。ExprDriver_func()が言語処理系依存の...
-AExpr()の最後の999は演算子の優先順位です。優先度999まで...
-こんな ExprDriver_func() に丸投げばかりの仕様なので、 Ex...
func==0: 対象となる数式から次の1トークンを取ってくるだけ...
演算子なのか何らかの値を持つオブジェクトなのか...
func==1: 指定されたExprObjectをメモリ開放します。どんな...
まあたいていはfreeするだけの簡単な処理になりま...
func==2: 直前にfunc==0で読み取ったトークンを、押し戻しま...
こういうことをできるようにするもっとも簡単な方...
このやり方なら、func==2が来た時に、s = s0; を実...
func==3: リザーブです。今のところこの呼び出しはありませ...
func==4: 単項演算子を新規に追加したい場合、もしくは既存...
追加も変更もないなら、ただ0を返しておけばいいで...
func==5: 二項演算子、三項演算子などを新規に追加したい場...
追加も変更もないなら、ただ0を返しておけばいいで...
func==AExpr_Add: 二項演算子「+」による加算です。2つのExp...
他にも演算子の数だけ同様の呼び出しがあります。...
問題なくエラー処理されます。・・・だから処理し...
** 2025.04.20 Sun #0
-uchanさんのComProcのCPUのアセンブラで書かれたプログラム...
-同じアルゴリズムはたぶんx86とかx64とかARMとかAArch64とか...
--エミュレータのいらない世界が実現したらいいなあ。
-これが実現したら、CPUを自作したときに、たくさんのプログ...
-(追記)もう少しだけ詳しい話を書いてみる。
-たいていのアセンブラでは、CALL命令(もしくはそれに相当す...
-これを一般的なC言語プログラムでどう表現するかという問題...
-まず前提として、アセンブラのラベルにはCALL用かJMP用かと...
--これはCALL命令の直後にRET命令があるときとかに、よく用い...
-こういうことをされると、「CALLされることがあるラベルかど...
--これに対しては、関数に対するJMPをCALL+RETに変換すればい...
-そもそもC言語においてはgoto用のラベルと関数はかなり異な...
-そうなると、CALL命令はリターン用のラベルを宣言してその値...
--[註]RISC系の一部のCPUではCALL/RETでスタックを使わず、専...
-でもこれは難しい。goto用のラベル値を取得する方法がない。...
--http://cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/gccexte...
--というかgccを作った人は、本当によく考えている。この機能...
-CALL命令はほぼすべてのアセンブラプログラムに出てくるくら...
-ここからが今回の思い付き。プログラム全体を巨大なswitch-c...
--うーん、前提の部分も含めて、この説明じゃ何を言いたいの...
** 2025.04.20 Sun #1
-一方で、安野さんたちのvibe codingの話とかを見ていると、...
--https://x.com/takahiroanno/status/1913121506273710241
** 2025.04.21 Mon #0
-たまに、どうやってプログラミングの勉強をしたらいいですか...
-まずとにかくプログラムを書きます。OSに関心がある時はOSを...
-私は自分が作ったプログラムのすべてを常用しているわけでは...
// subはp0,p1だけではなく、opの情報も必要. 具体的には (ty...
// cast演算子(typオブジェクト, valオブジェクト)にできれば...
// (typ)を検出したら、まずtypをオブジェクトとして送出する...
// ?の3項演算子はどうするのか。まず?が来る。スタックする...
// 単項演算子と二項演算子の違いは、実際の項の数ではなく、...
終了行:
* buntan-pc #2
-(by [[K]], 2025.04.11)
** (0)
-https://github.com/buntan-pc/
-これにかかわる開発の話
** 2025.04.11 Fri #0
-今のbuntan-pcにはuasという専用のアセンブラがあるのだけど...
-そのために、どういうソースを渡せばどういうバイナリがでて...
-uchanさんに、「・・・ということでテストセットを3組くらい...
-uas.exeを作っていたらコンパイルエラーが出た。「//」のコ...
-上記のコメント問題を直したら、7個の警告が出るだけでビル...
-なるほどね、MS-Cには「/utf-8」っていうオプションがあるの...
-次はucc.exe。
-まずmakeを用意するのが面倒だったので以下のucc.cを作って...
#include "main.c"
#include "ast.c"
#include "insn.c"
#include "symbol.c"
#include "token.c"
#include "type.c"
-問題は2つ。
--libgen.hがないので、dirname()がない。
--以下の記述を嫌がる。
struct GenContext gen_ctx = {
parse_ctx.scope,
0, 0, 0, {}, {-1, -1}, 0, {}, print_ast, 0
};
-さてどうしたものか。
0, 0, 0, {0}, {-1, -1}, 0, {0}, print_ast, 0
--にしたらとりあえず文句を言わなくなった。
-じゃあ残るはdirname()だけだな。どこかに落ちてないかな。
--なるほど、こういう仕様なのか。 https://surf.st.seikei.a...
-Cursorさんに「<libgen.h>のdirnameを作ってください。」っ...
#include <stdio.h>
#include <string.h>
char* my_dirname(char* path) {
static char buffer[256];
char* last_slash;
// パスがNULLまたは空の場合、"."を返す
if (path == NULL || *path == '\0') {
return ".";
}
// パスをコピー
strncpy(buffer, path, sizeof(buffer) - 1);
buffer[sizeof(buffer) - 1] = '\0';
// 最後のスラッシュを探す
last_slash = strrchr(buffer, '/');
// スラッシュが見つからない場合、"."を返す
if (last_slash == NULL) {
return ".";
}
// スラッシュの後ろを終端文字に置き換える
if (last_slash != buffer) {
*last_slash = '\0';
} else {
// ルートディレクトリの場合
*(last_slash + 1) = '\0';
}
return buffer;
}
--とりあえずこれでいけそうだな。
-これでucc.exeはビルドできるようになったけど、できたucc.e...
-いやでも、uas.exeは問題なく動いているっぽいし、ucc/tests...
** 2025.04.11 Fri #1
-ある程度テストしてみたところ、手元でビルドしたuas.exeは...
** 2025.04.14 Mon #0
-とりあえずK版のアセンブラは半分くらいできた。
-今のところ、289行。
-本家は section .data の次に section .text を書くというル...
** 2025.04.15 Tue #0
-array.sくらいならアセンブルできるようになった!(かも)。
-まだ出力部を書いてないので、メモリの中でアセンブルできて...
-数値計算を本家よりは頑張ったので、 push lb3-lb2+1 くらい...
-今は356行。
** 2025.04.15 Tue #1
-db命令にも対応して、サンプルの.sファイルは全部アセンブル...
-あとは出力部をかかないとな・・・。
** 2025.04.15 Tue #2
-出力部もできた。ちょっとバクもあったけど、それも直して、...
-今は408行。まあでも行数はそんなに重要じゃない。1行に詰め...
-一番苦戦したデバッグは、fopen(exe, "wb")が失敗してNULLを...
--BZエディタで開いているファイルをfopenで書き込みオープン...
--これに気づくまでに30分くらい悩んだ。まさかここで失敗し...
-あとは些細な問題として、途中から本家が出力している実行フ...
-やったね!(明日upload予定)
** 2025.04.16 Wed #0
-今回アセンブラを作るために使ったaclminiというライブラリ...
Ai intptr_t のtypedef (頻出なので短く書けるようにし...
Ap void * のtypedef
Av void のtypedef
Auc unsigned char のtypedef
Asc signed char のtypedef
AStr char * のtypedef
As static の#define
AClass(Abc) { ... }; → structしてtypedefしてくれるマクロ
aSz(Abc) (intptr_t) sizeof(Abc) の代わり (sizeofはuns...
AMlc : AMalloc - 汎用メモリアロケータ・インター...
AMlcStd : AMlc Standard - malloc/free/reallocを使っ...
AMlcStdNumSz : AMlcStd Number/Size - mallocしたブロック...
ATokenMgr : ATokenManager - 文字列に対して出現順に0,1...
AExpMem : AExpandableMemory - 可変長配列
-aSzはASzにした方がいいかもしれない。そうすればAで始まる...
--(追記)ということで aSz は廃止して ASz にした。
** 2025.04.16 Wed #1
-https://essen.osask.jp/files/kuas00a.zip (4.79KB)
--ソースファイルのみです。書いてないけどライセンスはKL-01...
--コンパイルの際は、 kuas.c のみコンパイルすればいいです...
--うわー、ソースコードだけでzip化すると5KB未満かー。小さ...
-今回かなり短期間で書けたわけですが、それで思ったのは、も...
** 2025.04.16 Wed #2
-「--pmem」「--dmem」オプションに対応してほしいと言われた...
-https://essen.osask.jp/files/kuas01a.zip (4.92KB)
--ソースファイルのみです。書いてないけどライセンスはKL-01...
--コンパイルの際は、 kuas.c のみコンパイルすればいいです...
** 2025.04.18 Fri #0
-const-expr.sにも対応してほしいと言われたので対応しました...
-https://essen.osask.jp/files/kuas02a.zip (5.13KB)
--ソースファイルのみです。書いてないけどライセンスはKL-01...
--コンパイルの際は、 kuas.c のみコンパイルすればいいです...
** 2025.04.19 Sat #0
-今日はkuasには直接関係しない話を書きます。
-インタプリタやコンパイラを作っていると、式の評価の処理が...
-私が上記の処理を書いたのは2021年で、その後、数回の改良を...
-とはいえ、言語を作るたびに似たような処理を書くというのは...
-まずどのくらいの汎用性を持たせるかを考えました。
--パースのアルゴリズムは規定しないで、言語側に裁量を持た...
--演算子の優先順位について。C言語に規定されている演算子に...
--とはいえ、bitAndやbitOrなどのbit演算は比較演算子よりも...
--だから演算子の追加が自由かつ低コストでできればよい。
--どんな型をどうサポートするのかは言語側の裁量なので、こ...
-そういうことを考えて、適当にいい感じに作ってみました。
-結局こんな感じになりました。
AClass(ExprDriver) {
// これはExprDriverの内部状態を保持するためのクラス.
const char *s, *s0; // もっともシンプルに行くなら、...
};
AClass(ExprObject) { intptr_t typ; ... }; // 言語側で好...
ExprObject *ExprDriver_func(ExprDriver *driver, intptr_t...
int main(int argc, const char **argv)
{
if (argc >= 2) {
ExprDriver driver;
driver.s = argv[1];
ExprObject *result = (ExprObject *) AExpr(ExprDr...
// ここでresultを表示.
}
return 0;
}
-これだけで行けます。ExprDriver_func()が言語処理系依存の...
-AExpr()の最後の999は演算子の優先順位です。優先度999まで...
-こんな ExprDriver_func() に丸投げばかりの仕様なので、 Ex...
func==0: 対象となる数式から次の1トークンを取ってくるだけ...
演算子なのか何らかの値を持つオブジェクトなのか...
func==1: 指定されたExprObjectをメモリ開放します。どんな...
まあたいていはfreeするだけの簡単な処理になりま...
func==2: 直前にfunc==0で読み取ったトークンを、押し戻しま...
こういうことをできるようにするもっとも簡単な方...
このやり方なら、func==2が来た時に、s = s0; を実...
func==3: リザーブです。今のところこの呼び出しはありませ...
func==4: 単項演算子を新規に追加したい場合、もしくは既存...
追加も変更もないなら、ただ0を返しておけばいいで...
func==5: 二項演算子、三項演算子などを新規に追加したい場...
追加も変更もないなら、ただ0を返しておけばいいで...
func==AExpr_Add: 二項演算子「+」による加算です。2つのExp...
他にも演算子の数だけ同様の呼び出しがあります。...
問題なくエラー処理されます。・・・だから処理し...
** 2025.04.20 Sun #0
-uchanさんのComProcのCPUのアセンブラで書かれたプログラム...
-同じアルゴリズムはたぶんx86とかx64とかARMとかAArch64とか...
--エミュレータのいらない世界が実現したらいいなあ。
-これが実現したら、CPUを自作したときに、たくさんのプログ...
-(追記)もう少しだけ詳しい話を書いてみる。
-たいていのアセンブラでは、CALL命令(もしくはそれに相当す...
-これを一般的なC言語プログラムでどう表現するかという問題...
-まず前提として、アセンブラのラベルにはCALL用かJMP用かと...
--これはCALL命令の直後にRET命令があるときとかに、よく用い...
-こういうことをされると、「CALLされることがあるラベルかど...
--これに対しては、関数に対するJMPをCALL+RETに変換すればい...
-そもそもC言語においてはgoto用のラベルと関数はかなり異な...
-そうなると、CALL命令はリターン用のラベルを宣言してその値...
--[註]RISC系の一部のCPUではCALL/RETでスタックを使わず、専...
-でもこれは難しい。goto用のラベル値を取得する方法がない。...
--http://cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/gccexte...
--というかgccを作った人は、本当によく考えている。この機能...
-CALL命令はほぼすべてのアセンブラプログラムに出てくるくら...
-ここからが今回の思い付き。プログラム全体を巨大なswitch-c...
--うーん、前提の部分も含めて、この説明じゃ何を言いたいの...
** 2025.04.20 Sun #1
-一方で、安野さんたちのvibe codingの話とかを見ていると、...
--https://x.com/takahiroanno/status/1913121506273710241
** 2025.04.21 Mon #0
-たまに、どうやってプログラミングの勉強をしたらいいですか...
-まずとにかくプログラムを書きます。OSに関心がある時はOSを...
-私は自分が作ったプログラムのすべてを常用しているわけでは...
// subはp0,p1だけではなく、opの情報も必要. 具体的には (ty...
// cast演算子(typオブジェクト, valオブジェクト)にできれば...
// (typ)を検出したら、まずtypをオブジェクトとして送出する...
// ?の3項演算子はどうするのか。まず?が来る。スタックする...
// 単項演算子と二項演算子の違いは、実際の項の数ではなく、...
ページ名: