Çalışan bir C ++ yeniden düzenleme aracı var mı? [kapalı]


161

C ++ için büyük kod tabanlarıyla (yaklaşık 100.000 satır) çalışan tam özellikli bir yeniden düzenleme aracı bilen var mı?

Son yıllarda tekrar tekrar bulabildiğim her şeyi denedim: SlickEdit, Eclipse CDT. Hepsi hiç de kullanışlı değildi.

Hepsini kapa Özet : Zaman aldı ve "Visual Assist X" yanı sıra "C + için Refactor" değerlendirdi. Her ikisinin de etkileyici özellikleri var, ancak her ikisi de mükemmel olmaktan uzak. Büyük bir kod bloğunun çıkarılması genellikle manuel modifikasyonlar olmadan tatmin edici bir şekilde yapılmaz ve bu nedenle ödeme yapmaz.

"Visual Assist X", çok daha eksiksiz otomatik tamamlama vb. Gibi güzel özelliklere sahiptir.

Benim görüşüme göre cevap: "Hayır, C ++ için üretime hazır yeniden düzenleme aracı yoktur"

GÜNCELLEME Mart 2015 Bugün hdoghmens cevap gelince C ++ için Resharper denedim. Onun bağlantısı https://www.jetbrains.com/resharper/ C ++ hakkında hiçbir şey söylemiyor. Ama burada bir yıldan fazla bir süre önce açıklanan Resharper C ++ buldum:

https://www.jetbrains.com/resharper/features/cpp.html

Ben 20MB kod tabanı kullanarak VC2010 ile denedim.

Test 1: Extract Method: bir Resharper istisnası ile sonuçlanır. Kaynak kodu değiştirilmedi.

Test 2: Farklı kaynak ile özüt Yöntemi: İyi çalışıyor

Test 3: Çıkartılan işlevin imzasını değiştirin: Sonuçlar kırık C ++ kodunda:

bool myclass::do_work123(<unknown long Color>int& Filled*&, long, int&)

Belki de bu yüzden C ++ ana sayfada listelenmiyor.

Bence bu sorunun cevabı hala “HAYIR” .


11
Bunu sevdim. C ++ ile ilgili sorun çok karmaşık, bağlama duyarlı sözdizimidir. Aslında tam kaynağı ayrıştırmadan, bir tanımlayıcının ne anlama geldiğinden emin olamazsınız.
DevSolar


4
Eclipse aslında oldukça iyi çalışıyor, sadece eclipse.ini'yi düzenleyerek daha fazla bellek kullanmasına izin vermeniz gerekiyor
n0rd

3
Hala C ++ için yeniden düzenleme araçlarını izliyorsanız, lütfen JetBrains'te şu anda ReSharper'da C ++ desteği ve ayrı bir çapraz platform C ++ IDE
Jura Gorohovsky

1
@RED YUMUŞAK ADAIR ünlü. Bunu kontrol edin youtu.be/RT46MpK39rQ?t=1611
George C.

Yanıtlar:


38

Visual Studio ile Visual Assist X'i çok kullanışlı buluyorum . Başka bir seçenek ise C ++ için Refactor .


8
Ne yazık ki, C ++ için Refactor (varsa) büyük kod tabanlarıyla iyi çalışmaz.
Daniel Rose

1
Refactor for C ++ ve büyük kod tabanlarında özellikle ne olur?
Ira Baxter

2
@IraBaxter Basitçe kırıldı. Yeniden düzenleme seçenekleri görünmez veya tamamlanmaz. Garip hata mesajları var ya da hiç yok.
Daniel Rose

4
Refactor for C ++ küçük kod tabanları için bile iyi çalışmaz, hiç kırılmaz ve kullanılamaz.
kovarex

3
@Nils: anlamadığı şeyin özel bir örneğini verebilir misiniz?
Ira Baxter

41

Visual Assist ve Visual Studio büyük kod tabanlarıyla uğraşmayı çok daha kolay hale getirir. Görsel destek, bir sınıfın veya üyenin nasıl kullanıldığını izlemede iyidir ve yanlış pozitifler olmadan yeniden adlandırmada arama ve değiştirmeden daha etkilidir.


23

Ben bekliyoruz çınlama önemli ölçüde önümüzdeki birkaç yıl boyunca orada C manzara ++ üstlenmeden araçları değişecektir. C ++ kodunu çözümlemek ve anlamsal olarak analiz etmek için bir API sunan açık kaynaklı, modüler bir derleyicidir. IDE'ler ve diğer araçlar, kendi ayrıştırıcı ve semantik analizörlerini yazmakta zorlanmak yerine bu API'yı kullanabilecektir.

Google zaten clang kullanarak büyük ölçekli bir yeniden düzenleme aracı yaptı .


2
Ancak, Google dışında yalnızca ölümlü bir kişinin kullanabileceği bir sonuç var mı?
Jan Hudec

1
@JanHudec: Buradan bağlanan eğiticiye göz atın: comments.gmane.org/gmane.comp.compilers.clang.devel/23203
HighCommander4

17

Mozilla'nın Pork ( Wiki , Developer Wiki ) adlı kendi yeniden düzenleme aracı vardır . İşte Pork'un arkasındaki geliştiricinin blogu. Okuduğum kadarıyla Pork Mozilla'daki yeniden düzenleme işlemlerinde başarıyla kullanıldı.

Domuz eti * nix arazi gelirseniz yardımcı olmalıdır, Visual Studio için ben de Visual Assist öneririz.


9

Bizim DMS Yazılım Değişim Mühendisliği Toolkit C ++ dahil kod büyük organları üzerinde karmaşık dönüşümleri gerçekleştirmek için tasarlanmış bir dönüşüm motorudur. Milyonlarca satır kodlu sistemlerde güvenilir değişiklikler yapmak için kullanılmıştır. Derleyici hassas dil analiz cihazları ve transformatörler kullanarak çalışır.

Ad ve tür çözünürlüğüne sahip tam bir C ++ ayrıştırıcısına sahiptir, AST kodları oluşturur, bu ağaçları revize etmek için prosedürel veya kaynaktan kaynağa dönüşümleri (C ++ yüzey sözdizimi ile) uygulayabilir ve korunan yorumlarla derlenebilir çıktıyı yeniden oluşturabilir. (Düzenleme: 7/1/2011: Şimdi standardı anladığımız ölçüde C ++ 1X var :)

C ++ bileşen yeniden mimarisi ve diller arasında% 100 tam otomatik çeviriler de dahil olmak üzere büyük ölçekli yeniden yapılandırma projelerinde kullanılmıştır. Bunu web sitesinde okuyabilirsiniz.

DMS ayrıca rastgele kaynak analiz araçları oluşturmak için de kullanılır. Örnekler arasında klon algılama, test kapsamı, akıllı fark (basit ekleme ve silme satırları yerine kaynak kodu yapılarının ve soyut düzenleme işlemlerinin karşılaştırılması) vb.

Ne değil (şu anda) etkileşimli bir yeniden düzenleme aracıdır. Çoğu yeniden düzenleme işlemini iyi yapabilmek için derin kontrol ve veri akışı analizlerine ihtiyacınız olduğuna inanıyoruz. DMS bunu desteklemek için genel makinelere sahiptir ve bu noktada C, COBOL ve Java için makineler uygulanmıştır, C ++ bir sonraki sıradadır. Bu zor bir iş. Bu tür bir sorun iyi çözülene kadar kimseden çok ciddi C ++ yeniden düzenleme araçları görmeyeceksiniz. İlk önce tam bir C ++ ayrıştırıcısına ihtiyacınız var: -}

EDIT 7/5/2011: Etkileşimli sürümde bir deneme yapacağız. Bunun nasıl yapılacağını araştırmak için Enerji Aşaması I SBIR bölümünü kazandık. Bkz. Http://science.energy.gov/sbir/awards-and-general-stats/fy-2011/phase-i-by-state/?p=1#tx ("Teksas" altında Anlamsal Tasarımlar arayın). Acele bir sonuç beklemeyin; Bu, bir araca ulaşmak için 3 aşamalı çok yıllı programın sadece başlangıcıdır.

EDIT 8/11/2011: İlk ilerleme ... şimdi tüm C ++ 0x ve OpenMP direktiflerini ele alıyoruz.

EDIT 1/4/2012: C ++ kodunun tam akış denetimini yapar.

EDIT 9/15/2014: Şimdi elinizde C ++ 14 ön uç ayrıştırıcı / dönüşüm motoru var. Bu noktada bile oldukça güvenilir bir şekilde yeniden adlandırılıyor: -}


İndirme sayfanızda bu aracı değerlendirmek için bir bağlantı yok gibi görünüyor semanticdesigns.com/Products/RegisterEval.html Şu anda VS2010 veya VS2008 için bir deneme sürümü ve fiyatlandırma mevcut mu?
SmacL

Yeniden düzenleme aracı için, "acele bir sonuç beklemeyin". Faz I Ar-Ge görevimiz sona erdi ve Faz II için fon başvurusunda bulunuyoruz. DMS'yi ve değerlendirme araçlarını tartışmak için şirkete başvurun. Enterprise Oracle'ın bir indirme öğesi olmadığı gibi, "değerlendirmek için indirdiğiniz" türden bir şey değildir.
Ira Baxter

... DMS VS2008 / VS2010'u dönüştürebilir, ancak etkileşimli bir araç olarak kullanamaz ve önişlemci yönergelerine ilişkin sınırlamalar vardır. (İyi haber şu ki, bunlarla ilgili önemli bir sorunu çözdüğümüzü düşünüyoruz ve bunu II. Aşama Ar-Ge programında uygulayacağız).
Ira Baxter

Geri bildiriminiz için teşekkürler, ancak peşimde olduğum araç türü gibi görünmüyor. Etkileşimli, sadece bir kol ve bir bacak, örneğin bir çağrı alır parametre sayısını değiştirme, bir işaretçi parametresi bir başvuru değiştirerek, maliyet olmadan büyük bir kod tabanı üzerinde makul basit dönüşümler gerçekleştirebilir bir şey gerek yok. VisualAssist yakın, ancak biraz daha ileri gitmesi gerekiyor.
SmacL

3
... DMS'nin amacı, "yeniden düzenleme" veya "değil" kod dönüşümlerinin kodlama ve hatasız uygulanmasını sağlamaktır. Evet, zor ve henüz orada değiliz. C ++ için gördüğüm diğer araçlardan daha yakın IMNSHO'yuz ve araç temellerinde bir sorun yok. Geriye kalanlar, ön işlemciyle, kod ölçeğiyle ve C ++ semantiğini bu tür dönüşümlere izin verecek şekilde kodlama çabasıyla ilgili kötü problemlerdir. Ve bunun BÜYÜK bir proje olduğunu söyleyen ilk kişi olacağım.
Ira Baxter

8

Emacs kullanıyorsanız, Xrefactory'yi deneyin . Yöntem çıkarma, sınıfların / işlevlerin / değişkenlerin yeniden adlandırılmasını ve ekleme / silme / taşıma parametrelerini destekler.Ayrıca çok iyi / hızlı kod tamamlama motoruna sahiptir.


6

Şu anda C ++ için herhangi bir yeniden düzenleme aracı tavsiye edemez , kesinlikle 100k satır ve üzeri büyük kod tabanları için değil. Bunun OP gibi değişeceğini umuyorum ve umarım bir gün bir şeyler olacak. Gerçekten iyi araçlar görmeden önce dilin önemli ölçüde değişmesi gerekeceğinden korkuyorum.

btw, SlickEdit yeniden düzenleme özelliklerini düşürdü mü?


Dil yaptılar C ++ 2011 standardının sürümü ile, önemli ölçüde değişiklik. Ek komplikasyonlar sorunu daha da zorlaştırıyor, daha kolay değil, çünkü tüm kullanıcılar tüm gelişmiş dil özelliklerini ve yeniden düzenleme yeteneğini isteyecek : - {
Ira Baxter

2
Son zamanlarda Slickedit'in yeteneklerini okuduktan sonra, bir ismin sezgisel yöntemlerle kullanılmasına karşılık gelen tanımı belirlediği anlaşılıyor. "Doğru" bir C ++ ad araması yapmaz. Bu, dönüşümlerinin doğru olduğuna güvenemeyeceğiniz anlamına gelir. Eğer çalışmasını denetlemek sakıncası yoksa, bu sizin için uygun olabilir. Gerçekten büyük yazılım paketlerinde, bu muhtemelen iyi değildir. Benim fikrim.
Ira Baxter

4

Emacs kullanıyorsanız ve henüz denemediyseniz rtags denemenizi öneririz (ayrıca vim için bir paket var). C / C ++ kodunu indeksleyen clang tabanlı bir istemci / sunucu uygulamasıdır ve şu özelliklere sahiptir:

  • tanıma / bildirime git
  • tüm referansları bul, sonraki / önceki sayfaya git
  • sembolü yeniden adlandır
  • clang “fixits” ile entegrasyon

Benim için rtags (ve emacs) tanıtan bu konuşmayı izledikten sonra denemeye karar verdim .

(Sadece QtCreator'ım bazı sembolleri düzgün bir şekilde yeniden adlandıramadığında bu kadar ileri gittiğimi söylemeliyim, bu şimdilik bu büyük IDE'yi kullanmam için bir gösteri durdurucu)

Rtags tarafından desteklenen yanı sıra, ben de dahil olmak üzere bazı ek düzgün özelliklere ihtiyacım var:

  • fonksiyon tanımı / prototip yarat
  • çıkarma işlevi
  • alıcı / ayarlayıcı yöntemleri oluşturma

Bunlar için emacs için semantik-refactor paketi kullanmanızı öneririm (vim için alternatif olup olmadığından emin değilim)

Genellikle, clang tabanlı araçlar çok umut verici görünüyor . Büyük kod tabanına sahip projeler de dahil olmak üzere C ++ yeniden düzenleme için clang araçları hakkında daha fazla bilgi edinmek istiyorsanız, Chandler Carruth'un bazı harika konuşmaları var.


3

DMS yazılım rengineering araç bence bunu yapar. Bu büyük ölçekli ve C ++ kolları için tasarlanmış bir kod dönüştürme motorudur. Çıktının ne kadar zarif olduğu hakkında hiçbir fikriniz yok.


1
DMS, büyük C ++ kodu gövdelerinin yeniden araştırılmasını otomatikleştirmek için kullanılmıştır. Bkz. Akers, R., Baxter, I., Mehlich, M., Ellis, B., Luecke, K., Örnek Olay: C ++ Bileşen Modellerinin Otomatik Program Dönüşümü, Bilgi ve Yazılım Teknolojisi ile Yeniden Yapılandırılması 49 (3): 275 -291 2007. Yayıncıdan ulaşılabilir
Ira Baxter

Ne demek "zarif çıktı" ile ne demek. DMS'den elde ettiğiniz çıktı, ona ne verdiğinize ve hangi dönüşümleri uyguladığınıza açıkça bağlıdır. Dönüşüm kodun bir kısmına dokunmazsa, kodun o kısmı ilk etapta olduğu kadar zarif veya değil. Eğer koda dokunursa, zarafet, bir kodlayıcının manuel değişikliklerinde olduğu gibi, dönüşümlerin ne kadar akıllı olduğuna göre belirlenir. Bunun zarafet olduğunu düşünmüyorum, ancak sonucun biçimlendirilmesi "aslına uygun" baskı (orijinal format) veya tanımlı bir güzel baskı stili olabilir.
Ira Baxter

2

Kesinlikle bir Klocwork ticari bir kod yeniden düzenleme paketi olarak söz etmek gerekir . Demo videodan geçtiğinizde çok umut verici görünüyor.


2

Sorun C ++ şablonlarıdır. 2019'dan itibaren C ++ şablonlarını destekleyen herhangi bir yeniden düzenleme aracının farkında değilim. VS2019, VisualAssist, Clion, QtCreator'ı denedim.

Örneği düşünün:

#include <iostream>

struct foo { void print() {} };
struct bar { void print() {} };

template <typename T>
void call_print(T&& v) { v.print(); }

void print() {}

int main()
{
    call_print(foo{});
    call_print(bar{});
    return 0;
}

Yeniden Adlandırma Yeniden Düzenleme özelliğini çalıştırırsam foo::print, bar::printotomatik olarak yeniden adlandırılmalıdır. Çünkü bunlar call_printişlev şablonu örneklemeleriyle bağlantılıdır .


1

Visual C ++ (Express Edition ücretsiz) kullanıyorsanız , www.wholetomato.com (C ++ yeniden düzenleme özelliklerine bağlantı ) adresinden Visual Assist'i kullanabilirsiniz .

30 günlük deneme süresine sahiptir ve Visual C ++ ürününün yerleşik akıllılığının daha hızlı ve daha fazla özellik dolu olduğunu bulduk.


2
Express sürümü ile eklentileri kullanabileceğinizi düşünmüyordum
Yacoby

3
Kesinlikle geçmişte VS C ++ express ile VA yüklemeye çalıştım ve işe yaramadı.
quamrana

Visual Studio eklentilerini yalıtılmış modda yükleyemezsiniz (Express sürümlerinin tümü IDE'yi yalıtılmış modda çalıştırır). Öğrenci iseniz , Visual Studio'nun tam sürümlerini DreamSpark veya MSDNAA'dan indirebilirsiniz.
Billy ONeal

1

Eğer kod temeli yeniden mühendisliği için arıyorsanız: MOOSE. Ama bu bir editör değil, geniş bir analiz ve yeniden yapılandırma araçları koleksiyonu.




1

CLion çok umut verici görünüyor.

Yasal Uyarı: Projelerimi kullanmak için CMake formatına dönüştürmem gerektiğinden henüz denemedim.


1

Lattix'i denemenizi tavsiye ederim . Mimariyi keşfetmek, sorunlu bağımlılıkları tanımlamak ve modülerliği geliştirmek ve teknik borcu azaltmak için kodu yeniden yapılandırmak için büyük C / C ++ kod tabanlarını analiz etmenizi sağlar. Lattix ayrıca yeniden düzenleme işlemine yardımcı olacak bir dizi algoritma sağlar. Bu algoritmalar, öğeleri hiyerarşinin bir bölümünden diğerine nasıl taşıyacağınızı, döngüleri kırabileceğinizi ve alt sistemleri birleştirerek alt sistemlerin birleştirilmesini ve uyumunu geliştirebilmenizi anlamanıza yardımcı olur. İşte Android Çekirdeğini (1.6 milyon LOC C / C ++) analiz eden Lattix sonuçları . Tam açıklama: Lattix için çalışıyorum


1

Bu soruyu çok geç bulduğum için üzgünüm. Öğrencilerim ve asistanlarım 2006'dan beri C ++ yeniden düzenleme üzerinde çalışıyorlar. CDT'lerin yeniden düzenleme altyapısının çoğu IFS yazılım enstitüsündeki ekibim tarafından oluşturuldu. Birkaç yıldan beri Cevelop'a CDT sürümümüzü C ++ kod modernizasyonu refactorings vb. için destek sağlıyoruz. Cevelop, çalışma alanı doğru şekilde kurulursa büyük kod tabanlarıyla çalışabilir. Https://cevelop.com adresinden ücretsiz olarak edinilebilir


Çok ilginç. İndirdim ve başlamayacak. Lütfen github.com/Cevelop/Issues/issues/84
RED SOFT ADAIR

0

Visual Studio 2013 için aşağıdaki eklentiyi buldum: Microsoft tarafından Visual C ++ Refactoring .

Sadece basit bir yeniden adlandırma aracıdır ancak kusursuz çalışır. Bir sembole sağ tıkladıktan sonra aşağıdaki bağlam menüsünü ekler:

resim açıklamasını buraya girin

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.