· kaynak Hacker News – Front Page (native)
C++ Insights, C++'ı Derleyicinin Gözünden Göstererek Hacker News Ana Sayfasına Yerleşti
C++'ı derleyicinin örtük olarak ürettiği kodu ortaya çıkarmak için yeniden yazan Clang tabanlı bir araç olan C++ Insights, Hacker News ana sayfasına ulaştı; aracın lambda, dönüşüm (cast) ve özel üye fonksiyonlarındaki dönüşümleri dikkat çekti.
Derleyicin sizin için ne yazdığını gösteren bir Clang aracı
Andreas Fertig tarafından geliştirilen açık kaynak bir proje olan C++ Insights, Hacker News ana sayfasına yerleşerek, sıradan C++ kodunu derleyicinin fiilen gördüğü koda dönüştüren bu araca yeniden ilgi çekti. Clang üzerine kurulu olan araç bir kaynakten kaynağa dönüşüm gerçekleştiriyor: bir kaynak dosyayı alıyor ve örtük dil mekanizmasının — üretilen constructor'lar, gizli dönüşümler (cast), operator çağrıları — açık hale getirildiği genişletilmiş bir sürümü çıkarıyor.
Projenin GitHub dokümantasyonu fikri minimal bir örnekle anlatıyor. Base ve Derived adlı iki sınıf ve bir Derived nesnesini kopyalayan, atayan ve yukarı doğru dönüştüren (upcast) main içindeki birkaç satır, dikkate değer hiçbir şey olmadan derleniyor. C++ Insights'tan geçirildiğinde aynı program Clang'ın sessizce eklediklerini gösteriyor: her sınıf için derleyicinin ürettiği varsayılan constructor, kopya constructor ve atama operator'ü, yorum satırına alınmış bildirimler olarak; açık bir constructor çağrısı olarak yeniden yazılan bir kopya başlatma; operator= çağrısı olarak açıkça yazılan atama; ve taban sınıf referansına dönüşümün bir static_cast olarak ifade edilmesi.
Lambda'lardan structured binding'lere
Özel üye fonksiyonların ötesinde, araç modern C++'ın bilerek gizlediği yapıları da genişletiyor. Projenin README'sine göre C++ Insights, lambda'ları, range-based for döngülerini ve structured binding'leri derleyici içi karşılıklarına dönüştürüyor, operator'lerin nerede çağrıldığını ve derleyicinin dönüşümleri (cast) nereye yerleştirdiğini işaretliyor ve auto ile decltype ardındaki türleri çıkarıyor. Belirtilen hedef, çıktının kendisinin derlenebilir olması; ancak yazar bunun her durumda mümkün olmadığını belirtiyor.
Öğretmekten doğdu
Fertig, projenin C++11, C++14 ve C++17 ile gelen özellikler üzerine materyal hazırlarken 2017'de başladığı araştırmadan ortaya çıktığını yazıyor. Mevcut seçenekleri yetersiz buldu: Clang AST'sini dökebiliyor ve Compiler Explorer gibi araçlar üretilen assembly'yi gösteriyor, ama hiçbirinin çıktısı programcıların gerçekte yazdığı dilde ifade edilmiyor. Özellikle öğrencilere öğretmek için iki yaklaşımı da tatmin edici bulmadı ve bu yüzden örneğin bir range-based for döngüsünü desugar edilmiş haline yeniden yazabilecek Clang tabanlı bir araç geliştirmeye başladı. Kapsam oradan büyüdü.
Erişilebilirlik ve entegrasyonlar
C++ Insights tarayıcıda cppinsights.io adresinde çalışıyor; bu yüzden denemek için yerel bir kurulum gerektirmiyor. Yerel kullanım için binary, insights <YOUR_CPP_FILE> -- -std=c++17 şeklinde çağrılıyor; Clang bayrakları çift tireden sonra geçiliyor. Proje, LLVM kaynak ağacının içinde harici bir proje olarak ya da mevcut bir Clang kurulumuna karşı bağımsız olarak derlenebiliyor; CMake seçenekleri statik bağlama, kod kapsamı ve benzeri konuları kapsıyor. getinclude.py adlı yardımcı betik, derleme sırasında binary'ye sabit şekilde gömülen include yollarının üstesinden gelmek için seçilen bir derleyiciden — varsayılan olarak g++'tan — sistem include yollarını topluyor.
README ayrıca Vim, Neovim ve Visual Studio Code için plugin'ler, macOS için bir Homebrew formülü, ayrı olarak geliştirilen bir Docker container ve bash, zsh ile fish için shell tamamlama betikleri dahil entegrasyonları listeliyor.
Uyarılar
Fertig aracın sınırları konusunda açık sözlü. Her şeyi doğru yaptığını iddia etmediğini, C++20 gibi daha yeni standartlardaki özellikler üzerindeki çalışmanın sürdüğünü ve sonuçların nihayetinde Clang'ın AST'yi kendi anlayışına bağlı olduğunu söylüyor. Davranışı GCC veya MSVC ile karşılaştıran geliştiriciler bu Clang temelini akılda tutmalı.
Neden önemli
C++, yaygın olarak kullanılan diller arasında derleyicinin sessizce yaptığı işin büyüklüğü açısından alışılmadık bir konumda. Zero kuralı, özel üye fonksiyonlarının tamamı örtük olan sınıfları teşvik ediyor ve modern özellik setinin büyük bir kısmı — lambda'lar, structured binding'ler, range-based for döngüleri — daha ayrıntılı mekanizmalar üzerinde sözdizimsel şekerden ibaret. Compiler Explorer hattın sonunu assembly'de gösteriyor ve AST dökümleri bir iç temsili gösteriyor; ama C++ Insights faydalı bir orta noktayı işgal ediyor: okuyucunun zaten bildiği aynı C++ ile yazılmış çıktı. Bu, onu hem bir yapının gerçekte ne anlama geldiğini öğrenen yeni başlayanlar için hem de performans veya ince overload çözümlemesi üzerine düşünen deneyimli geliştiriciler için değerli kılıyor. Hacker News ana sayfasında yeniden görünmesi, bu tür öğretim araçlarına olan talebin hâlâ güçlü olduğuna işaret ediyor.
- #cpp
- #clang
- #compiler
- #open-source
- #developer-tools