Java neden yapı dili olarak kullanılmıyor?


24

Java genel amaçlı bir dilse ve bir program oluşturmak, Java dili kullanılarak tanımlanabilecek bir şeyse, neden derleme dosyaları yazmak için bu en iyi yol değil, bunun yerine Ant, Maven ve Gradle gibi araçlar kullanıyoruz? Bu daha kolay olmaz ve ayrıca başka bir programlama dili daha öğrenmeye gerek kalmaz mı? (BTW - bu soru C # gibi diğer dillere de uygulanabilir)


7
"Neden inşa dilleri için genel amaçlı diller kullanılmıyor" sorusuyla ilgili biraz daha ilginç olabilir - Demek istediğim, C de bir yapım dili değil. Ayrıca , Java'da tek bir .java dosyası oluşturmak

8
Bu muhtemelen "Neden DSL'lerle rahatsız etsin?" Olarak genelleştirilebilir.
SinirliFormsDesigner ile

1
Daha iyi bir soru olabilir; IDE'ler / derleyiciler / araçlar neden bu kadar kötü?
Brendan,

6
@ Derleme araçları ve IDE'ler farklı amaçlara hizmet ediyor.
07'de jwenting

1
Çünkü "genel amaçlı" diller, iyi tanımlanmış basit etki alanına özgü diller yerine asla kullanılmamalıdır. Ve eğer "başka bir programlama dili" öğrenmeye ihtiyaç duyuyorsa sizi ilgilendirirse, gerçekten programlama yapmamalısınız, başka bir işlem yapmayı deneyin.
SK-mantık

Yanıtlar:


21

Belirli Bir Amaç İçin Özel Bir Araç

  • lâf salatası

    Genel amaçlı diller genellikle çok ayrıntılı. Java'da bir yapıyı yönetmem gerekirse, canavarın boyutuna göre çok hızlı bir şekilde depresyona girerdim. Bununla birlikte, Java ile yazılmış bir DSL kullanarak kolayca yönetilebilir. Ve bir dereceye kadar Gradle'ı (Groovy için) ve Buildr'i (Ruby için) bu şekilde görebilirsiniz.

  • zorluk

    Genel amaçlı diller zor. Programlamanın zor olduğunu ve kimsenin yapamayacağını düşünmüyorum, ama mesele şu ki: inşa mühendisiniz mutlaka programcınız değil!

  • amaç

    Bu, zorluğun ve ayrıntıların kesişme noktasında az ya da çokdır . Dil bir amaç için tasarlanmıştır ve burada çok özel bir şeyden bahsediyoruz. Öyleyse neden genel amaçlı bir dili kullanmak istiyorsunuz ? Yapılar için ihtiyacınız olan:

    • farklı konfigürasyonları, ortamları vb. işlemek için şubeler ve şartlandırmalar ...
    • ortamınızdan veri almak için bir dizi talimat
    • Teslim edilebilir ürünler üretmek için talimatlar

    Gerçekten daha fazlasına ihtiyacınız yok.

Yapı sisteminiz, takip ettiğiniz özel kullanım durumları için yeterince esnek değil gibi göründüğü zaman can sıkıcıdır, ancak çoğu insan için alternatif olmaktan çok daha iyidir.

Muhtemelen, programlanabilir çoğu sisteme göre bildirimsel yapı sistemlerini tercih eden insanlar arasında bir kutupsallığın olmasının nedeni budur: Sanırım geliştiricinin kutudan çıkmanın yollarını aramaya doğal bir eğilimi olabilir.

Bekle, Gerçekten Bir Araca İhtiyacımız Var mı?

Başka bir ilgili soru şudur: gerçekten bir yapım aracına ihtiyacımız var mı? Tüm dillerde var olmaları, ilk başta orada bulunmaması gereken bir boşluğu doldurduklarının işareti değil midir?

Bazı diller mutlaka bir yapım aracı gerektirmez. Örneğin, çoğu komut dosyası dili bir tane gerekmez ve yükleme sırasında çözülür. Ya da derleyicisi sizin için her şeyi yapacak olan Go'yu kullanın, ki bu güzel bir karşılama noktası: ya gcc gibi bir derleyicinin birdenbire bir sürü bayrak, bir bağlayıcı ve her şeyi birlikte ölmek için bir dosyaya ihtiyacı yoksa? Veya Javac ona ne yapacağını söylemek için bir build.xml veya pom.xml gerekmedi mi? Bağımlılıklar, programın bir parçası olduğundan, bağımlılık yönetimi doğrudan dilin kendi araçlarının bir parçası olmamalı mı?

Kesinlikle kullanıcı (üretici) için çok daha basit bir yaklaşım gibi görünüyor. Biri sadece başlık altında olduklarını ve bu inşa sürecini etkilemek için seçiminizi ve fırsatlarınızı ellerinden aldıklarını iddia etseler de (ancak böyle bir aracın derleyici uzantılarına ve benzeri şeylere izin vermesini umarsınız). Ayrıca, araçları ve dili iki ayrı şey olarak görüyoruz, bu yüzden aniden onları çok sıkı bir şekilde birbirine bağlamış gibi görünmüyor olabilir.

Programlarınızı oluşturmak için kullandığınız dilin sorun olduğunu sanmıyorum. Programlamak için kullandığınız dil ve bunun için gerekli olan temel platform ve araç gereç, ve biz hala buna devam ediyoruz.


Şahsen, make / gmake / autotools / pmk kullandım ve C için onlarla mutlu oldum, ve yaptığımız her şeyden sonra Java ile başladım, sonra karınca ve şimdi genel olarak Maven'i tüm bu alternatiflere tercih ediyorum. Gradle, buildr ve diğerlerinde değer görebildiğim halde, daha belirgin bir kayma gerçekleşene kadar maven prevalansını seviyorum. Artı bunun çok katı olmasını seviyorum , ama yine de gerekirse bu konuda çalışmanıza imkan veriyor. Kolay değil ki iyi bir şey.

Bu bir yapım aracıdır. Sadece onu kucaklamayı öğren ve onunla savaşma. Bu kaybedilen bir savaş. Ya da en azından çok çok uzun bir tane.


Pragmatikçiliğin gibi. Sorum şu ki meraktan. Ben maven kullanıyorum (geçmişte make ve karınca kullanmış) ve bazen iyi ve bazen kötü olan "kara büyü" yapıyor. Ama yine de sihir.
vainolo

1
"Veya Javac ona ne yapacağını söylemek için bir build.xml veya pom.xml gerekmediyse?" - heh. yapmaz ve asla yapmaz.
user253751

@ immibis: bu tartışılabilir. Projelerimi ofiste sadece javac ile yapmaktan hiç hoşlanmam :) Bir Makefile ya da shell script ile ya da en azından kabuk takma adlarıyla bir şeyler koymak için kesinlikle biraz tutkal gerekir. Ya da her şeyi tek bir klasörde ve depodaki tüm dosyaları içeren devasa bir program. Gerçekten sevdiğim bir şey değil! :) Fakat bu tamamen OP'nin sorusuyla ilgisi olmayan başka bir tartışma.
haylem

