text0001
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* 川合のプログラミング言語自作のためのテキスト#0001
-(by [[K]], 2019.02.25)
** (1) はじめに
-「プログラミング言語を作ってみたい」と思ったことがある人...
-おそらくは、多く人にとってプログラミング言語を作るのは難...
-私はプログラミング言語は(世間の人が思っているよりは)ず...
-この時点では「本当にプログラミング言語を作るのは簡単なの...
** (2) インタプリタかコンパイラか
-プログラミング言語は、大きく分けるとインタプリタ型とコン...
-一方でインタプリタ型は、ソースコードを実行前にコンパイル...
-こう書くとなんだかコンパイラ型がとてもよさそうに思えます...
-eval命令というのは、プログラムの中で "i = 3;"みたいな文...
-eval命令はそんなに重要でしょうか?・・・その話をする前に...
-どうしてそんな魔法みたいなことができるのかと言えば、つま...
-ここで既存のプログラミング言語で新しいJITコンパイラを作...
-evalがない言語でJITコンパイラを書こうと思ったら、機械語...
-そして今まではインタプリタは遅いとバカにされてきましたが...
-いろいろ書きましたが、つまり川合はJITコンパイラで作った...
--コンパイラは好きじゃないとか言いつつ、組み込み向けとか...
--要するにここで作り方を説明していないことに対するいいわ...
** (3) TL-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);
fclose(fp);
t[i] = 0; // 終端マークを書いておく.
}
int var[256]; // 変数.
unsigned char txt[10000]; // ソースコード.
int pc = 0; // プログラムカウンタ.
int getNumber(unsigned char c)
{
if ('0' <= c && c <= '9')
return c - '0'; // 1桁の定数.
return var[c]; // 1文字の変数名.
}
int main(int argc, const char **argv)
{
int i, pc0;
loadText(argc, argv, txt, 10000);
for (;;) {
pc0 = pc;
if (txt[pc] == 0) // ファイル終端.
exit(0);
if (txt[pc] == '\n' || txt[pc] == ' ' || txt[pc]...
pc++;
continue;
}
if (txt[pc + 1] == '=') { // 2文字目が"=".
i = txt[pc];
if (txt[pc + 3] == ';') { // 単純代入.
var[i] = getNumber(txt[pc + 2]);
} else if (txt[pc + 3] == '+' && txt[pc + 5]...
var[i] = getNumber(txt[pc + 2]) + getNum...
} else if (txt[pc + 3] == '-' && txt[pc + 5]...
var[i] = getNumber(txt[pc + 2]) - getNum...
} else
goto err;
} else if (txt[pc] == 'p' && txt[pc + 1] == 'r' ...
printf("%d\n", var[txt[pc + 6]]);
} else
goto err;
while (txt[pc] != ';')
pc++;
}
err:
printf("syntax error : %.10s\n", &txt[pc0]);
exit(1);
}
-はいこれだけです。C言語でたったの''65行''です。もちろん...
--変数名は半角一文字のみ。
--数値定数は整数で一桁のみ。
--「a=3;」みたいにスペースを入れずに書かなければいけない。
--ひとまず足し算と引き算とprintができればいい。
-ええ本当にひどい仕様だと思います。・・・かつてのタイニー...
-しかも<stdio.h>と<stdlib.h>しか使っていません。それでも6...
-このTL-1は以下のプログラムを問題なく実行する能力がありま...
a=1;
b=2;
c=a+b;
print c;
-今は足し算と引き算しかないですが、掛け算や割り算を追加す...
-この先で、最初に課した制約を少しずつ減らしていきます。い...
** (4) TL-1の簡単な説明
-関数:
--loadText() : コマンドライン引数で指定されたソースファイ...
--getNumber() : 変数名もしくは数字を一文字渡すと、その値...
--main() : 言語処理の本体。
-変数:
--var[] : 変数の値を記憶しておくための変数。
--txt[] : ソースコードを記憶しておくための変数。
--pc : 現在プログラムのどこを実行しているのかを記憶するた...
-C言語での文字列の扱いに不慣れな人のために、簡単な説明ペ...
-[隠れたこだわり]
--このTL-1やそれ以降のプログラムは、C言語が得意じゃない人...
--ポインタはやむをえないときは使ってもいいが、ポインタに...
--文字列を扱うときは極力標準関数で扱える形式にする。
** 次回に続く
-次回: [[text0002]]
*こめんと欄
-(2)の内容について、コンパイラが上級者向けで、インタプリ...
#comment
終了行:
* 川合のプログラミング言語自作のためのテキスト#0001
-(by [[K]], 2019.02.25)
** (1) はじめに
-「プログラミング言語を作ってみたい」と思ったことがある人...
-おそらくは、多く人にとってプログラミング言語を作るのは難...
-私はプログラミング言語は(世間の人が思っているよりは)ず...
-この時点では「本当にプログラミング言語を作るのは簡単なの...
** (2) インタプリタかコンパイラか
-プログラミング言語は、大きく分けるとインタプリタ型とコン...
-一方でインタプリタ型は、ソースコードを実行前にコンパイル...
-こう書くとなんだかコンパイラ型がとてもよさそうに思えます...
-eval命令というのは、プログラムの中で "i = 3;"みたいな文...
-eval命令はそんなに重要でしょうか?・・・その話をする前に...
-どうしてそんな魔法みたいなことができるのかと言えば、つま...
-ここで既存のプログラミング言語で新しいJITコンパイラを作...
-evalがない言語でJITコンパイラを書こうと思ったら、機械語...
-そして今まではインタプリタは遅いとバカにされてきましたが...
-いろいろ書きましたが、つまり川合はJITコンパイラで作った...
--コンパイラは好きじゃないとか言いつつ、組み込み向けとか...
--要するにここで作り方を説明していないことに対するいいわ...
** (3) TL-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);
fclose(fp);
t[i] = 0; // 終端マークを書いておく.
}
int var[256]; // 変数.
unsigned char txt[10000]; // ソースコード.
int pc = 0; // プログラムカウンタ.
int getNumber(unsigned char c)
{
if ('0' <= c && c <= '9')
return c - '0'; // 1桁の定数.
return var[c]; // 1文字の変数名.
}
int main(int argc, const char **argv)
{
int i, pc0;
loadText(argc, argv, txt, 10000);
for (;;) {
pc0 = pc;
if (txt[pc] == 0) // ファイル終端.
exit(0);
if (txt[pc] == '\n' || txt[pc] == ' ' || txt[pc]...
pc++;
continue;
}
if (txt[pc + 1] == '=') { // 2文字目が"=".
i = txt[pc];
if (txt[pc + 3] == ';') { // 単純代入.
var[i] = getNumber(txt[pc + 2]);
} else if (txt[pc + 3] == '+' && txt[pc + 5]...
var[i] = getNumber(txt[pc + 2]) + getNum...
} else if (txt[pc + 3] == '-' && txt[pc + 5]...
var[i] = getNumber(txt[pc + 2]) - getNum...
} else
goto err;
} else if (txt[pc] == 'p' && txt[pc + 1] == 'r' ...
printf("%d\n", var[txt[pc + 6]]);
} else
goto err;
while (txt[pc] != ';')
pc++;
}
err:
printf("syntax error : %.10s\n", &txt[pc0]);
exit(1);
}
-はいこれだけです。C言語でたったの''65行''です。もちろん...
--変数名は半角一文字のみ。
--数値定数は整数で一桁のみ。
--「a=3;」みたいにスペースを入れずに書かなければいけない。
--ひとまず足し算と引き算とprintができればいい。
-ええ本当にひどい仕様だと思います。・・・かつてのタイニー...
-しかも<stdio.h>と<stdlib.h>しか使っていません。それでも6...
-このTL-1は以下のプログラムを問題なく実行する能力がありま...
a=1;
b=2;
c=a+b;
print c;
-今は足し算と引き算しかないですが、掛け算や割り算を追加す...
-この先で、最初に課した制約を少しずつ減らしていきます。い...
** (4) TL-1の簡単な説明
-関数:
--loadText() : コマンドライン引数で指定されたソースファイ...
--getNumber() : 変数名もしくは数字を一文字渡すと、その値...
--main() : 言語処理の本体。
-変数:
--var[] : 変数の値を記憶しておくための変数。
--txt[] : ソースコードを記憶しておくための変数。
--pc : 現在プログラムのどこを実行しているのかを記憶するた...
-C言語での文字列の扱いに不慣れな人のために、簡単な説明ペ...
-[隠れたこだわり]
--このTL-1やそれ以降のプログラムは、C言語が得意じゃない人...
--ポインタはやむをえないときは使ってもいいが、ポインタに...
--文字列を扱うときは極力標準関数で扱える形式にする。
** 次回に続く
-次回: [[text0002]]
*こめんと欄
-(2)の内容について、コンパイラが上級者向けで、インタプリ...
#comment
ページ名: