💭

Nim-lang hello worldの160Kbのバイナリを150バイトまで縮める(2015 https://hookrace.net/

2021/09/04に公開

やや古いネタだが、言及してる人が誰も居ないようなので。

Nim binary size from 160 KB to 150 Bytes · HookRace Blog

hello.nim のバイナリサイズを縮めようという企画らしい。
better CたるNimlangの本質をなかなか表してると思われる。

echo "Hello!"

正直、プログラムとは呼べない行数。

※以下全てnimコマンドラインオプション

  • そのままビルド 160Kb
  • gccによる最適化 --opt:size 19Kb
  • gcをとめる --gc:none 11Kb
  • --os:standalone 6.1Kb
  • --passL:nostdlib 1.4Kb ※動かず
  • システムコール直呼び --noMain 1.5Kb

システムコール直呼びのおかげで、ソースが跡形もない。
Nim package directory syscall

import syscall

const STDOUT = 1

proc write(fd: cint, buf: cstring, len: csize): clong
          {.inline, discardable.} =
  syscall(WRITE, fd, buf, len)

proc exit(n: clong): clong {.inline, discardable.} =
  syscall(EXIT, n)

proc main {.exportc: "_start".} =
  write STDOUT, "Hello!\n", 7
  exit 0

外部ライブラリをimportしてるが、nimlangは一旦全てをCに落とすので、バイナリサイズに大きな影響はでないようだ。

それをstripして952B

最後に、逆アセンブルしたりELFヘッダを削ったり 150B

Discussion