Kode tingkat atas di JuliaLang tidak melakukan apa yang Anda pikirkan – Beragampengetahuan
Oleh: Bingkai Putih
Repost dari:
Haiiii, itu kamu.
Dia kurang tidur karena dia perlu menyesuaikan siklus tidur 12 jamnya untuk mempersiapkan JuliaCon 2023 di Boston.
Jadi posting blog ini akan datang kepada Anda pada dini hari di Australia, untuk membuat saya tetap terjaga.
Semoga lebih seru dari biasanya.
Hari ini saya di sini untuk memberi tahu Anda bahwa mungkin Anda salah tentang apa yang dilakukan kode tingkat atas di julialang.
Meskipun jika Anda memahami prekompilasi dengan baik, maka Anda akan mengetahuinya.
Posting ini akan menjelaskan apa intinya __init__.
Misalkan, saya membuat sebuah paket: Foo.jl.
(Saya sebenarnya melakukan ini saat membuat postingan ini. Tidak ada.)
Biasanya saya akan menggunakan PkgTemplates.jl untuk ini.
Tapi sekarang jam 12:20 dan protes.
(@v1.6) pkg> generate Foo
Generating project Foo:
Foo/Project.toml
Foo/src/Foo.jl
Dan berikan Foo/src/Foo.jl konten berikut:
module Foo
const x = rand(1:100)
end # module
Jadi kita bisa berharap paket itu akan ditentukan x ke nilai acak antara 1 dan 100 setiap kali paket dimuat.
Jadi unduh paketnya dan periksa nilainya Foo.x dan periksa itu.
(@v1.6) pkg> activate .
Activating environment at `~/Foo/Project.toml`
julia> using Foo
[ Info: Precompiling Foo [6e8a2a8c-8738-4114-964a-5c8b3d9db774]
julia> Foo.x
3
oke oke, sah.
Sekarang restart julia dan periksa lagi
(@v1.6) pkg> activate .
Activating environment at `~/Foo/Project.toml`
julia> using Foo
julia> Foo.x
3
Dan sekali lagi:
(@v1.6) pkg> activate .
Activating environment at `~/Foo/Project.toml`
julia> using Foo
julia> Foo.x
3

Jadi agak aneh, peluang untuk muncul angka yang sama 3 kali berturut-turut adalah satu banding sejuta.
Jadi sesuatu yang aneh sedang terjadi.
Itu tidak menggulir kembali nomor saat paket dimuat.
_(Di sinilah beberapa orang mungkin menebak bahwa saya lupa membuat RNG. Tapi bukan itu masalahnya. Julia secara otomatis membuat RNG menggunakan LibUV’s uvrandom sumber grup entropi)
Mari kita ubah paket kita.
Mari tambahkan komentar tentang apa yang telah kita amati.
sunting Foo/src/Foo.jl untuk memberi tahu
module Foo
const x = rand(1:100) # Tests show this always returns 3
end # module
Oke sekarang cek lagi.
(@v1.6) pkg> activate .
Activating environment at `~/Foo/Project.toml`
julia> using Foo
[ Info: Precompiling Foo [6e8a2a8c-8738-4114-964a-5c8b3d9db774]
julia> Foo.x
72
oh oh.
Itu telah berubah.
Silakan periksa kembali.
(@v1.6) pkg> activate .
Activating environment at `~/Foo/Project.toml`
julia> using Foo
julia> Foo.x
72

Saya kira banyak pembaca sekarang mengerti triknya.
Itu berubah setiap kali dibungkus prakompilasi.
Jadi apa yang terjadi selama prekompilasi melakukan ini?
Kebanyakan orang mungkin terbiasa melakukan prakompilasi untuk mengunggah paket dan menyimpan hal-hal seperti fungsi parsing, dll.
Sedikit lebih banyak peserta yang akan mengetahui tentang penggunaan prekompilasi untuk benar-benar menyimpan kode yang dikompilasi (terutama di Julia 1.9+, di mana kode asli selalu disimpan) untuk metode tertentu.
Mungkin Anda menggunakan PrecompileTools untuk menandai hal-hal yang akan dikompilasi seperti itu.
tetapi ini benar-benar hanya kasus khusus dari apa yang sebenarnya dilakukan oleh prekompiler.
Prakompilasi hanya menjalankan semuanya, lalu menyimpan status runtime julia ke disk.
Jadi ini tidak berarti bahwa fungsi apa pun yang dipanggil mendapatkan JIT terkompilasi mereka disimpan (PrecompileTools hanya menyediakan bantuan untuk sedikit kontrol lebih atas ini)
Kemudian ketika Anda memuat sebuah paket, status tersimpan itu akan diunggah.
Kode sumber di tingkat teratas dalam paket tidak pernah dijalankan lagi.
Saat Anda memanggil suatu fungsi, kode itu dijalankan, bukan dari file, tetapi keluar dari status yang disimpan selama kompilasi.
Dimana itu __init__ Silahkan masuk.
Kode masuk __init__tidak seperti kode tingkat atas modul, yang dijalankan setiap kali modul dimuat.
Jadi mari kita perbaiki paket kita.
sunting Foo/src/Foo.jl lagi:
module Foo
function __init__()
@eval const x = rand(1:100)
end
end # module
Kita gunakan @eval seperti saat menjalankan jalankan semuanya dalam lingkup global.
(kami tidak dapat menggunakan global x = rand(1:100) karena itu tidak akan berhasil const).
Apakah itu bagus untuk digunakan? @eval cara ini? Saya akan meninggalkannya untuk posting mendatang (seperti apa yang mendorong posting ini sejak awal. Saya ingin membicarakannya). @eval tapi saya ingin orang-orang memahami prekompilasi terlebih dahulu.).
Ini argumen karena kasus penggunaan khusus ini sangat aneh sehingga tidak terlalu penting.
(@v1.6) pkg> activate .
Activating environment at `~/Foo/Project.toml`
julia> using Foo
[ Info: Precompiling Foo [6e8a2a8c-8738-4114-964a-5c8b3d9db774]
julia> Foo.x
85
dan periksa apakah memulai ulang Julia akan memulai ulang:
(@v1.6) pkg> activate .
Activating environment at `~/Foo/Project.toml`
julia> using Foo
julia> Foo.x
66
Dan kita semua baik.
Ada beberapa efek menarik tentang bagaimana konstanta tingkat atas dikompilasi sebelumnya.
Fakta bahwa prekompilasi benar-benar hanya menyimpan (kurang lebih) seluruh status runtime julia adalah semuanya.
Inilah mengapa kita dapat melakukan hal-hal seperti penggunaan @eval untuk membuat berbagai metode dan membuat semuanya bekerja seefisien jika kita menuliskannya dengan tangan.
Ini dapat digunakan untuk kode berbasis data.
Disarankan untuk menggunakan ini untuk Timezones.jl daripada cara saat ini menyortir data secara manual, lalu memuatnya __init__.
Saya juga telah melihat kasus di mana nilai global yang sangat kompleks ditentukan dan dengan demikian meningkatkan ukuran buffer kompilasi hingga banyak gigabyte.
Saya harap postingan ini memberi sedikit pencerahan.
Itu melayani tujuan menjaga saya tetap waras.
Sekarang hampir jam 4 pagi, jadi saya diizinkan bersiap-siap untuk tidur.
Contents
Terkait
Software Terbaru Saat Ini
Aplikasi yang sedang trend saat ini
object oriented programming, programming language, programming adalah, web programming, belajar programming, tournament software, software, software adalah, contoh software, apa itu software, pengertian software, aplikasi, aplikasi penghasil uang, aplikasi bokep, aplikasi video, programming
#Kode #tingkat #atas #JuliaLang #tidak #melakukan #apa #yang #Anda #pikirkan