Google Closure gerçek bir derleyici midir?


19

Bu soru, bu Yığın Taşması sorusundaki yorumlardaki tartışmalardan esinlenmiştir . Google Kapatma Derleyici belgeleri (vurgu eklenmiştir) şöyle der:

Kapatma Derleyicisi, JavaScript'in daha hızlı indirilmesini ve çalıştırılmasını sağlayan bir araçtır. JavaScript için gerçek bir derleyicidir. Kaynak dilden makine koduna derlemek yerine JavaScript'ten daha iyi JavaScript'e derler.

Ancak Wikipedia aşağıdaki "derleyici" tanımını verir:

Derleyici, bir programlama dilinde (kaynak dil) yazılmış kaynak kodunu başka bir bilgisayar diline dönüştüren bir bilgisayar programıdır (veya bir dizi programdır) . dil.

Buna dayanarak, Google Closure'un bir derleyici olmadığını söyleyebilirim. Ancak Google'ın bunun aslında bir "gerçek derleyici" olduğunu açıkça belirtmesi, daha fazlası olup olmadığını merak etmemi sağlıyor. Google Closure gerçekten bir JavaScript derleyicisi mi?


2
Bahse girerim JS çıktı tüm yasal JS uygun bir alt kümesidir; Bu anlamda, çıkış dili olan "başka bir" dil.
AakashM

Yanıtlar:


23

Kapatma Derleyici bir olan minifier , bir optimize edici ve doğrulayıcı hepsi bir arada. Bu tür, kendi kategorisine koyar, çünkü bir derleyicinin en azından geçerli formunda çalışmayan bir şeyi alması ve bunu yapacak bir şeye dönüştürmesi gerekir ( ECMAScript tabanlı bir örnek için TypeScript alır ).

Ancak terminolojiyi genişlettiği için Google'ı suçluyor musunuz? Başka ne diyeceklerdi? Google Minifier? Hayır, bundan daha fazlası ve orada yüzlerce kişi var. Google Optimizer? Bundan çok daha fazla. Google Doğrulayıcı? Hayır, bundan çok daha fazla.

Yani seçim

  • Buna Google Closure Foogle deyin ve sözlüğün içine başka bir anlam ifade etmeyen yeni bir kelime tanıtın.
  • Niyeti daha net ancak hatırlaması zor olan Google Closure Minoptivalidator olarak adlandırın.
  • Buna gerçeğe oldukça yakın olan Google Closure Compiler deyin.

Bir derleyicinin yapmasını beklediğiniz her şeyi, sadece anlamsal bir farkla yapar. Ve sonunda, tüm kelimeler bir ölçüde kullanımları ile tanımlanır. Dolayısıyla Google insanları derleyici olarak adlandırmaya ikna edebiliyorsa, derleyicinin tanımı biraz değişir. Kesinlikle bir soruna neden olacak şekilde değil.

Veya önceki örneğe geri dönmek için, TypeScript hakkında "gerçek derleyici" olarak adlandırılmasına izin veren önemli bir şey bulabilir misiniz? Google Closure Derleyicisi ise "neredeyse bir derleyici" ile sınırlandırılmalıdır?


Sorunun amacı insanların gerçekten bir "derleyici" olarak gördüklerini gerçekten görmekti. 0A0D tarafından belirtildiği gibi, bu sadece anlambilimsel, ancak kendimi Google'ın neden "gerçek bir derleyici" olduğunu açıklığa kavuşturmak gerektiğini hissettiğini merak ettim. "Minoptivalidator" için +1!
James Allardice

@JamesAllardice: Yine, eğer insanları bir derleyici olduğuna ikna edebilirseniz, derleyicinin tanımı da onu içerecek şekilde uzanır. Ve bu durumda olması gerçekten adil. Derleyiciden sematik bir çizgi ile ayıran yeni bir kelime tanımlarsanız, ürününüz "neredeyse ama tam olarak değil" olarak kategorize edilir.
pdr

1
Bilmiyorum, "Google Foogle" dan hoşlanıyorum :-)
GrandmasterB

9
Oy veriyorum Minoptival. Bir dinozor gibi geliyor. Herkes dinozorları sever, değil mi?
Izkata

2
@Izkata: Evrim tarihinin bize öğrettiği bir şey varsa, bu Javascript'in içerilmeyeceğidir. Javascript serbest kalıyor, yeni bölgelere genişliyor ve acılarla, hatta tehlikeli bir şekilde engellerden geçiyor.
pdr

9

Buna dayanarak, Google Closure'un bir derleyici olmadığını söyleyebilirim.

Evet, ama bu Wikipedia'nın bu noktada yetkili olduğunu varsayar.

Ve Wikipedia tanımının bir sayacı olarak, bazı sözlük tanımlarını göz önünde bulundurun ( http://www.thefreedictionary.com/compiler adresinden ):

2) (Bilgisayar Bilimi) - Üst düzey bir dilde yazılmış başka bir programı, yürütülebilmesi için makine diline çeviren program.

2) (Elektronik ve Bilgisayar Bilimi / Bilgisayar Bilimi) , COBOL veya FORTRAN gibi üst düzey bir programlama dilinin bilgisayar tarafından kullanılabilen makine diline dönüştürüldüğü bir bilgisayar programı.

Bu dillerde yazılmış talimatları, daha sonra doğrudan bilgisayar tarafından yürütülebilecek makine koduna dönüştüren belirli programlama dilleriyle ilişkili bir bilgisayar programı.

Bu tanımların hepsi biraz eski kafalı, ancak "tek bir gerçek anlam" olmadığını ve aslında "derleyici" gibi terimlerin anlamlarının zaman içinde değiştiğini göstermektedir. (Ve IMO gayet iyi, çünkü bu dava için kesin bir tanımlamaya ihtiyacımız yok .)

Closure derleyicisinin "gerçek derleyici" olup olmadığını tartışmak verimli bir etkinlik değildir (IMO). Bu bağlamda Google'ın "gerçek derleyici" ile ne anlama geldiğini anlamak daha yararlı olacaktır .


2
+1, İronik olarak, JS hem web için 'makine dili' ve 'üst düzey bir programlama dilidir'.
K.Steff

3
+1 ve artı 'Wikipedia'nın bu noktada yazar olduğunu varsayar'. Çok fazla insan orada yazılanları körü körüne kabul ediyor.
Marjan Venema

6

"Gerçek bir derleyici" olarak adlandırılabilmesinin nedeninin, programlarınızdan tam bir AST (soyut anlamsal ağaç) oluşturması ve bunu yeni bir metin oluşturmak için kullanmasıdır.

Hem orijinal hem de sonuçtaki metinlerin geçerli JavaScript olması sadece rastlantıdır.

Bu önemlidir, çünkü kodun yalnızca metin manipülasyonlarını yapan (minimizerler, ön hazırlayıcılar, vb.), Ancak herhangi bir AST işlemesi yapmayan, çok daha az kod yeniden oluşturma yapan birçok araç vardır. Bu araçlar gittikçe daha güçlü olsa bile, aynı tür bir yazılım değildir ve sınırlamalar farklıdır.


1
Teşekkürler, bu ilginç bir cevap. Açıklamanızın Wikipedia'dan ve başkalarının alıntıladığı çeşitli sözlüklerden daha iyi bir "derleyici" tanımı sunabileceğini düşünüyorum.
James Allardice

Bu yanıtı beğendim ve bir noktada oy verdim, ancak bir AST inşa etmeden derlemenin (geleneksel yüksek seviyeli dilden makineye dil anlamında) mükemmel bir şekilde mümkün olduğunu belirtmek isterim. Örneğin bir Derleyici Oluşturalım konusuna bakın . Şimdi kesinlikle Crenshaw'un öğreticisinin derleyicisinin oldukça kaba olduğu doğrudur, ancak herhangi birinin derleyici olmamakla suçlandığına inanmıyorum.
dmckee

Bu referansı okumadım, ancak derleme için açık bir AST'nin kesinlikle gerekli olmadığını kabul ediyorum. Yine de çoğu durumda, verilerde açık olan veya yürütmede örtük olan eşdeğer bir yapı vardır (belki çağrı yığını (veya zaman içindeki gelişimi) sözdizimi analizini yansıtır). Benim asıl nokta derlemenin metin manipülasyonu değil, bazı kaynak kodlarının analizinden kod üretmesidir.
Javier

4

Bence anlambilim. Geleneksel anlamda, bir derleyici değildir. Ancak, aynı Wikipedia bağlantısında,

Bir derleyici şu işlemlerin çoğunu veya tamamını gerçekleştirebilir: sözlüksel analiz, önişleme, ayrıştırma, anlamsal analiz (Sözdizimine dayalı çeviri), kod oluşturma ve kod optimizasyonu.

Kapatma, bu işlemlerin bir kısmını veya tamamını gerçekleştirir.

Wikipedia makalesinde biraz daha aşağıda

Bununla birlikte, pratikte, bir dil hakkında, yalnızca derleme veya özel olarak yorumlanmasını gerektiren bir şey nadiren vardır, ancak çalışma zamanında yeniden yoruma dayanan diller tasarlamak mümkündür.

Olduğu söyleniyor, tahminim "Closure Optimizer" yerine " Closure Compiler " olarak adlandırmanın daha kolay olmasıydı çünkü gerçekten sadece tarayıcılar için JavaScript'i optimize ediyor, başka bir dile veya bayt koduna çevirmeye gerek yok.

Kapanış Derleyici bir isim olarak sıralayıcı değildir .


Bu sadece anlambilim, haklısın. Sorunun asıl amacı insanların sadece bir "derleyici" olarak gördüklerini görmekti. Hala Closure Derleyicisinin "gerçek bir derleyici" olduğunu düşünmüyorum, ancak birçok benzer işlem gerçekleştiriyor.
James Allardice

3

İlk olarak, bunu kaynaktan kaynağa derleyicinin varlığından çıkaralım. Bir şeyin derleyici olmadığını söyleyemezsiniz, çünkü sonuç daha düşük bir kod değildir.

Closure Compiler AST üretmek ve kod üretme ifade sahip olduğu doğru olsa da, orada birçok Javascript minimizer zaten bunu yapar ve ben muhtemelen onlara derleyiciler de olmaz.

Closure Compiler'ı gerçekten ayıran şey, hata tespiti ve optimizasyonunda birçok iyi bilinen derleyici tekniğinin uygulanmasıdır. İşte bazı örnekler:

Tip sistemi:

Kapatma Derleyicisi açıklamalı tip bir sistem tanımlar. Birçok derleyicinin programınızı hatalara karşı denetlemek için kullandığı tür çıkarım tekniklerini kullanır.

İşlemler arası optimizasyonlar

Closure Compiler, ölü kodu tüm program düzeyinde yeniden adlandırmak ve kaldırmak için çağrı grafikleri oluşturur.

İşlem içi optimizasyonlar

Closure Compiler, Veri Akışı analizinin yanı sıra farklı Kontrol Akışı Analizi uygulayarak Javascript'i optimize eder. Klasik derleyici teknikleri gibi: Inlining, Register Atama, Canlı Değişken Analizi .. ve daha birçoğu, Javascript çıkışından son gelen baytı sıkıştırmak için kullanılır.

Modül Sistemi

Daha hızlı başlatma süresi için kodunuzu ayrı indirmeye bölmek için kullanılabilen daha az bilinen Closure Compiler bölümü. Birçok grafik algoritması da kullanır. Bir şey "geleneksel" derleyicilerde de çok yaygındır.

Tüm bu derleyici ve statik analiz teknikleri, Closure Compiler'ı diğer Javascript minimizerlerinden ayıran şeydir. Hedeflenen giriş ve çıkış dilinin aynı olduğu gerçeğinden uzaklaşarak neden "gerçek derleyici" olarak sınıflandırılmadığını anlamıyorum.

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.