* a23_useSelfMade #3
-(by [[K]], 2023.01.23)
--親ページ: [[a23_useSelfMade]]

** 2023.01.24 Tue #1
-私は小学4年生の時に、中古のFM-8を使ってプログラミングを始めました(富士通製, 8bitCPU, 1.2MHz, メインメモリ64KB, ディスク1枚320KB)。FM-8に標準搭載されていたF-BASIC ver.1.0にはBEEPという命令があって、それで簡単にビープ音を出すことができました。ピーとなるだけでしたが、それでもないよりはずっと有用でした。BEEPのON/OFFを高速に切り替えることで、音に多少の変化を与えることもできました。
-中学に入ってFM-NEW7を中古で買いました(当時でも相当に型落ちしていたので1万円でした)。FM-NEW7にはPSG音源があり、PLAY文やSOUND文があって、最大で3重和音まで音を出すことができました。またFM音源カードを増設することで、FM音源3和音、SSG3和音が追加されて、PLAY HG命令を使って、とても良い音が鳴りました。

-しかし今私がC言語でプログラミングをすると、音は全く鳴らせません。グラフィックはacl1ライブラリやその前身のacl, bla, blikeライブラリなどを使うことで扱えましたが、音関係はずっと未着手でした。・・・つまり私のプログラミング環境は、FM-8のころの上位互換ではなかったのです。音に関して言えば、FM-8のほうが上だったのです。
-いや、Windows上でMinGWを使う環境でも、音を出す手段がありそうなことはずっと前から分かっていました。きっとPLAY文相当のことをやる手段はあって、MMLを演奏できるはずです。でも何をどう調べればいいのか見当もつかず、調査をやりかけてあきらめたままでした。

-さてeasy-Cにはワンライナーがあります。そしてグラフィックを扱えるようにするために<windows.h>もインクルードされた状態になっています。ということは、ワンライナーでwin32apiを好きなだけ試せるのです。・・・それで「そういえば前にwin32にはBeepっていう関数があるよって教えてもらったよな、ちょっと使ってみるかー」から始まって、「おお、できたー、こう書けばよかったのかー(うれしい)」「もっといい音は出せないかな?きっとなんか方法はあるはずだ」と検索して実験、検索して実験をワンライナーで繰り返したところ、ついにmidiOutOpen()やmidiOutShortMsg()でやりたいことができると分かりました。ここまでわかればもう十分なので、必要なコードをすらすらと書いて、APlayというクラスを作ってacl1に追加しました。これでついに、FM-8にもFM-NEW7にも負けない開発環境がWindows上に整ったことになります!(私としては)。

-まあこんな説明を書く必要はなかったのですが、なんというか「自分で使って自分の開発を便利にする」というのを今回とても実感したので、ぜひ紹介したかったのです。

-ということで daiku.c[13行] です。これはベートーベンの交響曲第9番第4楽章の合唱部分の主旋律です。「歓喜の歌」ともいわれます。
 APlay *p = aOpenPlay16(100000);
 
 APlay_mml(p, 0, "T110 @1 f+f+ga agf+e ddef+ f+.e8e2");
 APlay_mml(p, 0, "f+f+ga agf+e ddef+ e.d8d2");
 APlay_mml(p, 0, "eef+d ef+8g8f+d ef+8g8f+e de<a>");
 APlay_mml(p, 0, "f+2 f+ga agf+e ddef+ e.d8d2");
 
 APlay_mml(p, 0, "> f+f+ga agf+e ddef+ f+.e8e2");
 APlay_mml(p, 0, "f+f+ga agf+e ddef+ e.d8d2");
 APlay_mml(p, 0, "eef+d ef+8g8f+d ef+8g8f+e de<a>");
 APlay_mml(p, 0, "f+2 f+ga agf+e ddef+ e.d8d2");
 
 APlay_run(p);
-気づいた人はほとんどいないと思うので書いておきますが、これは私のお気に入りの曲の一つで、「30日でできる!OS自作入門」の664ページでも紹介しています。

~

** 2023.01.24 Tue #2
-ついでなので、他もどんどんやります。以下もすべて「30日でできる!OS自作入門」で紹介したものです。

-kirakira.c[11行] : 「きらきら星」
 APlay *p = aOpenPlay16(100000);
 
 APlay_mml(p, 0, "T120 @1 ccggaag2 ffeeddc2");
 APlay_mml(p, 0, "ggffeed2 ggffeed2");
 APlay_mml(p, 0, "ccggaag2 ffeeddc2 r1");
 
 APlay_mml(p, 0, "ccggaag2 ffeeddc2");
 APlay_mml(p, 0, "ggffeed2 ggffeed2");
 APlay_mml(p, 0, "ccggaag2 ffeeddc2");
 
 APlay_run(p);
-fujisan.c[13行] : 「富士山」
 APlay *p = aOpenPlay16(100000);
 
 APlay_mml(p, 0, "T120 @1 g.g8agec8d8e2 d.g8gf8e8d2.r");
 APlay_mml(p, 0, "g.g8eca.b8>c<a g.a8g8f8e8d8c2.r");
 APlay_mml(p, 0, "d.d8ddc8d8e8f8g2 a.b8>c<ag2.r");
 APlay_mml(p, 0, ">c2<age.e8ag fed.c8c2.r");
 
 APlay_mml(p, 0, "g.g8agec8d8e2 d.g8gf8e8d2.r");
 APlay_mml(p, 0, "g.g8eca.b8>c<a g.a8g8f8e8d8c2.r");
 APlay_mml(p, 0, "d.d8ddc8d8e8f8g2 a.b8>c<ag2.r");
 APlay_mml(p, 0, ">c2<age.e8ag fed.c8c2.r");
 
 APlay_run(p);

-うーん、OS自作入門を見ていたら、自作入門のmmlplay.cみたいなやつをeasy-Cでもやりたくなってきた・・・(演奏に応じて表示が動くやつです)。

~

** 2023.01.25 Wed #1
-今日もまずはOS自作入門から1曲。ベートーベンの交響曲第5番第1楽章より。APlayは工夫とかしなくても簡単に最大16和音を出せるのだから、すべてのパートを使えばいいのですが、今は楽譜が手元にないので、ちょっとできません。OS自作入門では単音で頑張って再現していたので、そのMMLを使って作りました。
-daigo.c[30行]
 APlay *p = aOpenPlay16(100000);
 APlay_mml(p, 0, "T155 @1 l8");
 
 APlay_mml(p, 0, "rggge-2.rfffd1");
 APlay_mml(p, 0, "rggge-a-a-a-g>e-e-e-c2r8<ggg");
 APlay_mml(p, 0, "da-a-a-g>fffd2r8ggf");
 APlay_mml(p, 0, "e-<e-e-fg>ggfe-<e-e-f");
 APlay_mml(p, 0, "g>ggfl4e-rcrg2.l8r<a-a-a-f1r4");
 APlay_mml(p, 0, "  r a-a-a-fddd<ba-a-a-g<ggg");
 APlay_mml(p, 0, ">>e-a-a-a-fddd<ba-a-a-g<ggg");
 APlay_mml(p, 0, ">>e-g>ccc2<bbb>dd2ccce-e-ddf");
 APlay_mml(p, 0, "feeggffa-a-ggb-b-a-a->c");
 APlay_mml(p, 0, "c<bb>dce-e-e-c<ggge-c<gge-ccc<b>>>fdd");
 APlay_mml(p, 0, "<bgffd<bgfd<b>ccc>>e-e-e-");
 APlay_mml(p, 0, "c<aaag-e-e-e-c<aaaa4r2r4b-4r4");
 
 APlay_mml(p, 0, "rb-b-b-e-2f2<b-2>l4b->e-de-fcc<b-");
 APlay_mml(p, 0, "b->e-de-fcc<b->b->e-de-fcc<b-");
 APlay_mml(p, 0, "<b->cd-c<b->c<b-a->d-e-fe-");
 APlay_mml(p, 0, "d-e-d-ce-fg-fe-fg-fe-fg-f");
 APlay_mml(p, 0, "e-fg-fe-fg-fg-al8b-2r8>c<b-a-");
 APlay_mml(p, 0, "a-gfe-e-dcdfe-<b-g");
 APlay_mml(p, 0, ">dc<a-f>c<b-ge-<b->>ab-a");
 APlay_mml(p, 0, "b-ab-ab->c<b-a-a-gfe-e-dcd");
 APlay_mml(p, 0, "fe-<b-g>dc<a-f>c<b-ge-");
 APlay_mml(p, 0, "<b->b->b-b-e-ggge-<b-b-b-ge-e-e-");
 APlay_mml(p, 0, "<b->ddde->ggge-<b-b-b-ge-e-e-");
 APlay_mml(p, 0, "<b->b-b-b-b-4r4.b-b-b-b-4r4.>ddde-4r2");
 
 APlay_run(p);

~

** 2023.01.25 Wed #2
-ずっとAPlayばかりですみません。でも本当にやっとできたのでうれしくて・・・。
-単音ばかりでは面白くないので、和音が必要なバッハの小フーガト短調を書いてみました。でも最後までやるのはすごく大変だったので、全5ページの楽譜のうちの最初の1ページだけです。
-fuga.c[28行]
 APlay *p = aOpenPlay16(100000);
 
 APlay_mml(p, 0, "T74 @20 g>d<b-.a8 g8b-8a8g8f+8a8d g8d8a8d8b-8a16g16a8d8 g8d16g16a8d16a16b-8a16g16a16d16>d16c16");
 APlay_mml(p, 1, "@20 r1 r1 r1 r1");
 APlay_mml(p, 2, "@20 r1 r1 r1 r1");
 APlay_mml(p, 3, "@20 r1 r1 r1 r1");
 
 APlay_mml(p, 0, "<b-16a16g16b-16a16g16f+16a16g16d16g16a16b-16>c16d16e16 f16e16d16f16e16d16c+16e16d8<a8>d8e8f16g16f16g16g8.f32g32a16g16a16b-16a16g16f16e16");
 APlay_mml(p, 1, "r1 daf.e8 d8f8e8d8c+8e8<a");
 APlay_mml(p, 2, "r1 r1 r1");
 APlay_mml(p, 3, "r1 r1 r1");
 
 APlay_mml(p, 0, "f16a16g16a16c+16a16g16a16d16a16g16a16c+16a16g16a16 f16d16c+16d16g16d16c+16d16a16d16c+16d16g16d16c+16d16 <a8>f8<g8>e8<f8a8>d8f8");
 APlay_mml(p, 1, ">d8<a8>e8<a8>f8e16d16e8<a8 >d8<a16>d16e8<a16>d16f8e16d16e16<a16>a16g16 f16e16d16f16e16d16c+16e16d16<a16>d16e16f16g16a16b16");
 APlay_mml(p, 2, "r1 r1 r1");
 APlay_mml(p, 3, "r1 r1 r1");
 
 APlay_mml(p, 0, "e-8a8r8e-8d8g8r8d8 c16<b-16>c16d16c16a16g16a16<b-16>g16f+16g16<a16>f16e-16f16 g2r2");
 APlay_mml(p, 1, ">c16<b-16>c16d16c16<b-16a16>c16<b-16a16b-16>c16<b-16a16g16b-16 a8g8f+8d8g4r4 r8d8g8a8b-16>c16<b-16>c16c8.<b-32>c32");
 APlay_mml(p, 2, "r1 r2<g4>d4 <b-4.a8g8b-8a8g8");
 APlay_mml(p, 3, "r1 r1 r1");
 
 APlay_mml(p, 0, "r2<d8r8c8r8 d8r8c8r8b-4>c4 d4c4r8<b-8r8a8");
 APlay_mml(p, 1, "d16c16d16e-16d16c16<b-16a16b-16>d16c16d16<f+16>d16c16d16 <g16>d16c16d16<f+16>d16c16d16r16<g16f+16g16r16g16f+16g16 r16g16f+16g16r16g16f+16g16d4c4");
 APlay_mml(p, 2, "f+8a8d4g8d8a8d8 b-8a16g16a8d8g8d16g16a8d16a16 b-8a16g16a16d16>d16c16<b-16a16g16b-16a16g16f+16a16");
 APlay_mml(p, 3, "r1 r1 r1");
 
 APlay_run(p);

~

** 2023.01.25 Wed #3
-今日はまたワンライナーでいろいろ試して、win32でのウィンドウの閉じ方がわかった!なるほどこうすればよかったのかー。

~

** 2023.01.26 Thu #1
-なぜこんなにMML演奏が楽しいのかを考えてみました。
-そもそもMMLによる演奏は、音がすごくいいかというとそんなことはないし(いやいい音はするけど人間の演奏の再現性という意味でwav/mp3ファイルには負ける)、声も入らないしで、既存の音楽を再現する手段としてはベストとは言えません。だからきっと最近は流行らないのですよね。
-でも私のように現実の楽器はほとんど演奏できなくて、でも音楽が好きな人からすると、MMLは夢の世界なのです。楽譜さえ読めればいろんな楽器が演奏できます。一発勝負ではないので多少間違えてもいくらでも後から直せます。テンポも自由に調整できます。

~

** 2023.01.26 Thu #2
-ここまでのツールのダウンロード: https://essen.osask.jp/files/usmp20230126b.zip (60.3KB)
--入っているものはすべてWindows用でLinuxやmacOSで動かすことは全く考えられていません。「自分が作ったものを自分で使う」のポリシーなので他の人が使うことを考えるのは将来の課題です。
--wineとかのエミュレータを使えば、Linux上でも動くかもしれません(未確認ですが)。
//--[bug] cacheという名前の空のディレクトリがないと、ecrunがうまく動きません。空のディレクトリを入れ忘れました・・・。
|acl1/ (78.1KB)|acl1ライブラリ(作りかけ)|
|cache/ (0.00KB)|ecrun.exeがコンパイル結果を格納しておくところ。これがないとecrunはうまく動かない。|
|1ec.exe (9.50KB)|easy-C用のワンライナー用の疑似シェル|
|1ec.c [298行]|上記のソースコード|
|ecrun.exe (6.00KB)|easy-Cを実行するためのプログラム(例: prompt>ecrun kcubei.c などとする)|
|ecrun.c [48行]|上記のソースコード|
|ecc0.exe (8.50KB)|ecrun.exeの下請け|
|ecc0.c [268行]|上記のソースコード|
|hl9b.exe (29.5KB)|HL-9b: easy-Cと文法が似ているのでいくつかのプログラムはそのまま実行できます。|
|hl9b.c [740行]|上記のソースコード|

-1ec.exeを使えば、「2023.01.12 Thu #1」以降のすべてのプログラムが動きます。ワンライナーではないものも、 1ec>run kcube.c みたいにすれば実行できます。このときecrun.exeを下請けとして呼び出すので、ecrun.exeやecc0.exeを同じディレクトリに置いておく必要があります。
-hl9b.exeで実行できるもの、できないものの表です。
|1ec|HL-9b||
|〇|〇|[[a23_usm001]] 2023.01.16 Mon #1 : [ワンライナー] グラデーション|
|〇|〇|[[a23_usm001]] 2023.01.16 Mon #1 : [ワンライナー] 市松模様|
|〇|〇|[[a23_usm001]] 2023.01.16 Mon #1 : [ワンライナー] aDrawLineのXor模様|
|〇|〇|[[a23_usm001]] 2023.01.16 Mon #1 : [ワンライナー] 銀色の球|
|〇|〇|[[a23_usm001]] 2023.01.16 Mon #1 : [ワンライナー] 日本の国旗|
|〇|〇|[[a23_usm001]] 2023.01.16 Mon #1 : [ワンライナー] aSetPxiのXor模様|
|〇|×|[[a23_usm001]] 2023.01.17 Tue #1 : 3dwave.c 同心円状に広がっていく波面 [旧]|
|〇|×|[[a23_usm002]] 2023.01.18 Wed #1 : 3dwave.c[13行] 同心円状に広がっていく波面 [新]|
|〇|〇|[[a23_usm002]] 2023.01.18 Wed #2 : kcubei.c[33行] 回転キューブ|
|〇|×|[[a23_usm002]] 2023.01.19 Thu #1 : kcube.c[23行] 回転キューブ|
|〇|×|[[a23_usm002]] 2023.01.19 Thu #2 : kray.c[56行] 簡単なレイトレーシング|
|〇|〇|[[a23_usm002]] 2023.01.23 Mon #1 : maze.c[14行] 迷路作成(穴掘り法)|
|〇|〇|[[a23_usm002]] 2023.01.23 Mon #2 : 3dwavei.c[15行] 同心円状に広がっていく波面|
|〇|〇|[[a23_usm003]] 2023.01.24 Tue #1 : daiku.c[13行] 「歓喜の歌」の演奏|
|〇|〇|[[a23_usm003]] 2023.01.24 Tue #2 : kirakira.c[11行] 「きらきら星」の演奏|
|〇|〇|[[a23_usm003]] 2023.01.24 Tue #2 : fujisan.c[13行] 「富士山」の演奏|
|〇|〇|[[a23_usm003]] 2023.01.25 Wed #1 : daigo.c[30行] 「運命」の演奏|
|〇|〇|[[a23_usm003]] 2023.01.25 Wed #2 : fuga.c[28行] 「小フーガト短調」の演奏|

~

** 2023.01.27 Fri #1
-私にとっては毎度おなじみのマンデルブロー集合のグラフィックです。
-mandel.c[27行]
 AWin *w = aOpenWin(512, 384, "mandel");
 int x, y;
 for (y = 0; y < 384; y++) {
     for (x = 0; x < 512; x++) {
         int sn = 0, sx, sy, n;
         AInt32 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 >> 4;
         c = aRgb8(n, 0, 0);
         if (n >= 256) {
             c = aRgb8(0, 0, 0);
             if (n < 447) {
                 c = aRgb8(255, n - 255, 0); }}
         aSetPix(w, x, y, c); }}
 aPrintTime();
https://essen.osask.jp/files/pic20230130a.png

~

** 2023.01.27 Fri #2
-ええと私は blikeライブラリ、blaライブラリ、aclライブラリ、acl1ライブラリと似たようなライブラリを何度も作ってきた(というか作り直してきた)わけですが、なぜそんなことになったのか、ここに理由を残しておこうと思います。

-''[blikeライブラリ (2010年)]''
-私がかつてwin32でのグラフィック表示方法について勉強した時に、「いや私は絵を描きたいのであって、WM_PAINTが来たらどうするとか、そういう処理を書きたいわけじゃない」って強く思いました。メッセージ処理をしたいのではなく、絵を描きたいのです。
-そう思ってみると、ああ昔のBASICは良かったなあって思いました。あの頃は画面に線を引きたければLINE命令を一つ実行すればいいだけでした。円を描きたければCIRCLE命令を一つ実行すればいいだけでした。
-それで「あのころのBASICのように」という意味で「BASIC-like」、さらに略して「blike」という名前のライブラリを作りました。これがそもそものスタートでした。
-blikeライブラリは、OSECPU-VMにも(多少改造されて)採用されていたようです。

-''[blaライブラリ (2018年)]''
-blikeライブラリはウィンドウを一つしか持てないという問題がありました(というかもっと他にも問題があった気がしますが、よく覚えていません)。blaというのは、blike-advanceの略で、blikeにはできないこともできるようにしたライブラリでした。
-blaライブラリはES-BASICに採用されたりしました。

-''[aclライブラリ (2020年)]''
-blaライブラリは、Windowsにしか対応できていないという問題がありました。いや、最初はmacOSにも対応できていたのですが、macOSのバージョンが上がると(確か High Sierra あたりだったかな)どうやっても動かなくなってお手上げになりました。それで、macOSへのネイティブ対応をあきらめて、SDL 2.0対応にして乗り切ろうと考えました。これはうまく行きました。
-このaclという名前は、「ある、ひとつの(a)」「C言語用の」「ライブラリ」の略です。C言語では名前空間という概念がなく、関数名やクラス名はグローバルで定義されます。名前の衝突を避けるために、たとえばblaライブラリでは全部の関数名にblaという接頭語を付けていました。しかしこれはだんだん邪魔になってきます。それでできるだけ短い接頭語を探しているうちに「a」だけにしたら最強なのではないかと安易に考えて(笑)、それでライブラリも「acl」になったのでした。
-aclライブラリは2021年版の「10日くらいでできる!プログラミング言語自作入門」のHL-9などに採用されました。

-''[acl1ライブラリ (2023年)]''
-aclライブラリはそんなには悪くなかったのですが、任意のライブラリ関数に対して「お前がメモリをmalloc/freeするときは、標準関数のmalloc/freeじゃなくてこちらでカスタマイズしたこの特別なmalloc/freeを使え」って言いたくなることが時々あって、でもそんなことを指定する手段がaclライブラリにはなく、少し不便に感じていました。しかしだからといって、すべてのライブラリ関数の引数にmallocとfreeの関数ポインタを渡すというのも便利ではありません。それに今はmalloc/freeのオーバーライドだけですが、将来はもっと他の関数に対してもオーバーライドしたくなるかもしれません。そうしたらまたacl2とかを作らなければいけないのでしょうか。そんなの面倒すぎます。
-ということで、何をオーバーライドしたくて何をオーバーライドしないのか、そういう情報を一括して管理するクラス(common-argmentクラス)を考えて、そのオブジェクトだけをどの関数にも渡せるようにしようと思いました。これで将来にわたって仕様変更なく拡張していけるはずです。そういう仕様に作り替えたのがacl1ライブラリです。なお、common-argmentではなく大域変数でオーバーライド情報を伝達する方法も考えましたが、大域変数方式だとマルチスレッドプログラミングとの両立が難しく、acl1の方式に落ち着きました。
-このmalloc/freeの自由なオーバーライドはかなり有用で、普段はできるだけシンプルな(というか標準関数のものをそのまま使うmalloc/freeを)デフォルトにしておきますが、性能が欲しい時は適当に都合の良いmalloc/freeに切り替えて性能を出します。いろんな状況に柔軟に対応するmalloc/freeをうまく作るのは大変ですが、シンプルな状況にのみ対応するmalloc/freeはかなり簡単で、それをうまく組み合わせてプログラムを作ると、簡単にサイズと性能の両立ができます。
-(ちなみにこのcommon-argment方式に落ち着くまでに1年間くらいの試行錯誤がありました・・・。)
-あと重要な違いとして、acl1ライブラリはMMLによる音楽演奏に対応しています(参考:上記の 2023.01.24 Tue #1 )。
-acl1ライブラリはeasy-Cに採用されています。

~

** 2023.01.28 Sat #1
-昨晩いろいろ試して、.exeファイルを小さくする方法がちょっとわかりました。
--あえて古いバージョン(MinGWの5.1.6だったかな)を使ってputsで「hello, world」を表示: 5.5KB
--さらにmainCRTStartupを自作して、さらに.rdataを.dataに統合させた: 3.5KB
--さらにリンカスクリプトを改造した: 2.50KB
---.textの後ろに.rdataをマージ
---.idataの後ろに.dataをマージ
---これでセクションが.textと.idataと.bssの3つだけになる。3つだけになればセクションヘッダが0x200までに収まる。そうするとそれだけで0.5KB縮む。またセクションが整理されて0.5KBのセクションが1つ減ったことになるので、合計で1.0KB減ったというわけ。

--上記にあるHL-9bもこの方法でリンクし直してみました。29.5KB→27.0KBになりました。

~

** 2023.01.29 Sun #1
-主に自分用のメモ:

-以下のように普段の記述に「--verbose」を付ければ、gccがどんなオプションを付けて関連ツールをj実行しているかがわかります。
 prompt>gcc --verbose hello.c -O3 -o hello.exe
-collect2.exe(=ldの実体)への引数もこれで分かります。

-デフォルトのリンカスクリプトを取得するには以下のようにします。
 prompt>gcc hello.c -O3 -o hello.exe -Wl,-s,--verbose
-これを見ながら適当に ldscript.txt を作って以下のようにすれば、自作スクリプトに基づいてリンクしてくれるようになります。
 prompt>gcc hello.c -O3 -o hello.exe -Wl,-s,-T,ldscript.txt

~

** 2023.01.29 Sun #2
-主に自分用のメモ:
--すべて例外なく-Osを指定。-Wl,-s。
|gcc 3.4.5 デフォルト|30,208バイト||
|gcc 3.4.5 mainCRTStartup自作・リンカスクリプト自作|27,648バイト|〇|
|gcc 9.2.0 デフォルト|50,688バイト||
|gcc 9.2.0 mainCRTStartup自作・リンカスクリプト自作|32,524バイト||
-これを見ると、サイズを追求するなら古いMinGWを使ったほうが有利だと分かります。
-というか、gcc 9.2.0 のデフォルトはちょっといただけないです。-Os指定でこのサイズになるのは、正直やってられない気がします。
--試しに -O3 にしてみたら65,024バイトになりました。だから一応-Osは役には立っていたようです。
--でもたぶん速度優先でコンパイルして実行速度で比較したら、gcc 9.2.0 が最速なんだろうなあとは思います(試してはいないですが)。

~

** 2023.01.30 Mon #1
-年と月を入力すると、カレンダーが出てくるというただそれだけのアプリです。
-calendar.c[11行]
 static char *a = "JanFebMarAprMayJunJulAugSepOctNovDec";
 static int a1[12] = { 22, 4, 24, 20, 22, 18, 27, 23, 19, 21, 17, 26 };
 int yy = aInput("year=? "), mm = aInput("month=? ") - 1, w, d, d1; a1[1] = 4;
 if (yy % 400 == 0 || (yy % 4 == 0 && yy % 100 != 0)) { a1[1] = 11; }
 printf("\n         %.3s %4d\n\nSun Mon Tue Wed Thu Fri Sat\n", a + mm * 3, yy);
 w = yy - (mm <= 1); w = (w + w / 4 - w / 100 + w / 400 + a1[mm]) % 7; d1 = a1[mm] / 7 + 28;
 for (d = 0; d < w; d++) { printf("    "); }
 for (d = 1; d <= d1; d++) {
     printf("%3d ", d); w = (w + 1) % 7;
     if (w == 0) { printf("\n"); }}
 if (w > 0) { printf("\n"); }
http://k.osask.jp/files/pic20230131a.png
https://essen.osask.jp/files/pic20230131a.png
-このプログラムではa1[]という配列に少し工夫があって、7進法で書いた時の1の位と7の位とで別々の意味があります。要するに、2つの配列を一つにまとめて行数を節約しているのです。

~

** 2023.01.30 Mon #2
-なんかリンカがデフォルトでリンクしようとするオブジェクトファイルに、crtbegin.oとcrtend.oというのがあります。なんかよくわからないけど、きっと大事なんだろうと思って手を付けないでいましたが、試しにリンク対象に含めないようにしたところ、なんか問題なく動くことがわかりました。・・・なんだかちょっと危ない気もしますが、なくても動くならないほうがいいやということで、ひとまずこれを含めずに実行ファイルを生成させることにします。
-これにより、「hello, world」程度ならたった 1.5KB の実行ファイルになるようになりました。びっくりです!

~



//子供に教える手順
//nekofun. invader.pr.prs.prlf.prsp
//winのクローズ

* こめんと欄
#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS