C ++ ile derleme komut dosyaları yazmak mantıklı mı?


15

Projelerimi IDE / makefiles oluşturmak için CMake kullanıyorum, ancak yine de derlenmiş dosyaları işlemek veya hatta kod üretmek için özel "komut dosyaları" çağırmak gerekiyor.

Önceki projelerde Python kullanıyordum ve her şey yolundaydı, ama şimdi üzerinde çalıştığım iki çok büyük projede çok fazla bağımlılığı yönetmekte ciddi sorun yaşıyorum, bu yüzden her yerde bağımlılıkları en aza indirmek istiyorum.

Birisi bana sadece bunun için bir dil bağımlılığı eklemek yerine komut dosyalarımı yazmak için C ++ kullanmamı önerdi. Projelerin kendileri zaten C ++ kullanıyor, bu yüzden görebildiğim birkaç avantaj var:

  • tüm projeyi oluşturmak için sadece bir C ++ derleyicisi ve CMake gerekli olacaktır, başka hiçbir şey (diğer tüm bağımlılıklar C veya C ++ 'dır);
  • C ++ tipi güvenlik (modern C ++ kullanırken) her şeyin "doğru" olmasını kolaylaştırır;
  • aynı zamanda daha iyi bildiğim dil, bu yüzden iyi bir Python kodu yazabilsem bile onunla daha rahatım;
  • yürütme hızında potansiyel kazanç (ama gerçekten algılanacağını sanmıyorum);

Ancak, bazı dezavantajlar olabileceğini düşünüyorum ve henüz denemediğim gibi gerçek etkiden emin değilim:

  • kod yazmak için daha uzun olabilir (bu emin değilim çünkü C ++ 'da hızlı çalışan bir şey yazmak için yeterince verimli olduğumu söyleyebilirim, bu nedenle belki bu sistem için yazmak çok uzun olmaz) (derleme süresi gerekir' t bu durum için bir sorun değildir);
  • Giriş olarak okuyacağım tüm metin dosyalarının UTF-8'de olduğunu varsaymalıyım, C ++ 'da çalışma zamanında kolayca kontrol edilebildiğinden ve dilin sizin için kontrol etmeyeceğinden emin değilim;
  • C ++ kitaplıklarının yönetilmesi, komut dosyası dillerinden daha zordur;

Deneyim ve öngörü eksikim, bu yüzden belki de avantajları ve dezavantajlarım yok. Yani soru şu: Bunun için C ++ kullanmak mantıklı mı? rapor edecek deneyimleriniz var mı ve önemli olabilecek avantaj ve dezavantajları görüyor musunuz?


1
Yapı için tek bir dil yorumlayıcısına bağlı olarak , özellikle Python olduğundan - çok taşınabilir, Linux'ta yaygın ve Windows'ta kolayca bulunabilen çok kötü görünmüyor. Ek Python kitaplıklarına ihtiyacınız varsa, virtualenv'i kullanabilirsiniz ve bir Python dosyası (gönderebileceğiniz) ve sanal ağı kurmak, bunları yüklemek ve gerçekte çalıştırmak için bir Python dosyası (gönderebileceğiniz) dışında bir şey eklemez. bu ortamda komut dosyaları oluşturun. Yapımınızda ekstra bir komut dosyasına ve bir internet bağlantısına gereksinim duyabilirsiniz.

Metnin kodlamasını oldukça iyi bir güvenilirlikle tahmin edebilirsiniz.
DeadMG

@DeadMG Evet, ancak çok fazla iş varsa bunu elle yapmak ( iyi bir tahmin yapmak ve kendinizi sınırlamak istemiyorsanız "bu ascii veya unicode ve unicode ise, kaç bit ve ne bayt sırası?") Ve başka bir bağımlılık eklemek (bunun için özgür ve bağımsız bir kütüphane varsa) Python'a bağlı olarak durmak için C ++ 'a düşme noktasını yener.

@delnan Evet, ancak hala daha fazla dilde yükleniyor. Açıklamanızdan, herhangi bir ek bağımlılık "çok kötü" görünmüyor ama ben zaten yönetecek çok şey var çünkü belki de kullanılan dilleri sınırlamak için yardımcı olabilir düşünüyorum. Ayrıca gömülü bir komut dosyası dili (doğrudan projede C ++ ile uygulanır), javascript / HTML / CSS, XML ve akılda tutulması gereken çok sayıda diğer formatları kullanıyorum.
Klaim

2
c ++ derleme betiğinizi oluşturmak için ne kullanacaksınız?
jk.

Yanıtlar:


24

Sadece Python kullanın.

C ++ ile geliştirdim ve Python'da komut dosyalarımı yapıyorum ve C ++ ile komut dosyaları oluşturmak acı verici olurdu:

  • Python, sözlükleri, listeleri, liste sözlüklerinin iç içe sözlüklerini, vb. Değiştirmeyi önemsiz kılar (Örneğin, komut dosyalarımdan biri, tüm araçlarımın, araçların sürümlerinin ve araçların sürümlerinin yollarının çok düzeyli bir hiyerarşisini kullanıyor. ) C ++, şablonlar ve özel sınıflar için de aynısını yapabilir, ancak çok daha ayrıntılıdır (bu, genellikle daha düşük üretkenliğe dönüşen daha fazla kod satırına dönüşür).
  • Python, XML ve JSON işleme, alt süreç ve os.walk gibi üst düzey kitaplıklar ve rutinler sağlar . Yine, C ++ bunu yapabilir, ancak kütüphaneleri bulmak, API'lerini öğrenmek, çağrıları doğru bir şekilde bir araya getirmek (genellikle daha düşük seviyedir) vb.
  • Derleme komut dosyaları katma değerli olmayan bir etkinliktir (bir terimi yalın olarak ödünç almak için). Mümkün olduğunca üst düzeyde bir dil kullanmak, mümkün olduğunca çabuk bitirmek, kullanıcılarınıza fayda sağlayan işe geri dönmek daha iyidir.
  • Deneyimlerime göre, komut dosyaları oluşturma beklenmedik şekillerde büyür. Bir görev başlangıçta C ++ için basit görünse bile, aceleyle karmaşıklaşabilir. Yeni bir gereksinim ortaya çıktığında, bir Python betiğinde işlem yapmak C ++ 'da yapmaktan daha kolaydır (yeni kitaplık API'lerini bulmayı veya okumayı gerektirebilir).

