独自Cコンパイラを作ってみよう!
あなたは
人目のお客様です.
※ ここで説明していることはすべて無保証です.
サンプルのソースコードやその他プログラム,各種情報などは,
個人の責任の上で利用してください.
NLCC(No Look, No Listen, No Learn C Compiler)
は独自のCコンパイラです.
何も見ず,何も参考にせずに,フルスクラッチで開発しています.
ご意見,要望などあれば,ぜひ連絡ください!
- NLUX alpha (2023/03/02版)
- NLLの修正
- オーディオ機能を追加
- スタック操作の演算し(I+/I-)を追加
- COND()/AT()/FPUSH()/FPOP()で引数の変数値を書き換え可能な仕様を廃止
- VECTOR型を追加し,値のベクトル化と動的な拡張の対応準備で値の扱いを大幅に修正
- nllibcの修正
- FreeBSD/PowerPC対応を追加
- 一部のアーキテクチャで遅延スロットの配慮が無かった問題を修正
- fseek()を追加
- NLUX alpha (2023/01/21版)
- NLLの修正
- 組込み用途向けにメインループを独立させ分離しやすくする
- NLUX alpha (2023/01/19版)
- NLLの修正
- ファイル関連の関数で,エラー時に強制終了せずエラーを返すように修正
- NLUX alpha (2023/01/18版)
- NLLの修正
- GPAINT()の処理を修正
- コマンドヒストリにパース後(小文字→大文字変更後)の行を保存するように変更
- コマンド実行機能(SYSTEM())を追加
- システムコール呼び出し機能(SYSCALL())を追加
- NOSYSTEM()/NOSYSCALL()を追加
- -no-system/-no-syscallオプションを追加
- FWAIT()を追加
- WAITにマイクロ秒,1秒を追加
- NLUX alpha (2023/01/16版)
- NLLの修正
- Windows環境でエスケープシーケンスの文字がそのまま出力されるタイミングがある問題を修正
- 終了後にカーソル非表示のままになる問題を修正
- コマンド後にスペースを必須とする(FORMATのような変数がFOR文と判断されてしまうため.F.のような省略表記の場合はスペース不要)
- GPAINT()を追加(塗りつぶし)
- NLUX alpha (2023/01/13版)
- NLLの修正
- 動的メモリを解放せずプールするように修正
- FEVAL()を追加
- SCREEN()/GSCREEN()のモード指定をフラグに統合
- NLUX alpha (2023/01/12版)
- NLLの修正
- #によるベクトル値指定をポストフィックスでなく演算子に変更
- 括弧内の演算の文法不正でメモリリークがあった問題を修正
- NLUX alpha (2023/01/11版)
- NLLの修正
- NEW実行時にメモリ解放の不整合があった問題の修正
- GGETOFFSET()/GSETOFFSET()/GGETSCALE()/GSETSCALE()を追加
- NLUX alpha (2023/01/10版)
- NLLの修正
- malloc/free()を用いたメモリ管理を追加し,オブジェクトを動的に獲得するように変更(従来動作はNLL_MEMORY_STATICで指定可能)
- NLCCでビルドできていなかった問題の修正(INFINITY等のビルトインの対応(USE_MATHBUILTIN))
- NLUX alpha (2023/01/06版)
- NLLの修正
- 一部のターミナルでフレームバッファの表示が崩れる問題の修正(改行をエスケープシーケンスでなく\nで行う)
- Windows環境でキー入力が行えない問題の修正(getch()がcursesのgetch()と衝突していたので,_getch()に変更する)
- NLUX alpha (2023/01/05版)
- NLLの修正
- 変数の型を動的に変更可能に仕様変更(NLL_TYPECHANGE_ENABLE)(関数が引数を受け取る場合の配慮)し,従来の静的型の変数を?=演算子で定義可能にする
- グラフィック対応を追加
- グラフィック対応に合わせて,テキスト画面制御を大幅に改修
- curses対応
- Windowsでの入出力関連・ターミナル制御を整備
- 関数への引数渡しをGOSUB MAIN:(X)でなく GOSUB MAIN,X のように修正(旧書式も可能)
- 組込み定数値の一覧機能を追加
- 組込み定数を大幅に追加
- DUMPの引数を組込み定数値を使うように修正
- キー入力関連をグラフィックに合わせて統合
- \f,\aの処理を追加
- LINE()/BOX()を追加,SCROLL()にX方向を追加,GGETSCR()をGSCRSTAT()に変更
- ARGS/IFコマンドを追加
- 資源量をチューニング
- SPRINTF()/FPRINTF()を追加(書式指定表示)
- PRINTコマンドを表示のみに変更(代替としてFPRINTM()を新設)
- PUTS()をFPRINT()に変更
- 操作端末と入出力先を分離.入出力先を切替え可能にし,STDIN/STDOUTを追加
- V#3のようなベクトル表記を追加
- スタックのダンプ機能を追加(DUMP D_STACK),STACKNUM()を追加
- 値の変換関数を,複数の引数をまとめて変換するように改良(TRUE()/FALSE()/ITOA()/ATOI()/ITOF()/FTOI()/LENGTH()/RAND()/ASCII()/CHAR()/INT()/ABS()/SIGN()/PI()/RADIAN()/DEGREE()/SIN()/COS()/SQRT())
- 数学関数を拡充
- 他,細かい修正多数
- NLCCの修正
- nllineの修正
- Windowsでの入出力関連・ターミナル制御を整備
- curses対応
- nllibcの修正
- atexit()の実行を逆順に修正
- fileno()を追加
- sigreturn()の型をDebianに合わせて修正
- stdio.cの関数名を修正(標準ヘッダファイル上の関数との衝突回避)
- 全体の修正
- stack-protectorを無効化
- nlccを用いたFreeBSD-13でのビルドの対応(__NO_TLSが廃止されているため__RUNETYPE_INTERNALに変更)
- Debianでのビルドの対応
- NLUX alpha (2022/11/19版)
- nllibcの修正
- Linuxでsigaction()が正常に動作しない問題の修正(rt_sigactionの第4引数を追加する)
- Linux/x86_64でシグナルハンドラ呼び出しでダウンする問題の修正(SA_RESTORERとsigreturn()を追加する)
- FreeBSD/amd64,Linux/x86_64でシステムコールの第4引数を正常に渡せていない問題を修正
- Linux/x86でselect()が正常動作していなかった問題の修正(newselectにする)
- select()のシステムコール番号を見直し(newselectを利用する)
- NLLの修正
- 高速に出力されたときに出力抜けが発生する問題の修正(selectで出力可をチェックする)
- NLUX alpha (2022/11/15版)
- NLLの修正
- 日本語変数を可能にする(ただし非推奨)
- ARGS()/LOCAL()/RESTORE()を追加
- WAITで10000分の1秒単位での指定を可能にする
- NLUX alpha (2022/11/14版)
- NLLの修正
- ?, @ の演算子を追加
- スタック機能(PUSH/POP/FPUSH()/FPOP())を追加
- VALUE()/COND()/AT()を追加
- LOOP/FORで終了条件が未指定の場合に無限ループになるように変更
- DUMP COMMAND / DUMP FUNCTION でのコマンド一覧/関数一覧の出力を追加
- 戻り値の無いサブルーチン関数を単体で実行するとエラーとなっていた問題を修正
- NLUX alpha (2022/11/11版)
- NLLの修正
- -q指定時に起動時の自動実行が無効になっていた問題の修正
- EXITで即時終了していなかった問題の修正
- GOTO/GONEXT/LOOPEND/RETURNに付加的に式を指定できるように修正
- RUN 0 時に後続のコマンドが実行されるように修正
- EDIT 0 で最終行が編集対象になっていなかった問題を修正
- TRUE()/FALSE()関数を追加
- NLUX alpha (2022/11/09版)
- NLLの修正
- GONEXTで負の値を指定時に,前の行に戻る機能を追加
- 演算にポストインクリメント(I++),ポストデクリメント(I--)を追加
- 演算に<<=,>>=,+=,-=,*=,/=,%=,&=,^=,|=を追加
- END/EXITで終了コードを返すことを可能にする
- エラー時のエラーコードを見直し
- NLUX alpha (2022/11/06版)
- NLLの修正
- EVALを追加
- 文字の型を符号無しに変更
- 起動時のヘルプを追加(-hオプション)
- サンプルプログラムを追加
- NLUX alpha (2022/11/05版)
- NLLの修正
- nllibc利用の際に数学ライブラリを利用しないように修正(nllibcは数学ライブラリを持たないため)
- GONEXTで,行末に達した場合に次の行に繰り越すように修正
- GONEXTで,行未指定のときにGONEXT自身の位置からジャンプする機能を追加
- NLUX alpha (2022/11/04版)
- nllibcの修正
- NLLの修正
- 関数呼び出し中のブレーク動作を整備
- SKIP/SAVE/LOADを追加
- 標準入力を利用すると無限ループになる問題の修正
- NLUX alpha (2022/11/02版)
- nllibcの修正
- NLLの修正
- Windowsでの動作時に,2回目のCtrl+Cでプログラム終了してしまう問題を修正
- NLUX alpha (2022/11/01版)
- 全体の修正
- NLCCの修正
- 数値の末尾の型指定にulを追加
- いくつかの演算子の型の不正を修正(!,ポインタ演算,?:など)
- nllineの修正
- nllibcの修正
- システムコールを追加
(unlink/fchdir/chmod/chown/lseek/access/sync/fcntl/fsync/fchown/fchmod/
mkdir/rmdir/mmap/munmap/truncate/ftruncate/select/pselect/gettimeofday/settimeofday)
- MinGWでのWindows向けビルドに対応(定義を追加など)
- mmap()用定義(sys/mman.h),select()用定義(sys/select.h),モード関連定義(sys/stat.h),時刻関連定義(time.h,sys/time.h)を追加
- ソケット定義(sys/socket.h)を追加
- time()/sleep()/usleep()を追加
- ファイルストリーム系関数の受信バッファを追加
- fgets()が改行単位で読み込みされていなかったバグを修正
- strtol()のendptr未設定と0のときに正常に値をとれないバグを修正
- NLLの修正
- メモリ管理を追加(MEMORYコマンド)
- LOOP/LOOPENDを追加しFOR/NEXTの仕様を修正
- 値の初期化と終了時の資源解放チェックを追加
- ラベルの関数呼び出し機能を追加
- 文字列内に表示不可能文字も含めることを可能にする
- 文字列中での\x0Aのような指定を追加
- ポインタ変数,ポインタ演算,エイリアス変数を追加
- 数値のリスト(ベクトル数)の機能拡充
- メモリ管理,ファイル関連の関数を追加
- Windows向けクロスビルドに対応
- -eオプション追加(ワンライナー実行用)
- 定数変数を追加
- README拡充
- テストセットを追加
- その他,細かい修正と仕様変更
- NLUX alpha (2022/10/20版)
- NLCCの修正
- nllのコンパイルに合わせたバグ修正
- 浮動小数の定数の配慮を追加(ただし浮動小数演算は未サポートのため,整数値として扱う)
- 宣言のみの関数の配列内定義でダウンする問題の修正.(値を持たない関数の配慮を追加)
- 型チェックのバグを修正.(配列とポインタが型不一致となっていた)
- NLLの修正
- 浮動小数演算,数学関数の追加
- 配列,関数,端末制御,フレームバッファの追加
- サブルーチンへの引数渡し,戻り値返しを追加
- リスト値のサポート,複数の型の値をサポート
- 文字列のサポート
- 様々な数式をサポート
- 様々な機能を関数として追加
- 条件プレフィクス,数式の連結を追加を追加
- 字句解析と構文解析を行入力時に行い,実行時には解析結果を実行するように修正
- 各種の安定化(不正ポインタアクセス対応や解放洩れ対応など)
- 文法やコマンドの大幅な改良と更新
- テストセットを大幅に追加
- NLCCでのコンパイルとテストセットが通ることを確認
- その他,大幅な改良と修正
- NLUX alpha (2022/09/22版)
- NLUX alpha (2022/08/10版)
- 全体の修正
- ドキュメントを追加(README.txt)
- テスト時に clean がされていないため,再ビルドされていなかった問題を修正
- NLCCの修正
- 関数呼び出しのビルトインを追加(USE_BUILTIN_CALL: 通常の関数呼び出しを,ポインタ利用での関数呼び出しで行う)
- NLUX alpha (2022/07/22版)
- 全体の修正
- テスト時のスタティックリンクを廃止(標準のlibcが静的リンクされ,多数の実行ファイルサイズが大きくなりテストディレクトリが巨大サイズになっていた)
- make -j に対応(Makefile中での複数ターゲットの指定を廃止)
- NLCCの修正
- テンポラリレジスタに caller saved のレジスタを指定していたため,関数呼び出し時に保存されず値が破壊されていた問題を修正(ビットフィールドのビルトイン利用時に値が破壊され誤動作していた)
- if/for/while等の条件がlong値の場合に正常動作しない問題を修正(int値にしていたため)
- 各種演算のビルトインをlongに対応し整備
- ビルトインの強制利用オプションを追加(USE_BUILTIN)
- 符号拡張のビルトインでシフト演算を使わないように修正(シフト演算のビルトインで符号拡張が利用された場合に,無限再帰となるため)
- NLUX alpha (2022/07/10版)
- NLUX alpha (2022/07/09版)
- 全体の修正
- テストセットにnllibcのテスト用フレームワークを追加
- NLCCの修正
- va_arg(ap, char *)が正常な値を返さない問題を修正(va_arg()の値がintとして定義されていたため,64ビット環境でポインタ値に対して符号拡張が行われてしまっていた)
- va_arg()処理時の引数のロードの処理誤りを修正
- nllibcの修正
- fdopen()/strtol()/strtoul()を追加
- tolower()/toupper()の値が不正なバグを修正
- printf()フォーマットの桁指定に対応("%02x"など)
- printf()系の戻り値が不正な問題を修正
- fputs()/fwrite()の戻り値が不正な問題を修正
- fputc()が正常に動作していなかった問題を修正
- puts()の戻り値を見直し
- NLUX alpha (2022/05/14版)
- nllibcの修正
- 以下の関数を追加
- vprintf()/vfprintf()/vsprintf()
- fgetc()/fputc()
- bcmp()/bcopy()/bzero()
- isascii()
- NLUX alpha (2022/03/07版)
- nllibcの修正
- stdio.h系の出力関数の出力バッファのバグを修正
- 初期化関数のミスでバッファが毎回初期化されてしまいバッファがクリアされることで,出力もれが発生していた
- 出力バッファを利用せずに直接送信することで,出力順番が入れ替わることがあった
- exit()による終了時にバッファのフラッシュが行われていなかった
- 出力バッファをファイル構造体から分離
- atexit()を実装
- NLUX alpha (2022/03/06版)
- 全体の修正
- テストセットをnlccから分離し独立,ディレクトリ整理
- テストセットで/tmp上での実行をサポート(メモリファイルシステムの利用を想定)
- ターゲットアーキテクチャの指定を追加(ARCH)
- nlcc→nlcc1に変更
- NLCCの修正
- デフォルトアーキテクチャをアーキテクチャ定義に応じて切替える
- nllibcの修正
- feof()/ferror()/fread()/fwrite()を追加
- 他,細かい修正
- NLUX alpha (2021/12/21版)
- NLCCの修正
- 演算のビルトインでの再帰による無限ループを防ぐ修正
- NLUX alpha (2021/11/13版)
- 全体の修正
- 全体で組み合わせてビルドできるように,Makefileを大幅に修正・整備
(nllibc/nlline/nlshやシステム標準のヘッダファイル・ライブラリなどを組み合わせてビルド可能)
- 様々なパターンでのビルド用Makefileを追加
- Debian/CentOSでのビルドに対応
- NLCCの修正
- x86_64対応(FreeBSD/Debianで動作確認済み,セルフビルドが可能)
- AArch64を追加(ただし未テスト)
- nllibc/nlsh/nllineのビルドに対応
- もろもろいっぱい修正
- nllibcの修正
- x86_64のcrtでスタックポインタのアラインメントを追加
- システム付属の標準ヘッダファイルでビルドできるように対応
- Debian/CentOS環境でのビルド整備
- malloc()で速度が極端に遅くなる問題の対応(キャッシュ化)
- malloc()でmmap()に対応
- fopen()/fclose()によるファイルポインタ対応
- stdioの出力をバッファリング
- もろもろいっぱい修正
- NLUX alpha (2021/10/01版)
- FreeBSD/CentOS/Debian上でセルフコンパイルが可能になった
(各種標準ヘッダファイルをインクルードしてコンパイルが可能)
- 多アーキテクチャ対応のフレームワークを追加
- 多アーキテクチャ対応(ARM/MIPS/PowerPC/Thumb/MIPS16/OSECPU)
(ただし未テスト.OSECPUは実験レベルの対応)
- 多アーキテクチャ対応を想定した処理の共通化
- ビルトインを多数追加し,アーキテクチャ対応時の必要作業を可能な限り削減
- 命令未実装の場合に,ビルトインや別命令で可能な限り代替するように修正
- もろもろいっぱい修正
- NLUX alpha (2021/09/11版)
- FreeBSD上でセルフコンパイル(nlcc1自身でnlcc1を生成)が可能になったレベル
- FreeBSD(amd64)上でgcc→nlcc1→nlcc1(※1)→nlcc1(※2)のように生成し,
※1と※2が一致し,またテストプログラムがすべて動作することを確認
- もろもろいっぱい修正
- NLUX alpha (2021/09/05版)
- コンパイラドライバ開発に向けて,nlccをnlcc1に改名
- テストセットを追加し,テストを自動化
- x86アセンブリを出力し,多くのテストプログラムが正常動作したレベル
- もろもろいっぱい修正
- NLUX alpha (2021/08/09版)
- nlsh/nllibcと統合しnluxとする
- x86アセンブリをなんとなく出力してくれるレベル
(ループによる合計計算くらいは動いたレベル.でもまだ全然不十分)
- もろもろいっぱい修正
- NLCC alpha (2021/06/02版)
- 構文解析(と言うのだと思う,多分)ができるところまででひとまず公開
メールは kozos(アットマーク)kozos.jp まで