Cosmopolitan C – Satu Executable File untuk Multi Platform

2 min read

Disclaimer
Saya bekerja di AWS, semua opini adalah dari saya pribadi. (I work for AWS, my opinions are my own.)
Cosmopolitan C Multi Platform
Logo-logo sistem operasi (Sumber gambar: wikimedia)

TeknoCerdas.com – Salam cerdas untuk kita semua. Sebagai pengembang software anda pasti sering mendengar istilah multi-platform. Yang artinya sebuah program dapat berjalan pada banyak platform atau OS. Namun biasanya hal itu memerlukan executable file yang berbeda untuk tiap OS atau perlu virtual machine (contoh: JVM) untuk berjalan. Cosmopolitan C menurut saya revolusioner karena satu executable file untuk multi OS.

Ya anda tidak salah membaca. Satu executable file untuk multi OS meliputi Linux, macOS, Windows, dan *BSD.

Apa itu sebenarnya Cosmopolitan C? Singkatnya Cosmopolitan C adalah sebuah pustaka bahasa C yang fokus pada portabilitas dengan melakukan abstraksi syscall sesuai dengan platform tempat berjalan. Pustaka Cosmopolitan C masuk pada kategori yang sama dengan pustaka C yang sudah dikenal seperti libc atau musl.

Baca Juga
Install COBOL pada Ubuntu 20.04

Yang revolusioner adalah file executable hasil compile dari program yang menggunakan Cosmopolitan C dapat otomatis berjalan di berbagai platform. Jadi cukup satu kali build untuk berbagai OS. Hasil build dari Cosmopolitan C dikenal dengan Actually Portable Executable atau APE format.

File executable APE format memiliki karakteristik khusus sehingga dapat berjalan di multi platform. Berikut adalah karakteristik dari APE.

MZqFpD='
BIOS BOOT SECTOR'
exec 7<> $(command -v $0)
printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7
exec "$0" "$@"
exec qemu-x86_64 "$0" "$@"
exit 1
REAL MODE...
ELF SEGMENTS...
OPENBSD NOTE...
NETBSD NOTE...
MACHO HEADERS...
CODE AND DATA...
ZIP DIRECTORY...

Bingung? Sama saya juga. Namun pada intinya adalah Windows dan keluarga UNIX memiliki cara berbeda dalam mengeksekusi sebuah file. Ketika file tersebut dieksekusi pertama kali maka dia seperti melakukan rewrite pada dirinya sendiri sehingga bagian file yang berkesesuaian dengan platform tersebut akan digunakan.

Hal ini terbukti jika sebuah file executable APE pernah dieksekusi pada satu platform misal macOS dan kemudian file tersebut disalin ke Linux maka kemungkinan tidak berjalan.

Secara lengkap anda dapat merujuk pada cara kerja APE di halaman berikut https://justine.lol/ape.html.

Konsep multi platform ini berbeda dengan Java meskipun mengklaim multi-platform Java memerlukan JVM yang merupakan file executable berbeda untuk tiap platform. Begitu juga dengan Go, meskipun portable tapi dia harus dicompile untuk tiap platform berbeda.

Satu hal lagi yang menarik dari Cosmopolitan C adalah pustaka C yang disediakan didevelop oleh satu orang dan dia adalah seorang programmer wanita bernama Justine Tunney. Hal yang cukup luar biasa menurut saya.

Uji Coba Cosmopolitan C

Untuk pengujian ini saya akan mencoba membuat sebuah program C sederhana yang mengambil dan menampilkan input dari STDIN. Nantinya file ini akan kita jalankan pada macOS dan Linux.

Saya melakukan compiling di lingkunan Linux menggunakan GNU gcc. Kita namakan saja file ini hello-stdin.c.

int main()
{
  char buf[30];
  printf("Full name: %s", buf);
  fgets(buf, 30, stdin);
  printf("Hello %s\n", buf);

  return 0;
}

Lakukan compile gcc dengan perintah perintah dibawah ini. Diasumsikan bahwa kita sudah menginstal Cosmopilitan C.

$ gcc -g -O -static -fno-pie -no-pie -mno-red-zone \
-nostdlib -nostdinc -o hello-stdin.com.dbg hello-stdin.c \
-Wl,--gc-sections -Wl,-z,max-page-size=0x1000 -fuse-ld=bfd \
-Wl,-T,ape.lds -include cosmopolitan.h crt.o ape.o cosmopolitan.a

Setelah proses selesai lanjutkan dengan mengubah object file ke dalam bentuk executable.

$ objcopy -SO binary hello-stdin.com.dbg hello-stdin.com

Harusnya sekarang terdapat file executable hello-stdin.com. Yaitu sebuah executable yang dapat berjalan multi-platform. Perlu diingat karena setelah executable ini dijalankan melakukan rewrite pada dirinya sendiri maka sebelum dijalankan hendaknya copy file executable tersebut ke platform yang ingin ditest.

Dibawah ini adalah file executable yang dijalankan di Linux.

$ uname -a
Linux 1597f391cb68 4.19.121-linuxkit #1 SMP Tue Dec 1 17:50:32 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
$ md5sum ./hello-stdin.com
ecb9c591428cd4264c9f1e8a05d7e4e3
$ ./hello-stdin.com
Full name:
TeknoCerdas.com Linux

Hello TeknoCerdas.com Linux

Dan ini adalah file executable yang sama dan saya jalankan di macOS.

$ Darwin Rios-MacBook-Air.local 18.7.0 Darwin Kernel Version 18.7.0: Tue Aug 20 16:57:14 PDT 2019; root:xnu-4903.271.2~2/RELEASE_X86_64 x86_64
$ md5 ./hello-stdin-mac.com
MD5 (./hello-stdin-mac.com) = ecb9c591428cd4264c9f1e8a05d7e4e3
$ ./hello-stdin-mac.com
Full name:
TeknoCerdas.com macOS

Hello TeknoCerdas.com macOS

Dengan Cosmopolitan C maka jargon write once run anywhere benar-benar bisa diterapkan.