๐ Single Binary dengan CoreRT ๐
Baru beberapa saat yang lalu saya menulis bahwa untuk distribusi .NET Core memang masih melibatkan banyak berkas dependensi, diatas 100 berkas (lihat Perlukah Belajar .NET Core) karena membawa juga dependensi runtime tetapi dengan adanya CoreRT yaitu runtime .NET Core yang khusus dioptimasi untuk AOT ( ahead of time compilation) artinya kompilasi aplikasi .NET Core sekarang bisa langsung di kompilasi ke native alih-alih seperti biasanya yaitu kompilasi ke Intermediate Language atau IL seperti C# (dan Java).
tl;dr; Anda bisa mengkompilasi aplikasi .NET Core ke single binary!
Contoh sederhana hanya untuk menunjukkan bahwa C# sangat serius dengan .NET Core
Update [5 Juli 2020]: Lihat postingan berikut dari Hanselman untuk .NET Core 3.x
Hello World
Install .NET Core SDK versi 2 dan buat projek console
> dotnet new consoleThe template "Console Application" was created successfully.Processing post-creation actions...
Running 'dotnet restore' on C:\TMP\TMP.csproj...
Restoring packages for C:\TMP\TMP.csproj...
Generating MSBuild file C:\TMP\obj\TMP.csproj.nuget.g.props.
Generating MSBuild file C:\TMP\obj\TMP.csproj.nuget.g.targets.
Restore completed in 3.48 sec for C:\TMP\TMP.csproj.Restore succeeded.
Buat berkas config nuget, karena dependesi ILCompiler ada di nuget.
> dotnet new nuget
The template โNuGet Configโ was created successfully.
Tambahkan nuget.config
<add key="dotnet-core" value="https://dotnet.myget.org/F/dotnet-core/api/v3/index.json" /><add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
Tambahkan paket compiler native untuk ILCompiler
> dotnet add package Microsoft.DotNet.ILCompiler -v 1.0.0-alpha-*
Jalankan publish di x64 Native Tools Command Prompt for VS 2017
(yeah memang masih membutuhkan langkah ini, artinya anda setidaknya harus menginstal Visual C++ Tool untuk VS 2017 atau mudahnya menginstal VS2017 C++)
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.5.6
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'C:\TMP>dotnet publish -r win-x64 -c release
Microsoft (R) Build Engine version 15.5.180.51428 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.Restore completed in 118.75 ms for C:\TMP\TMP.csproj.
TMP -> C:\TMP\bin\x64\release\netcoreapp2.0\win-x64\TMP.dll
Generating native code
TMP -> C:\TMP\bin\x64\release\netcoreapp2.0\win-x64\publish\
Kalau anda memaksa untuk memakai command prompt biasa maka akan muncul error seperti
..Platform linker not found. Make sure to publish from a x64 Native Tools Command Prompt for VS 2017 with C++ tools installed. [C:\TMP\TMP.csproj]
Jika kompilasi berhasil maka maka binary release untuk aplikasi console .NET Core memakai CoreRT setidaknya seperti berikut, lihat di bin\x64\release\netcoreapp2.0\win-x64\publish

Kalau dibandingkan ukuran total kompilasi versi release memakai .NET Core dengan memakai CoreRT maka terjadi penurunan ukuran total yang cukup drastis yaitu sekitar 61MB menjadi sekitar 5MB.


Berapa persen penurunan ukuran hasil kompilasi memang tergantung dari dependensi aplikasi tersebut tetapi yang pasti memang terjadi penurunan ukuran binary.
Apa perlunya AOT kalau pake JIT saja aplikasi sudah bisa berjalan?
ya memang betul tapi selain proses kompilasi langsung ke native (single binary) akan sangat memudahkan proses pendistribusian alasan lainnya yaitu optimasi & performansi aplikasi jauh lebih baik dengan metode AOT (kompilasi native) daripada memakai JIT yang biasanya memang memakan waktu start-up jauh lebih lama, sehingga untuk aplikasi seperti game akan sangat berefek kalau di kompilasi secara native.
Monogame
Contoh resmi dengan game engine Monogame, hasil kompilasi ada sedikit perbedaan antara kompilasi IL dengan runtime Mono dengan kompilasi game yang memakai CoreRT


Perbedaan mencolok dari kompilasi monogame biasa dengan monogame CoreRT yaitu untuk OS Windows monogame tidak bergantung pada runtime Mono (Monogame.Framework.dll)
Langkah seperti CoreRT juga ada di Java 9 meskipun masih experimental dan cuman di sistem module sepertinya. Poinnya adalah semakin banyak pilihan dan cara untuk kompilasi aplikasi ke native untuk bahasa pemrograman yang biasanya memakai compiler JIT.
[Update 11 April 2018]
Sedikit catatan tambahan bahwa sangat dimungkinkan bahwa CoreRT digunakan di Unity sebagai platform game artinya bisa muncul varian OS baru dengan menggunakan CoreRT sebagai runtime yang sangat efisien.
Lihat link berikut untuk penjelasan lebih lanjut tentang CoreCLR dan Unity http://xoofx.com/blog/2018/04/06/porting-unity-to-coreclr/
Tentang Saya
Programer yang tidak terlalu bertendensi ke bahasa pemrograman tertentu, meskipun saya termasuk fans berat dari Node.js tetapi selama problem terselesaikan ok saja kalau harus pakai teknologi lain โ Github.