Yapı sisteminin dil ile entegrasyonu da çok bölgeli projeler için sorunlu. Hem A hem de B dilini kullanırsam ve onlar için tek bir derleme süreci olmasını istersem, hangi dilin derleme sistemini kullanırım?
Sebastian Redl

@SebastianRedl Peki, üçüncü bir dili tanıtarak sorun nasıl daha kolay hale gelir ? Sadece sizin için daha uygun olan dili seçin. (Tabii ki, eğer üçüncü bir dile ihtiyacınız varsa, Java da olabilir.)
Ville Oikarinen

21

JavaBir edilmektedir şart , dil Ant, Mavenvb vardır bildirim diller:

Farkı şu şekilde tanımlayabiliriz:

  • Zorunlu programlama: "makineye" bir şeyin nasıl yapılacağını söylemek ve bunun sonucunda ne olmasını istediğinizi söylemek .
  • Bildirimsel programlama: "makineye" ne olmak istediğinizi söylemek ve bilgisayarın nasıl yapılacağını çözmesine izin vermek. 1

Yapı dilleri, yapımcıya ne yapılması gerektiği, nerede yapılması gerektiği vb. Hakkında bilgi verir. Yapıyı çalıştıran motor (@ElliottFrisch'in belirttiği gibi zorunlu bir dilde yazılmış olan) bu talimatları okur ve bunları yerine getirir.

Bilgilendirme dilleri, yapım senaryolarında daha uygun görünebilir, çünkü yapım görevleri genel olarak aynıdır ve bu formda tam teşekküllü kod formundan daha sürdürülebilir ve okunabilir olarak kabul edilir.


3
Zorunlu bir dili kullanan en az bir tane derleme sistemi var. Scons Python'u kullanıyor.
user16764

Bunu zorunlu kılmak, bir bağımlılık listesi içeren bir sınıf yazmaktan ve bu bağımlılıkları çözmek için bir yöntem yazmaktan daha zor değildir. Sanırım JVM'nin başlangıç ​​zamanı gibi bir sebep daha var.

2
@Lee: Hemen hemen tüm Java dünyasında kullanılan yapı araçları (Ant, Maven, Gradle, SBT, ...) ayrıca tipik (Rake, Buildr veya Scons istisnalar ile JVM üzerinde çalışan bir olabilir , ama yok olması için ) JVM üzerinde çalışır.
Jörg W Mittag

6
@vainolo "Çoğu insan gerçekten Ant / Maven / Make'i sevmiyor" mu? Bu cesur bir ifade!
Ben Thurley

1
@BenThurley İnsanların yapmasını sevdim, neden karınca yaratıldı? ve eğer karınca sevildiyse, neden Maven'di? Ve şimdi insanlar neden Gradle kullanıyor? Ancak bunun cesur bir ifade olduğuna katılıyorum ve sadece bazı java geliştiricilerinin "anekdot" kanıtlarıyla destekleniyor
vainolo

4

Tipik bir derleme sisteminin özelliklerine bakarsanız şunları bulabilirsiniz:

  1. Çok fazla veri: adlar, anahtarlar, ayarlar, yapılandırma öğeleri, dizeler, vb.
  2. Çevre ile etkileşimi çok: komutlar, çevre değişkenleri
  3. Bağımlılık, diş çekme, kayıt vb. İşlemlerle ilgili nispeten basit bir "yapı motoru"

Bazı dilleri (Java / C # / Python / etc) kullanarak bir dizi derleme dosyası yazmaya başlarsanız, üçüncü veya dördüncü tekrarlamaya kadar (a) verinin ve harici komutların çoğunu bir şeyde veri olarak saklarsınız. XML (b) gibi "yapı motorunu" en sevdiğiniz dilde yazmak gibi.

Ayrıca, derleme motorunda çeşitli özellikleri tetiklemek için XML'inizdeki verilerin bir kısmını yorumlanmış bir dil olarak ele almanız yararlı olacaktır. Ayrıca bazı makroları yorumlayabilir veya verilerde dize değişimleri gerçekleştirebilirsiniz.

Başka bir deyişle, Make veya Ant, veya Rake veya MsBuild ile bitirdiniz. İyi yaptığı şeyler için zorunlu bir dil ve ne yapmak istediğinizi açıklayan veri yapıları, şimdi genellikle XML.


2

Bu durumlarda Java / C ++ / C # kullanımına karşı sayısız faktör vardır.

Öncelikle, uygulamanızı oluşturmak için çalıştırmadan önce derleme komut dosyanızı derlemeniz gerekir. Yapı komut dosyanızı oluşturmak için gereken paketleri, bayrakları, derleyici sürümlerini, araç yollarını nasıl belirtirsiniz? Kuşkusuz, bunun etrafında bir yol bulabilirsin, ancak bu oluşturma adımına (örn. Python) ihtiyaç duymayan bir dile veya yapım aracınızın yerel olarak anladığı bir dile sahip olmak çok daha kolaydır.

İkincisi, derleme dosyaları veri yoğunken, Java / C ++ / C # kod ve algoritmalar yazmaya daha uygundur. Java ve arkadaşları, depolamak istediğiniz tüm verilerin özlü bir temsiline sahip değildir.

Üçüncüsü, Java ve arkadaşlarının geçerli olması için çok fazla kazana ihtiyacı var. Derleme dosyası, tüm içe aktarımlarını içeren bir sınıf içinde bir yöntemin içinde olmalıdır. Bir betik dili veya özel dil kullanırken, tüm bu kaynaştırıcılardan kaçınabilir ve yalnızca oluşturma ayrıntılarına sahip olabilirsiniz.


0

Aslında! Neden sık sık (başlangıçta) düşündüğünden daha karmaşık bir problem için güçlü ve anlamlı bir dil kullanmıyorsunuz ? Özellikle problemi yaşayan insanlar zaten böyle bir dille yetkin olduğunda. (Bina programcıların kendi sorunudur ve programcılar tarafından en iyi şekilde çözülür.)

Ayrıca kendime bu soruyu yıllar önce sordum ve Java'nın özellikle Java projeleri için yapıları tanımlamak için iyi bir dil olduğuna karar verdim. Sonuç olarak, bunun hakkında bir şeyler yapmaya başladım.

YASAL UYARI : Bu cevapta , geliştirmekte olduğum bir yapı sistemi olan iwant'ı destekliyorum . Ama bu zaten tartışmalı bir tartışma olduğundan, tamam olduğuna eminim.

Java’nın yararlarını (güçlülük ve açıklayıcılık) veya özellikle istemediğimi açıklamayacağım. Eğer ilgileniyorsanız, iwant sayfasında daha fazla okuyabilirsiniz .

Bunun yerine, Java'nın (ve diğer GPL'lerin) neden bina için uygun olmadığına kolayca karar verildiğini düşüneceğim. Buradaki birçok cevap ve yorum, bu düşüncenin güzel örnekleridir. Bazı tipik argümanları ele alalım:

"Java zorunludur, ancak yapılar en iyi şekilde bildirimsel olarak tanımlanır" diyebilirler.

Doğru. Ancak bir dili dahili DSL için bir meta dil olarak kullanırken , gerçekte sayılan şey onun sözdizimidir . Java gibi zorunlu bir dilin bile bildirimsel olduğu kandırılabilir . Bilgilendirici görünüyor ve hissediyorsa, (pratik amaçlar için) bildiricidir. Örneğin:

JacocoTargetsOfJavaModules.with()
    .jacocoWithDeps(jacoco(), modules.asmAll.mainArtifact())
    .antJars(TestedIwantDependencies.antJar(),
            TestedIwantDependencies.antLauncherJar())
    .modules(interestingModules).end().jacocoReport(name)

Bu, iwant'ın demo projesinden gerçek bir örnek .

Aslında, bunu, kullanıcılarını "test" veya "derleme" gibi zorunlu fiillere maruz bırakan sözde bazı beyan edici yapı sistemleriyle karşılaştırın. Yukarıdaki bildiri sadece isimler, fiiller içermez. Derleme ve test etme, kullanıcıya istediği isimleri vermek için iwant tarafından örtük olarak ele alınan görevlerdir. Dil değil. Onu böyle kullanıyorsun.

"Java ayrıntılı"

Evet, çok fazla Java kodu var. Fakat yine de, dil değil, nasıl kullandığınızdır. Bir uygulama ayrıntılı ise, onu güzel bir soyutlamanın arkasına alın. Birçok GPL bunun için yeterli mekanizmalar sunar.

XML ile yazılmış yukarıdaki Java kod parçasını hayal edin. Parantezleri açılı ayraçlarla değiştirin ve hareket ettirin. Ve sonra her anahtar kelimeyi kapanış etiketi olarak kopyalayın ! Bir Java sözdizimi olduğunu değil ayrıntılı.

(XML ile kıyaslamak bir bebekten şeker almak gibi bir şeydir, ancak birçok yapı XML'de tanımlanmaktadır.)

"Derleme betiğinizi derlemelisiniz"

Bu geçerli bir nokta. Bununla birlikte, çözülmesi gereken küçük bir teknik problemdir. Bunu fasulye kabuğu veya başka bir tercüman kullanarak çözebilirdim . Bunun yerine, başka bir derleme problemi olarak görerek ve basit bir Java bootstrapper derleyen ve çalıştıran basit bir kabuk veya karınca betiği ile önyükleme yaparak çözdüm.

"Java'nın kazanı var"

Doğru. Sınıfları ithal etmelisin, "genel", "sınıf" ve benzerlerinden bahsetmelisin. Ve burada basit harici DSL'ler başlangıçta kolay bir kazanç elde ediyor.

Projeniz bu kazanın çok önemli olduğu kadar önemsizse, tebrikler. Sorununuz zor değil ve onu nasıl çözeceğiniz önemli değil.

Ancak birçok projenin derleme, kapsam raporu ve paketlemeden daha fazlasına ihtiyacı vardır. Java'nın kazan plakası müşterilerin sorunları için kabul edilebilirse, neden sorun oluşturmuyorsunuz? Neden ayakkabılar sadece başkalarının çocukları için yapılıyor?


0

Diğer cevapların değinmediğini düşündüğüm bir şey, bu inşa dillerinin sınırlarının ve şeffaflığının onları faydalı kılan şeylerin büyük bir parçası olmasıdır. Mesela Maven'i ele alalım. Evet, yapıları yürütür ancak bağımlılıkları da tanımlar. Bu bir Maven yapısının bu bağımlılıkları azaltmasına ve bağımlılıklarına vb. Bakmasına izin verir.

Bunun doğrudan Java ile yapıldığını düşünün. Derleme aracı bir bağımlılık olduğunu görecektir. Daha sonra diğer Java uygulamasını indirmesi ve bağımlılıklarının ne olduğunu belirlemek için onu çalıştırması gerekir. Ancak Maven için bağımlılık beyanlarına bakıyor. Maven derleme dosyası şeffaftır. Turing'in eksiksiz bir dili doğası gereği şeffaf değildir ve bu nedenle bunun gibi bazı amaçlar için yetersizdir.


Gradle buna nasıl sığar? Bağımlılıkları genel amaçlı bir dil (Groovy) kullanarak bildirimsel bir tarzda tanımlar. Bir Groovy, JavaScript veya Lisp tabanlı bir araçta, yalnızca okumak ya da 'yürütmek' (bir işlev uygulamak) ister beyannameleri çözümlemek için dilin derleyicisini veya tercümanını kullanmak doğaldır. Bu kod ve verinin dualitesi, imkansız olmasa da, genel kabul görmüş Java deyiminin bir parçası değildir. Bütünlüğü tamamlamak, iyi veri gösterimini engellemez. Verilerinizin, beklemesini istemediğiniz bir şeyi yapma olasılığını açar.
joshp

@joshp Gradle ile aşina değilim. DSL olarak tanımlanır ve işler oldukça açıklayıcı görünür. Groovy'ye dayanmak, mutlaka onun gücündeki Groovy'ye eşdeğer olduğu anlamına gelmez. Gradle'ın aslında Turing-eksiksiz bir dil olup olmadığını söylemek için muhtemelen daha iyi bir konumda olacaksınız. Baktığım bağımlılık örnekleri oldukça basit görünüyor. Bağımlılık beyanları gibi şeylerde keyfi Groovy ifadeleri kullanabilir misiniz?
JimmyJames

Şahsen geçiş bağımlılıklarından bile hoşlanmıyorum. Genellikle sadece sınıf yolunda sürprizlere neden olurlar (çoklu uyumsuz kütüphane versiyonları). Bu yüzden maven dışlama elemanına sahip, ancak güçlük buna değmez. Açık bağımlılıklar hayatı kolaylaştırır. Yine geçişli bağımlılık olabilir Java ile uygulanacak. Diğer projelerin yapı tanımlarını yeniden kullanarak iwant ile böyle bir şey yaptım .
Ville Oikarinen

@VilleOikarinen En çok seninle aynı fikirdeyim. Sanırım bir ton şişkinliğe de neden oluyor, çünkü kullanmasanız bile daha fazla bağımlılık çekmenin bir maliyeti yok. Bununla birlikte, bu cevap bağlamında, bu özelliğin değeri veya bilgeliği hakkında değil, DSL kullanımının bunu başarmada ne kadar yararlı olduğu konusunda yorum yapıyorum.
JimmyJames

1
@VilleOikarinen Sanırım bunun sonuna geldik ama sadece pom / maven hakkında konuşmayacağımı açıklığa kavuşturmak istiyorum. Bu bir DSL yapı örneğidir, ancak fazla düşünmüyorum. Bunu alçakgönüllülükle kullanırım ve sanırım tıknaz. Fakat bu kadar baskın olan şey, bağımlılık beyanlarıdır. Buildr'ı bir süre kullandım ve bağımlılıklar için pom'ı okudum fakat bunları build spesifikasyonları için kullanmıyor. Bu pom'ı anlayan, Java temelli olmayan ama AFAIK’in anlayabildiği bir takım araçlar var.
JimmyJames,
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.