Neden oluşturma araçları, temel programlama dilinden farklı bir komut dosyası dili kullanıyor?


23

Son zamanlarda, çoğu dilin ana yapım aracının / sisteminin, temel programlama dilininkinden farklı bir dil kullandığını fark ettiğimde Nodejs projesi için bazı yapım araçlarını kullanıyorum.

Örneğin, komut dosyaları yazmak için make C veya C ++ kullanmaz ve karınca (ya da Maven) Java'yı komut dosyası olarak kullanmaz.

Ruby gibi daha yeni diller benim için anlamlı olan komisyon gibi araçlar oluşturmak için aynı dili kullanıyor . Ama neden bu her zaman böyle olmadı? Temel dilden farklı bir dil kullanan bir oluşturma aracına sahip olmanın avantajı nedir?


14
Belki de genel amaçlı dil, aracın uzman kullanımı için yeterince uygun değildir? Mesela C 'de make dosyaları yazmak istemem! Bazen bir DSL daha iyidir.
Andres F.

13
Buna başka bir açıdan bakın: Neden uygulama yazılımı yazmak için make kullanmıyorsunuz?
whatsisname,

4
Bu makale , öncelikle yazarın Lisp'i harika kıldığına inandığı şey hakkındadır, ancak Ant'ın Java yerine XML'i neden kullandığı hakkında bazı bilgiler vardır.
8bittree

6
Eğer C'ye bina programlarını otomatikleştiren bir program yazmak istiyorsan, maketekrar yazmaya başlamaz mısın?
Brandin

6
@ joshin4colours yapmak olan C. kullanımlara da dil yazılı Ancak başlatır kabuk gerektiği gibi bir açıklayıcı bir dildir.

Yanıtlar:


36

Bir şeyi yapmak için hangi programlama dilinin kullanılacağının seçimi, o projeyle ilgili diğer görevlere değil, o hedefin özelliklerine bağlı olmalıdır.

Bir derleme aracı çok spesifik bir iş çıkarır ve ana proje için hangi dili kullanırsanız kullanın, bir derleme aracı kendi başına bir yazılımdır.

Ana projeyi ve yapım aracını bağlamaya çalışmak çok kötü bir karar olabilir. Bir derleme aracı ile ihtiyaç duyduğunuz şey, hızlı bir dosya yönetimi ve IO yönetimi ile basit bir işlemdir.

Eğer ruby ​​gibi diller kendi inşa araçlarını uygulamak için kendilerini kullanıyorsa, herşeyin aynı dilde yazılı tutulması gerekenden ziyade o dilin özellikleri ile ilgilidir.


18

C veya Java gibi bir dili betik dilleri olarak kullanan bir derleme aracı yazmak imkansız değildir. Bununla birlikte, derleme araçları, daha fazla bildirici betik dili kullanmaktan yararlanır . C içinde makefile (veya build.xml veya her neyse) yazmanın acısını ve kazanını düşünün.

Yapı araçları, C'nin özellikle iyi bir seçim olmadığı bir görev olan DSL kullanımından yararlanır. C, bir oluşturma aracı için çok geneldir ve hataya açık ve düşük düzey ayrıntılarla da ilgilidir. Örneğin, bir derleme aracında açık bellek yönetimi ile ilgilenmek istemezsiniz! Öyleyse, C benzeri bir sözdizimi kullanıyor olsanız bile, komut dosyası aracınızda çöp toplama özelliğini kullanıyor olabilirsiniz, bu noktada neden yalnızca özel bir DSL kullanmıyorsunuz?

Ruby'nin bunun için kullanılabileceği mantıklı, çünkü C ya da Java'dan daha üst düzeyde, daha açıklayıcı bir dil. Ayrıca bakınız: Gradle, sbt.


13
Imagine the pain and boilerplate of writing a makefile (or build.xml, or whatever) in C.Önemsiz olmayan koşullu mantığı (bildiğiniz, standart zorunluluk olan şeyleri) bildirimsel bir XML komut dosyasında ifade etmeye çalışmanın acısını ve karmaşasını hayal edin. Oh, bekle, hayal etmek zorunda değilsin; Muhtemelen bununla baş etmek zorundaydın, ve muhtemelen bir buçukluktu, değil mi? Yapılar, bildirimsel bir betik dili için olası en kötü seçeneklerden biridir, çünkü ciddi sorunlar çabucak sona erer, ancak bildirme sınırlarına dayanır ve bir derleme aracına ihtiyaç duymayacak kadar basit olanlar.
Mason Wheeler

7
@MasonWheeler Mevcut yapım araçlarının beni zorlaştırdığı durumlar var, evet. Bunların hiçbiri düşük seviye C benzeri zorunlu bir dil kullanarak yardımcı olmazdı. Ruby gibi muhtemelen ideal bir şey görüyorum: İhtiyaç duyulduğunda, yeterince beyan edici ve zorunlu. C bu görev için bana kabuslar verecek. Bana göre derleme sistemleri (çoğunlukla) bildirimsel DSL'ler için iyi bir kullanım durumudur: ne yapacağınıza önem veriyorsunuz , nasıl yapılacağına değil (çoğu zaman).
Andres F.

2
Yeterince adil. Her zaman, C'nin "X yanlış soruyu soruyorsanız cevap ise" teknolojilerinden biri olduğunu, dürüst olduğunu; Sadece, XML ile çalışan "betikler", her birine dalmak zorunda kaldığımda bir kabustu. DSL özelliklerine sahip üst düzey bir emir dilinin ideal olacağı konusunda hemfikirim.
Mason Wheeler

@AndresF .: Dosya yapmak gibi şeyler yaklaşımların bir karışımını gerektirir. İstenilen çıktı durumu bildirimsel olarak belirtilir, ancak bu duruma ulaşmak için gerekli eylemler zorunlu olarak belirlenir.
supercat

1
@MasonWheeler Ben bu yapılandırma dilini XML'in kendisinden daha fazla tasarlayan insanların sorunu olduğunu düşünüyorum. Bu tür dillerin yazarlarının genel yanılgısı, yalnızca XML'de bir şey olduğu için otomatik olarak insan tarafından okunabileceğini varsaymaktır. (Bu hatayı kendimden daha fazla defa yaptığımı biliyorum. Çok cazip.) İyi tasarlanmış ve yalın bir yapılandırma dili, herhangi bir biçimde olduğu gibi XML üzerinden de çalışabilir.
biziclop

12

Size gerçek bir dünya örneği verelim.

Yaklaşık 15 yıl önce, C ile yazılmış büyük bir sistemin Unix'ten Windows'a taşınması üzerine çalıştım, yaklaşık 3 milyon satır kod vardı. Size bir ölçek fikrini vermek için, unix sistemlerimizden bazılarını (RS6000) derlemek 24 saatten fazla sürdü, pencereler sistemi yaklaşık 4 saatte derleyebildi.

(Ayrıca kendi tercüme ettiğimiz dilde 2 milyon kod satırı vardı, ancak bu dili dosya işleme için tasarlanmadığı için yapı sistemlerinde kullanmamayı kararlaştırdık. .)

Derleme sistemi bir kabuk betiği ve dosya karışımı halinde yazıldığı zaman, bunlar pencerelere taşınabilir değildi - bu yüzden kendi derleme sistemimizi yazmaya karar verdik.

