a25_kharcs3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* kharcs #3
-(by [[K]], 2025.06.13)
** (0) これはなに?
-(kharcsページは、kharc開発でわかったことを整理して説明...
-今回説明したいこと: ~この順番でCコンパイラを作ったら早...
--[1]~[6]→[[a25_kharcs2]]
--[7]プリプロセッサ、グラフィックライブラリ(8日目)
** (7) プリプロセッサ、グラフィックライブラリ(8日目:6/1...
-昨日のエミュレータ&JITコンパイラで楽しくなってきたので...
-プリプロセッサは [[a25_buntan04]] の2025.05.07~2025.05....
-グラフィックライブラリはeasy-Cを作った時に使ったものをac...
-ここでいったん現状をまとめます。
|(1)acl3ライブラリ|RIGHT:607行|RIGHT:19.9KB|開発期間:2025...
|(2)acl3gライブラリ|RIGHT:653行|RIGHT:16.6KB|開発期間:202...
|(3)プリプロセッサ|RIGHT:378行|RIGHT:12.6KB|開発期間:2025...
|(4)コンパイラ本体|RIGHT:840行|RIGHT:27.7KB|開発期間:2025...
|(5)内蔵用アセンブラ|RIGHT:87行|RIGHT:13.3KB|開発期間:202...
|(6)kharcエミュレータ|RIGHT:73行|CENTER:↑|開発期間:2025.0...
|(7)kharcバイナリ→x86機械語のJITコンパイラ|RIGHT:66行|CEN...
|(8)(main)|RIGHT:52行|RIGHT:2.1KB|開発期間:2025.06.04~20...
|(4~8の集計)|RIGHT:1118行|RIGHT:43.1KB|開発期間:2025.06....
-今回作った、「それっぽい見た目にするための」ヘッダファイ...
-プリプロセッサが使えるようになったので作りました。
void startup() { main(); asm { End(); } }
// APIs (syscall)
#define openWin(xSiz, ySiz) Syc(0, xSiz, y...
#define wait(msec) Syc(1, msec)
#define setMode(win, mod) Syc(2, win, mod)
#define setPix0(win, x, y, c) Syc(3, win, x,...
#define fillRect0(win, sx, sy, x, y, c) Syc(4, win, sx...
#define fillRect(win, sx, sy, x, y, c) Syc(5, win, sx...
#define drawRect0(win, sx, sy, x, y, c) Syc(6, win, sx...
#define drawRect(win, sx, sy, x, y, c) Syc(7, win, sx...
#define drawLine(win, x0, y0, x1, y1, c) Syc(8, win, x0...
#define fillOval0(win, sx, sy, x, y, c) Syc(9, win, sx...
#define fillOval(win, sx, sy, x, y, c) Syc(10, win, s...
#define drawOval(win, sx, sy, x, y, c) Syc(11, win, s...
#define fillOvalCent(win, x, y, a, b, c) Syc(12, win, x...
#define drawOvalCent(win, x, y, a, b, c) Syc(13, win, x...
#define fill(win, x, y, c) Syc(14, win, x...
#define Amul64Shr(a, b, c) Syc(15, a, b, c)
#define AprintTime() Syc(16)
#define Argb8(r, g, b) ((r)*65536+(g)...
#define AWin_ModeSet 0
#define AWin_ModeOr 1
#define AWin_ModeAnd 2
#define AWin_ModeXor 3
void putchar(int c) { asm { LodRMd(R0,SP,$c); printf("%c...
----
-まずは私にとって定番のこれを作りました(サンプル1)。
#include "kharc.h"
int main()
{
int win, x, y, c;
win = openWin(256, 256);
c = 0;
for (y = 0; y < 256; y++) {
for (x = 0; x < 256; x++) {
setPix0(win, x, y, c);
c = c + 0x100;
}
}
wait(-1);
}
--https://essen.osask.jp/files/pic20250613a.jpg
-こうやってグラフィックスが出せるようになると、なんかすご...
-これは上記のソースコードをテキストファイルに保存して、
prompt>kcc sample1.txt
-とすればすぐに表示されます。kccさえあれば、gccなどのコン...
-このプログラムのように最後がwait(-1)で終わっているものは...
----
-次はこれを作りました(サンプル2)。私がcharsと呼んでいる...
#include "kharc.h"
int main()
{
int i;
for (i = 0x20; i <= 0x7e; i++) {
putchar(i);
}
putchar(0x0a);
return 0;
}
-実行結果はこうなります。
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW...
----
-次はこれを作りました(サンプル3)。
#include "kharc.h"
int main()
{
int win, x, y, c;
win = openWin(512, 512); setMode(win, AWin_ModeXor);
c = 0xffff00;
for (x = 0; x < 512; x++) {
drawLine(win, 0, 0, x, 511, c);
drawLine(win, x, 0, 511, 511, c);
}
wait(-1);
}
--https://essen.osask.jp/files/pic20250613b.png
----
-次はこれを作りました(サンプル4)。
#include "kharc.h"
int main()
{
int win, x, y, c;
win = openWin(256, 256);
for (y = 0; y < 256; y++) {
for (x = 0; x < 256; x++) {
c = (x ^ y) * 0x010101;
setPix0(win, x, y, c);
}
}
wait(-1);
}
--https://essen.osask.jp/files/pic20250613c.png
----
-これはマンデルブロー集合の画像をかくためのプログラムです...
-普通に実行すると数分の実行時間がかかるので、
prompt>kcc sample5.txt 2
-のようにファイル名のあとに「2」を付けます。これは実行モ...
#include "kharc.h"
int main()
{
int w; w = openWin(512, 384);
int x, y;
for (y = 0; y < 384; y++) {
for (x = 0; x < 512; x++) {
int sn, sx, sy, n; sn = 0;
int c, cx, cy, zx, zy, xx, yy;
for (sx = 0; sx < 4; sx++) {
cx = (x * 4 + sx) * 56 + 4673536;
for (sy = 0; sy < 4; sy++) {
cy = (y * 4 + sy) * (-56) - 124928;
zx = cx; zy = cy;
for (n = 1; n < 447; n++) {
xx = Amul64Shr(zx, zx, 24);
yy = Amul64Shr(zy, zy, 24);
if (xx + yy > 0x4000000) break;
zy = Amul64Shr(zy, zx, 23);
zx = xx + cx - yy;
zy = zy + cy;
}
sn = sn + n;
}
}
n = sn / 16;
c = Argb8(n, 0, 0);
if (n >= 256) {
c = Argb8(0, 0, 0);
if (n < 447) {
c = Argb8(255, n - 255, 0);
}
}
setPix0(w, x, y, c);
}
}
AprintTime();
wait(-1);
}
--https://essen.osask.jp/files/pic20250613d.jpg
-多用している Amul64Shr(a, b, c) という関数は、aとbを掛け...
----
-Windows用のkcc.exeとそのソースコードです。
--https://essen.osask.jp/files/kcc00a.zip (50.5KB)
-これは開発途上のものを適当にまとめたものです。実行しよう...
-これはデバッグ中の表示が残ったもので、まあ「よくわからん...
-JITコンパイラは32bit用に作ったので、kcc.exeを作る時は32b...
-ビルドするときは、kcc.cだけを指定すればいいです。残りは...
-GDI32.DLLを使うので、「-lgdi32」を指定する必要があります。
-機能としては、ここに提示されているサンプルを動かす程度の...
-エラーチェックもほとんどしてなくて「バグがないと分かって...
** 今後の予定
-ポインタと配列を使えるようにしたら、できることが増えそう...
-構造体も使えるようにしたいです。
-浮動小数点演算もやりたいし、最適化もやりたいです。
-でもkharcばかりやっていると他の仕事があまりできないので...
-今回は SecHack365 の第1回のオンラインイベント(2025.06.1...
-今回作ってわかったことは、Cコンパラを作るのはそれほど大...
-2013年とか2014年にOSECPU-VMを作っていたころは、Cコンパイ...
-実はkccはパーサやトークナイザを使っていません。なくてもC...
-いろいろ開発しながら「これは将来も使いそうだな」と思った...
-kharcはLLVMやLuaみたいなカテゴリで、超軽量型という立場を...
-まあコンパイラをちゃんと作り切った時にどのくらいの規模に...
終了行:
* kharcs #3
-(by [[K]], 2025.06.13)
** (0) これはなに?
-(kharcsページは、kharc開発でわかったことを整理して説明...
-今回説明したいこと: ~この順番でCコンパイラを作ったら早...
--[1]~[6]→[[a25_kharcs2]]
--[7]プリプロセッサ、グラフィックライブラリ(8日目)
** (7) プリプロセッサ、グラフィックライブラリ(8日目:6/1...
-昨日のエミュレータ&JITコンパイラで楽しくなってきたので...
-プリプロセッサは [[a25_buntan04]] の2025.05.07~2025.05....
-グラフィックライブラリはeasy-Cを作った時に使ったものをac...
-ここでいったん現状をまとめます。
|(1)acl3ライブラリ|RIGHT:607行|RIGHT:19.9KB|開発期間:2025...
|(2)acl3gライブラリ|RIGHT:653行|RIGHT:16.6KB|開発期間:202...
|(3)プリプロセッサ|RIGHT:378行|RIGHT:12.6KB|開発期間:2025...
|(4)コンパイラ本体|RIGHT:840行|RIGHT:27.7KB|開発期間:2025...
|(5)内蔵用アセンブラ|RIGHT:87行|RIGHT:13.3KB|開発期間:202...
|(6)kharcエミュレータ|RIGHT:73行|CENTER:↑|開発期間:2025.0...
|(7)kharcバイナリ→x86機械語のJITコンパイラ|RIGHT:66行|CEN...
|(8)(main)|RIGHT:52行|RIGHT:2.1KB|開発期間:2025.06.04~20...
|(4~8の集計)|RIGHT:1118行|RIGHT:43.1KB|開発期間:2025.06....
-今回作った、「それっぽい見た目にするための」ヘッダファイ...
-プリプロセッサが使えるようになったので作りました。
void startup() { main(); asm { End(); } }
// APIs (syscall)
#define openWin(xSiz, ySiz) Syc(0, xSiz, y...
#define wait(msec) Syc(1, msec)
#define setMode(win, mod) Syc(2, win, mod)
#define setPix0(win, x, y, c) Syc(3, win, x,...
#define fillRect0(win, sx, sy, x, y, c) Syc(4, win, sx...
#define fillRect(win, sx, sy, x, y, c) Syc(5, win, sx...
#define drawRect0(win, sx, sy, x, y, c) Syc(6, win, sx...
#define drawRect(win, sx, sy, x, y, c) Syc(7, win, sx...
#define drawLine(win, x0, y0, x1, y1, c) Syc(8, win, x0...
#define fillOval0(win, sx, sy, x, y, c) Syc(9, win, sx...
#define fillOval(win, sx, sy, x, y, c) Syc(10, win, s...
#define drawOval(win, sx, sy, x, y, c) Syc(11, win, s...
#define fillOvalCent(win, x, y, a, b, c) Syc(12, win, x...
#define drawOvalCent(win, x, y, a, b, c) Syc(13, win, x...
#define fill(win, x, y, c) Syc(14, win, x...
#define Amul64Shr(a, b, c) Syc(15, a, b, c)
#define AprintTime() Syc(16)
#define Argb8(r, g, b) ((r)*65536+(g)...
#define AWin_ModeSet 0
#define AWin_ModeOr 1
#define AWin_ModeAnd 2
#define AWin_ModeXor 3
void putchar(int c) { asm { LodRMd(R0,SP,$c); printf("%c...
----
-まずは私にとって定番のこれを作りました(サンプル1)。
#include "kharc.h"
int main()
{
int win, x, y, c;
win = openWin(256, 256);
c = 0;
for (y = 0; y < 256; y++) {
for (x = 0; x < 256; x++) {
setPix0(win, x, y, c);
c = c + 0x100;
}
}
wait(-1);
}
--https://essen.osask.jp/files/pic20250613a.jpg
-こうやってグラフィックスが出せるようになると、なんかすご...
-これは上記のソースコードをテキストファイルに保存して、
prompt>kcc sample1.txt
-とすればすぐに表示されます。kccさえあれば、gccなどのコン...
-このプログラムのように最後がwait(-1)で終わっているものは...
----
-次はこれを作りました(サンプル2)。私がcharsと呼んでいる...
#include "kharc.h"
int main()
{
int i;
for (i = 0x20; i <= 0x7e; i++) {
putchar(i);
}
putchar(0x0a);
return 0;
}
-実行結果はこうなります。
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW...
----
-次はこれを作りました(サンプル3)。
#include "kharc.h"
int main()
{
int win, x, y, c;
win = openWin(512, 512); setMode(win, AWin_ModeXor);
c = 0xffff00;
for (x = 0; x < 512; x++) {
drawLine(win, 0, 0, x, 511, c);
drawLine(win, x, 0, 511, 511, c);
}
wait(-1);
}
--https://essen.osask.jp/files/pic20250613b.png
----
-次はこれを作りました(サンプル4)。
#include "kharc.h"
int main()
{
int win, x, y, c;
win = openWin(256, 256);
for (y = 0; y < 256; y++) {
for (x = 0; x < 256; x++) {
c = (x ^ y) * 0x010101;
setPix0(win, x, y, c);
}
}
wait(-1);
}
--https://essen.osask.jp/files/pic20250613c.png
----
-これはマンデルブロー集合の画像をかくためのプログラムです...
-普通に実行すると数分の実行時間がかかるので、
prompt>kcc sample5.txt 2
-のようにファイル名のあとに「2」を付けます。これは実行モ...
#include "kharc.h"
int main()
{
int w; w = openWin(512, 384);
int x, y;
for (y = 0; y < 384; y++) {
for (x = 0; x < 512; x++) {
int sn, sx, sy, n; sn = 0;
int c, cx, cy, zx, zy, xx, yy;
for (sx = 0; sx < 4; sx++) {
cx = (x * 4 + sx) * 56 + 4673536;
for (sy = 0; sy < 4; sy++) {
cy = (y * 4 + sy) * (-56) - 124928;
zx = cx; zy = cy;
for (n = 1; n < 447; n++) {
xx = Amul64Shr(zx, zx, 24);
yy = Amul64Shr(zy, zy, 24);
if (xx + yy > 0x4000000) break;
zy = Amul64Shr(zy, zx, 23);
zx = xx + cx - yy;
zy = zy + cy;
}
sn = sn + n;
}
}
n = sn / 16;
c = Argb8(n, 0, 0);
if (n >= 256) {
c = Argb8(0, 0, 0);
if (n < 447) {
c = Argb8(255, n - 255, 0);
}
}
setPix0(w, x, y, c);
}
}
AprintTime();
wait(-1);
}
--https://essen.osask.jp/files/pic20250613d.jpg
-多用している Amul64Shr(a, b, c) という関数は、aとbを掛け...
----
-Windows用のkcc.exeとそのソースコードです。
--https://essen.osask.jp/files/kcc00a.zip (50.5KB)
-これは開発途上のものを適当にまとめたものです。実行しよう...
-これはデバッグ中の表示が残ったもので、まあ「よくわからん...
-JITコンパイラは32bit用に作ったので、kcc.exeを作る時は32b...
-ビルドするときは、kcc.cだけを指定すればいいです。残りは...
-GDI32.DLLを使うので、「-lgdi32」を指定する必要があります。
-機能としては、ここに提示されているサンプルを動かす程度の...
-エラーチェックもほとんどしてなくて「バグがないと分かって...
** 今後の予定
-ポインタと配列を使えるようにしたら、できることが増えそう...
-構造体も使えるようにしたいです。
-浮動小数点演算もやりたいし、最適化もやりたいです。
-でもkharcばかりやっていると他の仕事があまりできないので...
-今回は SecHack365 の第1回のオンラインイベント(2025.06.1...
-今回作ってわかったことは、Cコンパラを作るのはそれほど大...
-2013年とか2014年にOSECPU-VMを作っていたころは、Cコンパイ...
-実はkccはパーサやトークナイザを使っていません。なくてもC...
-いろいろ開発しながら「これは将来も使いそうだな」と思った...
-kharcはLLVMやLuaみたいなカテゴリで、超軽量型という立場を...
-まあコンパイラをちゃんと作り切った時にどのくらいの規模に...
ページ名: