Kode tingkat atas di JuliaLang tidak melakukan apa yang Anda pikirkan

 – Beragampengetahuan
6 mins read

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

GIF dari Broklin 99, kata karakter utama "keren keren keren, sekarang tidak diragukan lagi" khawatir

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

GIF dari Broklin 99, kata karakter utama "tidak atau tidak atau tidak baik" dengan penderitaan

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

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

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *