8 mins read

Jelajahi fitur utama dan pembaruan di Julia 1.12 – Beragampengetahuan

Oleh: Konsultasi Great Lakes

Diposting ulang dari:

Postingan ini ditulis oleh Steven Whitaker.

Versi baru bahasa pemrograman Julia baru saja dirilis! Versi 1.12 saat ini merupakan versi stabil terbaru dari Julia.

Rilis ini merupakan rilis minor, yang berarti mencakup perbaikan bahasa dan perbaikan bug, namun juga sepenuhnya kompatibel dengan kode yang ditulis pada versi Julia sebelumnya (mulai dari versi 1.0 dan seterusnya).

Dalam postingan kali ini, kita akan melihat beberapa fitur dan peningkatan yang diperkenalkan pada Julia versi terbaru ini. Baca keseluruhan postingan atau klik tautan di bawah untuk beralih ke fitur yang Anda minati.

Jika Anda baru mengenal Julia (atau hanya perlu penyegaran), silakan lihat seri tutorial Julia kami, dimulai dengan cara menginstal Julia dan VS Code.

Julia 1.12 memperkenalkan peningkatan kualitas hidup yang besar untuk pengembangan paket dengan memungkinkan redefinisi jenis. Sebagai ilustrasi, sebelum Julia 1.12:

julia> struct A endjulia> struct A           x::Int       endERROR: invalid redefinition of constant Main.AStacktrace: [1] top-level scope   @ REPL[2]:1

Namun di Julia 1.12, tidak terjadi kesalahan! Namun, perhatikan bahwa objek apa pun dengan tipe lama akan tetap bertipe lama—objek tersebut tidak diperbarui secara otomatis agar sesuai dengan definisi tipe baru. Misalnya:

julia> struct A endjulia> a1 = A()A()julia> struct A           x::Int       endjulia> a2 = A(1)A(1)julia> a1@world(A, 38513:38515)()

Perhatikan bahwa setelah mendefinisikan ulang A,a1 dilambangkan sebagai milik tipe tersebut Adari apa yang disebut “zaman dunia” di masa lalu.

Penting bahwa ketika mendefinisikan metode pengiriman pada suatu tipe, metode tersebut didefinisikan ke instance tipe tersebut yang ada pada saat definisi metode. Melanjutkan dari contoh sebelumnya:

julia> f(a::A) = println("hello")f (generic function with 1 method)julia> f(a2)hellojulia> f(a1) ERROR: MethodError: no method matching f(::@world(A, 38513:38515))The function `f` exists, but no method is defined for this combination of argument types.Closest candidates are:  f(::A)   @ Main REPL[6]:1Stacktrace: [1] top-level scope   @ REPL[8]:1julia> struct A            x::Float64       endjulia> f(A(2.0)) ERROR: MethodError: no method matching f(::A)The function `f` exists, but no method is defined for this combination of argument types.Closest candidates are:  f(::@world(A, 38516:38521))   @ Main REPL[6]:1Stacktrace: [1] top-level scope   @ REPL[18]:1

Dengan kata lain, jika Anda memperbarui suatu tipe, ingatlah untuk memperbarui metodenya juga.

Namun biasanya, ketika seseorang bekerja dengan suatu tipe dan beberapa metode yang menggunakan tipe tersebut untuk pengiriman, mereka sedang mengembangkan sebuah paket. Pengembangan paket bekerja secara berbeda dari sekedar bekerja di REPL, jadi mari kita lihat bagaimana kemampuan untuk memperbarui tipe mempengaruhi pengembangan paket.

Pertama, tanpa alat yang tepat, mengembangkan paket Julia bisa jadi menyusahkan, terlepas dari apakah jenisnya (atau apa pun) bisa diperbarui atau tidak. Hal ini karena biasanya, setelah sebuah paket dimuat, perubahan yang dilakukan pada kode sumber paket tidak akan berlaku sampai Julia di-restart dan paket tersebut dimuat ulang. Dengan kata lain, seluruh runtime Julia harus dimulai ulang dan kode harus dimuat ulang meskipun hanya satu fungsi dalam paket yang diperbarui.

Untungnya, Revise.jl ada. Revise.jl memberikan peningkatan kualitas hidup yang besar bagi pengembang paket dengan memungkinkan perubahan pada kode sumber paket berlaku segera tanpa perlu memulai ulang Julia.

Peringatan terbesar? Revise.jl tidak dapat menangani perubahan pada definisi struktur. Jadi jika Anda memutuskan suatu struktur dalam paket Anda memerlukan bidang tambahan, Anda kurang beruntung, Anda harus memulai ulang Julia. Dan kemudian jika Anda memutuskan bahwa struktur tersebut benar-benar tidak memerlukan bidang itu, sayang sekali, mulai ulang Julia.

Tapi itu semua berubah dengan Julia 1.12! Rilis ini menambahkan mekanisme untuk mendefinisikan ulang tipe yang dilampirkan Revise.jl, menghilangkan kelemahan paling signifikan yang tersisa dalam pengembangan paket Julia. Jumlah waktu yang dibutuhkan pengembang untuk memulai ulang Julia akan berkurang secara signifikan dengan Julia 1.12, sehingga memungkinkan produktivitas yang lebih besar.

Julia 1.12 diperkenalkan Fix struct dapat digunakan untuk mengedit argumen fungsi. (Di sini, “memperbaiki” berarti “mengatur”, bukan “memperbaiki.”) Anggap saja ini sebagai cara lain untuk mendefinisikan penutupan.

