a26_txt03
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* 川合のプログラミング言語自作のためのテキスト第四版#0
-(by [[K]], 2026.05.27)
** (1) はじめに
-プログラミング言語の自作のテキストを書いてからもう5年が...
-今の私なら、また全然違った切り口でプログラミング言語自作...
-今回は acl4 みたいなやり方で、つまり「ライブラリ自作駆動...
-''[目次]''
--[[a26_txt03]] (acl4v2_000): はじめに, a_static, a_Ve...
--[[a26_txt03_001]](acl4v2_001): デバッグレベル, malloc/f...
--(ここに目次を入れていく予定)
** (2) プログラミング言語の作り方として正しいのはどちらな...
-前述の通り、私は以前「10日くらいでできる!プログラミング...
-でもこれは「東京から大阪に行くときに、新幹線で行くのが正...
-私自身も、この2026年版のほうが後発だからこっちが優れてい...
-もし余裕があれば、両方の作り方の違いを眺めてみてください...
** (3) 「ライブラリ自作駆動開発」とは何ですか?
-最初に断っておきますが、この言葉は私が適当に考えた造語で...
-C言語は便利な関数を書き足していけば、どこまででも便利に...
-C言語はC++やほかの言語に比べて機能が少なくて不便だと言わ...
-もちろんオブジェクト指向言語ではないので、クラスライブラ...
-私の聞いたところによると、競技プログラミングが得意な人た...
-みなさんは「わらしべ長者」という昔話をご存じでしょうか。...
-Wikipediaにより詳しい説明があります → https://ja.wikiped...
-私はライブラリ自作駆動開発をわらしべ長者開発だと説明する...
-ここで作った関数群は、もちろん別の開発にも使えます。自作...
** (4) 著者について
-私は「30日でできる!OS自作入門」の著者で、主にそこで有名...
-学生の頃は機械語とかアセンブラが大好きという性格でした。...
-著者の性格としては、周囲の人が新しい技術に注目してどんど...
-OS自作の人がなぜ言語自作をすることになったのか、たまに聞...
-それに、もし運よくとびっきり便利な言語ができてしまって生...
-私はOS自作でちょっと名を上げたときに、先生方から「君がOS...
-それ以降の私は、何かうまくできたと感じるたびに、その作品...
-このテキストでは、何をどう作ったかという説明ももちろんし...
-そもそもこんな「著者について」っていうのがなくてもライブ...
** (5) ライブラリの名称
-「acl4v2」とします。
-まず acl っていうのが何なのか、それを説明します。「a c-l...
-4なのは私の中では acl シリーズの第四世代なので、それがそ...
-まあつまり、全然かっこよくない名前です。いやだって、もう...
-ちなみにイメージカラーは紅茶色です。・・・だったらこのテ...
** (6) ヘッダファイルを作るかどうか
-従来のC言語の一般的なライブラリの作り方として「~.c」の...
-これの良いところはコンパイル時間が短くなることです。だか...
-しかし今はPCの性能が非常に高くなっていて、わざわざ分割コ...
-もちろん巨大なアプリとかを作る場合はそんなことを言ってい...
-分割コンパイルをしないならヘッダファイルは必要ありません...
-一方でコンパイラはある関数定義を見たときに「この関数はど...
-そのためには関数の属性に static を付けます。そうすると、...
-ということなので、関数宣言の時はどんどん static を付けま...
-ということで、何ができれば理想的かというと、 static を一...
-それでこんな書き方になりました。
#if (!defined(MyStatic))
#define MyStatic static
#endif
...
MyStatic int libFunc1(int a, int b, int c)
{
....
}
-これで MyStatic というシンボルを空にしてdefineしておけば...
** (7) 関数名をどうするか
-C言語の標準ライブラリは、すごく自己中心的で、sinとかsqrt...
-私の考えではわかりやすい名前・使いやすい名前はライブラリ...
-そういう意味では、先の(6)に書いた「MyStatic」はいい名前...
-では関数名はどうしたらいいでしょうか。私はかつてはライブ...
-ということで、私が到達した最終形態を見せます。
#if (!defined(a_Version))
#define a_Version 9999
#endif
#if (a_Version > 0)
#define static_ a_static
...
#define VecChr a_VecChr
#define Set0 a_Set0
...
#endif
....
#if (!defined(a_static))
#define a_static static
#endif
...
-まず最初の a_Version に関する記述は全部無視してください...
-すると私は MyStatic でも acl4v2_static でもなく、 a_stat...
-そして a_Version です。これが何のためにあるかですが、デ...
-そしてもし省略形がアプリ側の変数名・関数名と衝突が起きて...
-さらに考えられるケースとして、ある時点でacl4v2ライブラリ...
-そんな時は、a_Versionを1とか2とかにするのです。acl4v2ラ...
#if (a_Version > 1)
追加された関数の省略形の定義
#endif
-という形で書かれるので、省略形をどこまで有効にするかを選...
** (8) acl4v2.c
#include "acl4v2_000.c"
#include "acl4v2_001.c"
#include "acl4v2_002.c"
#include "acl4v2_003.c"
#include "acl4v2_004.c"
#include "acl4v2_005.c"
...
** (9) acl4v2_000.c
#if (!defined(a_Version))
#define a_Version 9999
#endif
#if (a_Version >= 1)
#define static_ a_static
#define class_ a_class
#endif
#if (!defined(a_static))
#define a_static static
#endif
#include <ctype.h>
#include <errno.h>
#include <float.h>
#include <inttypes.h>
#include <limits.h>
#include <locale.h>
#include <math.h>
#include <setjmp.h>
#include <signal.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define a_class(c) typedef struct c ## _ c; struct ...
** (10) 追加の説明
-[Q]なぜincludeがたくさんあるの?
-[A]それはacl4v2.cをインクルードすれば標準関数が一通り使...
-[Q]a_class()というマクロは何ですか?
-[A]普通にstructを使って構造体宣言をすると、Abcと書くだけ...
struct Abc {
int a, b, c;
};
Abc abc; // エラーになる.
struct Abc abc; // これなら許してくれる.
-でもそれは不便です。C++のようにstructを省略できるように...
class_(Abc) {
int a, b, c;
};
Abc abc; // エラーにならない.
-ちなみになぜエラーにならなくなるのかというと、結果的に以...
typdef struct Abc_ Abc;
struct Abc_ {
int a, b, c;
};
** (11) あとがき?
-今回はたくさん書いたのに、コード本体(9)は30行しか進みま...
-まあそれだけ丁寧に説明したってことでいいのかな?
-続きはこちら → [[a26_txt03_001]]
* こめんと欄
#comment
終了行:
* 川合のプログラミング言語自作のためのテキスト第四版#0
-(by [[K]], 2026.05.27)
** (1) はじめに
-プログラミング言語の自作のテキストを書いてからもう5年が...
-今の私なら、また全然違った切り口でプログラミング言語自作...
-今回は acl4 みたいなやり方で、つまり「ライブラリ自作駆動...
-''[目次]''
--[[a26_txt03]] (acl4v2_000): はじめに, a_static, a_Ve...
--[[a26_txt03_001]](acl4v2_001): デバッグレベル, malloc/f...
--(ここに目次を入れていく予定)
** (2) プログラミング言語の作り方として正しいのはどちらな...
-前述の通り、私は以前「10日くらいでできる!プログラミング...
-でもこれは「東京から大阪に行くときに、新幹線で行くのが正...
-私自身も、この2026年版のほうが後発だからこっちが優れてい...
-もし余裕があれば、両方の作り方の違いを眺めてみてください...
** (3) 「ライブラリ自作駆動開発」とは何ですか?
-最初に断っておきますが、この言葉は私が適当に考えた造語で...
-C言語は便利な関数を書き足していけば、どこまででも便利に...
-C言語はC++やほかの言語に比べて機能が少なくて不便だと言わ...
-もちろんオブジェクト指向言語ではないので、クラスライブラ...
-私の聞いたところによると、競技プログラミングが得意な人た...
-みなさんは「わらしべ長者」という昔話をご存じでしょうか。...
-Wikipediaにより詳しい説明があります → https://ja.wikiped...
-私はライブラリ自作駆動開発をわらしべ長者開発だと説明する...
-ここで作った関数群は、もちろん別の開発にも使えます。自作...
** (4) 著者について
-私は「30日でできる!OS自作入門」の著者で、主にそこで有名...
-学生の頃は機械語とかアセンブラが大好きという性格でした。...
-著者の性格としては、周囲の人が新しい技術に注目してどんど...
-OS自作の人がなぜ言語自作をすることになったのか、たまに聞...
-それに、もし運よくとびっきり便利な言語ができてしまって生...
-私はOS自作でちょっと名を上げたときに、先生方から「君がOS...
-それ以降の私は、何かうまくできたと感じるたびに、その作品...
-このテキストでは、何をどう作ったかという説明ももちろんし...
-そもそもこんな「著者について」っていうのがなくてもライブ...
** (5) ライブラリの名称
-「acl4v2」とします。
-まず acl っていうのが何なのか、それを説明します。「a c-l...
-4なのは私の中では acl シリーズの第四世代なので、それがそ...
-まあつまり、全然かっこよくない名前です。いやだって、もう...
-ちなみにイメージカラーは紅茶色です。・・・だったらこのテ...
** (6) ヘッダファイルを作るかどうか
-従来のC言語の一般的なライブラリの作り方として「~.c」の...
-これの良いところはコンパイル時間が短くなることです。だか...
-しかし今はPCの性能が非常に高くなっていて、わざわざ分割コ...
-もちろん巨大なアプリとかを作る場合はそんなことを言ってい...
-分割コンパイルをしないならヘッダファイルは必要ありません...
-一方でコンパイラはある関数定義を見たときに「この関数はど...
-そのためには関数の属性に static を付けます。そうすると、...
-ということなので、関数宣言の時はどんどん static を付けま...
-ということで、何ができれば理想的かというと、 static を一...
-それでこんな書き方になりました。
#if (!defined(MyStatic))
#define MyStatic static
#endif
...
MyStatic int libFunc1(int a, int b, int c)
{
....
}
-これで MyStatic というシンボルを空にしてdefineしておけば...
** (7) 関数名をどうするか
-C言語の標準ライブラリは、すごく自己中心的で、sinとかsqrt...
-私の考えではわかりやすい名前・使いやすい名前はライブラリ...
-そういう意味では、先の(6)に書いた「MyStatic」はいい名前...
-では関数名はどうしたらいいでしょうか。私はかつてはライブ...
-ということで、私が到達した最終形態を見せます。
#if (!defined(a_Version))
#define a_Version 9999
#endif
#if (a_Version > 0)
#define static_ a_static
...
#define VecChr a_VecChr
#define Set0 a_Set0
...
#endif
....
#if (!defined(a_static))
#define a_static static
#endif
...
-まず最初の a_Version に関する記述は全部無視してください...
-すると私は MyStatic でも acl4v2_static でもなく、 a_stat...
-そして a_Version です。これが何のためにあるかですが、デ...
-そしてもし省略形がアプリ側の変数名・関数名と衝突が起きて...
-さらに考えられるケースとして、ある時点でacl4v2ライブラリ...
-そんな時は、a_Versionを1とか2とかにするのです。acl4v2ラ...
#if (a_Version > 1)
追加された関数の省略形の定義
#endif
-という形で書かれるので、省略形をどこまで有効にするかを選...
** (8) acl4v2.c
#include "acl4v2_000.c"
#include "acl4v2_001.c"
#include "acl4v2_002.c"
#include "acl4v2_003.c"
#include "acl4v2_004.c"
#include "acl4v2_005.c"
...
** (9) acl4v2_000.c
#if (!defined(a_Version))
#define a_Version 9999
#endif
#if (a_Version >= 1)
#define static_ a_static
#define class_ a_class
#endif
#if (!defined(a_static))
#define a_static static
#endif
#include <ctype.h>
#include <errno.h>
#include <float.h>
#include <inttypes.h>
#include <limits.h>
#include <locale.h>
#include <math.h>
#include <setjmp.h>
#include <signal.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define a_class(c) typedef struct c ## _ c; struct ...
** (10) 追加の説明
-[Q]なぜincludeがたくさんあるの?
-[A]それはacl4v2.cをインクルードすれば標準関数が一通り使...
-[Q]a_class()というマクロは何ですか?
-[A]普通にstructを使って構造体宣言をすると、Abcと書くだけ...
struct Abc {
int a, b, c;
};
Abc abc; // エラーになる.
struct Abc abc; // これなら許してくれる.
-でもそれは不便です。C++のようにstructを省略できるように...
class_(Abc) {
int a, b, c;
};
Abc abc; // エラーにならない.
-ちなみになぜエラーにならなくなるのかというと、結果的に以...
typdef struct Abc_ Abc;
struct Abc_ {
int a, b, c;
};
** (11) あとがき?
-今回はたくさん書いたのに、コード本体(9)は30行しか進みま...
-まあそれだけ丁寧に説明したってことでいいのかな?
-続きはこちら → [[a26_txt03_001]]
* こめんと欄
#comment
ページ名: