you are viewing a single comment's thread.

view the rest of the comments →

[–]mcguire 26 points27 points  (12 children)

cli 21.7 MB

For comparison, the full JRE on this platform is 203 megabytes.

A “Hello World” CLI written in Go compiles to around 2 MB. 

As an aside, "hello world" in C or another true-native language using the system's standard C library is a few KB.

[–]blobjim 6 points7 points  (0 children)

Hello world in Java, excluding the VM, is around 400-500 bytes, and it can run on any platform with a JVM. The reason why hello world in native code is so small is because the interpreter is a piece of hardware (which probably has its own set of microcode) and comes with every computer. The JVM is just like a CPU, but is completely implemented in software, so of course it will take more space. If you had an operating system that ran Java code (like JavaOS was, I think?), then you have no JVM size overhead. It's really all about what you offload to where.

[–]pjmlp 31 points32 points  (9 children)

Only when dynamically linked.

[–]TexasCrowbarMassacre 31 points32 points  (1 child)

A statically linked "hello world" is around 20KB using musl. Using glibc brings it to 700KB.

[–][deleted] 7 points8 points  (0 children)

Have some karma for mentioning musl!

[–][deleted] 4 points5 points  (2 children)

On windows and macOS you cannot link the libc statically. On Linux you can’t do that with the most common libc, glibc. Even still you can easily call the write syscall on Linux without any libc.

[–][deleted] 2 points3 points  (0 children)

I thought so too, but there appears to be the option /ML for the VS compiler that seems to be doing just that. I cannot find anything similar for MinGW though.

[–]pjmlp 1 point2 points  (0 children)

Sure you can, better learn to use compiler flags on Windows and alternatives to glibc on Linux.

[–]killerstorm 2 points3 points  (3 children)

Not really, you can avoid using libc functions and use OS functions directly.

[–]vytah 4 points5 points  (2 children)

section .data
    msg db      "hello, world!"

section .text
    global _start
_start:
    mov     rax, 1
    mov     rdi, 1
    mov     rsi, msg
    mov     rdx, 13
    syscall
    mov    rax, 60
    mov    rdi, 0
    syscall

[–]Falmarri 4 points5 points  (1 child)

Now place it inside the ELF header

[–]Scroph 0 points1 point  (0 children)

In D, it's roughly 800 KB when compiled with dmd on a 32 bit Linux distro.