Salah satu kegunaan utama Fixsemata-mata untuk kenyamanan, terutama saat membuat fungsi tertutup dengan banyak masukan. Misalnya, kita mempunyai model fisika (tidak masuk akal) berikut:

function dynamics(velocity, resistance, gravity, position, friction, length, mass)    return velocity + resistance + gravity + position + friction + length + massend

Sekarang, misalkan kita mempunyai fungsi lain yang menghitung (atau menerima sebagai masukan) nilai tertentu massdan kemudian buat fungsi baru yang menghitung dynamics dengan mass dikoreksi. Dulu, fungsi anonim sudah umum digunakan, jadi mari kita bandingkan penggunaan fungsi anonim dengan penggunaan Fix:

mass = 30 dynamics_with_mass = let mass = mass    (velocity, resistance, gravity, position, friction, length) -> dynamics(velocity, resistance, gravity, position, friction, length, mass)enddynamics_with_mass_fix = Base.Fix7(dynamics, mass)

Seperti yang Anda lihat, menggunakan Fix jauh lebih ringkas. Tapi keduanyadynamics_with_massDan dynamics_with_mass_fixberoperasi sebagai fungsi dari enam argumen dan perhitungan dynamics dengan mass ditetapkan pada nilai tertentu.

Selanjutnya, misalkan kita ingin menghitung turunan dari dynamicssebagai fungsi dari velocityuntuk nilai tetap dari parameter lainnya. Dalam hal ini, ada enam argumentasi yang perlu diperbaiki.Fix memungkinkan pengeditan hanya satu argumen, tapi Fixes dapat disarangkan untuk memperbaiki banyak argumen. Mari kita bandingkan penggunaan fungsi anonim dengan penggunaan Fix:

resistance = 2gravity = 9.8position = 0friction = 0length = 0.5mass = 30f = let resistance = resistance,        gravity = gravity,        position = position,        friction = friction,        length = length,        mass = mass    velocity -> dynamics(velocity, resistance, gravity, position, friction, length, mass)endf_fix = Base.Fix2(Base.Fix2(Base.Fix2(Base.Fix2(Base.Fix2(Base.Fix2(dynamics, resistance), gravity), position), friction), length), mass)pipefix(::ValN, x) where N = Base.Fix2(Base.FixN, x)f_pipefix = Base.Fix2(dynamics, resistance) |>    pipefix(Val2(), gravity) |>    pipefix(Val2(), position) |>    pipefix(Val2(), friction) |>    pipefix(Val2(), length) |>    pipefix(Val2(), mass)

Dalam hal ini, menurut saya menggunakan fungsi anonim lebih mudah dibaca. Namun,Fix mungkin memiliki beberapa keunggulan kinerja dibandingkan fungsi anonim. Misalnya: penggunaan Fix dapat mengurangi kebutuhan untuk mengkompilasi fungsi anonim yang digunakan berulang kali.

Untuk konteks dan diskusi lebih lanjut, lihat permintaan penarikan yang dirujuk Fix.

Mungkin yang mengejutkan, fitur eksperimental mungkin merupakan tambahan yang paling dinantikan di Julia 1.12: argumen baris perintah baru --trimmemungkinkan fitur (saat ini eksperimental) untuk menghapus kode yang tidak perlu dari file executable yang dikompilasi.

Tunggu, Julia bisa membuat executable mandiri? Namun, sekali lagi, ini adalah versi uji coba, kali ini melalui skrip yang disebut juliac.jl(Anehnya, catatan rilis tidak menyebutkan apa pun tentang skrip ini, meskipun skrip ini disebutkan di beberapa rangkaian pesan di Julia Talk, dan yang paling berguna bagi saya adalah skrip ini.)

Mari kita lihat cara menggunakannya juliac.jldengan program sederhana:

function @main(args::VectorString)::Cint    for arg in args                        println(Core.stdout, arg)    end    return 0end

Program ini hanya mencetak ke konsol semua argumen baris perintah yang diberikan.

Untuk mengkompilasinya menjadi executable, cukup jalankan perintah berikut:

julia ~/.julia/juliaup/julia-1.12.0+0.x64.linux.gnu/share/julia/juliac/juliac.jl --output-exe print_args --experimental --trim main.jl

(Perhatikan bahwa saya menguji ini dengan Julia yang diinstal melalui Juliaupon Linux. Lokasi juliac.jl skrip mungkin berbeda di sistem Anda.)

Untuk memverifikasi itu berfungsi:

$ ./print_args hello worldhelloworld

Lalu apa sebenarnya dampaknya --trim?Tanpa fitur (eksperimental) baru, ukurannya print_args yang dapat dieksekusi adalah 206 MB di komputer saya.Dengan --trimJumlah tersebut telah meningkat lebih dari 100 kali lipat, turun menjadi hanya 1,6 MB!

Dalam postingan ini, kita mempelajari tentang beberapa fitur dan peningkatan baru yang diperkenalkan di Julia 1.12, termasuk tipe yang dapat didefinisikan ulang,Fix,Dan --trim.Pembaca yang penasaran dapat melihat catatan rilis untuk daftar lengkap perubahan.

Apa yang paling Anda sukai di Julia 1.12? Beri tahu kami di komentar di bawah!

]]>

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

#Jelajahi #fitur #utama #dan #pembaruan #Julia

Tinggalkan Balasan

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