ã»ã«ããã¹ãå¯è½ãªCã³ã³ãã¤ã©ãæ¸ã
æè¿ãã³ã³ãã¤ã©ãæ¸ããã¨ãæµè¡ã£ã¦ããããã ãæµè¡ã«ä¹ã£ã¦ãã£ã¦ã¿ãããããããªç¥è¦ãå¾ãããã®ã§ç´¹ä»ãããã
ã³ã³ãã¤ã©ãæ¸ãã¨ä¸å£ã«è¨ã£ã¦ããããããªã¹ã³ã¼ãããããããã§ã¯Cè¨èªãç¨ãã¦Cã³ã³ãã¤ã©ãæ¸ããã¨ãé¸æãããCè¨èªã¯è¨èªä»æ§çã«ã³ã³ãã¯ãã§åºãç¥ããã¦ãããã¾ãããã¼ã«ã¨ãã¦ã®Cã³ã³ãã¤ã©ãæ®åãã¦ããããã®å ´åãèªåãæ¸ããCã³ã³ãã¤ã©ã§ãèªåãæ¸ããCã³ã³ãã¤ã©ã®ã½ã¼ã¹ã³ã¼ããã³ã³ãã¤ã«ãããã¨ãåççã«ã¯å¯è½ã ããããã»ã«ããã¹ãã¨ãããã²ã¨ã¤ã®å°éç®æ¨ã¨ãã¦é常ã«èå³æ·±ãã
å½åã¯å¬ã®éã«çµããããäºå®ã ã£ãã®ã ãæ¥ã¾ã§ä¼¸ã³ã¦ãã¾ã£ããããããæ¥ã«ãªã£ã¦ãå¯ãã£ããé¨ã§å®¶ã«å± ãæ¥ãå¤ããã¢ã¦ããã¢ã·ã¼ãºã³ã¾ã§ã«ç®æ¨ã®ã»ã«ããã¹ããéæãããã¨ãã§ããã
æãCã®ã¤ã³ã¿ããªã¿ãæ¸ãããã¨ããã£ãããã³ã³ãã¤ã©ãæ¸ãã®ã¯ãã¯ããã¦ã§ãããæ代ãé²ãã§éçºææ³ãå¤ãã£ãããã³ã³ãã¤ã©ç¹æã®ææ³ããã£ãããããããã¨å¦ã³ããã£ãã
ãªã½ã¼ã¹
-
https://github.com/rui314/9cc ã·ã³ãã«ã«æ¸ãããCã³ã³ãã¤ã©ãæåæã®ã³ããããããã°ãæ®ã£ã¦ããã®ã§ãæåã¯åçµçã«ãéçºéç¨ããã¬ã¼ã¹ããã¨ããããå§ããã
-
ä½ã¬ã¤ã¤ãç¥ããã人ã®ããã®Cã³ã³ãã¤ã©ä½æå ¥é ä¸è¨9ccã®ä½è ãæ¸ãã¦ããããã¹ããå 容çã«ã¯éå»ã®ã³ã³ãã¤ã©ä½æã®çµé¨ãè¸ã¾ãã¦ãããã«ã¢ãããã¼ãããã¦ãã¦ããããããã
-
ã³ã³ãã¤ã©âåçã»ææ³ã»ãã¼ã« ãã©ã´ã³ããã¯ã¨ãã¦ç¥ããããã³ã³ãã¤ã©é¢ä¿ã®æç§æ¸ããã¡ãããç§ã¯èªã¿å§ãããã©å®èµ°ã§ããªãã£ãããããããã以å¤ã®ãã£ã¨èãããã¹ãã«ã¯ä½åããã©ã¤ãã¦æ§æ解æã®ã¨ããã¯ç解ã§ãã¦ããã¨æã£ã¦ããã
-
å®ç¨Cããã°ã©ãã³ã° æã®æ¬ã§ä»ã¯æã«å ¥ãã«ããããæãå ¥ããããã®ã§ãªã¹ãã¢ããããã®æ¬ã®ä¸ã§Cã®ã¤ã³ã¿ããªã¿ãå®è£ ãã¦ãããæ§æ解æã¯ææ¸ãã®å帰ä¸éãã¤ã³ã¿ããªã¿ãªã®ã§ã³ã¼ãçæé¢ä¿ã®ã¨ããã¯è§£èª¬ããã¦ããªããããããããã°ã©ãã³ã°åå¿è ã®ããã«ã¤ã³ã¿ããªã¿ã®å®è£ ã«ã¯ããã¦è§¦ãã¦ãèªåã§ãä½ãããã ãã¨æã£ãããããä½ããã®ã ã
ãã以éãä¸ã®ãã©ã´ã³ããã¯ãªã©ãåããã³ã³ãã¤ã©ææ³ã®æ¬ã¯ä½åãèªãã ããã®æã¯yaccãªã©ã®ãã¼ãµã¸ã§ãã¬ã¼ã¿ãããã·ã¥ãã¦ã³ã»ãªã¼ãããã³ãèå³ã®ä¸å¿ã ã£ããä»åã¯åå¿ã«ããã£ã¦ææ¸ãã®å帰éé ãã¼ãµã ããã¼ãµã¯è»½ããã¾ãã主ãªé¢å¿ã¯ã³ã¼ãçæï¼ABIãBBãSSAï¼ã«ãªãã
éçºææ³
9ccã®ä½è ã主張ãã¦ããéçºæ¹æ³ã¯ã¨ã¦ãèå³æ·±ããå®éã«ãã£ã¦ã¿ã¦ããã®å¼·åããå®æã§ãããä¸è¬çãªéçºææ³ã¨ãã¦ãã©ããªã½ããã¦ã§ã¢éçºã«ãé©ç¨å¯è½ã§ãããè¦ç¹ãç´¹ä»ãããã
é常ã«ç°¡åãªã¨ããããå§ããã¤ãã«åãç¶æ ãä¿ã¤
ãã©ã¼ãã«ãªéçºææ³ã§ã¯ãä»æ§ãä¼è°ãªã©ã§å®ããããä»æ§æ¸ãã§ãããéçºãå§ã¾ããããã¯ééãã ãããã°ã©ã ã®æ©è½ãä»æ§ã¯å®è£ ã¨å¯æ¥ã«é¢ä¿ãããã©ããªã«åªç§ãªããã°ã©ãã§ãå®è£ ããã«ä»æ§ã確å®ããã°è½ã¨ãç©´ãè¦è½ã¨ãããããã®ã ã
æ¡å¼µã«æ¡å¼µãããããã°ãã¹ãã²ããã£ã§ã¡ã³ããã³ã¹ä¸è½ãªããã°ã©ã ã«ãªãæãããããããããæ©è½ãæ¡å¼µãã¦ããã¨ãã«ããããå½ã¦ã§ã¯ãªããã®æç¹ã§å¿ è¦ãªæ§é åè¨è¨ã»æ½è±¡åãéæé²ããã°ã¹ãã²ããã¤ã«ãªããã¨ã¯ãªããã¾ããã¢ã¸ã¥ã¼ã«åããªãã¡ã¯ã¿ãªã³ã°ãããã®ã«çµ¶å¯¾å¿ è¦ãªãã¼ã«ãèªååããããã¹ãã ãã¤ã¾ããæ¡å¼µãããã¡ã³ããã¹ä¸è½ã«ãªãã®ã¯ãã¹ããæ¯ãã¨ãããªãã¡ã¯ã¿ãªã³ã°ãåºæ¥ãªããããçãè¨ãã°ããã¹ãããªããããã
æåã¯å®æ°ãåºåããã ãã®ã³ã³ãã¤ã©ãä½ãããããé»åã¬ãã«ã®å¼ãã³ã³ãã¤ã«ã§ããã³ã³ãã¤ã©ã«ãªããæ¡ä»¶åå²ã»é¢æ°å¼ã³åºããªã©æ©è½ã追å ãããæçµçã«ã¯èªåèªèº«ãã³ã³ãã¤ã«ã§ããããã«ãªããéä¸ã®æ®µéã¯ãæ©è½ãå°ãªãCè¨èªã«ä¼¼ãã³ã³ãã¤ã©ã ãããã®ç¯å²ã§ã¡ããã¨ã³ã³ãã¤ã©ã¨ãã¦åä½ãã¦ãã®ç¯å²ã®ãã¹ãã«éããã¨ãããã¨ãæéè¦ãã¤ã³ãã§ããã
èªååããããã¹ã
ç¾ä»£ã®è¥è ã¯ãèªååããããã¹ãã¯å½ç¶ã®ãã®ã ã¨èããã ãããç§ãæåã«èªååãã¹ãã«è§¦ããã®ã¯1995å¹´ããã®Perlã³ãã¥ããã£ã ãå½æPerlã¯Perl 4ããPerl 5å¤ãããã¨ãã¦ããæ代ã ã£ããPerl5ã§ã¯ã¢ã¸ã¥ã¼ã«ãå°å ¥ãããã¢ã¸ã¥ã¼ã«ã®ãªãã¸ããªã§ããCPANç»é²ããããã«ã¯èªååãããã¦ããããã¹ããæ±ããããã®ã ã
ãããã20å¹´ããã¾ã§ã¯èªååãããã¦ããããã¹ããå½ããåã ãå°å ¥ããã¦ããªãã®ã¯ç§ã®å¤åå ããããªãã®ã ããã
-
ãã¹ããèªååããã¦ããªããâãã¹ãã¯åºè·åã®ãªã½ã¼ã¹ã大éæå ¥ããç¶æ ã§ããè¡ãããªãã ãããããã¦ããã¹ãæ¼ãã¨å¤§éã®ãã°ãåºããéçºè ããã¹ããæ¸ããããããã¨ã«éçºããããããã°ã¯é²ããªããç´æã«è¿½ããããã®ãããªãã¹ãã¯ããã¹ãããã¨ãç®çã¨ãªããã¶ã«ã§ç¡æå³ãªãã®ã«ãªããã¨ãå¤ãã
-
ãã¹ããæ¸ãããããªããããã¥ã¡ã³ããæ¸ãããããªããâãã¹ãã¯å®è¡å¯è½ãªä»æ§æ¸ã§ãããèªç¶è¨èªãããæ確ã§å®çµã ãæè¿ã®è¨èªã§ã¯ãDocãã¹ãããå°å ¥ããã¦ãããAPIã®åä½ããã¹ãã³ã¼ãã¨ãã¦ã¤ã³ã©ã¤ã³ããã¥ã¡ã³ãåãããã®ããã¥ã¡ã³ãä¸ã®ã³ã¼ããèªåå®è¡ãããã®ã ã
-
ãã¹ãã®æ¸ãæ¹ãããããããªããâãã¹ããã¼ã«ãå°å ¥ããã¨å¦ç¿ã³ã¹ããããããRustãªã©ã®ç¾ä»£çãªè¨èªã§ã¯ãã¹ããè¨èªä»æ§ã«å«ã¾ãã¦ããã®ã§è¿·ãã¯ãªãã¯ãã ãCãªã©ã®å¤ãè¨èªã§ãã¹ããå®è¡ããã«ã¯ãã¦ãã¦ãå¿ è¦ã ããã¾ãã¯ã«ãã¬ãã¸ã«ãã ããããã¨ã«ããèªåå®è¡ãããã¨ãèããããCppUTestã¯ãæ©è½ã¯å°ãªãã移æ¤æ§ã¯è¯ããè¯ãé¸æãã ã¨æãããã¹ããæ¸ãã=å ¥åºåãæ確ã«ãªã£ã¦ãããã¨ãããã¨ã§ãããã
-
ãã¹ãããã¹ãã¦ããã¯ããªã®ã«ãã°ãåºããâãã°ãåç¾ããããã®æå°æ§æã®ãã¹ããæ¸ãããæå°æ§æã®ãã¹ãã¯ã·ã³ãã«ãªã®ã§ã製åæ¬ä½ã®ã³ã¼ãããããã°ããããããããã°æéã®ç縮ã«ãå½¹ç«ã¤ãä¸åº¦æ¸ãããã¹ãã¯èªåå®è¡ãããã¨ã³ãã°ã»ãã°ã¬ãé²ãããã£ã¦ã¿ãã¨ãããããä¸ç®æãä¿®æ£ãããä»ã®ãã¹ããè½ã¡ãã¨ãããã°ã¬ã¯ããã°ãã°çãããéå»ã®ãã°ä¿®æ£ã®èç©ã§ããèªååãã¹ããç¡ããã°ãã©ããã£ã¦ãã°ã¬ãé²ãã¨ããã®ã ãããã
-
ããã¨åæã«èªååããããã«ãã大äºãmakeä¸çºãMakefileãå«ããªãã代æ¿ã¨ãªããã«ãã·ã¹ãã ãã¹ã¯ãªããã§ãã«ãã§ããã®ãæã¾ãããIDEã®ãã«ããã¿ã³ã§ã¯IDEã®å¾®å¦ãªè¨å®ã®å½±é¿ãå ¥ã£ã¦ãã¾ãæããããã
æåã¯æ£å¸¸ç³»ã®ã¿
é常ã®ããã°ã©ã ã§ã¯APIãå¼ãã æã¯è¿ãå¤ããã§ãã¯ããã¨ã©ã¼ãªãã°å¯¾å¦ããªããã°ãªããªããããããã³ã³ãã¤ã©ã¨ããããã°ã©ã ã®ç¹æ§ä¸ãå ¥åãã¨ã©ã¼ã ã£ãããã以ä¸ã®ã³ã³ãã¤ã«ã¯ç¶ç¶ã§ããªãã®ã§ãç°å¸¸çµäºããã®ã¿ã ãããããããã¨ã©ã¼ã¡ãã»ã¼ã¸ãåºããã°ãªãè¯ã(æè¿ã®ã³ã³ãã¤ã©ã¯ãã®æ¹é¢ã®é²æ©ãèãã)ã
ã¡ã¢ãªç¢ºä¿ã«ãããfreeããªããã¨ããè¨è¨ããã³ã³ãã¤ã©ã§ã¯ãã¾ãããã
å½ç¶ãã¦ã¼ã¶ã¨ã®ã¤ã³ã¿ã©ã¯ãã£ããªæä½ãä¼´ãGUIããã°ã©ã ããµã¼ãããã°ã©ã ã¯ããã¡ãã¨ã¨ã©ã¼ãã§ãã¯ãè¡ããªããã°ãªããªãã
Gitã¸ã®ãã¾ããªã³ããã
ãããç¾ä»£ã§ã¯å½ç¶ã ãããéçºãã¦ããã¨ãã©ãã«ãããã«ããã¾ãè¡ããªããªããã¨ã¯è¯ãããããã®ã¨ãã«ããããåãã¦ããã¨ããã¾ã§ãµã¯ãã¨æ»ãããã¨ã¯ãã¨ã¦ãå®å¿ã§ããã
ãããã£ãå¤æ´å±¥æ´ããã¡ãã¨ãã¬ã¼ã¹ãã¦ããã°ãåºãæã«ãã¤ã§ãä»»æã®å°ç¹ã«æ»ããããã«ããããã«ããGitã®ãããªãã¼ã«ãæ´»ç¨ãããã¨ã¯å¿ è¦ã ããã¡ã¤ã«ã®å é ã«å¤æ´ãã°ãã³ã¡ã³ããã¦ãããããªç²ãã§ã¯ãå¾ããã®å½¹ã«ç«ããªããå¤æ´å±¥æ´ã¯Gitã管çãããã®ã§ãã¡ã¤ã«ã³ã¡ã³ãã管çãããã®ã§ã¯ãªããç¾ä»£ã§ã¯Gitã«ãã§ãã¯ã¤ã³ããã¦ããªãã½ã¼ã¹ã³ã¼ãã¯ããããªãã®ã ãããé©æé©æã§ãããã
ã»ã«ããã¹ã
é常ãèªåã§æ¸ããã³ã³ãã¤ã©ã®ã³ã¼ãã¯ãgccã§ã³ã³ãã¤ã«ãããããã®ã³ã³ãã¤ã©ã¯é常ãstage1ã³ã³ãã¤ã©ã¨å¼ã°ãããå½ç¶ãstage1ã³ã³ãã¤ã©ã¯ãã¹ãã³ã¼ã(Cè¨èª)ãæ£ããã³ã³ãã¤ã«ãã¦ãã§ããå®è¡ãã¡ã¤ã«ã¯æ£å¸¸ã«å®è¡ãããªããã°ãªããªãããã㯠stage1ãã¹ãã¨å¼ã°ãããstage1ã³ã³ãã¤ã©ã¯ãã¢ã«ã´ãªãºã ã¯èªä½ããã ãgccã§ã³ã¼ãçæããã¦ããã
stage1ã³ã³ãã¤ã©ã¯Cã³ã³ãã¤ã©ãªã®ã§ããã¹ã(stage1test)ã ãã§ãªããèªåèªèº«ã®ã³ã³ãã¤ã©ã½ã¼ã¹ã³ã¼ããã³ã³ãã¤ã«ãããã¨ãã§ããããããã»ã«ããã¹ãã¨è¨ãããããã¦ã§ããã³ã³ãã¤ã©ãstage2ã³ã³ãã¤ã©ã ãå½ç¶ãstage2ã³ã³ãã¤ã©ãããã¹ãã³ã¼ããã³ã³ãã¤ã«ããçæç©ã¯æ£å¸¸ã«å®è¡ããã(stage2test)ã
stage2ãããã¹ãã³ã¼ãã ãã§ãªããå½ç¶ãèªåèªèº«ã®ã½ã¼ã¹ã³ã¼ããã³ã³ãã¤ã«ãããã¨ãã§ããããã®ææç©ã stage3 ã³ã³ãã¤ã©ã¨å¼ã¶ããã®ã¨ããstage1ã³ã³ãã¤ã©(ã½ã¼ã¹=èªä½ãã³ã³ãã¤ã©=gcc)ãstage2ã³ã³ãã¤ã©(ã½ã¼ã¹=èªä½ãã³ã³ãã¤ã©=èªä½)ãstage3ã³ã³ãã¤ã©(ã½ã¼ã¹=èªä½ãã³ã³ãã¤ã©=èªä½)ã¨ãªããå ¨ã¦ããã¾ãè¨ã£ã¦ããã°ãstage2 㨠stage3 ã¯ãã¤ããªã¬ãã«ã§å®å ¨ã«ä¸è´ããã¯ãã§ãããstage1ã¨stage2ã¯ã½ã¼ã¹ã¯åãã ãã³ã³ãã¤ã©ãç°ãªãã®ã§ãã¤ããªä¸è´ããªãã
æã®UNIXã¯ã¼ã¯ã¹ãã¼ã·ã§ã³ä¸ã§ã·ã¹ãã ã®ã³ã³ãã¤ã©(cc)ã使ã£ã¦gccããã«ãããã¨ãã«ãèªåã§stage2==stage3ã®ãã¹ãã¾ã§è¡ããã¦ãããä»ã¯æåããgccã§ãããã
Cè¨èªã®å®å
¨ãªå®è£
ã§ã¯ãªããã»ã«ããã¹ããç®æ¨ã®å ´åãããç¨åº¦ã®æ®µé以éã¯ãã»ã«ããã¹ãããããã«å¿
è¦ãªæ©è½ã®å®è£
ã®ã¿ã«ã¿ã¼ã²ãããçµããã¨ãã§ããããã¨ãã°ãæµ®åå°æ°ç¹æ¼ç®ãªã©ã®å®è£
ã¯ã»ã«ããã¹ãã«ã¯ä¸è¦ã ãã¾ããèªä½ã³ã³ãã¤ã©ã®æ©è½ã足ããªãå ´åãã½ã¼ã¹ã³ã¼ãããã®æ©è½ã®ç¯å²ãã使ããªãããã«ä¿®æ£ãããã¨ãå¯è½ã ãä»åã®å ´åãå¯å¤åå¼æ°é¢æ°ã®å®è£
ã諦ãããè¯ãããè¿åä½ã¨ãã¦ãswitch
-case
ã使ããã« if
-else
ã ãã§å®è£
ããã¨ããenum
ã使ããã«#define
ã§æ¸ã¾ãã¨ãã
ãããã°ææ³
ãããã¬ã§ã§ãããã¨ãã¨ããã®ã¯CPUã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢ä¿ãã¦ãã¦ãCPUã®ã¢ã¼ããã¯ãã£ã¯ãããã»ãã¿ã以å¾ãããå¤ãããªããã²ã¨ã¤ã®ãããã¬ã«ç¿å¾ãããã¨ã¯ãä»ã®ãããã¬ã«ãå°æ¥ã®è²ã ãªãããã°ã«ãå¿ç¨å¯è½ã ã
ã³ã³ãã¤ã©ã¯è¤éãªãã¿ã´ã©è£ ç½®ã¿ãããªãã®ã§ãããçã«åå ãæ¢ãå½ã¦ããããæ£ããåä½ããããã«ããã¨ãããã¾ã§ã¾ã£ãããåããªãã£ããã¿ã´ã©è£ ç½®ããããªã稼åãã ãã¨ããã®ã¯æåçãªä½é¨ã«ãªãã ãããæåã®ããããåãã次ã®ããããåãããªãããã®æ¬¡ãåãããã¤ã£ããã¦ããããããä¿®æ£ããã®ããããã°ãæ®ããã°æ°ãæ°ããããã«ãå ãè¦ããªããªãã1ã¤ã¥ã¤ãããã°ãã¦ãã£ããããããªãæå¾ã¾ã§ããããåãç¶ããå ¨ãã¹ãããã¹ããã
ã¨ãã«ã³ã³ãã¤ã©ãä½æããå ´åãå ã®ã½ã¼ã¹ãééã£ã¦ãã¦èª¤åä½ããã¨è¨ãã±ã¼ã¹ã¨ãã³ã¼ãçæãééã£ã¦ãã¦çæç©ãã¡ããã¨åããªãã¨ããã±ã¼ã¹ããããæåã¯stege1ã®åé¡ããã®æ¬¡ãstage2ã®åé¡ã ã
stage1ã³ã³ãã¤ã©ããã«ããstage1ãã¹ãããã¹ãããã¨ããã¾ã§ã¯æ¯è¼ç容æã«å°éã§ãããããããstage2ã³ã³ãã¤ã©ããã«ãã§ããªã(ãã¹ãã§ã«ãã¼ããããã¦ããªããã°ãã³ã³ãã¤ã©ã½ã¼ã¹ã§è¸ãã§ãã)ãstage2testããã¹ããªã(ã³ã¼ãçæã®ã©ããã«ãã°ããã)ã¨ããç¶æ ã«é¥ããããã¯ã³ã³ãã¤ã©ä½æã«ç¹æã®èª²é¡ã§ãã£ã¬ã³ã¸ã³ã°ã§ããã
ããã«å¥ã®èª²é¡ããããstage1ã³ã³ãã¤ã©ã¯gccãªã©ã§ãã«ãããã®ã§ãããã°æ å ±ãå ¥ã£ã¦ãããstage1ã³ã³ãã¤ã©ãè½ã¡ãå ´åãstage1testã失æããå ´åã®ãã¬ã¼ã¹ã¯ã½ã¼ã¹ã³ã¼ãã¬ãã«ã§å¯è½ãªã®ã§ãæ¯è¼ç容æã ãä¸æ¹ãstage2ã³ã³ãã¤ã©ã¯ããããã°æ å ±ãåãè¾¼ã¾ãã¦ããªãã®ãstage2ã³ã³ãã¤ã©ããããã°ããå ´åã¯ããã¿ã®ãã·ã³èªããããã°ãããã¨ã«ãªãããã¨ãã¨ãèªåã§çæããã³ã¼ããªã®ã§ãçæã®æ¹éãªã©ã¯ç解ãã¦ãããæ¯è¼çèªãã¦ãããã¯ãã ã§ãããããããgdb ã«ããã·ã³ãã«ç¡ãã®ãããã°ã¯ãé常ã®IDEã«æ £ããä½ã«ã¯é°å²æ°ãç°ãªãã
gdbã®ä½¿ãæ¹ã«ã¤ãã¦ã¯ãå¥è¨äºã«ã¾ã¨ããã https://nkon.github.io/Gdb-basic/
ä»åã®ã³ã³ãã¤ã©ã¯ä¸éã³ã¼ãæ¹å¼ã§ãããä¸éã³ã¼ãã®ãã³ãæ©è½ãä»ãã¦ããã®ã§ãããããããã°ã®è¦éãä»ãã«å¤§å¤å½¹ã«ãã£ãã
ä¾1: ã³ã¼ãçæã®ãã°(å½ä»¤ã®ä»æ§)
ä»åä½æããã³ã³ãã¤ã©ã¯Cãèªã¿è¾¼ãã§ã¢ã»ã³ãã©ãåºåããããã®åºåã«ãã°ãããã¨ã次ã®ã¹ãã¼ã¸ã®ã³ã³ãã¤ã©ãæ£ããåããªããééããä¾ã§ã¯ãæ¯è¼å½ä»¤ã«é¢ãããã®ã==
ã>=
ãªã©ã®Cã®æ¯è¼æ¼ç®åã¯ã¢ã»ã³ãã©ã§ã¯ä¸»ã«cmp
å½ä»¤ã¨ãã¦å®è£
ãããããã¹ãã±ã¼ã¹ã«ã¯æ£ã®æ°ã®æ¯è¼ã ãæ¸ãã¦ãã£ãã®ã§ããã¹ãã¯ãã¹ããã®ã ããã³ã³ãã¤ã©ã®ã½ã¼ã¹ã³ã¼ãä¸ã«è² ã®æ°ã¨æ¯è¼ããæ¯è¼æ¼ç®åãç¨ãã¦ãããå®ã¯ãcmp
å½ä»¤ã®ãªãã©ã³ãã®ãããå¹
ã«ãã£ã¦ã¯å¿
è¦ãªã¾ã§ã«æ¡å¼µããããã®æ¡å¼µã符å·æ¡å¼µã§ã¯ãªãããã«ã¼ãåãæ¡å¼µãªã®ã ã
ã¤ã¾ããint i; i = -1; i == -1;
ã¨ããã¨ããi
㯠int
ãªã®ã§32ãããã-1
ã¯å³å¤ãªã®ã§64ãããã¨ãã¦ãããã¤ã¾ããi
㯠0xffff_ffff
ã-1
ã¯0xffff_ffff_ffff_ffff
ã¨ãªããcmp
å½ä»¤ã¯i
ã«ç¸å½ããã¬ã¸ã¹ã¿ã64ãããã«æ¡å¼µãã¦0x0000_0000_ffff_ffff
ã¤ã¾ã4294967295ãä¸æ¹-1
ã¯-1
ã®ã¾ã¾ãæ¯è¼ã¯å¤±æããã
ãã®ãã°ã for
ã«ã¼ãã®å¤å®å¼ã«å½±é¿ãã㨠for
ã«ã¼ããçµäºããã« SEGV ã«ãªãããã®é¨åã®ã½ã¼ã¹ã³ã¼ãçã«ã¯æ£ããæ¸ãã¦ããã®ã§ãçã®åå ã«æ°ã¥ãã¾ã§ãããã°ã¯å°é£ã§ãã£ããããããæ£ã®æ°ã©ããã®æ¯è¼ã§ã¯æ£ããæ¯è¼ã§ããããã¹ãããã¹ãã¦ããã®ã§ãæ¯è¼æ¼ç®åã«çãã®ç®ãè¡ãã«ããã
ããªã¼ãèªãã§ãã㨠SEGV ããâfor
ã«ã¼ããæ£å¸¸ã«çµäºããªãâã¢ã»ã³ãã©ã¬ãã«ã§è¿½ãããã¦è¡ãã¨ãcmp
å½ä»¤ãæ£ãããã©ã°ãã»ããããªããâãªãã??ã¨ãªã£ã¦ããã¶ã解決ã¾ã§ã«7æéãããããã£ã(ä¸æ¥æº¶ãã)ã
ä¾2: ã³ã¼ãçæã®ãã°(ABIã®å®è£ )
ä»ã®ä¾ã§ã¯ã¬ã¸ã¹ã¿ã®ä½¿ãæ¹ã ãç¾è±¡ã¨ãã¦ã¯ãããé¢æ°ãSEGVãããããããã»ã¨ãã©ã®å ´åã¯æ£å¸¸ã«åä½ããããç¹å®ã®é¢æ°ããå¼ã°ããæã®ã¿SEGVãããåå ãæ¢ã£ã¦ã¿ãã¨ãSEGVããã¨ãã¯ããã¤ã³ã¿ãã»ããããã¦ããã¹ãå¼æ°ã«ãã¤ã³ã¿ãã»ããããã¦ããªãã
åå ã¯ãå¼ã³åºãå´ã®é¢æ°ã®ã³ã¼ãçæã«ãã£ããx86-64 ABIã§ã¯ rbp
,rsp
,r12
,r13
,r14
,r15
,rbx
ã¯å¼ã°ããå´ãä¿åããªããã°ãªããªããããããé¢æ°ãããã¼ã°ã§ push rbx
ããã®ãå¿ãã¦ããããã®çµæã(1)å¼ã³åºãå´é¢æ°ã§ãã¼ã«ã«å¤æ°ããããã使ã rbx
ã«ããã¼ã«ã«å¤æ°ãå²ãå½ã¦ã¦ããã(2)ãã®å¾ã§é¢æ°ãå¼ã³åºãããã®ã¨ãã« rbx
ãå£ãã¦ããã¾ã¾ãªã¼ã¿ã³ãã¦ã(3)ãã®å¾ã§ããã®å£ããrbx
ã«å²ãå½ã¦ããããã¼ã«ã«å¤æ°ã使ã£ã¦ã次ã®é¢æ°ã«å¼æ°ã¨ãã¦æ¸¡ãã¦ããã
å¼æ°ããªã«ã·ã¤ããSEGVããã¨ããã¾ã§ã¯ããã«è¾¿ãã¤ããããããããªãå¼æ°ãå£ãããããããå¼ã³åºãçµè·¯ã«ä¾åãããã¨ãããã«ãã®åå ãé¢æ°ãããã¼ã°ã§å¼ã³åºãè¦ç´ãå®ããªããã¨(ä»ã®é¢æ°ã§ã¯åãã¦ãããããããªã«å¼ã³åºãè¦ç´ã«è©³ãããªãã£ã)ã«åå ããã£ãããããä¸æ¥æº¶ããã
ä½ãèããã«ãã¹ã¿ãã¯ãã·ã³ã¨ãã¦æ§æãã¦ããã°ã·ã³ãã«ã§ãããããã°ã¯åççã«çºçããªãã£ããããããªããããããx86-64ABIã¯é¢æ°ã¸ã®å¼æ°æ¸¡ãããã¼ã«ã«å¤æ°ãªã©ã§ç©æ¥µçã«ã¬ã¸ã¹ã¿ã使ã(é«éåã®ãã)ãã¬ã¸ã¹ã¿å²å½ã¢ã«ã´ãªãºã ãæ£ããå®è£ ããªããã°ãªããªãã®ã§é£æ度ãé«ãã
ä¾3: ãã¼ã¿æ§é ã®ãã°
ã³ã³ãã¤ã©ã®ã³ã¼ãä¸ã§ã¯ãã¼ã¿æ§é (ãªã³ã¯ãããªã¼ãªã©)ãé »ç¹ã«ç»å ´ããããã¼ã¿æ§é ã¯ä½ãå´ã¨ä½¿ãå´ã§å¥ãã¦ãããä½ãå´ã§ãã¹ããã£ã¦ãããã¯ééãã使ãå´ã§SEGVã§è½ã¡ããä½åãééããã¨å¯¾å¦ãæ £ãã¦ãããè³¢ããããã¬ãªããã¼ã¿æ§é ãè¦è¦åãã¦ãããããä»ã®ç¶æ³ã§ã¯ãããªãã¼ã«ã¯ä½¿ããªãããããã¬ã§ã¡ã¢ãªãã³ããç¹°ãè¿ãã¦ãç´ã«ãã¼ã¿æ§é ã¨ã¡ã¢ãªã¢ãã¬ã¹ãæ¸ãåºãä½æ¥ã«ãªãã
ç´ã«æ¸ã
ãããã¬ã¯ããã°ã©ã ã®å®è¡ãã³ã³ããã¼ã«ãã¦ãããããåºåã¯ã¡ã¢ãªãã³ãã¨ã¬ã¸ã¹ã¿ãã³ãã ãã ãã¢ã»ã³ãã©åºåã¯è¡¨ç¤ºãã¦ãããããã½ã¼ã¹ã³ã¼ãã¨ã®å¯¾å¿ã¯ãã£ã¦ãããªãããããã£ããç¾ä»£çãªãããã¬ããã£ã¦ãããGUIããªãå ´åãããã¨åçã®ãã¨ããç´ã«ææ¸ãã§è¡ããPaper User Interface(PUI)ã¨ããããã ãé¢åãããã«ããã¼ã¿æ§é ããã½ã¼ã¹ã¨ã¢ã»ã³ãã©ã®å¯¾å¿ããã®æã®ã¬ã¸ã¹ã¿ã®ç¶æ ãªã©ãç´ã«æ¸ãã¦ããã¨ãç»é¢ãçºãã¦ããã¨ãã«ã¯è¦è½ã¨ãã¦ãããã¨ã«ãæ°ã¥ããããã
ã³ã³ãã¤ã©ã®ææ³
ä¸è¬çãªã³ã³ãã¤ã©ææ³ã«ã¤ãã¦ã®ã¡ã¢ã
lexer
lexãªã©ã®ãã¼ã«ãããããããã¦ãã®å ´åãææ¸ãã§ãåé¡ãªãæ¸ããã ããã1æåã®ã·ã³ãã«ã¯ã¢ã¹ãã¼ã³ã¼ããã®ã¾ã¾ã®ãã¼ã¯ã³ç¨®å¥ãè¤æ°æåã®äºç´å¾ãèå¥åã¯ã256以ä¸ã®å®æ°ãå²ãå½ã¦ããã¨ãä¸è¬çã ããã
parser
å帰éé ãã¼ãµãææ¸ãããå ´åã¨ãyacc/bison ãªã©ã®ãã¼ã«ã使ãæ¹æ³ããããä»åã¯ææ¸ãã®å帰éé ãã¼ãµã§ãªãã¨ããªã£ããCã®ææ³ã¯æ´å²çãªçç±ãããããã¾ããããã§ãªãã®ã§ãææ¸ãã§ä¾å¤å¦çãå¤ãæãã®ã»ãã馴æã¿ããããããªå°è±¡ãããããã¼ã«ã§ãã£ããæ¸ããã»ã©ããã¨ã®ææ³ããããã§ã¯ãªããã¨ãããã¨ãã¾ããã»ã«ããã¹ãããå ´åã¯ãå°ãªãã¨ããã¼ãµã¸ã§ãã¬ã¼ã¿ã使ãæ©è½ã¯100%ãµãã¼ãããªããã°ãªããªãã
ããã¦ããã§ã«ã³ã³ãã¤ã©ãããä¸ã§ããã¦ã³ã³ãã¤ã©ãä½ãã¨ããææ¦ããã¦ããã¨ãã«ãä¾åãã¼ã«ã¯å°ãªãã»ãããããããã
ã»ã«ããã¹ãã®å¿ è¦ããªãDSL(domain specific language)ãä½ãå ´åãªã©ã¯ããã¼ãµã¸ã§ãã¬ã¼ã¿ã使ã£ãã»ããå¿«é©ã«ä½ããã¨æãã
semantic analyzer
ãææ¬ã¨ãã9ccã§ã¯parserã¨semantic analyzerãåãã¦ãã¦ãparserã¯AST(æ½è±¡æ§ææ¨)ãä½ããã¨ã«å°å¿µãã¦ãããæå³ä»ããã¨ã©ã¼ãã§ãã¯ãªã©ã¯semantic analyzerã§è¡ãæ¹éã¨ãªã£ã¦ããããã¨ãã°ã1 = 2+3; ã¨ããæã¯ãparserã§ã¯ãã®ã¾ã¾ãã¹ãããsemantic analyzerã§ã¨ã©ã¼ã«ããããã㯠parserãã·ã³ãã«ã«ä¿ã¤ããã«æå¹ãªææ³ã ã£ããããããCã®ææ³ã®è¤éãããã«ããã£ããparserã§ãæå³çãªã¨ããã«æãå ¥ããªããã°ãªããªãå ´é¢ãããã
preprocessor
èªä½ã³ã³ãã¤ã©ã®å ´åãããªããã»ããµã¯ gcc -E
ã«ä»»ãã¦ãã¾ã£ã¦ãè¯ããã¨ããèãããããä»åã¯9ccã«å¾ã£ã¦ããªããã»ããµã®ä¸é¨å®è£
ãåãå
¥ãããããªããã»ããµã®å®å
¨ãªå®è£
ã¯(ã³ã¼ãã¼ã±ã¼ã¹ã®æ£ç¢ºãªä»æ§ã«ã¢ã¯ã»ã¹ãã«ãããã¨ããã£ã¦)é£ããã¨æãããããã使ãé¨åã®å®è£
ã ããªããªãã¨ããªããããã«ãèªåã®ã³ã³ãã¤ã©ã®å ´åã«ã¯ __MY_COMPILER
ãå®ç¾©ããããã«ãã¦ããã¨ãããããå½¹ã«ç«ã¤å ´é¢ãåºã¦ããã
ã¡ãã£ã¨æ··ä¹±ããã®ããif
ã¨ãããã¼ã¯ã¼ããããªããã»ããµã§ãCã®æ¬æã§ã使ããããã¨ã
å®éã«ã¯ãããªããã»ããµã®å®è£ ã¨ããã®ã¯ãããªããã»ããµã®ã¤ã³ã¿ããªã¿(æ¡ä»¶åå²ããã¯ãå±é)ãå®è£ ãããã¨ãã¨ã»ã¼çãããªããã³ã³ãã¤ã©ãä½ã£ã¦ããã¯ããããã¤ã®éã«ãã¤ã³ã¿ããªã¿ãä½ã£ã¦ããâ¦ã
IR generator
ä»åã®ã³ã³ãã¤ã©ã¯9ccã«ç¿ã£ã¦ä¸éè¨èªæ¹å¼ãç¨ãã¦ãããæåã®ã³ã¼ãçæã®æ®µéã§ã¯ãç¡éã®ã¬ã¸ã¹ã¿ã使ããä¸éè¨èªã¨ãã¦ã³ã¼ãçæãè¡ãã次ã®æ®µéã§x86-64ã®å®ã¬ã¸ã¹ã¿ãå²ãå½ã¦ãããã«x86-64ã®ã³ã¼ãçæã®æ®µéã§ãç¹æã®äºæ ãç¹ãè¾¼ãããã«ããã¹æ§æã«ãããã¨ã§ãå段éã®ä»äºãç°¡ç´ åãããããã®ã¸ãã¯ãLLVMãªã©ã§ã®ç¥è¦ããã£ã·ãçãè¾¼ã¾ãããã®ãªã®ã ããã
æé©å
ä»åã®ã³ã³ãã¤ã©ã§ã¯ãã»ã¨ãã©æé©åãªããã®ããã¦ããªããçæãããã³ã¼ããè¦ãã¨ãmov r10,r10
ã®ãããªæå³ããªãã³ã¼ãããããã並ãã§ãããå°æ¥çã«ã¯ãç°¡åãªæé©åãå®è¡ãã¦ã¿ã¦ãã©ããããé度ãå¤åããã確ããã¦ã¿ãããã®ã ã
ä¾ã¨ãã¦ãã³ã¼ãçæé¨ã«æ¬¡ã®ãããªãã®ãå
¥ãã¦ã¿ããmov r10,r10
ã®ãããªç¡æå³ãªã³ã¼ããåºåããªããæé©åãã ã
case IR_MOV:
if (regs[r0] == regs[r2]) {
break;
}
emit2s("mov %s, %s", regs[r0], regs[r2]);
break;
ãã«ãæéããã¡ã¤ã«ãµã¤ãºãæ¯è¼ãã¦ã¿ãã
 | æé©åç¡ã | æé©åæã |
