a21_txt01
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* 川合のプログラミング言語自作のためのテキスト第三版#1 ~...
-(by [[K]], 2021.02.28)
** (1) はじめに
-「プログラミング言語を作ってみたい」と思ったことがある人...
-おそらくは、多くの人にとってプログラミング言語を作るのは...
-私はプログラミング言語は(世間の人が思っているよりは)ず...
-この時点では「本当にプログラミング言語を作るのは簡単なの...
----
-このテキストでは、最初はインタプリタ(スクリプト言語)の...
-というとなんだか欲張りな構成ですが、結局プログラミング言...
----
-目的別ガイド:
--とにかく言語の本質だけが知りたければ、HL-1だけ読めばい...
--トークンを使って変数名を可変長にするやり方を知りたけれ...
--基本的な分岐処理を理解したければ、HL-3まで読めばいいで...
--REPLの例が見たければ、HL-4まで読めばいいです。
--実行速度を高める工夫に興味があれば、HL-5やHL-6まで読め...
--演算子の優先順位を反映した式の評価をやりたければ、HL-7...
--for文やブロックif文などの実装方法に興味があれば、HL-8ま...
--インタプリタ編を最後まで読みたければ、HL-9aまで読んでみ...
----
-もくじ(HL-1から順番に読んでいくとわかるように書いていま...
|ページ名|名前|行数|.exeの大きさ|説明|速度のめやす|
|[[a21_txt01]]|HL-1|RIGHT:49行|RIGHT:6.0KB|初めの一歩、た...
|[[a21_txt01_2]]|HL-2|128行|RIGHT:6.5KB|変数名は1文字じゃ...
|[[a21_txt01_3]]|HL-3|148行|RIGHT:7.0KB|条件分岐などをサ...
|[[a21_txt01_4]]|HL-4|186行|RIGHT:7.5KB|REPLの導入(これ...
|[[a21_txt01_5]]|HL-5|214行|RIGHT:7.5KB|少し高速化|RIGHT:...
|[[a21_txt01_6]]|HL-6|284行|RIGHT:8.0KB|もっと高速化(が...
|[[a21_txt01_6a]]|HL-6a|297行|RIGHT:8.5KB|さらに高速化!...
|[[a21_txt01_7]]|HL-7|445行|RIGHT:9.5KB|式の導入(なんか...
|[[a21_txt01_8]]|HL-8|557行|RIGHT:11.0KB|forやブロックif...
|[[a21_txt01_8a]]|HL-8a|635行|RIGHT:12.0KB|配列や文字列リ...
|[[a21_txt01_9]]|HL-9|754行|RIGHT:19.5KB|グラフィック命令...
|[[a21_txt01_9a]]|HL-9a|772行|RIGHT:20.0KB|C言語っぽく改...
|[[a21_txt01_10]]||||ここまでのまとめ・今後の課題||
|[ [[a21_txt02]] ]|HL-11~|||続編(JITコンパイラ・普通の...
--(註)「.exeの大きさ」はWindows向けにgcc(MinGW)でコンパイ...
---しかしここで扱う言語処理系は、Windows専用というわけで...
---純粋に言語処理系の規模の目安を示すために書いてあります。
---基本的には小さければ小さいほどシンプルで、教材として理...
---行数を書いているのも同じ意図です。行数だけだと、1行の...
この二つを併記すれば、規模感の目安としては十分だと思って...
--「速度のめやす」は、C言語で10億回ループさせた場合と、こ...
---なお、gccに対しては「-O3」という一番強い最適化を指示し...
---遅すぎて10億回もまわせないときは、1億回とかにへらして...
---おおざっぱな目安です。
** (2) HL-1
-事前の説明はこれくらいにして、とにかく言語を作ってみます...
#include <stdio.h>
#include <stdlib.h>
void loadText(int argc, const char **argv, unsigned char...
{
FILE *fp;
int i;
if (argc < 2) { // 引数が少ないのでエラー表示して終...
printf("usage>%s program-file\n", argv[0]);
exit(1);
}
fp = fopen(argv[1], "rt"); // テキストモードでファイ...
if (fp == 0) { // ファイルを開けなかった.
printf("fopen error : %s\n", argv[1]);
exit(1);
}
i = fread(t, 1, siz - 1, fp); // iは読み込んだバイト...
fclose(fp);
t[i] = 0; // 終端マークを書いておく.
}
int main(int argc, const char **argv)
{
unsigned char txt[10000]; // ソースコード.
int i, pc, var[256]; // varは変数.
loadText(argc, argv, txt, 10000);
for (i = 0; i < 10; i++)
var['0' + i] = i; // テクニック#1.
for (pc = 0; txt[pc] != 0; pc++) {
if (txt[pc] == '\n' || txt[pc] == '\r' || txt[pc...
continue;
if (txt[pc + 1] == '=' && txt[pc + 3] == ';') { ...
var[txt[pc]] = var[txt[pc + 2]];
} else if (txt[pc + 1] == '=' && txt[pc + 3] == ...
var[txt[pc]] = var[txt[pc + 2]] + var[txt[pc...
} else if (txt[pc + 1] == '=' && txt[pc + 3] == ...
var[txt[pc]] = var[txt[pc + 2]] - var[txt[pc...
} else if (txt[pc] == 'p' && txt[pc + 1] == 'r' ...
printf("%d\n", var[txt[pc + 6]]);
} else
goto err;
while (txt[pc] != ';')
pc++;
}
exit(0);
err:
printf("syntax error : %.10s\n", &txt[pc]);
exit(1);
}
-はいこれだけです。C言語でたったの''49行''です。もちろん...
--変数名は半角一文字のみ。
--数値定数は整数で一桁のみ。
--しかも「a=3;」みたいにスペースを入れずに書かなければい...
--ひとまず代入と足し算と引き算とprintしかできない。
--printは「print 変数名;」の形式のみ解釈できる。このとき...
-ええ本当にひどい仕様だと思います。・・・かつてのタイニー...
-しかも<stdio.h>と<stdlib.h>しか使っていません。それでも4...
--<stdio.h>はprintf()とファイル入出力のために使っています。
--<stdlib.h>はexit()のために使っています。
-このHL-1は以下のプログラムを問題なく実行する能力がありま...
a=1;
b=2;
c=a+b;
print c;
-今は足し算と引き算しかないですが、掛け算や割り算を追加す...
-この先で、最初に課した制限を少しずつ減らしていきます。す...
** (4) HL-1の簡単な説明
-関数:
--loadText() : コマンドライン引数で指定されたソースファイ...
--main() : 言語処理の本体。
-変数:
--var[] : 変数の値を記憶しておくための変数。
--txt[] : ソースコードを記憶しておくための変数。
--pc : 現在プログラムのどこを実行しているのかを記憶するた...
-プログラム中で「テクニック#1」と書かれた部分があります。...
--こうすることで、プログラムでは変数と定数を区別する処理...
-''C言語での文字列の扱いに不慣れな人のために、簡単な説明...
-[隠れたこだわり]
--このHL-1やそれ以降のプログラムは、C言語が得意じゃない人...
--ポインタはやむをえないときは使っていますが、ポインタに...
//--文字列を扱うときはなるべく標準関数で扱える形式にしま...
** (5) 重要な注意事項
-[Q]HLシリーズのソースコードは、グローバル変数を多用して...
--[A]全面的にその通りです。私の意図は、とにかくエラーチェ...
--これは私の説明のための教材であって、製品や実用的な言語...
--またセキュリティを教えようと思ったときに、このプログラ...
** (6) 切実なお願い
-このテキストは上記の通り、いろいろと問題を含んでいます。...
-また、HL-2以降のプログラムは差分で提供されており、入力ミ...
-またそもそも変数名や関数名などもきれいに読みやすくするべ...
-エラーチェックを略した説明に徹するのであれば、C言語では...
-全部もっともです。・・・しかし、それを全部私がやったら、...
-それに仮に私がやれば、それは私が「あれもこれもやった、す...
-ということで、この「はりぼて言語」に関する何かをやってく...
-もししばらく待っても何もやってもらえなかったら・・・しょ...
** 次回に続く
-次回: [[a21_txt01_2]]
*こめんと欄
-すみません、構文ハイライトが欲しいです! -- 名無しさん S...
-ごもっともです。・・・どなたか、ここのプログラムを勝手に...
-説明で語り口調ですごく分かりやすいです! -- 名無しさん S...
-説明で語り口調ですごく分かりやすいです! -- 名無しさん S...
-説明で語り口調ですごく分かりやすいです! -- 名無しさん S...
-説明で語り口調ですごく分かりやすいです! -- 名無しさん S...
-スミマセン、何回も送信してしまっていたかもしれません。 -...
-ありがとうございます! -- ''K'' SIZE(10){2022-05-05 (木)...
-やっと最高のサイトにありついた... lexとかyaccを使わず、...
#comment
終了行:
* 川合のプログラミング言語自作のためのテキスト第三版#1 ~...
-(by [[K]], 2021.02.28)
** (1) はじめに
-「プログラミング言語を作ってみたい」と思ったことがある人...
-おそらくは、多くの人にとってプログラミング言語を作るのは...
-私はプログラミング言語は(世間の人が思っているよりは)ず...
-この時点では「本当にプログラミング言語を作るのは簡単なの...
----
-このテキストでは、最初はインタプリタ(スクリプト言語)の...
-というとなんだか欲張りな構成ですが、結局プログラミング言...
----
-目的別ガイド:
--とにかく言語の本質だけが知りたければ、HL-1だけ読めばい...
--トークンを使って変数名を可変長にするやり方を知りたけれ...
--基本的な分岐処理を理解したければ、HL-3まで読めばいいで...
--REPLの例が見たければ、HL-4まで読めばいいです。
--実行速度を高める工夫に興味があれば、HL-5やHL-6まで読め...
--演算子の優先順位を反映した式の評価をやりたければ、HL-7...
--for文やブロックif文などの実装方法に興味があれば、HL-8ま...
--インタプリタ編を最後まで読みたければ、HL-9aまで読んでみ...
----
-もくじ(HL-1から順番に読んでいくとわかるように書いていま...
|ページ名|名前|行数|.exeの大きさ|説明|速度のめやす|
|[[a21_txt01]]|HL-1|RIGHT:49行|RIGHT:6.0KB|初めの一歩、た...
|[[a21_txt01_2]]|HL-2|128行|RIGHT:6.5KB|変数名は1文字じゃ...
|[[a21_txt01_3]]|HL-3|148行|RIGHT:7.0KB|条件分岐などをサ...
|[[a21_txt01_4]]|HL-4|186行|RIGHT:7.5KB|REPLの導入(これ...
|[[a21_txt01_5]]|HL-5|214行|RIGHT:7.5KB|少し高速化|RIGHT:...
|[[a21_txt01_6]]|HL-6|284行|RIGHT:8.0KB|もっと高速化(が...
|[[a21_txt01_6a]]|HL-6a|297行|RIGHT:8.5KB|さらに高速化!...
|[[a21_txt01_7]]|HL-7|445行|RIGHT:9.5KB|式の導入(なんか...
|[[a21_txt01_8]]|HL-8|557行|RIGHT:11.0KB|forやブロックif...
|[[a21_txt01_8a]]|HL-8a|635行|RIGHT:12.0KB|配列や文字列リ...
|[[a21_txt01_9]]|HL-9|754行|RIGHT:19.5KB|グラフィック命令...
|[[a21_txt01_9a]]|HL-9a|772行|RIGHT:20.0KB|C言語っぽく改...
|[[a21_txt01_10]]||||ここまでのまとめ・今後の課題||
|[ [[a21_txt02]] ]|HL-11~|||続編(JITコンパイラ・普通の...
--(註)「.exeの大きさ」はWindows向けにgcc(MinGW)でコンパイ...
---しかしここで扱う言語処理系は、Windows専用というわけで...
---純粋に言語処理系の規模の目安を示すために書いてあります。
---基本的には小さければ小さいほどシンプルで、教材として理...
---行数を書いているのも同じ意図です。行数だけだと、1行の...
この二つを併記すれば、規模感の目安としては十分だと思って...
--「速度のめやす」は、C言語で10億回ループさせた場合と、こ...
---なお、gccに対しては「-O3」という一番強い最適化を指示し...
---遅すぎて10億回もまわせないときは、1億回とかにへらして...
---おおざっぱな目安です。
** (2) HL-1
-事前の説明はこれくらいにして、とにかく言語を作ってみます...
#include <stdio.h>
#include <stdlib.h>
void loadText(int argc, const char **argv, unsigned char...
{
FILE *fp;
int i;
if (argc < 2) { // 引数が少ないのでエラー表示して終...
printf("usage>%s program-file\n", argv[0]);
exit(1);
}
fp = fopen(argv[1], "rt"); // テキストモードでファイ...
if (fp == 0) { // ファイルを開けなかった.
printf("fopen error : %s\n", argv[1]);
exit(1);
}
i = fread(t, 1, siz - 1, fp); // iは読み込んだバイト...
fclose(fp);
t[i] = 0; // 終端マークを書いておく.
}
int main(int argc, const char **argv)
{
unsigned char txt[10000]; // ソースコード.
int i, pc, var[256]; // varは変数.
loadText(argc, argv, txt, 10000);
for (i = 0; i < 10; i++)
var['0' + i] = i; // テクニック#1.
for (pc = 0; txt[pc] != 0; pc++) {
if (txt[pc] == '\n' || txt[pc] == '\r' || txt[pc...
continue;
if (txt[pc + 1] == '=' && txt[pc + 3] == ';') { ...
var[txt[pc]] = var[txt[pc + 2]];
} else if (txt[pc + 1] == '=' && txt[pc + 3] == ...
var[txt[pc]] = var[txt[pc + 2]] + var[txt[pc...
} else if (txt[pc + 1] == '=' && txt[pc + 3] == ...
var[txt[pc]] = var[txt[pc + 2]] - var[txt[pc...
} else if (txt[pc] == 'p' && txt[pc + 1] == 'r' ...
printf("%d\n", var[txt[pc + 6]]);
} else
goto err;
while (txt[pc] != ';')
pc++;
}
exit(0);
err:
printf("syntax error : %.10s\n", &txt[pc]);
exit(1);
}
-はいこれだけです。C言語でたったの''49行''です。もちろん...
--変数名は半角一文字のみ。
--数値定数は整数で一桁のみ。
--しかも「a=3;」みたいにスペースを入れずに書かなければい...
--ひとまず代入と足し算と引き算とprintしかできない。
--printは「print 変数名;」の形式のみ解釈できる。このとき...
-ええ本当にひどい仕様だと思います。・・・かつてのタイニー...
-しかも<stdio.h>と<stdlib.h>しか使っていません。それでも4...
--<stdio.h>はprintf()とファイル入出力のために使っています。
--<stdlib.h>はexit()のために使っています。
-このHL-1は以下のプログラムを問題なく実行する能力がありま...
a=1;
b=2;
c=a+b;
print c;
-今は足し算と引き算しかないですが、掛け算や割り算を追加す...
-この先で、最初に課した制限を少しずつ減らしていきます。す...
** (4) HL-1の簡単な説明
-関数:
--loadText() : コマンドライン引数で指定されたソースファイ...
--main() : 言語処理の本体。
-変数:
--var[] : 変数の値を記憶しておくための変数。
--txt[] : ソースコードを記憶しておくための変数。
--pc : 現在プログラムのどこを実行しているのかを記憶するた...
-プログラム中で「テクニック#1」と書かれた部分があります。...
--こうすることで、プログラムでは変数と定数を区別する処理...
-''C言語での文字列の扱いに不慣れな人のために、簡単な説明...
-[隠れたこだわり]
--このHL-1やそれ以降のプログラムは、C言語が得意じゃない人...
--ポインタはやむをえないときは使っていますが、ポインタに...
//--文字列を扱うときはなるべく標準関数で扱える形式にしま...
** (5) 重要な注意事項
-[Q]HLシリーズのソースコードは、グローバル変数を多用して...
--[A]全面的にその通りです。私の意図は、とにかくエラーチェ...
--これは私の説明のための教材であって、製品や実用的な言語...
--またセキュリティを教えようと思ったときに、このプログラ...
** (6) 切実なお願い
-このテキストは上記の通り、いろいろと問題を含んでいます。...
-また、HL-2以降のプログラムは差分で提供されており、入力ミ...
-またそもそも変数名や関数名などもきれいに読みやすくするべ...
-エラーチェックを略した説明に徹するのであれば、C言語では...
-全部もっともです。・・・しかし、それを全部私がやったら、...
-それに仮に私がやれば、それは私が「あれもこれもやった、す...
-ということで、この「はりぼて言語」に関する何かをやってく...
-もししばらく待っても何もやってもらえなかったら・・・しょ...
** 次回に続く
-次回: [[a21_txt01_2]]
*こめんと欄
-すみません、構文ハイライトが欲しいです! -- 名無しさん S...
-ごもっともです。・・・どなたか、ここのプログラムを勝手に...
-説明で語り口調ですごく分かりやすいです! -- 名無しさん S...
-説明で語り口調ですごく分かりやすいです! -- 名無しさん S...
-説明で語り口調ですごく分かりやすいです! -- 名無しさん S...
-説明で語り口調ですごく分かりやすいです! -- 名無しさん S...
-スミマセン、何回も送信してしまっていたかもしれません。 -...
-ありがとうございます! -- ''K'' SIZE(10){2022-05-05 (木)...
-やっと最高のサイトにありついた... lexとかyaccを使わず、...
#comment
ページ名: