Categories |
CPU¤ÎÁϤ꤫¤¿ |
Modern Compiler Implementation in ML |
NerdTV |
PDP-11¥·¥ß¥å¥ì¡¼¥¿¤Ç¸ÅÂå¤ÎUNIX¤òư¤«¤·¤Æ¤ß¤ë |
The Yakumo Project |
¤ä¤µ¤°¤ìÆÉ½ñÏ¿
ºÇ¶á¤Î¥Ä¥Ã¥³¥ß:1.Dominic(2008-06-23 05:05)
2.CheapestCheapOEMoem(2008-06-17 03:00)
3.NewDownloadCreativAdobOEM(2008-06-12 20:00)
ºÇ¶á¤Î¥È¥é¥Ã¥¯¥Ð¥Ã¥¯:1.Ç»½Ì´Ô¸µ¥ª¥ì¥ó¥¸¥Ë¥å¡¼¥¹:¥×¥í.. (2006-12-22 22:02)
"Modern Compile Implementation in ML"¤â¤Ä¤¤¤ËÂè12¾Ï"Putting It All Together"¤ËÆÍÆþ¡£¤è¤¦¤ä¤¯¥³¥ó¥Ñ¥¤¥é¤Îưºî³Îǧ¥Õ¥§¡¼¥º¤ËÅþ㤹¤ë¤³¤È¤¬¤Ç¤¤¿¡£¤Á¤Ê¤ß¤Ëº£¤Þ¤Ç¤¹¤Ã¤«¤ê½ñ¤Ëº¤ì¤Æ¤¤¤¿¤¬¡¢ËͤλȤäƤ¤¤ëºî¶È ´Ä¶¤Ï°Ê ²¼¤ÎÄ̤ꡧ
º£²óÀ½ºî¤·¤¿¥³¥ó¥Ñ¥¤¥é¤Ï"Modern Compile Implementation in ML"ÍѤËÀ߷פµ¤ì¤¿¶µºàÍѸÀ¸ì"Tiger"¡ÊTiger¤Ë¤Ä¤¤¤Æ¤Ï2004ǯ2·î8Æü¤Î¥¨¥ó¥È¥ê¤Ç¤â¼ã´³ÀâÌÀ¤·¤¿¡Ë¤Ç½ñ ¤«¤ì¤¿¥×¥í¥°¥é¥à¤òÆþÎÏ¤È ¤¹¤ë¡£ºÇ½é¤Ë¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¥Æ¥¹¥È¥×¥í¥°¥é¥à¤Ï¡Ê¤ªÌó«¤Î¡Ë"Hello World"¤Ç¤¢¤ë¡£¥Õ¥¡¥¤¥ë̾¤Ï"hello.tig"¡£
/* hello world */
print("Hello, World!\n")
"Modern Compile Implementation in ML"¤Î¥µ¥Ý¡¼¥È¥Ú¡¼¥¸¤Ë¤¢¤ë¥é¥¤¥Ö¥é¥ê¡¢runtime.c¤ò ¥³¥ó¥Ñ¥¤¥ë¤·¡¢¸½ºßÀ½ºî¤·¤Æ¤¤¤ë¥³¥ó¥Ñ¥¤¥é¤Î½ÐÎϤȥê¥ó¥¯¤¹¤ë¤³¤È¤Ë¤è¤ê¡¢"print"¤Ê¤É¤Î´ðËÜŪ´Ø¿ô¤¬Tiger¤«¤éÍøÍѤǤ¤ë¤è¤¦¤Ë¤Ê¤ë¤Î¤À¤¬¡¢ ¤½¤Î¤Þ¤Þ¥³¥ó¥Ñ¥¤¥ë ¤·¤è¤¦¤È¤¹¤ë¤È¤³¤ó¤Ê¥¨¥é¡¼¤¬È¯À¸¤¹¤ë¡£
$ gcc -c runtime.c
runtime.c:1:8: warning: undefining "__STDC__"
runtime.c:106: error: conflicting types for 'getchar'
/usr/include/stdio.h:190: error: previous declaration of 'getchar' was here
¥¨¥é¡¼¤¬È¯À¸¤·¤Æ¤¤¤ë¡¢runtime.c¤Î³ºÅöÉôʬ¤Ï¤³¤ó¤Ê´¶¤¸¡£
.....
#undef getchar
struct string *getchar()
{.....
¤¶¤Ã¤È¸«¤¿¸Â¤ê¡¢¡Ê#undef
getchar¤Ë¤è¤Ã¤Æ¡ËC¤Îɸ½àÆþ½ÐÎϥ饤¥Ö¥é¥ê¤Ë¤¢¤ëƱ̾¤Î´Ø¿ô/¥Þ¥¯¥í¤È¤Î¾×ÆÍ²óÈò¤ò¤·¤è¤¦¤È¤·¤Æ¤¤¤ëµ¤ÇۤϤ¢¤ë¤â¤Î¤Î¡¢
¤½¤ì¤¬¤¦¤Þ¤¯µ¡Ç½¤·¤Æ¤¤¤Ê¤¤¡£¤¤¤í¤¤¤í¤Ê¼ê¤ò»î¤·¤Æ¤ß¤¿¤¬¡¢·ë¶Éruntime.cÆâ¤Î"*getchar()"¤ò"*getchr()"¤Ë½ñ¤´¹¤¨¤ë¤È
¤¤¤¦¸È©¤ÊÊýË¡¤ò»È¤¤¡¢
°ìö¤·¤Î¤°¤³¤È¤Ë¤·¤¿¡£
¤ä¤Ã¤ÈËÜÈÖ¡£¤Þ¤º¤ÏStandard ML of New Jersey¤ÎÂÐÏ÷¿´Ä¶¤Ë¤Æ¡¢"hello.tig"¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¡£
- Main.compile "test/hello.tig";
emit tigermain
val it = () : unit
¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿·ë²Ì¤Ï"hello.tig.s"¤È¤¤¤¦¥Õ¥¡¥¤¥ë̾¤Ç½ÐÎϤµ¤ì¤ë¡£Ãæ¤ò¸«¤ë¤È¤½¤ì¤é¤·¤¤IA32¤Î¥¢¥»¥ó¥Ö¥ê¥³¡¼¥É¤¬ ½ÐÍè¾å¤¬¤Ã ¤Æ¤¤¤ë¤Î¤¬Ê¬¤«¤ë¡§
.globl _tigermain
.def _tigermain; .scl 2; .type 32; .endef
_tigermain:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
.....
½Ð¤Æ¤¤¿¥¢¥»¥ó¥Ö¥ê¥³¡¼¥É¤ÎÁ´ÂÎÁü¤Ï¤³ ¤Á¤é¤ò»²¾È¡£Í¾·×¤Ê"movl"¤ä"jmp"¤¬ÌܤËÉÕ¤¯¤¬¡¢¤³¤ì¤é¤ÏÄÉ¡¹¼è¤ê½ü¤¤¤Æ¤¤¤¯Í½Äê¡£
¤³¤ì¤ògcc¤Ç¥³¥ó¥Ñ¥¤¥ë¤·¡¢Àè¤Û¤É¤Îruntime.c¤Î¥³¥ó¥Ñ¥¤¥ë·ë²Ì¤È¥ê¥ó¥¯¡¢¤½¤·¤Æ¡Ê¤ä¤ä¶ÛÄ¥¤·¤Ä¤Ä¡Ë¼Â¹Ô¡§
$ gcc hello.tig.s runtime.o
$ ./a.exe
o, World!
¿ðU²ç¡¦ ¡¦¡¦$¡¦±¦¡¦E¡¦E¡¦} µ¦¡¦¡¦UE¡¦ ¹¦¡¦¡¦µ¦
¡Ê……ÃæÎ¬……¡Ë
ModuleHandleA P P P P P P P P P P P P P P cygwin1.dll P KERNEL32.dll
Segmentation fault (core dumped)
¥¯¥é¥Ã¥·¥å¡£Çɼê¤Ë»¶¤Ã¤¿¡£
¼Â¹Ôľ¸å¤Ë"o, World!"¤È½Ð¤Æ¤¤¤ë¤È¤³¤í¤«¤é¤·¤Æ¡¢ºÇ½é¤Î4¥Ð¥¤¥È(="Hell")¤¬ÀÚ¤ì¤Æ¤¤¤ë¤³¤È¤Ï¤¹¤°¤Ëʬ¤«¤ë¡£¤Ê¤Ë¤«¥º¥ì¤Æ¤¤¤ë¤Î¤«¤È»×¤¤¤Ê¤¬¤é¥¢¥»¥ó¥Ö ¥ê¥³¡¼¥É¤òį¤á¤ë…¤¬¡¢¤è¤¯¤ï¤«¤é¤Ê¤¤¡£
C¤ÇƱÍÍ¤ÎÆ°ºî¤ò¤¹¤ë¥×¥í¥°¥é¥à¤ò½ñ¤¤¤Æ¡¢runtime.o¤È¥ê¥ó¥¯¡¢¼Â¹Ô¤µ¤»¤ë¤È¡¢Æ±¤¸¤è¤¦¤ËSegmentation fault¤Ç¥¯¥é¥Ã¥·¥å¤¹¤ë¡£¥³¥ó¥Ñ¥¤¥é¤ÎÌäÂê¤Ç¤Ï¤Ê¤¯¡¢¥ê¥ó¥¯¤·¤¿¥é¥¤¥Ö¥é¥ê"runtime.o"¤Ë²¿¤«¤¢¤ë¤è¤¦¤À¡£
ÌäÂê¤Î¥é¥¤¥Ö¥é¥ê¤Î¥½¡¼¥¹¤Ç¤¢¤ëruntime.c¤ò į¤á¤¿¤È¤³¤í¡¢¸¶°ø¤Ï¤¢¤Ã¤±¤Ê¤¯È½ÌÀ¤·¤¿¡£Tiger¤Ç¤ÏC¤Î¤è¤¦¤ÊNULL½ªÃ¼Ê¸»úÎó¤Ç¤Ï¤Ê¤¯¡¢Pascal·Á¼°¡¢¤Ä¤Þ¤êŤµ(4¥Ð¥¤¥È)¡Üʸ»úÎóËÜÂÎ ¤È¤¤¤¦¹½À®¤Îʸ»úÎó¤ò»È¤Ã¤Æ¤¤¤¿¤Î¤Ç ¤¢¤Ã¤¿¡£Ëܤˤâ½ñ¤¤¤Æ¤¢¤Ã¤¿¤è¤¦¤À¤¬¤¹¤Ã¤«¤ê˺¤ì¤Æ¤¤¤¿¤è¡£
¤È¤¤¤¦¤³¤È¤Ç¡¢¥³¥ó¥Ñ¥¤¥é¤«¤é½ÐÎϤµ¤ì¤ë¥¢¥»¥ó¥Ö¥ê¥³¡¼¥ÉÃæ¤Ç
...
L0:
.ascii "Hello, World!\n\0"
¤È¤Ê¤Ã¤Æ¤¤¤¿²Õ½ê¤ò¡¢
...
L0:
.int 14
.ascii "Hello, World!\n"
¤È½ÐÎϤ¹¤ë¤è¤¦¤Ë¥×¥í¥°¥é¥à¤ò½¤Àµ¤·¡¢ºÆÅÙ¥³¥ó¥Ñ¥¤¥ë¡¢¼Â¹Ô¤¹¤ë¡§
$ gcc hello.tig.s runtime.o
$ ./a.exe
Hello, World!
¤Ä¤¤¤Ëư¤¤¤¿¡£
¤Þ¤º¤ÏÂè°ìÊâ¡£¤Ç¤â¤³¤³¤«¤é¤¬Ä¹¤¤…¤Î¤À¤í¤¦¤Ê¡¢¤ä¤Ï¤ê¡£
¤¿¤Þ¤ËÍè¤Þ¤¹¤Î¤Ç¤è¤í¤·¤¯¤ª´ê¤¤¤·¤Þ¤¹¡£