TypeScript, JS'ye dönüşür. Sonra, "daha az" (isteğe bağlı) ve bir dağıtım yapma sürecinde başka neler var? Ama bunun gibi hiçbir şeyin (afaik) "derleme" ile ilgisi yoktur. Her şey paketlenir ve büyük ölçüde optimize edilir, ancak aslında derlenmez, değil mi?
Derleme , A dilinde yazılmış bir programı, B dilinde yazılmış anlamsal olarak eşdeğer bir programa dönüştürmek anlamına gelir, öyle ki derlenmiş programı B dili kurallarına göre değerlendirmek (örneğin, onu B için bir tercümanla yorumlamak ) aynı sonucu verir ve Orijinal programı A dili kurallarına göre değerlendirmekle aynı yan etkiler (örneğin, onu A için bir tercümanla yorumlamak ).
Derleme basitçe bir programı A dilinden B diline çevirmek anlamına gelir . Tüm anlamı bu. (Ayrıca, A ve B'nin aynı dilde olmasının tamamen mümkün olduğuna dikkat edin .)
Bazı durumlarda, A ve B'nin ne olduğuna ve derleyicinin ne yaptığına bağlı olarak belirli türdeki derleyiciler için daha özel isimlere sahibiz :
- eğer bir derleme dil olarak algılanan ve B makine dili olarak algılanan, o zaman bir çağrı montajcı ,
- eğer bir makine dili olarak algılanan ve B derleme dil olarak algılanan, o zaman bunun diyoruz disassembler ,
- eğer bir daha düşük seviyeli olarak algılanan B , daha sonra bunu bir çağrı Decompiler ,
- eğer A ve B aynı dil ve ortaya çıkan program, bir şekilde daha hızlı veya daha hafif olan, o zaman bir çağrı iyileştirici ,
- eğer A ve B aynı dilleri ve elde programı küçüktür, o zaman bu bir çağrı minifier ,
- eğer A ve B aynı dilleri ve elde programı daha az okunabilir, o zaman bir çağrı obfuscator ,
- eğer A ve B soyutlama kabaca aynı seviyede olması algılanmaktadır, o zaman diyoruz transpiler ve
- eğer A ve B soyutlama kabaca aynı seviyede olarak algılanan ve ortaya çıkan programı korur, yorum biçimlendirme ve programcı niyet böyle edilir o zaman biz diyoruz, orijinal program olarak aynı şekilde sonuçlanan programını korumak mümkün olduğunu bir yeniden mühendislik aracı .
Ayrıca, eski kaynakların "derleme" ve "derleyici" yerine "çeviri" ve "çevirmen" terimlerini kullanabileceğini unutmayın. Örneğin, C "çeviri birimleri" hakkında konuşuyor.
Ayrıca "dil işlemcisi" terimiyle de karşılaşabilirsiniz. Bu, tanıma bağlı olarak bir derleyici, yorumlayıcı veya hem derleyici hem de yorumlayıcı anlamına gelebilir.
Javascript kendisi hala yorumlanıyor, değil mi?
JavaScript bir dildir. Diller bir dizi mantıksal kural ve kısıtlamadır. Diller yorumlanmaz veya derlenmez. Diller sadece vardır .
Derleme ve yorumlama, bir derleyici veya yorumlayıcının özellikleridir (ha!). Her dil bir derleyici ile uygulanabilir ve her dil bir yorumlayıcı ile uygulanabilir. Birçok dilde hem derleyici hem de yorumlayıcı bulunur. Birçok modern yüksek performanslı yürütme motorunda hem en az bir derleyici hem de en az bir yorumlayıcı bulunur.
Bu iki terim, farklı soyutlama katmanlarına aittir. İngilizce yazılmış bir dil olsaydı, "yorumlanmış dil" bir tür hatası olurdu.
Ayrıca bazı dillerin yorumlayıcı veya derleyici olmadığına da dikkat edin. Hiç uygulaması olmayan diller var. Yine de bunlar diller ve bunlara program yazabilirsiniz. Onları çalıştıramazsın.
Ayrıca, her şey de yorumlanır notu o noktada : Bir şeyi yürütmek istiyorsanız, gereken yorumlamak. Derleme sadece kodu bir dilden diğerine çevirir. Çalıştırmıyor. Yorumlama onu çalıştırır. (Bazen, donanımda bir yorumlayıcı uygulandığında, buna "CPU" diyoruz, ancak yine de bir yorumlayıcıdır.)
Örnek olay: Şu anda var olan her bir ana akım JavaScript uygulamasının bir derleyicisi vardır.
V8, saf bir derleyici olarak başladı: JavaScript'i doğrudan orta düzeyde optimize edilmiş yerel makine koduna derledi. Daha sonra ikinci bir derleyici eklendi. Şimdi, iki derleyici var: orta düzeyde optimize edilmiş kod üreten ancak derleyicinin kendisi çok hızlı ve az RAM kullanan hafif bir derleyici. Bu derleyici ayrıca derlenen koda profil oluşturma kodunu da ekler. İkinci derleyici, daha ağır, daha yavaş, daha pahalı bir derleyicidir, ancak çok daha sıkı, çok daha hızlı kod üretir. Ayrıca, dinamik optimizasyon kararları almak için ilk derleyici tarafından enjekte edilen profil oluşturma kodunun sonuçlarını kullanır. Ayrıca, ikinci derleyiciyi kullanarak hangi kodun yeniden derleneceğine karar, bu profil oluşturma bilgisine göre verilir. İşin içinde hiçbir zaman bir tercüman bulunmadığını unutmayın. V8 asla yorumlamaz, her zaman derler. Yapmaz hatta bir tercüman içermelidir. (Aslında bugünlerde öyle olduğuna inanıyorum, ilk iki yinelemeyi açıklıyorum.)
SpiderMonkey, JavaScript'i daha sonra yorumladığı SpiderMonkey bayt koduna derler. Yorumlayıcı aynı zamanda kodun profilini çıkarır ve daha sonra en sık çalıştırılan kod bir derleyici tarafından yerel makine koduna derlenir. Dolayısıyla, SpiderMonkey iki derleyici içerir : biri JavaScript'ten SpiderMonkey bayt koduna ve diğeri SpiderMonkey bayt kodundan yerel makine koduna.
Neredeyse tüm JavaScript yürütme motorları (V8 hariç), JavaScript'i bayt koduna derleyen bir AOT derleyicisinin bu modelini ve bu bayt kodunu yorumlama ve derleme arasında geçiş yapan karma modlu bir motoru izler.
Bir yorum yazdın:
Makine kodunun işin içinde olduğunu düşünüyordum.
"Makine kodu" ne anlama geliyor?
Bir insanın makine dili nedir, diğerinin orta dili ve tersi nedir? Örneğin, doğal olarak bu tür bir CPU, JVM bayt kodu yürütebilir işlemciler bulunmaktadır JVM bayt kodu olan özgün bir makine kodu. O x86 makine kodunu çalıştırdığınızda Ve x86 makine kodu için tercümanlar vardır edilir bayt kodu yorumlanır.
Java ile yazılmış JPC adlı bir x86 yorumlayıcısı var. Yerel bir JVM CPU üzerinde çalışan JPC üzerinde x86 makine kodunu çalıştırırsam… bayt kodu hangisidir ve yerel kod hangisidir? X86 makine kodunu JavaScript'e derlersem (evet, bunu yapabilen araçlar var) ve bunu telefonumdaki (ARM CPU'lu) bir tarayıcıda çalıştırırsam, bayt kodu ve yerel makine kodu hangisidir? Ya derlediğim program bir SPARC öykünücüsüyse ve onu SPARC kodunu çalıştırmak için kullanıyorsam?
O Not her dil soyut bir makineyi tetiklediğini ve makine için makine dilidir. Dolayısıyla, her dil (çok yüksek seviyeli diller dahil) yerel makine kodudur. Ayrıca her dil için bir tercüman yazabilirsiniz. Dolayısıyla, her dil (x86 makine kodu dahil) yerel değildir.