C'nin ayrıştırılmasının zor olduğunu ve C ++ 'nın esasen imkansız olduğunu söyleyen bir halk teoremi var.
Doğru değil.
Doğru olan, C ve C ++ 'nın LALR (1) ayrıştırıcılarını kullanarak ayrıştırma makinesini kırmadan ve sembol tablosu verilerinde dolaşmadan ayrıştırılmasının oldukça zor olmasıdır. Aslında GCC, YACC ve bunun gibi ek bilgisayar korsanlığı kullanarak onları ayrıştırırdı ve evet, bu çirkindi. Artık GCC, el yazısı ayrıştırıcıları kullanıyor, ancak yine de sembol tablosu korsanlığı ile. Clang çalışanları asla otomatik ayrıştırıcı üreteçleri kullanmayı denemedi; AFAIK Clang ayrıştırıcısı her zaman elle kodlanmış özyinelemeli iniş olmuştur.
Doğru olan, C ve C ++ 'nın daha güçlü otomatik olarak oluşturulmuş ayrıştırıcılarla, örneğin GLR ayrıştırıcılarla ayrıştırılmasının nispeten daha kolay olduğu ve herhangi bir hacklemeye ihtiyacınız olmadığıdır. Elsa C ++ ayrıştırıcı bunun bir örneğidir. Bizim C ++ Ön Uç başka (olarak tüm "derleyici" ön uçları vardır, GLR oldukça harika ayrıştırma teknolojisidir) 'dir.
C ++ ön ucumuz GCC'ler kadar hızlı değil ve kesinlikle Elsa'dan daha yavaş; Onu dikkatlice ayarlamak için çok az enerji harcadık çünkü daha acil sorunlarımız var (yine de milyonlarca satır C ++ kodunda kullanıldı). Elsa muhtemelen daha genel olduğu için GCC'den daha yavaştır. Bugünlerde işlemci hızları göz önüne alındığında, bu farklılıklar pratikte çok önemli olmayabilir.
Ancak bugün yaygın olarak dağıtılan "gerçek derleyiciler", köklerini 10 veya 20 yıl veya daha eski derleyicilere dayandırmaktadır. O zaman verimsizlikler çok daha önemliydi ve hiç kimse GLR ayrıştırıcılarını duymamıştı, bu yüzden insanlar nasıl yapacaklarını bildiklerini yaptılar. Clang kesinlikle daha yenidir, ancak daha sonra halk teoremleri "ikna edebilirliklerini" uzun süre korurlar.
Artık bunu bu şekilde yapmak zorunda değilsin. GLR ve diğer bu tür ayrıştırıcıları, derleyici bakımında bir gelişme ile, ön uç olarak çok makul bir şekilde kullanabilirsiniz.
Ne olduğunu doğrudur, Mahallenin iyi derleyici'nın davranışını eşleşen bir dilbilgisi alma zor olmasıdır. Neredeyse tüm C ++ derleyicileri orijinal standardı (çoğu) uygularken, aynı zamanda çok sayıda karanlık köşe uzantısına da sahiptirler, örneğin MS derleyicilerinde DLL özellikleri, vb. Güçlü bir ayrıştırma motorunuz varsa, zamanınızı elde etmeye çalışarak geçirebilirsiniz. ayrıştırıcı oluşturucunuzun sınırlamalarına uyması için gramerinizi esnetmeye çalışmak yerine, son dilbilgisini gerçeğe uyacak şekilde kullanın.
DÜZENLEME Kasım 2012: Bu cevabı yazdığımızdan beri, C ++ ön ucumuzu ANSI, GNU ve MS varyant lehçeleri dahil olmak üzere tam C ++ 11'i işleyecek şekilde geliştirdik. Çok fazla ekstra şey olsa da, ayrıştırma motorumuzu değiştirmemize gerek yok; sadece gramer kurallarını gözden geçirdik. Anlamsal analizi değiştirmek zorunda kaldık ; C ++ 11 anlamsal olarak çok karmaşıktır ve bu çalışma ayrıştırıcının çalışmasını sağlama çabasını batırır.
DÜZENLEME Şubat 2015: ... artık tam C ++ 14'ü işliyor. ( Basit bir kod bitinin GLR ayrıştırmaları için c ++ kodundan insan tarafından okunabilir AST alın ve C ++ 'ın meşhur "en can sıkıcı ayrıştırması" na bakın).
Nisan 2017 DÜZENLEME: Artık (taslak) C ++ 17'yi işliyor.