Julia ASTs
Julia'nın iki kod temsili vardır. İlk olarak, parser tarafından döndürülen bir yüzey sözdizimi AST'si (örneğin, Meta.parse fonksiyonu) ve makrolar tarafından manipüle edilir. Bu, yazıldığı gibi kodun yapılandırılmış bir temsilidir ve bir karakter akışından julia-parser.scm tarafından oluşturulur. Sonra, tür çıkarımı ve kod üretimi tarafından kullanılan bir düşürülmüş form veya IR (ara temsil) vardır. Düşürülmüş formda daha az düğüm türü vardır, tüm makrolar genişletilmiştir ve tüm kontrol akışı açık dallara ve ifade dizilerine dönüştürülmüştür. Düşürülmüş form julia-syntax.scm tarafından oluşturulur.
Öncelikle makroları yazmak için gerekli olan AST'ye odaklanacağız.
Surface syntax AST
Ön uç AST'leri neredeyse tamamen Expr ve atomlardan (örneğin semboller, sayılar) oluşur. Genellikle her görsel olarak farklı sözdizimsel form için farklı bir ifade başı vardır. Örnekler s-ifade sözdizimi ile verilecektir. Her parantezli liste bir Expr'e karşılık gelir, burada ilk öğe başlıktır. Örneğin (call f x) ifadesi Julia'daki Expr(:call, :f, :x) ifadesine karşılık gelir.
Calls
| Input | AST |
|---|---|
f(x) | (call f x) |
f(x, y=1, z=2) | (call f x (kw y 1) (kw z 2)) |
f(x; y=1) | (call f (parameters (kw y 1)) x) |
f(x...) | (call f (... x)) |
do sözdizimi:
f(x) do a,b
body
endparses as (do (call f x) (-> (tuple a b) (block body))).
Operators
Çoğu operatör kullanımı sadece fonksiyon çağrılarıdır, bu nedenle call başlığı ile ayrıştırılır. Ancak bazı operatörler özel formlardır (mutlaka fonksiyon çağrıları değildir) ve bu durumlarda operatörün kendisi ifade başlığıdır. julia-parser.scm dosyasında bunlara "sentaktik operatörler" denir. Bazı operatörler (+ ve *) N-ary ayrıştırma kullanır; zincirlenmiş çağrılar tek bir N-argüman çağrısı olarak ayrıştırılır. Son olarak, karşılaştırma zincirlerinin kendine özgü bir ifade yapısı vardır.
| Input | AST |
|---|---|
x+y | (call + x y) |
a+b+c+d | (call + a b c d) |
2x | (call * 2 x) |
a&&b | (&& a b) |
x += 1 | (+= x 1) |
a ? 1 : 2 | (if a 1 2) |
a,b | (tuple a b) |
a==b | (call == a b) |
1<i<=n | (comparison 1 < i <= n) |
a.b | (. a (quote b)) |
a.(b) | (. a (tuple b)) |
Bracketed forms
| Input | AST |
|---|---|
a[i] | (ref a i) |
t[i;j] | (typed_vcat t i j) |
t[i j] | (typed_hcat t i j) |
t[a b; c d] | (typed_vcat t (row a b) (row c d)) |
t[a b;;; c d] | (typed_ncat t 3 (row a b) (row c d)) |
a{b} | (curly a b) |
a{b;c} | (curly a (parameters c) b) |
[x] | (vect x) |
[x,y] | (vect x y) |
[x;y] | (vcat x y) |
[x y] | (hcat x y) |
[x y; z t] | (vcat (row x y) (row z t)) |
[x;y;; z;t;;;] | (ncat 3 (nrow 2 (nrow 1 x y) (nrow 1 z t))) |
[x for y in z, a in b] | (comprehension (generator x (= y z) (= a b))) |
T[x for y in z] | (typed_comprehension T (generator x (= y z))) |
(a, b, c) | (tuple a b c) |
(a; b; c) | (block a b c) |
Macros
| Input | AST |
|---|---|
@m x y | (macrocall @m (line) x y) |
Base.@m x y | (macrocall (. Base (quote @m)) (line) x y) |
@Base.m x y | (macrocall (. Base (quote @m)) (line) x y) |
Strings
| Input | AST |
|---|---|
"a" | "a" |
x"y" | (macrocall @x_str (line) "y") |
x"y"z | (macrocall @x_str (line) "y" "z") |
"x = $x" | (string "x = " x) |
`a b c` | (macrocall @cmd (line) "a b c") |
Dokümantasyon dizesi sözdizimi:
"some docs"
f(x) = xparses as (macrocall (|.| Core '@doc) (line) "bazı belgeler" (= (call f x) (block x))).
Imports and such
| Input | AST |
|---|---|
import a | (import (. a)) |
import a.b.c | (import (. a b c)) |
import ...a | (import (. . . . a)) |
import a.b, c.d | (import (. a b) (. c d)) |
import Base: x | (import (: (. Base) (. x))) |
import Base: x, y | (import (: (. Base) (. x) (. y))) |
export a, b | (export a b) |
using aynı temsile sahiptir import, ancak :import yerine :using ifade başlığı ile.
Numbers
Julia, birçok şematik uygulamadan daha fazla sayı türünü destekler, bu nedenle tüm sayılar AST'de doğrudan şematik sayılar olarak temsil edilmez.
| Input | AST |
|---|---|
11111111111111111111 | (macrocall @int128_str nothing "11111111111111111111") |
0xfffffffffffffffff | (macrocall @uint128_str nothing "0xfffffffffffffffff") |
1111...many digits... | (macrocall @big_str nothing "1111....") |
Block forms
Bir ifade bloğu (block stmt1 stmt2 ...) olarak ayrıştırılır.
Eğer ifadesi:
if a
b
elseif c
d
else
e
endparses as:
(if a (block (line 2) b)
(elseif (block (line 3) c) (block (line 4) d)
(block (line 6 e))))Bir while döngüsü (while koşul gövde) olarak ayrıştırılır.
Bir for döngüsü (for (= var iter) body) şeklinde ayrıştırılır. Eğer birden fazla yineleme spesifikasyonu varsa, bunlar bir blok olarak ayrıştırılır: (for (block (= v1 iter1) (= v2 iter2)) body).
break ve continue 0-argüman ifadeleri olarak (break) ve (continue) şeklinde ayrıştırılır.
let, (let (= var val) body) veya (let (block (= var1 val1) (= var2 val2) ...) body) olarak ayrıştırılır, tıpkı for döngüleri gibi.
Temel bir fonksiyon tanımı (function (call f x) body) olarak ayrıştırılır. Daha karmaşık bir örnek:
function f(x::T; k = 1) where T
return x+1
endparses as:
(function (where (call f (parameters (kw k 1))
(:: x T))
T)
(block (line 2) (return (call + x 1))))Tür tanımı:
mutable struct Foo{T<:S}
x::T
endparses as:
(struct true (curly Foo (<: T S))
(block (line 2) (:: x T)))İlk argüman, türün değiştirilebilir olup olmadığını belirten bir boole'dir.
try blokları (try try_block var catch_block finally_block) olarak ayrıştırılır. Eğer catch sonrası bir değişken yoksa, var #f olur. Eğer finally ifadesi yoksa, o zaman son argüman mevcut değildir.
Quote expressions
Julia kaynak sözdizimi biçimleri kod alıntısı için (quote ve :( )) $ ile interpolasyonu destekler. Lisp terminolojisinde, bu onların aslında "arka alıntı" veya "yarı alıntı" biçimleri olduğu anlamına gelir. Dahili olarak, interpolasyonsuz kod alıntısı için de bir ihtiyaç vardır. Julia'nın şeması kodunda, interpolasyonsuz alıntı, inert ifade başlığı ile temsil edilir.
inert ifadeleri Julia QuoteNode nesnelerine dönüştürülür. Bu nesneler, herhangi bir türdeki tek bir değeri sarar ve değerlendirildiğinde basitçe o değeri döndürür.
Bir quote ifadesinin argümanı bir atom olduğunda, bu da bir QuoteNode'a dönüştürülür.
Line numbers
Kaynak konum bilgisi (satır satır_num dosya_adı) şeklinde temsil edilir; burada üçüncü bileşen isteğe bağlıdır (ve mevcut satır numarası değiştiğinde, ancak dosya adı değişmediğinde, atlanır).
Bu ifadeler Julia'da LineNumberNode olarak temsil edilir.
Macros
Makro hijyeni, escape ve hygienic-scope baş çiftinin ifadesiyle temsil edilir. Bir makro genişletmesinin sonucu, yeni kapsamın sonucunu temsil etmek için otomatik olarak (hygienic-scope block module) içine sarılır. Kullanıcı, çağırandan kodu içermek için içine (escape block) ekleyebilir.
Lowered form
Düşürülmüş form (IR), derleyici için daha önemlidir, çünkü tür çıkarımı, iç içe geçme gibi optimizasyonlar ve kod üretimi için kullanılır. Ayrıca, insan için daha az belirgindir, çünkü girdi sözdiziminin önemli bir yeniden düzenlenmesinden kaynaklanır.
Aşağıdaki veri türleri, Symbol ve bazı sayı türlerine ek olarak, düşürülmüş formda mevcuttur:
İfadeheadalanı ile belirtilen bir düğüm türüne ve alt ifadelerin birVector{Any}olduğu birargsalanına sahiptir. Yüzey AST'sinin neredeyse her parçası birExprile temsil edilirken, IR yalnızca sınırlı sayıdaExprkullanır, çoğunlukla çağrılar ve bazı yalnızca üst düzey formlar için.SlotNumarasıArgümanları ve yerel değişkenleri ardışık numaralandırma ile tanımlar. Slot indeksini veren bir tam sayı değerine sahip
idalanı vardır. Bu slotların türleri,CodeInfonesnelerininslottypesalanında bulunabilir.ArgümanSlotNumberile aynı, ancak yalnızca optimizasyondan sonra görünür. Referans verilen slotun, kapsayıcı fonksiyonun bir argümanı olduğunu belirtir.KodBilgisiBir dizi ifadenin IR'sini sarar.
codealanı, yürütülecek ifadelerin bir dizisidir.GotoNodeKoşulsuz dal. Argüman, atlanacak kod dizisindeki bir indeks olarak temsil edilen dal hedefidir.
GotoIfNotKoşullu dal. Eğer
condalanı yanlış olarak değerlendirilirse,destalanı tarafından tanımlanan indekse gider.ReturnNodeArgümanını (
valalanı) kapsayıcı fonksiyonun değeri olarak döndürür. Eğervalalanı tanımsızsa, bu ulaşılmaz bir ifadeyi temsil eder.AlıntıDüğümüBir değeri veri olarak referans almak için sarar. Örneğin,
f() = :afonksiyonu, sembolanın döndürülmesi içinvaluealanı sembolaolan birQuoteNodeiçerir, böylece sembol kendisi değerlendirilmek yerine döndürülür.KüreselReferansModül
modiçindeki global değişkenname'e atıfta bulunur.SSAValueBir derleyici tarafından eklenen ardışık numaralandırılmış (1'den başlayarak) statik tek atama (SSA) değişkenini ifade eder. Bir
SSAValue'ın numarası (id), temsil ettiği ifadenin değerinin kod dizisi indeksidir.YeniDeğişkenDüğümüBir değişkenin (slot) oluşturulduğu bir noktayı işaret eder. Bu, bir değişkenin tanımsız olarak sıfırlanması etkisini yaratır.
Expr types
Bu semboller Expr alanının head kısmında küçük harflerle görünmektedir.
aramaFonksiyon çağrısı (dinamik dağıtım).
args[1]çağrılacak fonksiyondur,args[2:end]ise argümanlardır.çağırFonksiyon çağrısı (statik yönlendirme).
args[1]çağrılacak MethodInstance,args[2:end]ise argümanlardır (çağrılan fonksiyonargs[2]'de bulunmaktadır).statik_parametreStatik bir parametreyi indeksle referans al.
=Atama. IR'de, ilk argüman her zaman bir
SlotNumberveya birGlobalRef'dir.yöntemBir genel işlevine bir yöntem ekler ve gerekirse sonucu atar.
1-argümanlı bir formu ve 3-argümanlı bir formu vardır. 1-argümanlı form,
function foo endsözdiziminden kaynaklanır. 1-argümanlı formda, argüman bir semboldür. Eğer bu sembol mevcut kapsamda bir işlevi zaten adlandırıyorsa, hiçbir şey olmaz. Eğer sembol tanımsızsa, yeni bir işlev oluşturulur ve sembol tarafından belirtilen tanımlayıcıya atanır. Eğer sembol tanımlı ama bir işlevi adlandırmıyorsa, bir hata oluşur. "Bir işlevi adlandırmak" tanımının, bağlamanın sabit olduğu ve bir tekil tür nesnesine atıfta bulunduğu anlamına gelir. Bunun nedeni, bir tekil türün örneğinin, metoda eklenmesi gereken türü benzersiz bir şekilde tanımlamasıdır. Türün alanları olduğunda, metodun örneğe mi yoksa türüne mi eklendiği net olmayacaktır.3-argüman biçiminin aşağıdaki argümanları vardır:
args[1]Bir işlev adı veya bilinmiyorsa ya da gereksizse
nothing. Eğer bir sembol ise, o zaman ifade ilk olarak yukarıdaki 1-argüman biçiminde davranır. Bu argüman o andan itibaren göz ardı edilir. Sadece türle katı bir şekilde yöntemler eklendiğindenothingolabilir,(::T)(x) = x, veya mevcut bir işleve bir yöntem eklenirken,MyModule.f(x) = x.args[2]Bir
SimpleVectorargüman türü verisi.args[2][1], argüman türlerinin birSimpleVector'ıdır veargs[2][2], metodun statik parametrelerine karşılık gelen tür değişkenlerinin birSimpleVector'ıdır.args[3]Bir
CodeInfo, metodun kendisi için. "Kapsam dışı" metod tanımları için (farklı kapsamlar içinde tanımlı metodları olan bir işleve bir metod eklemek) bu, bir:lambdaifadesine değerlendiren bir ifadedir.
struct_typeYeni bir
structtanımlayan 7-argüman ifadesi:args[1]struct'un adıargs[2]Bir
callifadesi, parametrelerini belirterek birSimpleVectoroluşturur.args[3]Bir
callifadesi, alan adlarını belirterek birSimpleVectoroluşturur.args[4]Bir
Symbol,GlobalRefveyaExpr, süper türü belirtir (örneğin,:Integer,GlobalRef(Core, :Any)veya:(Core.apply_type(AbstractArray, T, N)))args[5]Bir
callifadesi, alan türlerini belirterek birSimpleVectoroluşturur.args[6]Bir Bool,
mutableise doğru.args[7]Başlatmak için argüman sayısı. Bu, alan sayısı veya bir iç yapıcı'nın
newifadesiyle çağırdığı minimum alan sayısı olacaktır.
soyut_türYeni bir soyut tür tanımlayan 3-argümanlı bir ifade. Argümanlar,
struct_typeifadelerinin 1, 2 ve 4 numaralı argümanlarıyla aynıdır.ilkel_türYeni bir ilkel tür tanımlayan 4-argümanlı bir ifade. Argümanlar 1, 2 ve 4
struct_typeile aynıdır. Argüman 3, bit sayısını belirtir.Julia 1.5 struct_type,abstract_typeveprimitive_typeJulia 1.5'te kaldırıldı ve yeni yerleşik fonksiyonlara yapılan çağrılarla değiştirildi.küreselKüresel bir bağlama bildirir.
constBir (küresel) değişkeni sabit olarak tanımlar.
yeniYeni bir yapı benzeri nesne ayırır. İlk argüman türdür.
newsahte işlevi buna indirgenir ve tür her zaman derleyici tarafından eklenir. Bu, tamamen dahili bir özelliktir ve herhangi bir kontrol yapmaz. Rastgelenewifadelerini değerlendirmek kolayca segfault'a neden olabilir.splatnewnewile benzer, ancak alan değerleri tek bir demet olarak geçilir.newbirinci sınıf bir fonksiyon olsaydı,splat(new)ile benzer şekilde çalışır, bu yüzden bu ismi almıştır.tanımlıExpr(:isdefined, :x)mevcut kapsamdax'in zaten tanımlanıp tanımlanmadığını belirten bir Bool döndürür.the_exceptioncatchbloğunun içindeki yakalanan istisnayı,jl_current_exception(ct)tarafından döndürüldüğü gibi verir.girişBir istisna işleyicisi (
setjmp) girer.args[1], hata durumunda atlanacak yakalama bloğunun etiketidir.pop_exceptiontarafından tüketilen bir token verir.izinPop istisna yöneticileri.
args[1]çıkarılacak yöneticilerin sayısıdır.pop_exceptionYakalayıcı bloğundan çıkarken, mevcut istisnaların yığınını ilişkili
enterdurumuna geri döndürün.args[1], ilişkilienter'dan gelen belirteci içerir.Julia 1.1 pop_exceptionJulia 1.1'de yenidir.içerideKontroller, sınır kontrollerini açma veya kapama. Bir yığın tutulur; bu ifadenin ilk argümanı doğru veya yanlış ise (
doğru, sınır kontrollerinin devre dışı olduğu anlamına gelir), yığına eklenir. İlk argüman:popise, yığın çıkarılır.boundscheck@inboundsile işaretlenmiş bir kod bölümüne yerleştirildiğindefalsedeğerine sahiptir, aksi takdirdetruedeğerine sahiptir.loopinfoBir döngünün sonunu işaret eder.
LowerSimdLoop'a, ya@simdifadesinin iç döngüsünü işaretlemek ya da LLVM döngü geçişlerine bilgi iletmek için geçirilen meta verileri içerir.copyastKısmi alıntı uygulamasının bir parçası. Argüman, basitçe kopyalanıp çalışma zamanında döndürülen bir yüzey sözdizimi AST'sidir.
metaMeta verisi.
args[1]genellikle meta verisinin türünü belirten bir semboldür ve geri kalan argümanlar serbest biçimdedir. Aşağıdaki meta veri türleri yaygın olarak kullanılmaktadır::inlineve:noinline: Inline ipuçları.
yabancı çağrıStatik olarak hesaplanan
ccallbilgileri için konteyner. Alanlar şunlardır:args[1]: isimYabancı işlev için ayrıştırılacak ifade.
args[2]::Type: RTİçinde bulunduğu metod tanımlandığında statik olarak hesaplanan (literal) dönüş türü.
args[3]::SimpleVector(of Types) : ATİçinde bulunduğu metod tanımlandığında statik olarak hesaplanan (literal) argüman türlerinin vektörü.
args[4]::Int: nreqBir varargs fonksiyon tanımı için gereken argüman sayısı.
args[5]::QuoteNode{Symbol}: çağrı konvansiyonuÇağrı için çağrı düzeni.
args[6:5+length(args[3])]: argümanlarTüm argümanlar için değerler (her birinin türü args[3] içinde verilmiştir).
args[6+length(args[3])+1:end]: gc-kökleriÇağrı süresi boyunca gc-rooted olması gerekebilecek ek nesneler. Bunların nereden türetildiği ve nasıl işlendiği için Working with LLVM adresine bakın.
yeni_opak_kapamaYeni bir opak kapanış oluşturur. Alanlar şunlardır:
args[1]: imzaOpak kapama işlevinin imzası. Opak kapamalar dağıtıma katılmaz, ancak girdi türleri kısıtlanabilir.
args[2]: isvaKapatmanın varargs'ı kabul edip etmediğini belirtir.
args[3]: lbÇıktı türü için alt sınır. (Varsayılan
Union{})args[4]: ubÇıktı türü için üst sınır. (Varsayılan
Any)args[5]: yöntemGerçek yöntem bir
opaque_closure_methodifadesi olarak.args[6:end]: yakalarOpak kapama tarafından yakalanan değerler.
Julia 1.7 Opak kapalılar Julia 1.7'de eklendi.
Method
Tek bir yöntemin paylaşılan meta verilerini tanımlayan benzersiz bir kapsayıcı.
isim,modül,dosya,satır,imzaBilgisayar ve insan için yöntemi benzersiz şekilde tanımlayan meta veriler.
belirsizBu yöntemle belirsiz olabilecek diğer yöntemlerin önbelleği.
uzmanlıklarBu Yöntem için oluşturulan tüm MethodInstance'ların önbelleği, benzersizliği sağlamak için kullanılır. Benzersizlik, özellikle artımlı ön derleme ve yöntem geçersiz kılma takibi için verimlilik açısından gereklidir.
kaynakOrijinal kaynak kodu (varsa, genellikle sıkıştırılmış).
üreteçBelirli bir yöntem imzası için özel kaynak almak üzere çalıştırılabilen bir çağrılabilir nesne.
köklerAST'ye interpolasyon yapılmış, AST'nin sıkıştırılması, tür çıkarımı veya yerel kod üretimi için gerekli olan AST dışındaki nesnelere işaretler.
nargs,isva,called,is_for_opaque_closure,Açıklayıcı bit alanları bu metodun kaynak kodu için.
birincil_dünyaBu Yöntemi "sahip" olan dünya yaşı.
MethodInstance
Benzersiz bir kapsayıcı, bir Yöntem için tek bir çağrılabilir imzayı tanımlar. Özellikle Proper maintenance and care of multi-threading locks bu alanları güvenli bir şekilde nasıl değiştireceğiniz hakkında önemli detaylar için.
specTypesBu MethodInstance için birincil anahtar. Eşsizlik,
def.specializationsaraması ile garanti edilir.defBu işlevin tanımladığı
Method'in bir özel versiyonu. Ya da bu, bir Modül içinde genişletilmiş üst düzey bir Lambda ise ve bir Method'un parçası değilse, birModule.sparam_valsspecTypesiçindeki statik parametrelerin değerleri.Method.unspecialized'dekiMethodInstanceiçin bu, boş birSimpleVector'dır. AncakMethodTableönbelleğinden alınan bir çalışma zamanıMethodInstanceiçin bu her zaman tanımlı ve indekslenebilir olacaktır.belirlenmemişÜst düzey bir thunk için sıkıştırılmamış kaynak kodu. Ayrıca, üretilen bir fonksiyon için, kaynak kodunun bulunabileceği birçok yerden biridir.
geri kenarlarÖnceden tanımlanmış yöntemlerin tanımları sonrasında gerekli olabilecek artımlı yeniden analiz/yeniden derleme çalışmalarının verimli takibi için önbellek bağımlılıklarının ters listesini saklıyoruz. Bu, bu
MethodInstance'a olası bir çağrı içerecek şekilde çıkarılan veya optimize edilen diğerMethodInstance'ların bir listesini tutarak çalışır. Bu optimizasyon sonuçları,cacheiçinde bir yerde saklanmış olabilir veya sabit yayılımı gibi önbelleğe almak istemediğimiz bir şeyin sonucu olabilir. Bu nedenle, burada çeşitli önbellek girişlerine tüm bu geri kenarları birleştiriyoruz (her durumda, max_world için bir sentinel değeri ile yalnızca bir uygulanabilir önbellek girişi vardır).önbellekBu şablon örneğini paylaşan
CodeInstancenesnelerinin önbelleği.
CodeInstance
defBu önbellek girişinin türetildiği
MethodInstance.sahipBu
CodeInstance'ın sahibini temsil eden bir token. Eşleşmek içinjl_egalkullanılacak.rettype/rettype_constspecFunctionObjectalanı için çıkarılan dönüş türü, genellikle işlevin genel olarak hesaplanan dönüş türü ile de aynıdır.çıkarılanBu işlevin çıkarılan kaynağının bir önbelleğini içerebilir veya
rettype'in çıkarıldığını belirtmek için sadecenothingolarak ayarlanmış olabilir.ftprGenel jlcall giriş noktası.
jlcall_apifptr'ı çağırırken kullanılacak ABI. Bazı önemli olanlar şunlardır:- 0 - Henüz derlenmedi
- 1 -
JL_CALLABLEjl_value_t *(*)(jl_function_t *f, jl_value_t *args[nargs], uint32_t nargs) - 2 - Sabit (değer
rettype_constiçinde saklanır) - 3 - Statik parametreler ile iletilen
jl_value_t *(*)(jl_svec_t *sparams, jl_function_t *f, jl_value_t *args[nargs], uint32_t nargs) - 4 - Yorumlayıcıda çalıştır
jl_value_t *(*)(jl_method_instance_t *meth, jl_function_t *f, jl_value_t *args[nargs], uint32_t nargs)
min_dünya/max_dünyaBu yöntem örneğinin çağrılabileceği dünya yaşları aralığı. Eğer max_world özel token değeri
-1ise, değer henüz bilinmiyor. Yeniden düşünmemizi gerektiren bir geri kenar ile karşılaşana kadar kullanılmaya devam edilebilir.
CodeInfo
A (genellikle geçici) kaynak kodunu tutmak için kullanılan bir konteyner.
kodBir
Anydizisi ifadelerislotnamesBir dizi sembol, her bir slot (argüman veya yerel değişken) için isimler verir.
slotflagsBir bit bayrağı olarak temsil edilen slot özelliklerinin
UInt8dizisi:- 0x02 - atanmış (bu değişkenin solda hiçbir atama ifadesi yoksa yalnızca yanlış)
- 0x08 - kullanıldı (slotun herhangi bir okuma veya yazma işlemi varsa)
- 0x10 - statik olarak bir kez atanmış
- 0x20 - atanmadan önce kullanılabilir. Bu bayrak yalnızca tür çıkarımından sonra geçerlidir.
ssavaluetypesYa bir dizi ya da bir
Int.Eğer bir
Intise, fonksiyondaki derleyici tarafından eklenen geçici konumların sayısını verir (codedizisinin uzunluğu). Eğer bir dizi ise, her konum için bir tür belirtir.ssaflagsİfadelerdeki her bir ifade için 32 bitlik bayraklar. Daha fazla ayrıntı için julia.h dosyasındaki
jl_code_info_ttanımına bakın.linetableBir kaynak konum nesneleri dizisi
codelocslinetableile ilişkili her ifade için konumu belirten bir dizi tam sayı indeksi.
Opsiyonel Alanlar:
slottypesSlotlar için bir türler dizisi.
rettypeDüşünülen döndürme türü, düşürülmüş formun (IR) varsayılan değeri
Any'dir.çıkarım_sınır_heuristikleri_için_yöntemmethod_for_inference_heuristics, gerektiğinde çıkarım sırasında verilen yöntemin jeneratörünü genişletecektir.ebeveynBu nesneyi "sahiplenen"
MethodInstance(varsa).kenarlarıYöntem örneklerinin geçersiz kılınması gereken ileri kenarları ilet.
min_world/max_worldBu kodun çıkarıldığı zaman geçerli olduğu dünya yaşları aralığı.
Boolean özellikleri:
çıkarılanBu, tür çıkarımı tarafından üretilip üretilmediği.
inlineableBu, iç içe geçme için uygun olup olmadığını belirleyip belirlememek.
inboundları_yayBu,
@boundscheckbloklarını atlamak amacıyla iç içe geçildiğinde@inbounds'un yayılıp yayılmaması gerektiğini belirler.
UInt8 ayarları:
constprop- 0 = sezgisel kullanın
- 1 = agresif
- 2 = hiçbiri
saflık5 bit bayrağından oluşturulmuştur:- 0x01 << 0 = bu yöntem tutarlı bir şekilde döndürmeyi veya sona ermeyi garanti eder (
:consistent) - 0x01 << 1 = bu yöntem dışsal olarak anlamsal olarak görünür yan etkilerden (
:effect_free) arındırılmıştır. - 0x01 << 2 = bu yöntem bir istisna fırlatmayacağı garanti edilir (
:nothrow) - 0x01 << 3 = bu yöntem sonlanacağı garanti edilir (
:terminates_globally) - 0x01 << 4 = bu yöntemdeki sözdizimsel kontrol akışının sona ereceği garanti edilmiştir (
:terminates_locally)
Base.@assume_effectsiçin daha fazla ayrıntı için belgeleri inceleyin.- 0x01 << 0 = bu yöntem tutarlı bir şekilde döndürmeyi veya sona ermeyi garanti eder (