C++ logosuna benzeyen resmî olmayan C-- logosu | |
| Paradigması | zorunlu |
|---|---|
| İlk çıkışı | 1998) |
| Tasarımcı | Simon Peyton Jones ve Norman Ramsey |
| Tür disiplini | Statik, zayıf |
| Etkilendikleri | C |
| Web sitesi | cs.tufts.edu/~nr/c--/ |
C--, insanların doğrudan kod yazması için değil, yüksek seviye dillerin derleyicileri tarafından otomatik olarak üretilmek üzere tasarlanmış C benzeri bir ara programlama dilidir. Fonksiyonel programlama araştırmacıları Simon Peyton Jones ve Norman Ramsey tarafından yaratılmıştır. Diğer birçok ara dilin aksine, bytecode veya ikili (binary) bir formatta değil, düz ASCII metin olarak tutulur.
Dilin iki ana dalı bulunur:
C--, yüksek kalitede makine kodu üreten derleyicilerin geliştirilmesini kolaylaştırmak amacıyla "taşınabilir bir çevirici dili (assembly)" olarak tasarlanmıştır. Bu sayede, düşük seviyeli kod üretimi ve program optimizasyonu gibi karmaşık işlemler doğrudan C-- derleyicisine devredilir.
Dilin sözdizimi büyük ölçüde C'ye dayanır. Ancak kod üretimini ve optimizasyonu zorlaştırdığı gerekçesiyle, C'deki değişken sayıda argüman alan fonksiyonlar, işaretçi sözdizimi ve karmaşık tip sistemleri gibi bazı standart özellikler dilden çıkarılmıştır.
Dilin adı aslında bir kelime oyunudur: "C++" nasıl C'nin geliştirilmiş halini temsil ediyorsa, "C--" de C'nin daha sadeleştirilmiş ve küçültülmüş bir versiyonu olduğunu vurgular. (C dilinde ++ artırma, -- ise azaltma operatörüdür.)
Kendi başına sıfırdan bir kod üreteci yazmak zor olduğundan, geçmişte birçok proje (örneğin orijinal Modula-3) doğrudan C kodu üreten derleyiciler yazmıştır. Ancak C dilinin, fonksiyonel dillerin ihtiyaç duyduğu bazı konularda eksikleri vardır: C dili; kuyruk çağrısı optimizasyonunu garanti etmez, doğru çöp toplamayı veya verimli istisna işlemeyi desteklemez. C--, tüm bunları destekleyen ve C'ye kıyasla daha net sınırları olan, basit bir alternatif olmayı amaçlar. Dilin en yenilikçi özelliği, herhangi bir C-- derleyicisi ile çalışabilen taşınabilir çöp toplayıcılar ve istisna işleme sistemleri yazılmasına olanak tanıyan çalışma zamanı arayüzüdür.
Aşağıdaki C-- örneği, argüman olarak aldığı n değerine kadar olan tam sayıların toplamını ve çarpımını hesaplar. Bu kod parçası iki temel dil özelliğini göz önüne serer:
/* Kuyruk özyinelemesi */
export sp;
sp(bits32 n) {
jump sp_help(n, 1, 1);
}
sp_help(bits32 n, bits32 s, bits32 p) {
if n == 1 {
return(s, p);
} else {
jump sp_help(n - 1, s + n, p * n);
}
}
Günümüzde C--'nin en aktif kullanıldığı yer, Haskell programlama dilinin derleyicisi olan GHC'dir (Glasgow Haskell Compiler). Simon Peyton Jones ve Norman Ramsey gibi orijinal C-- geliştiricilerinin de katkılarıyla GHC ekibi, dili kendi ihtiyaçlarına göre genişleterek Cmm lehçesini (dialect) yaratmıştır. GHC'nin kod üretim aşaması (backend), oluşturulan bu C-- kodunu alır ve LLVM veya kendi yerleşik araçları üzerinden doğrudan çalıştırılabilir makine koduna dönüştürür.
Geçmişte Quick C-- gibi dili doğrudan destekleyen bağımsız derleyiciler geliştirilmiş olsa da, bu projelerin büyük çoğunluğu 2010'lu yıllarda terk edilmiştir ve günümüzde aktif olarak bakımları yapılmamaktadır.