Derleme ve Aktarma


92

Farkı ararken şu tanımlarla karşılaştım:

Derleme , bir dilde yazılmış kaynak kodunu alıp diğerine dönüştürmek için kullanılan genel terimdir.

Transpiling , bir dilde yazılmış kaynak kodunu alıp benzer bir soyutlama seviyesine sahip başka bir dile dönüştürmek için kullanılan belirli bir terimdir.

Soyutlamanın ne olduğunu anlıyorum.

Fakat yukarıdaki tanımda "benzer soyutlama düzeyi" ne anlama geliyor? Ve bir dilde soyutlama düzeyini nasıl buluruz?



Yanıtlar:


142

Yukarıda alıntı yaptığınız tanım, yeni başlayanların tamamen anlayamayacakları kadar geneldir ve bu yüzden pratikte gördüğümüz bir şeyi basitleştirmeme izin verin.

Derleyici: Bir dilde yazılmış kaynak kodunu alan ve başka bir dilde bir (veya birçok) çıktı dosyası üreten bir programı tanımlamak için kullanılan genel bir terimdir. Pratikte bu terimi çoğunlukla C kodunu girdi olarak alan ve çıktı olarak ikili çalıştırılabilir (makine kodu) üreten gcc gibi bir derleyiciyi tanımlamak için kullanırız.

Aktarıcılar , kaynaktan kaynağa derleyiciler olarak da bilinir. Yani özünde, bir kaynak kod dosyasını alıp başka bir dilde başka bir kaynak kod dosyasına veya aynı dilin farklı bir sürümüne dönüştüren bir derleyici alt kümesidir . Çıktı genellikle bir insan tarafından anlaşılabilir. Bu çıktının makinede çalışabilmesi için yine de bir derleyici veya yorumlayıcıdan geçmesi gerekir.

Bazı aktarıcı örnekleri:

  1. Emscripten : Transpiles C / C ++ 'dan JavaScript'e
  2. Babel : ES5'e ES6 + kodu Transpiles (ES6 ve ES5, JavaScript dilinin farklı sürümleri veya nesilleridir)

Şimdi, "benzer düzeyde soyutlama" derken ne demek istiyorlar: Bir kaynak dosyaya derler / aktarır dediğim gibi, assembly dilinin de bir kaynak dosya olduğu ve dolayısıyla gcc'nin aynı zamanda bir aktarıcı olduğu iddia edilebilir. Dolayısıyla, bu argüman, bu benzer soyutlama düzeyinin geçersiz kıldığı şeydir.

Dilleri alt, orta ve daha yüksek düzeyde kategorize etme fikri, makinenin / mimarinin gerçek çalışmasından sağladıkları soyutlama düzeyine dayanmaktadır.

Assembly gibi daha düşük seviyeli diller işlemci mimarisine çok yakındır, yani farklı işlemciler için farklı talimatlara sahiptir. C / C ++ / Java / JavaScript, tüm bunları soyutlayarak daha fazla soyutlama sağlayın.

Yani, bir transpiler, bu soyutlama açısından başladığınız dile daha yakın olan (veya alt-orta-üst düzey dil merdiveninde o dilin seviyesine daha yakın olan) bir dile derler.

Bu yardımcı olur umarım!


9
"Aktarıcılara bazı örnekler:" --- babel kendisine bir derleyici diyor. Aktarıcılar ve derleyiciler arasındaki ayrım gerçekten yapaydır.
zerkms

13
@zerkms Dediğim gibi, aktarıcılar derleyicilerin bir alt kümesidir.
tapananand