---|---|---|
make stage1 | 731ms | 689ms |
make stage2 | 313ms | 329ms |
make stage3 | 330ms | 346ms |
ls stage1cc | 157312 | 157320 |
ls stage2cc | 1119088 | 1110890 |
å®è¡ãã¡ã¤ã«ã®ãµã¤ãºã¯ãããå°ãããªã£ãããå®è¡æéã«ææå·®ã¯ç¡ãã£ããã¬ã¸ã¹ã¿ã³ãã¼ã®ã³ã¹ãã¯é常ã«ä½ããã¨ãããã¨ã ãããã
ã¡ãªã¿ã«ãmake stage2ã¯stage1ã³ã³ãã¤ã©ã使ãããmake stage3ã¯stage2ã³ã³ãã¤ã©ã使ãããããã®å®è¡æéã®å·®ã¯ãgccãåºåããå®è¡ãã¡ã¤ã«ãã¨ãèªä½ã³ã³ãã¤ã©ãåºåããå®è¡ãã¡ã¤ã«ãã®å®è¡é度ãæ¯è¼ããææ¨ã¨ãªããããèããã¨ãããæããªã®ã§ã¯ãªããããããã¡ã¤ã«ãµã¤ãºã®æ¯è¼çµæã¯æ²æ¨ã ãmake stage1ã§æéãããã£ã¦ããã®ã¯ããã£ã¹ã¯ãã£ãã·ã¥ã®å½±é¿ã¨gccãè¡ã£ã¦ããæé©åã®ããã®å®è¡æéã®å½±é¿ãèããããã
ä½ã¬ã¤ã¤æè¡
ABI(Application Binary Interface)
ä»åã®ã³ã³ãã¤ã©ã¯ã¢ã»ã³ãã©ãåºåããããã以å¤ã®ãªãã·ã§ã³ã¨ãã¦ã¯ãCãåºåããããæè¿ã§ã¯LLVMã®ä¸éè¨èª(IR)ãåºåããããç´æ¥ãã¤ããªãåºåãããã
ã½ã¼ã¹ã³ã¼ããã³ã³ãã¤ã«ããçµæãã¢ã»ã³ãã©ãåºåããããã®ã¢ã»ã³ãã©ã¯ãã¢ã»ã³ãã©ã§ã³ã³ãã¤ã«ããããã¤ã¾ããã¢ã»ã³ãã©ãç解ã§ããæ¸å¼ã§æ¸ããªããã°ãªããªããã¢ã»ã³ãã©ã¨ãã¦ã¯ãä¸è¬ç㪠gas ã使ããã³ãã³ãã©ã¤ã³ã§ã¯ gcc(ã³ã³ãã¤ã©ãã©ã¤ã)ããèµ·åããããã£ããã³ã³ãã¤ã©ãæ¸ããã®ã« gcc ãçµå±ä½¿ãã®ã ã
ã¢ã»ã³ãã©ã¯ãªãã¸ã§ã¯ããã¡ã¤ã«ãåºåããããªãã¸ã§ã¯ããã¡ã¤ã«ãã©ã¤ãã©ãªã¨ãªã³ã¯ãããå®è¡ãã¡ã¤ã«ãã§ãããã©ã¤ãã©ãªã¯ã·ã¹ãã æä¾ã®ãã®ããªã³ã«ã¯ gcc ã®ãªã³ã«(ããã gcc ããèµ·åãã)ã使ãã
ã¤ã¾ããã³ã³ãã¤ã©ã®åºåã¯ãã¢ã»ã³ãã©ãç解ã§ããã ãã§ãªããã©ã¤ãã©ãªã使ã£ã¦ãã·ã¹ãã ã®ã©ã¤ãã©ãªã¨ãªã³ã¯å¯è½ã«ããªããã°ãªããªããããã§ãªããã°ãåã x86 ã®ã¢ã»ã³ãã©ãåºåããã¨ãã¦ãããªã³ã¯ã§å¤±æããã
åç½®ããé·ããããããã£ãç¸äºéç¨ãå¯è½ã«ããã®ããABI(Application Binary Interface)ã§ãããããã¤ãã®ABIãåå¨ããããä»å㯠x86_64 ABI ã使ããLinux ä¸ã§ 64bit ããã°ã©ã ã§ä½¿ããã¦ããä¸è¬çãªå½¢å¼ã ãABIãå®ã£ã¦ããã°éã«ãã©ããªè¨èªã§æ¸ãããªãã¸ã§ã¯ããã¡ã¤ã«ã§ããªã³ã¯ã§ããã
x86_64 ABIã¯æ§æ¥ã®ãã®ã¨ã¯éãã¬ã¸ã¹ã¿ããªãã¹ãæ´»ç¨ãããã¨ããè¨è¨ã«ãªã£ã¦ãããå¿ ç¶çã«ãã³ã³ãã¤ã©ãåºåããã¢ã»ã³ããªã³ã¼ããæ§æ¥ã®ã¹ã¿ãã¯ãã·ã³ãåæã¨ãããã®ããã¬ã¸ã¹ã¿ãã·ã³ãåæã¨ãããã®ã«å¤ãã¦ãããªããã°ãªããªãããã®ã¸ãã¯ãããã¨æ°ããæè¡ã ã¨æãã
主ã«ã³ã³ãã¤ã©ç 究ãLLVMæ¹é¢ã®ææã ã¨æãããã¬ã¸ã¹ã¿ãã·ã³ã§ãã£ã¦ãæåã¯ç¡éåã®ã¬ã¸ã¹ã¿ã使ããã¬ã¸ã¹ã¿ãã·ã³åãã®ã¢ã»ã³ããª(ã¾ãã¯IR:ä¸éè¨èª)ãçæããããããç¾å®ã®ã¬ã¸ã¹ã¿ã«ããããããã¨ããææ³ã使ãããããã®æ®µéã§ãã¨ããããã¹ã¿ãã¯ã«ç©ãã§ããã¨ããå®è£
ããããç¾å®ã®ã¬ã¸ã¹ã¿æ°ã«åããã¦ããã¤è¦ç´ãå®ãããã«è©°ãè¾¼ããã¨ããããè¤éãªã¢ã«ã´ãªãºã ãå¿
è¦ã«ãªããCãæåã«éçºãããæ代ã«ã¯ã¹ã¿ãã¯ãã·ã³ãä¸è¬çã ã£ããããããã«ä¾åããå¯å¤åæ°å¼æ°ã¨<stdarg.h>
ã§å®ããããva_*
ãã¯ããªã©ã®ä»æ§ãç´ãè¾¼ãã§ããããããx86-64ã®å¼ã³åºãè¦ç´ã«åããã¦åå®è£
ããã®ã¯ãä»åã¯æéã®é¢ä¿ã§ããããããã¤ã¾ããå¯å¤åæ°å¼æ°ããµãã¼ãããªãã
Basic Block, Static Single Assignment
ã³ã³ãã¤ã©ã§æé©åã®ç¥ã«ä½¿ãããææ³ãBasic Blockã¯å é¨ã«åå²ãå«ã¾ãªã1ã¤ã®å®è¡ã®å¡ãStatic Single Assignmentã¯1åº¦ä»£å ¥ãããå¤æ°ã¯åä»£å ¥ãããªãå½¢å¼ãç¾ä»£ã®ã³ã³ãã¤ã©ã¯ãæé©åã®ç¥ã«åã«æé©åããã ãã§ãªããã¾ãããã®ãããªæ§é ãä½ã£ã¦ããã®ä¸ã§æé©åãè¡ãããã«ãªã£ã¦ããã9ccã¯ãã®ãããªå®è£ ãåãè¾¼ãã§ãããå¦ç¿ç¨ã¨ãã¦ãåªãã¦ããã
ç§èªèº«ã®ç解ãæªããã®ã§ã詳ããå 容ã¯Wikipediaã®è©²å½é ç®ãè¦ã¦æ¬²ããã
çµè«
çµè«ã¨ãã¦ã¯ããã®ããã«è²ã 楽ããã¦ç¥è¦ãå¾ãããã®ã§ãã³ã³ãã¤ã©ãæ¸ããã