8ccã¨ããæåãªCã³ã³ãã¤ã©ããããããããæ¸ããrui314ãããæ°ãã«9ccã¨ãããªãã¸ããªãä¸ãã¦ããã
https://note.mu/ruiu/n/n00ebc977fd60 ãèªãã«ãããã¯8ccãããã«ãããããããCã³ã³ãã¤ã©èªä½ã®ææã¨ãã¦ä½ã£ã¦ãããã®ã«éããªãã¨åæã«å¤æããåçµãã¦ã¿ããã¨ã«ããã åçµãªã®ã§ãæ¸ãã¦ããã³ã¼ãã¯åããèªåãçè§£ãã¦ãã£ãè¨é²ãããã«æ®ãã
åã®ã¹ããã¯ã¯ãæ®æ®µã¯Rubyã§Webã¢ããªãæ¸ããä»äºããã¦ããã Cã³ã³ãã¤ã©ã¯ä¸åæ¸ãããã¨ã¯ãªããBrainf*ckãããã¯æ¸ãããã¨ãããã¬ãã«ã ã
ã§ã¯ã¹ã¿ã¼ãã
https://github.com/rui314/9cc/commit/56e94442ae8844688d5390851e5b29ba0c946e2f
9cc.c
main颿°ã§printfãã¦ããã ãã®ã³ã¼ãã®ããã ãããããªãã¢ã»ã³ãã©ã£ã½ãã³ã¼ããçºè¦ã ã¢ã»ã³ãã©ã¯ä¸åæ¸ãããã¨ããªãã®ã§ãããåã¢ã»ã³ãã©ã ã
.intel_syntax noprefix
ã§ã°ã°ãã¨ã¢ã»ã³ãã©ã®ã使³ã¨ãã¦ã®è¨æ³ã宣è¨ããã³ã¼ãã®ããã ãã¢ã»ã³ãã©ã«ã¯è¤æ°ã®è¨æ³ãããã®ã ããã
.global main main:
ãªãã¨ãªãã ãã©é¢æ°å®£è¨ã¿ãããªãã®ããªï¼Cã§è¨ãmain颿°å®£è¨ã¿ãããªãã®ã ããã
mov rax, %d ret
ãã¼ããã®è¾ºã¯å
¨ç¶ãããããå¤å夿°rax
ã«æ°åãå
¥ãã¦returnçãªæããï¼
Makefile
9cc: 9cc.c
ãªãã¨ãã£ãããã ãã§ cc 9cc.c -o 9cc
taskãæ¸ãããã¨ã«ãªãããã ã
*.c
taskãdefaultã§ç¨æããã¦ãã®ããªï¼æ·±ãã¯ããããªãã
test.sh
ãã¹ãã³ã¼ãã£ã½ãã
./9cc "$input" > tmp.s
ããããä½ãCã³ã³ãã¤ã©9ccã«å¼æ°ããããã¦æ¨æºåºåãæ¸ãåºãã ãã¾ã®ã¨ããåã«ã¢ã»ã³ãã©ãprintfããã³ã¼ãã ã£ãã®ã§ãtmp.sã«ã¯ã¢ã»ã³ãã©ã®ã³ã¼ããæ¸ãåºãããã®ã ããã
gcc -static -o tmp tmp.s
ããã¯macã§ã¯å®è¡ä¸å¯è½ã ã£ãã-static
ãgccç¹æã®ãªãã·ã§ã³ã£ã½ãï¼
clangã§ãåããã¨ãã§ããªãã¯ãªãã ãããã©ãã³ã¼ãã®èªã¿æ¿ããªã©ã¯ããããªãã£ãã®ã§Dockerã§linuxç°å¢ãç¨æããã
Dockerfile
FROM ubuntu:18.10 RUN apt-get update RUN apt-get install -y make gcc lld
docker-compose.yml
version: "3" services: 9cc: build: context: . dockerfile: Dockerfile volumes: - ./:/9cc working_dir: /9cc
ããã§åçµããã³ã¼ãã
docker-compose run 9cc
ã§åãããã«ãªã£ããdocker便å©ã
./tmp actual="$?"
ããããåºåãããã¢ã»ã³ãã©ãå
ã«ãä»®ã®å®è¡ãã¤ããªtmp
ãä½ã£ã¦å®è¡ãã¦ãããã ããã
$?
ã¯ããã»ã¹ã®çµäºã¹ãã¼ã¿ã¹ã ã£ãããã®ã¢ã»ã³ãã©ã¯ãçµäºã¹ãã¼ã¿ã¹ãã»ãããããã®ã ã£ãããã ã
ãã®çµäºã¹ãã¼ã¿ã¹ãå
¥åã¨åããªãOKã¨ãã¦ããã
åã£ç«¯ããåã¢ã»ã³ãã©ãæ¸ãããæ°è¨èªç¿å¾ã§ããã
https://github.com/rui314/9cc/commit/916237396164ae25557b62bf0d1ca9d9cf8c2070
ãããªãè¶³ãç®å¼ãç®ã®ç»å ´ãã©ããã£ã¦å®è£ ãããã ãããããããã¢ã»ã³ãã©ã³ã¼ããæ¡å¼µãã¦ããã¯ãã ã
9cc.c
ã¾ãæåã«æ°åãèªã¿è¾¼ãããstrtol
ã¯åãã¦ç¥ã£ãã
第ä¸å¼æ°ã«ãã¤ã³ã¿ã渡ãããåæã«æååãæ°åã¨ãã¦èªã¿åã£ã¦ãããã£ã½ãã
第äºå¼æ°ã«ãã¤ã³ã¿ã®ãã¤ã³ã¿ã渡ãã¨ãèªã¿åãçµããä½ç½®ã¾ã§ãã¤ã³ã¿ãæãä½ç½®ãé²ãã¦ããã¦ãããããã ã便å©ã
ãã¹ãã³ã¼ãããå¯ããã«ãããã§20
ã®ãããª2æ¡ã®å ´åã§ãèªã¿è¾¼ããããã ã
次ã¯1æåãã¤èªã¿è¾¼ãã§ã+
ã ã£ããadd
ã®ã¢ã»ã³ãã©å½ä»¤ã-
ã ã£ããsub
ã®ã¢ã»ã³ãã©å½ä»¤ãæ¸ãåºãããã ã
ãã¶ãããã§è¶³ãç®å¼ãç®ã«ãªããã ããã
test.sh
åçµéãããã¨åããã
試ãã«123456
ã®ãããªæ°åãæ¸ãã¦ã¿ãã¨ãã©ãããçµæã255ãè¶
ãããã¨ãã§ããªãã
å¤åçµäºã¹ãã¼ã¿ã¹ã®æå¤§å¤ã ã¨æããããããã®ã³ã³ãã¤ã©ã¯ç¾ç¶255ãéçã®ããã ã
https://github.com/rui314/9cc/commit/42adde9b5e0ed09c0d76bb84da38d136be8390c1
ãããã空ç½ãå ¥ãããã¨ãã§ããããã«ãã夿´ãããã¾ã§ã¯ç©ºç½æåãå ¥ããã¨SEGVãã¦ããã ã¤ãã§ã«tokenizeã¨ãããã¨ã§ã空ç½ãé¤å»ããããã°ã©ã æ§æãä½ãåºããã ãããæ¬æ ¼çã«ãªã£ã¦ããã
9cc.c
enum { TK_NUM = 256, // Number literal TK_EOF, // End marker };
tokenã®ç¨®é¡ãå®ç¾©ãã¦ããããã ãã©ã使 256ããå§ã¾ããã ããï¼0ããããã ããªã®ããªï¼ã¨ãããããã®ã¾ã¾é²ããã
typedef struct { int ty; // Token type int val; // Number literal char *input; // Token string (for error reporting) } Token;
tokenã®æ§é ä½ã®ããã ãtokenã®ty(種é¡)ã¨val(å¤)ã¨input(å ¥åæå)ãvalãintåãªã®ã§ãããããæ°åã®è¶³ãå¼ãããã§ããªãã ãããããã§ãããã ææºè¼ã§ããã
Token tokens[100];
ããã¯æ£ç´ã¡ãã£ã¨ç¬ã£ã¦ãã¾ã£ãã ãã¾ãã«åç´ã§ãããã§ãããã wãã¨ãããºã³ã¼ãªæãã¨ãåç´ãªã¨ããããå§ãããã¨ã¸ã®å¾¹åºããããã ããã¾ã§æããã æ¥µéã¾ã§ç ãæ¾ã¾ãããè·äººè¸ã¨ããæãã ã
void tokenize(char *p)
ãããçµå±ã¯1æåãã¤èªã¿è¾¼ãã§ifæã§åå²ãã¦ããã ãã ãããã§ãããã ãã¨ä½åæããããã ãè·äººè¸ã ã
ty
ã«ç´æ¥'+'
ã¨'-'
ãå
¥ãã¦ããã
ããããty
ã«ç´æ¥æååãå
¥ããã¨ãæ³å®ããã¨ãã©ã®æåã¨ãã¶ã¤ãããªãããã«ããããã« TK_NUM = 256
ã¨ãªã£ã¦ãããã ãªã
main颿°ã§ã¯ãã®tokenã使ã£ã¦ããã¯ãifæã§åå²ãã¦ã¢ã»ã³ãã©ãæ¸ãåºãã
空ç½ãé£ã°ãã ãã«ãã¦ã¯ããä»°ã ãããããããããã¯ããã§ããã¨é£ã°ãã¦ãããã ããã
test.sh
ç¡äºã空ç½ãç¡è¦ãããã¨ãã§ããããã«ãªã£ãã