1
Bir şey eklemek istiyorum, burada doğal dilden bahsediyoruz. Bu nedenle belirsiz tanımlar beklenmektedir. Bir aktarıcının çıktısının "okuma kolaylığının" daha öncekine benzer olmasını beklerken, bir derleyici işleri okumayı zorlaştırır. Dolayısıyla Webpack / npm bir derleyicidir, çıktısını okumak istemezsiniz. (En azından, örneğin .vue dosyaları için "Yükleyicileri" eklediğinizde.
Samuel Åslund

1
Görüş: Tanımların şöyle olması gerektiğini düşünüyorum: Derleme: dil -> alt düzey dil. Transpilasyon: dil -> aynı seviyede dil.
Deji

3
@Deji Aynı seviyede dil değil, benzer bir soyutlama seviyesinde bir dil.
tapananand

33

İşte yanıtlamanın bir tür açıklayıcı yolu

Bu örnek olarak soyutlama katmanlarını düşünürseniz:

(1) CPU-level (actual logic gates on the CPU)
(2)machine code
(3)assembly code
(4)[C/C++, JVM/bytecode]
(5)[JavaScript, Python]

Bir derleyici daha düşük bir seviyeye (daha düşük sayı) gider. Bir aktarıcı, bir dilden (veya bir dilin sürümünden) diğerine aynı numaradan geçer.


1
Merak ediyorum, bu "soyutlama seviyeleri" listesi nereden geldi?
zerkms

Sadece rastgele açıklayıcı örnekler, ilk ikisinin biraz duygusal tbh olduğunu biliyorum, ancak daha uzun bir liste istedim: P
Araymer

2
Hoşuma gitti ve bunun gibi "resmi" bir sınıflandırma olsaydı gerçekten harika olurdu. Çünkü onsuz bir aracı (bir çevirmen) bir veya başka bir kategoriye koymak zor. Örneğin: javacbir derleyici ya da değil.
zerkms

2

Çoğunlukla tapanan'a katılıyorum ve cevap veriyorum, ama ...


tanım

Kelimeler "yaratılmıştır", bu yüzden bir amaca hizmet ederler. Ve bu da zamanla değişir.

Şimdi, kodu, bir derleyicinin yapabileceği, kaynağa "daha benzer" başka bir koda çeviren bir derleyici belirtmek için transpiler kullanma eğilimindeyiz. Ve her ikisi de çoğunlukla aynı bağlamda bahsedildiğinde ayırt etmek için kullanılır (yine çoğunlukla bir transpile dilinin en az bir kez daha derlenmesi gerekeceğini ima eder)


örnekler

Yani her şey çok özneldir. Bu yazının yazıldığı sırada:

  • Java dünyasından geldiğimde, ortaya çıkan kodun orijinal koddan daha verimli olmadığını tasvir etmek için CoffeeScript / TypeScript aktarıcılarını arayabilirim.
  • CoffeScript belgeleri bunun bir derleyici olduğunu ve babel'in bir aktarıcı olduğunu söylüyor. İsteyenler, CoffeeScript'in çok benzer olmasına rağmen Javascript olmadığını söylüyor. En azından onun bir versiyonu değil, çünkü Babel'in ürettiği bu.
  • Babel kendisine derleyici diyor.

Fazit

Yani transpile şu anda artık çok nadiren kullanılıyor ve sadece iki derleyiciyi birbirinden ayırmak için.

Derleme bundan çok daha karmaşık olduğundan (aynı / daha yüksek / daha düşük dil, sürüm vb.) Ve kelime artık kullanışlı görünmediğinden ("aktarıcılar" artık her yerde mevcut)


2

Örn: TypeScript (tür güvenli denetimli JavaScript'in bir Microsoft üst kümesi), farklı tarayıcı türlerinde çalışabilen JavaScript koduna dönüştürür.

https://en.wikipedia.org/wiki/Microsoft_TypeScript "Microsoft TypeScript, Microsoft tarafından geliştirilen ve sürdürülen açık kaynaklı bir programlama dilidir. JavaScript'in sıkı bir sözdizimsel üst kümesidir ve dile isteğe bağlı statik yazım ekler.

TypeScript, büyük uygulamaların ve JavaScript'e dönüştürmenin geliştirilmesi için tasarlanmıştır. [5] TypeScript, JavaScript'in bir üst kümesi olduğundan, mevcut JavaScript programları da geçerli TypeScript programlarıdır. TypeScript, hem istemci tarafında hem de sunucu tarafında (Node.js) yürütme için JavaScript uygulamaları geliştirmek üzere kullanılabilir. "


"Typescript derleyici" (veya tsc) aracı kendi adlandırma typescript olduğunu ima yoktur derlenmiş değil transpiled ... henüz alet temel donanım wrt soyutlama aynı düzeyde olan Javascript, için typescript dönüştürür. TypeScript derlenmiş mi yoksa kopyalanmış mı?
Alex McMillan

@AlexMcMillan TypeScript DERLENMİŞTİR, çünkü javascript'in bir üst kümesidir ve bu nedenle javascript'e derlenir.
Araymer

@Araymer Derleme ve aktarım arasındaki farkı anlıyor musunuz? TS derlenmediği için; JS de değil.
Alex McMillan

Evet ediyorum. TS, JS'nin bir üst kümesi olduğu için, daha yüksek bir soyutlama düzeyi olarak kabul edilir ve bu nedenle "derlenmiş" olarak anılır. Derlenen JS daha sonra normal olarak yorumlanır. Bu nedenle, TS'yi ararsanız, en çok tartışılan tek konu "derlemesi" dir. Ancak, aktarım ve derleme arasındaki çizginin resmi bir nicel tanımı yoktur. Oldukça duygusal bir hal alıyor, bu yüzden neyin derlendiğine dair fikriniz (olduğu gibi yaratıcılardan farklı) sadece sizin fikriniz.
Araymer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.