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++のが大きい。
凄いなぁアセンブリ言語。やる気にはならんけどなぁ。