Daha yüksek bir dili okunabilir C ++ 'a derlemek mümkün müdür? [kapalı]


12

C ++ birçok yönden harika bir dildir, ancak bazı şeyler IDE olmadan yazmak zahmetlidir. Bir VIM kullanıcısı olarak, S-Express'lerle ve muhtemelen Lisp benzeri makrolarla C ++ yazmamı sağlayan daha yüksek düzeyli bir dile erişebilseydim, aynı kalıpları yeniden yazmayı önlerken temiz kod oluşturulmasına izin verirsem çok ilginç olurdu. tekrar tekrar.

Freenode üzerinde sordum ve Lisp-> C'yi ECL ve Bigloo gibi derleyicilerle derleme gibi çeşitli fikirleri test ettim, ancak bunların hiçbiri özellikle temiz C kodu üretmedi.

Bu konuda herhangi bir çalışma var mı?


3
Neden tüm C ++ ve daha sonra istediğiniz ancak temiz zor olan bu özellikleri sadece bir sözdiziminden daha karmaşık C ++ için bir LISP makrosu tarafından genişletilmiş olsun, makrolar ile bir lisp kod neden yazmıyorsunuz? Daha da iyisi, kodunuzu LISP'ye yazmanız yeterli. :)
Jimmy Hoffa

2
Lisp -> C ++ çevirisinin (tartışmasız daha basit) C ++ -> Assembly okunamayan (görüş meselesi) derleme ürettiğinde temiz C ++ kodu üretmesini mi bekliyorsunuz? Zaten derlemenin amacı kimdir?

1
Bir şekilde tamamen kimsenin makroları tam olarak genişletmek istediğinizi genişletmek için yazmış olduğuna ikna olmadım, ancak kural makroları yazmak şaşırtıcı derecede basit olduğundan, sadece liste işleme yöntemleri, sadece yazmakta çok zorlanmamalısınız. makro genişleticinin dikkat etmesini istediğinizde sınırladığınız tek bir s-ifadesinin içinde, sadece C ++ kodunuzu genişletme ile almak için listeyi yazdırmanız yeterlidir.
Jimmy Hoffa

2
Lisp'in C ++ 'da (kapanış gibi) zor olan bazı şeyleri yapabileceğini kabul ediyorum. Bunları yapmanız gerekiyor mu? Daha sonra C ++ 'da yapmak zor olduklarından, onları C ++' a nasıl alırsanız alın, otomatik veya manuel olarak, güzel olmayacaktır. Benim önerim: Lisp'in yapabileceği zor şeylere gerçekten gerçekten ihtiyacınız yoksa Lisp'i kullanmayın. C ++ ile iyi geçin. Bu şeyleri kullanmanız gerekiyorsa, ancak C ++ ile kod yazmanız gerekiyorsa, bunu C ++ ile nasıl yapacağınızı öğrenin. Bu işte yetişkinleri çocuklardan ayıran şey budur.
Mike Dunlavey

3
C kodu yayan derleyicileri olan birkaç dil var, bu yüzden C benzeri C ++ kodu olsa bile bunun neden mümkün olmadığını görmüyorum. Sorunuz "C ++ 'daki tüm özellikleri kullanarak kanonik, en iyi uygulama C ++ kodunu alabilir miyim" ise, bu biraz zor olabilir.
Robert Harvey

Yanıtlar:


13

Daha yüksek seviyeli dilleri daha düşük seviyeli dillere derlemek çok kolay Bunun sayısız örneği var. Bir tanjantın çoğuna gitmeden, C'ye derlenen erken C ++ derleyicilerini gösterebiliriz.

Ancak karışıma "temiz" ve "okunabilir" atmaya başladığınızda, işler gerçekten zorlaşır. Temiz, okunabilir kod , yazdıklarınızın anlamını ve niyetini ifade eder . Bilgisayarlar, yorumlama ve anlam oluşturma konusunda kötü bir şekilde kötüdür. Sen adında değişkenler ile bitirmek olasılığının daha yüksek olduğu int_147daha input_buffer_length. Elbette, bu projeyi gerçekten işe almak istiyorsanız, Lisp'inizi bir çeşit makul okunabilir C ++ 'a dönüştürmek için büyük bir AI projesine girebilirsiniz, ancak mükemmel dürüst olmak gerekirse, Common Lisp derleyicileri yaptıkları işte oldukça iyi .

