CとC++とHaskellとnasmで書いたハローワールド
昨日大学でLT大会みたいなものがありまして、何だかアセンブリ言語の話をやたらと聞かされました。
何となく確認したら私のPCにはnasm
が入っていたので、何となくハローワールドを書きました。
こんなん。まったく読めない。
section .txt
global _start
_start:
mov edx,len
mov ecx,msg
mov ebx,1
mov eax,4
int 0x80
mov eax,1
int 0x80
section .data
msg db 'hello, world!', 0xa
len equ $ - msg
サンプルソースそのまんま。
eax
にシステムコール番号とやらを入れて、0x80
で呼び出す、ということらしい。らしいが、よく分からない。
実行する時は
$ nasm -f elf64 hello.asm
$ nasm ld hello.o
$ ./a.out
てな感じで。elf64になってますが、32ビット環境の時はelfでおっけーです。
何と出力される実行ファイルのサイズが1018バイト! 小さい!
ldに-s
オプションを付けると560バイト!!
これは凄いんじゃないか? と思ってC言語でも書いてみた。
#include <stdio.h>
int main()
{
printf("hello, world!\n");
return 0;
}
実によくあるハローワールド。
$ gcc hello.c
でコンパイルして、出力されたファイルは7.8KB。でかい、でかいぞ?
こっちにも-s
オプションを付けると6.1KBまで小さく・・・いややっぱりでかいぞ?
調子に乗ってHaskellでも書いてみた。
main = putStrLn "hello, world!"
ソースコードが笑っちゃうくらい短い。
$ ghc hello.hs
でこれもコンパイルして、実行ファイルが1.1MB。メガバイト。超デカい!?
-s
オプションは無いっぽいのでやらなかった。
せっかくなのでC++
#include <iostream>
int main()
{
std::cout << "hello, world!" << std::endl;
return 0;
}
こんな感じ。
$ g++ hello.cpp
コンパイルして、結果は8.4KB。Cよりちょっと大きい。
-s
オプション付きは6.2KBでした。
というわけで、
言語 | 出力のサイズ |
---|---|
nasm | 1,018 B |
C言語 | 7.8 KB |
C++ | 8.4 KB |
Haskell | 1.1 MB |
という結果に。 流石というか何というか、Haskellでかいよ・・・。
ちなみにソースコードのサイズで言うと
言語 | ソースのサイズ |
---|---|
nasm | 178 B |
C言語 | 74 B |
C++ | 91 B |
Haskell | 32 B |
でした。綺麗に逆転・・・と言いたい所だけれど、CよりC++のが大きい。
凄いなぁアセンブリ言語。やる気にはならんけどなぁ。