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でした。

というわけで、

言語出力のサイズ
nasm1,018 B
C言語7.8 KB
C++8.4 KB
Haskell1.1 MB

という結果に。 流石というか何というか、Haskellでかいよ・・・。

ちなみにソースコードのサイズで言うと

言語ソースのサイズ
nasm178 B
C言語74 B
C++91 B
Haskell32 B

でした。綺麗に逆転・・・と言いたい所だけれど、CよりC++のが大きい。

凄いなぁアセンブリ言語。やる気にはならんけどなぁ。

参考: 素人プログラマがアセンブラでHello worldに挑戦してみた。 - DQNEO起業日記