C ++ için listelediğiniz avantajlarla ilgili olarak:

  • Tek bir bağımlılık (Python) eklemek yapınızı önemli ölçüde zorlaştırmamalıdır. Örneğin, çoğu Linux kurulumunda zaten standarttır. Python'un "piller dahil" kitaplıkları sayesinde, derleme komut dosyalarınızın bağlı olacağı C ++ kitaplıklarından daha kolay yönetilebilir.
  • C ++ 'ın sağladığı güvenlik türü, küçük komut dosyaları için değil, büyük projeler için en kullanışlıdır.
  • Python, C ++ 'ı çok iyi tamamlar (düşük seviyeye karşı yüksek seviye, statik olarak yazılanlara göre dinamik olarak yazılır, vb.) Ve daha sonra yapmak isterseniz C ++ ile çok iyi entegre olabilir (SWIG ve Boost.Python sayesinde), bu yüzden C ++ programcısı için öğrenmeye değer.
  • Söylediğiniz gibi, yürütme hızı bir sorun olmamalıdır.

Bunu bir yıl boyunca çapraz paltform projesinde cmake ile mücadele ettikten sonra yaptık (python yapıları). Sonunda biz bağımlılık kontrolü (bir yapının en karmaşık kısmı) yapmaya çalışırken bile rahatsız etmedi. Otomatik yapılar için zaten her şeyi yeniden oluşturmak istediğiniz için ve C ++ 'da çok karmaşık bağımlılıklar var
Martin Beckett

1

Bunun duruma özel bir soru olduğuna inanıyorum. Komut dosyaları için C ++ kullanmanın anlamlı olup olmadığını doğru bir cevap olmadığını iddia ediyorum, anlamanın tek yolu pratikte denemek.