C kullanabilirdik, ancak python kullanmaya karar verdik, bunun birkaç nedeni vardı. (Ayrıca, kaynak kod kontrol sistemimizi python'da aynı anda yeniden yazdık, bu derleme sistemiyle çok iç içe geçti, böylece denetlenen modüllerin nesne dosyaları geliştiriciler tarafından paylaşılabilir.)

  • Kodumuzun çoğu dosyaların isimlendirilmesi kurallarına dayanan birkaç basit kuralla (tüm platformlar için sadece birkaç bin satır python, Windows, VMS ve 6 Unix sürümü) oluşturulabilir.

  • RegEx, farklı platformlardaki C sistemleri arasında çok standart değildi, Python, RegEx'te inşa etti.

  • Birkaç modül özel yapım adımları gerektiriyordu, Python sınıf dosyalarının dinamik olarak yüklenmesine izin verdi. Özel bir sınıfın, python dosyasının klasörde sihirli bir adı olan bir modül (lib) oluşturmak için kullanılmasına izin verdik. Bu python kullanmak için katil neden oldu.

  • Java'yı düşündük, ancak bu noktada tüm platformlarda gönderilmiyordu.

(Kaynak kodu kontrol sistemimizin kullanıcı arayüzü, tüm platformda taşınabilir bir web tarayıcısı kullanmıştır. İnternet bağlantımız olmadan 6 ay önceydi. Tarayıcıyı X25 üzerinden indirmek zorunda kaldık!)


Birkaç bigish sistem üzerinde çalıştıktan sonra, bazen gelişim ölçeğini nasıl ele alabileceğimi hissediyorum. Sonra böyle hikayeler okudum. Sheesh.
dmckee

@ immibis Bu 15 yıl önce yapılması gereken en moda şeydi. Dahası, bu uygulama önde gelen Unix satıcıları tarafından onaylandı ve teşvik edildi (özellikle SGI ve DEC, ancak IBM de).
oakad

1
İnsanlar Unix'in "pahalı" anlamına geldiğini unutma eğilimindedir. Windows masaüstü / iş istasyonu savaşını daha ucuza kazandı. Aynı sebepten dolayı Linux daha sonra sunucu savaşını kazandı.
slebetman

1
Bir bilgisayarın yazılımı çalıştırmasını istiyorsam kendim yazdım, esnek olmasını istiyorum ve çekirdeklerin nasıl derlendiğini 101 seçeneğim olsun istiyorum. Ancak, müşterinin bilgisayarına yüklenecek yazılımı satıyorsam müşterinin olmasını istiyorum esnek olmayan bir işletim sistemi çalıştırarak, bilgisayarımda çalışırsa bilgisayarında çalışacağını biliyorum. Linux'a bir yazılım satıcısı olarak bakarken bu büyük bir faktördü - destek çok pahalı görünüyordu. Linux, sunucunun yazılım satıcısı tarafından sağlandığı, örneğin çoğu web üzerinden dağıtılan yazılımın barındırdığı sunucu yazılımı savaşlarını kazandı .
Ian

3
@slebetman Sadece adil - Unix, önceki "savaşı" daha ucuz hale getirerek kazandı (LISPM'lere ve benzer makinelere kıyasla). Kesinlikle korkunçtu, fena halde tasarlanıp sürekli çöküyordu (ama LISPM! 'Den çok daha hızlı açılıyor: P), birincil programlama dili olarak C kullanıyordu (LISP'den ve benzerlerinden oldukça fazla düşüyordu), ama çok daha ucuzdu. Aslında birçoğu ücretsiz olduğu için kabul etti (Linux'tan çok önce birçok ücretsiz mutasyonlar vardı). Aslında, zamanın bir zaman diliminde MS-DOS'u tercih eden birçok eski okul LİSPeriyle tanıştım. Evet, bu korkunç.
Luaan

3

Bu sorunun kısa cevabı bu bir inşa aracı ne olmasıdır . Bazı kaynak dosyalardan bir son ürün oluşturmak amacıyla diğer araçların kullanımını otomatikleştiren bir araç. Derleme komut dosyasını ürünün kendisi ile aynı dilde yazıyorsak, derleme araçlarının aynı şekilde değerlendirilemeyeceği dile özgü araçların alanlarına giriyoruz.

Bu soruyu gündeme getirmektedir - neden derleyiciler, alışkın olduğumuz yapım otomasyonu türünü neden araçlardan üretmiyoruz? Cevabın hangi anlama geldiği, çünkü yapmak var . Unix'in "bir şeyi yap ve iyi yap" felsefesi, bunu yapmanın derleyicinin sorumluluğu olmadığını öne sürüyor *. Bununla birlikte, şahsen başım ağrıyor ve kendi "alıntı" olmayan "yerel" yapı sistemini sağlayan bir derleyici denemek istiyordum.

Bu şekilde tasarlanan bir derleyici örneği için, C ++ 'ın yerine geçen bir dil olan Jon Blow'un (henüz yayınlanmamış olan) Jai'sine bakın. Derleyicinin görüşmeleri ve demolarına bağlantılar burada toplanmıştır . Bu dil, derleyici içinde çalışan bayt kodunu derler, ikili kodun byte kodundan erişilebilen standart bir kütüphane tarafından sağlanan bir fonksiyon olmasını sağlar. Amaç, dilin ana sözdiziminde hem otomasyona hem de meta-programlamaya izin vermektir.

* Microsoft'un Visual Studio'suna bir bakış size karşıt felsefenin bir örneğini gösterecektir. :)


2

Oluşturma aracı, her şeyden önce, yalnızca 'gcc', 'ls', 'awk' veya 'git' gibi bir araçtır. Aracı bir girdiyle besleyin (dosya adı, parametreler, vb.) Ve buna göre bazı şeyler yapacaktır.

Bu araçların tümü, girdilerinizi yazmanız ve anlamanız kadar basit olması gereken şekillerde geçirmenize olanak sağlar. Yapı araçlarının özel durumunda, girdi, projenizin kaynak dosyalardan bitmiş ürüne nasıl geçtiğini açıklayan bir dosya olan bir reçete dosyasıdır.

Tarifiniz, projeyi ve kullanılacak derleyiciyi içeren klasöre geçmek kadar basitse, beyanname "dil" yeterlidir. Tarif bir kez daha karmaşık hale geldiğinde, daha mantıkla, bildirimsel dillerle baş etmek zahmetli hale gelir ve daha genel amaçlı diller kullanılır.

Şimdi, açıklayıcı tariflerinizi yazmak için kullanılan dil ile ürün kodunuzu yazmak için kullanılan diller arasında farklı amaç ve gereksinimlere sahip oldukları için hiçbir bağlantı olmadığı açıkça görülmelidir. Yapım aracının yazıldığı dil ile yapım tariflerinin yazılması gereken "dil" arasında bağlantı bile yoktur. İş için her zaman en iyi aracı kullanın!

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.