Bir Lisp'den C ++ oluşturmanın zorluğundan daha önemli olanı bunun faydasıdır. Oluşturulan C ++ 'ın okunabilmesi için hangi amaca hizmet eder? Lisp sizin kaynak kodunuzsa, ara gösterimler ilgisiz olmalıdır. C ++ 'ı orijinal Lisp'nizi anlamayan programcılara teslim etmek istiyorsanız, şimdi başka bir sorununuz var . Oluşturulan C ++ 'nızı değiştirmek istediklerinde ne olur? C ++ 'da Lisp'inize temiz tercüme etmeyen şeyler yazarlarsa ne olur?

Diyelim ki çözdük. On yıl sonra ve yüz milyonlarca DoD para bağışında bulunduktan sonra, Lisp'i deyimsel C ++ 'a dönüştürebilen bu büyük, karmaşık (ama kusursuz) dil çeviri motorunu oluşturduk. İnsanlara yeni bir programlama dili öğreterek ya da sadece iki dili birbirine bağlayabilmemizi sağlayan yeni bir derleyici geliştirerek daha iyi sonuç vermeyecek olan gerçekten ne kazandık?

Ah, doğru. Patronunuz C ++ yazmanızı istiyor ve istemezsiniz. Özgeçmişinizi güncelleyin ve yeni bir iş bulun.


Keşke özgeçmişimi güncelleyip başka bir iş bulabilseydim. Ne yazık ki iş = "öğrenci" ve patron = "profesör" olduğunda bu çok basit değildir. Ve maalesef, bir diplomam olmalı. Ne olursa olsun derslere gitmiyorum, ama evde kendim öğreniyorum. Zaten sektörde çalışıyorum ve bildiğim çoğu mezundan daha fazla para kazanıyorum. İşte böyle çalışır. Ne yazık ki. C ++ 'da karmaşık bir şey yazdığımda profesörüm beni geçmeyi kabul etti. Zaten C ++ biliyorum. Bu yüzden farklı bir şey öğrenme şansını tercih ederim (; Bir yana Rant, harika cevap. Teşekkürler
MaiaVictor

@Dokkat: C ++ 'ı bildiğinize inanmıyorum. Parametrenin yöntem veya işlevi olup olmadığına bağlı olarak özel uygulamalara sahip şablonlar yazabilir misiniz? Boost.MPL kullanarak derleme zamanı hesaplamaları yaptınız mı? Boost.ForEach'ın nasıl çalıştığını anlıyor musunuz? C ++ ile yapmak zorundaysanız, daha gelişmiş C ++ öğrenmek için bir fırsat olarak alın. İşiniz için de daha kullanışlı olacaktır.
Jan Hudec

1
Bu üzücü yıllarda C ++ ile çalışırken oldukça karmaşık şablonlar yaptım. Evet, Boost kullandım.Birçok, daha kullanışlı olması için bir çok makro tanımladığımı hatırlıyorum. Neyse ben bir çocuktum, bu eğlenceli bir deneyim değildi. Lisp'in bu kadar çok daha sağlam, daha az acı veren bir makro sistemi sağladığında, C ++ 'nın guruish becerileri gerektirdiği tam olarak bu tür bir meta programlamayı gerçekleştirdiğinde daha fazla öğrenmeye değinmiyorum.
MaiaVictor

3

Kısa cevap, şu anda Lisp'i READABLE C ++ 'a dönüştürmenize yardımcı olacak hiçbir şey yok. Elbette her şeyi C ++ veya C'ye dönüştürebilirsiniz, ancak okunabilir kod programlar tarafından değil, insanlar tarafından yazılır. Elbette, uygun biçimlendirme, girintiler, güzel sınıf adları ile C ++ kodunu çıktılayabilir ve hatta belki de bir şekilde Lisp sınıfı nesnelerinden C ++ sınıflarına mükemmel çeviri alabilirsiniz. Belki de kütüphane bağımlılıklarını sadece sağ bağlantılı alabilirsiniz ve belki çok yakın C dili C. Ama sonuçta her şey yazmıştı ürettiler ne için vardır ikilileri derlemek olabilir, okunabilir kod anlaşılamamıştır bir güzelliktir hiç kimse tarafından, en azından henüz değil ve muhtemelen hiçbir zaman okunabilir terimin başlangıçta oldukça özneldir ve bir grup geliştirici arasında neyin okunabileceği düşünülebilirse diğerleri tarafından iğrenç sayılabilir.