Şahsen ben dilin daha iyi ifade ve ikili dosyaları manipüle ve kod oluşturma görevini yönetmek için daha kolay (kişisel görüş, elbette) standart kütüphane araçları nedeniyle Python C ++ üstün görmek istiyorum. Tabii ki, görev için geliştirilen sofistike kütüphaneler mevcut olabilir, ancak eğer değilse, o zaman kişisel olarak kesinlikle Python'un "daha sık doğru" cevap olacağına bahse girerim - genel olarak.


1

Senaryoları kendiniz yazmayın, çabayı çoğaltıyorsunuz ve tekerlekleri yeniden icat ediyorsunuz.

C ++ derleme sistemlerini destekleyen SCONS veya Maven 3 gibi bir şey kullanın .

İyi bir derleme sistemi, dilden bağımsız olarak, çalışan bir yürütülebilir yapı oluşturmak için komut dosyası biçiminde özel mantık gerektirmemelidir.

Bir derleme sistemini özelleştirmek için komut dosyaları yazmanız gerekiyorsa, bu iyi bir derleme sistemi değildir. Bir derleme sistemi için bir eklenti yazmak farklı bir hikaye, ancak yine de çoğunlukla bir çevre / donanım için çok özel olmalı ve nadiren başvurulması gereken bir şey olmalı.


1
Açıkladığım gibi, zaten cmake kullanıyorum ama yine de yapılması gereken özel komut dosyalarına ihtiyacım var. Bu özel komut dosyalarından bahsediyorum, derleme sürecinin kendisi değil.
Klaim

1
Maven'i seviyorum - "Cehennem Dünyası" C programı oluşturmak için gereken senaryo programdan daha uzun!
quant_dev

@quant_dev, Maven'i ilk kez kullandığımı hatırlıyorum, kendi web sayfalarında, ilk kez kurulum zor olduğundan, zaten maven'i bilen biriyle başlamayı tavsiye ediyorlar. Bu, onunla hiçbir şey yapmak istemediğimin ilk işaretiydi!
Brady

Ben SCons sevdim, biraz yavaş ama kullanımı çok kolay.
quant_dev

1
@JarrodRoberson "Komut dosyalarını" çok fazla kullandım. Yani yapılandırma dosyaları. Beyan edici olmanın Maven'i otomatik olarak daha taşınabilir ve bakımı daha kolay hale getirip getirmediğinden emin değilim. Yine de daha az esnek hale getirir, bu da büyük projelerde acı olabilir.
quant_dev

0

Soruya odaklanmak için:

C ++ ile derleme komut dosyaları yazmak mantıklı mı?

Cevap basit bir hayır .

Şu anda kabul edilen cevap python'a yakınlaşıyor ve bir dizi geçerli endişeyi listeliyor, ancak dilden bağımsız bir neden eklemek istiyorum:

Gerçekten yok komut dosyası şey istediğiniz herhangi bunu yardımcı olabilir derlenmiş dili:

  • Komut dosyasını önyüklemek için bir komut dosyasına ihtiyacınız olacak!
  • Veya derlenmiş komut dosyasını kaynak denetiminde kontrol etmeniz (ve teslim edilen kaynaklarla senkronize tutmanız gerekir!)
  • Komut dosyası aniden ekli komut dosyası için bir yapı yapılandırmasına sahiptir. (Bunun korunması gerekir!)

Buna ek olarak, diğer cevapla gitmek:

Muhtemelen ayrıca yapı komut dosyalarınızı yazmak için bir "ham" komut dosyası dili kullanmak istemezsiniz (C ++ karmaşıklıklarının CMake tarafından işleneceğini anlıyorum).

Ne muhtemelen yapmalıyım birini seçmek olduğunu Build'a . Sistemleri . dışarı . orada . ve birinin faturanıza uygun olup olmadığını görün. Scriptability / genişletilebilirlik / CMake / çapraz platform ile güzel oynayı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.