C ++ 'ı okunabilir yapmak için Lisp'de değil C ++' da yazmanız gerekir. Ayrıca kodlama tarzınızı, kodunuzu okuyacak kişilerin en iyi anlayacağı şekilde değiştirebilmeniz gerekir. Tıpkı kitaplar gibi, programlar da belirli bir izleyici göz önünde bulundurularak yazılır ve iyi yazılmışsa güzel ve dokunaklı olabilir, değilse gizlenmiş ve sıkıcı olabilir. Ve eğer bizim için güzel romanlar yazmak için bir program bulamazsak, okunabilir C ++ 'a dönüştürecek bir şey bulamayacağız.


Sanırım "okunabilir" ile ne demek istediğimi abartıyorsun! Gerçekten güzel olması gerekmiyor. Sadece okuyabilir ve neler olduğunu anlayabilirsiniz. JimmyHoffa'nın yorumlarda önerdiği gibi, doğrudan bir çeviri için bazı Lisp makrolarıyla gideceğim sanırım.
MaiaVictor

3

ViM, C ++ için harika bir IDE'dir. Şimdiye kadar gördüğüm en iyi tamamlanma var, ancak bir sürü başlık içeri girerseniz biraz yavaşlaşıyor , clang tamamlandı . Ve derleme için zaten tüm IDE'leri eksik buldum; Sonuçta CMake'de derleme sistemi yazıyorsunuz. Ve lisp için herhangi bir yardım sağlayacak bir şey görmedim , dönem.

Doğru, C ++ lisp tarzı makrolara sahip değildir, ancak şablonlar şemanın hijyenik makrolarının yapabileceği her şeyi ve daha fazlasını yapabilir, çünkü bunları türlere ve yeteneklerine göre farklı şekilde uygulayabilirsiniz. Doğru, çöp toplayıcı eksikliği, kapanmaları biraz daha sıkıcı hale getiriyor, ancak kaynak yönetimi için kullanılan RAII deyiminin kendi avantajları ve ilginç özellikleri var.

Eğer bir öğrenciyseniz, tüm gelişmiş C ++ 'ları gerçekten biliyor musunuz? Algoritmalar kütüphanesinden, argüman türlerinin özelliklerine dayalı alternatif uygulamalar içeren şablonlar yazma üzerine, şablon meta-programlama (Boost.MPL kullanarak) kullanarak zaman hesaplamaları derleyin ve Boost'un başlık altında nasıl çalıştığını anlamaya? Değilse, bunu bazı gelişmiş C ++ öğrenmek için bir fırsat olarak almanızı öneririm. Okul ödevinin sürdürülmesi gerekmeyeceğinden, üretim kodunda okunabilirlik konusunda dikkatli olmanız gereken özelliklerin neler olduğunu görmek için dil ile oynayabilirsiniz.


Ve son doğrudan soruyu cevaplamak için: C ++, kemeri altında çok daha fazla deyime sahiptir ve herhangi bir şeyden deyimsel C ++ oluşturmanın bir yolu yoktur. Çünkü bu deyimlerin çoğunu başka bir şeyde ifade etmenin bir yolu olmayacağı için. Bir şey çöp toplama olacak gerçeğinden başlayarak, C ++ 'da yığıntan faydalanmak deyimdir.


VIM üzerinde anlaşın. C gelişimi için bir eldiven gibi uyuyor. Ben bir Vim kullanıcısıyım ama Lisp için Emacs'i SLIME ve Paredit ile kötü modda kullanıyorum. Temel REPL kancaları ile vim'de Lisping için bazı destek var, ancak SLIME'e yaklaşmıyorlar.
mike30
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.