Derleyici
KabaLang, KabaLang ile yazıldı
KabaLang derleyicisi KabaLang ile yazılmıştır ve kendini derler. Programların altında koşan çalışma zamanı da, masaüstü uygulamalarını çizen arayüz motoru da KabaLang. Her program kaynak koddan LLVM ara temsiline, oradan yerel makine koduna derlenir.
$ kabalang derle kare.kbl
⚡ [KabaLang] kare.kbl derleniyor...
✓ Derleme başarılı: kare (978 KB) [366ms] · LLVM
$ ./kare
385
Öz derleme
Dilin kendisi KabaLang ile yazıldı
Derleyici
Sözcükleyiciden LLVM IR üretecine, biçimlendiriciden dil sunucusuna kadar KabaLang. Derleyici kendini derler ve her değişiklikte kendini yeniden üreterek doğrulanır.
Çalışma zamanı
Bellek, metin, liste, sözlük, eşzamanlılık, ağ ve web sunucusu: programların altında koşan her şey KabaLang.
Arayüz motoru
Masaüstü uygulamalarını çizen yerleşim, yazı, tema ve olay sistemi de KabaLang; başka bir arayüz kütüphanesine dayanmaz.
Derleme hattı
Kaynaktan makine koduna tek hat
Kaynak
.kbl dosyası, Türkçe sözdizimiyle yazılmış program.
Ön yüz
Sözcükleyici, ayrıştırıcı ve sözdizim ağacı. Ad, tip, ömür ve izin denetimi burada yapılır; hatalı program bu adımı geçemez.
LLVM IR
Üreteç sözdizim ağacından doğrudan LLVM ara temsilini yazar; arada başka bir kaynak dile çeviri yapılmaz.
Eniyileme
LLVM eniyileyici geçişleri; bağlama anında program, KabaLang çalışma zamanıyla birlikte bir kez daha eniyilenir.
Yerel ikili
x86-64 makine kodu, statik bağlı tek dosya. Yorumlayıcı ya da sanal makine yok.
Ara temsil
Üretilen LLVM IR çıktısı
Soldaki program sağdaki LLVM IR'a derlenir; sayfa her yayında programı yeniden derler. Varsayılan eniyilemeyle bu döngü derleme anında çözülür ve programa yalnız sonuç (385) kalır.
fonksiyon kare_toplami(n: sayi) -> sayi:
toplam = 0
dongu i icinde 1..n:
toplam = toplam + i * i
don toplam
yazdir(kare_toplami(10))define internal i64 @"f.kare_toplami(sayi)"(i64 %p0) align 32 !dbg !14 {
giris:
%"v.n.0" = alloca i64
store i64 0, ptr %"v.n.0"
store i64 %p0, ptr %"v.n.0"
%"v.toplam.1" = alloca i64
store i64 0, ptr %"v.toplam.1"
%y2 = alloca i64
%y3 = alloca i64
%"v.i.2" = alloca i64
store i64 0, ptr %"v.i.2"
br label %basla
basla:
store i64 0, ptr %"v.toplam.1", !tbaa !8, !dbg !15
%t1 = load i64, ptr %"v.n.0", !tbaa !8, !dbg !16
store i64 1, ptr %y2, !tbaa !8, !dbg !16
store i64 %t1, ptr %y3, !tbaa !8, !dbg !16
%t4 = icmp sge i64 1, 0, !dbg !16
%t5 = icmp slt i64 %t1, 1073741824, !dbg !16
%t6 = and i1 %t4, %t5, !dbg !16
%t7 = and i1 true, %t6, !dbg !16
br i1 %t7, label %ad_hizli2, label %ad_denetimli3, !prof !1, !dbg !16
ad_denetimli3:
br label %abas4
abas4:
%t8 = load i64, ptr %y2, !tbaa !8, !dbg !16
%t9 = load i64, ptr %y3, !tbaa !8, !dbg !16
%t10 = icmp sle i64 %t8, %t9, !dbg !16
br i1 %t10, label %agovde5, label %ason1, !dbg !16
agovde5:
store i64 %t8, ptr %"v.i.2", !tbaa !8, !dbg !16
%t11 = load i64, ptr %"v.toplam.1", !tbaa !8, !dbg !17
%t12 = load i64, ptr %"v.i.2", !tbaa !8, !dbg !17
%t13 = load i64, ptr %"v.i.2", !tbaa !8, !dbg !17
%t14 = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %t12, i64 %t13), !dbg !17
%t15 = extractvalue {i64, i1} %t14, 0, !dbg !17
%t16 = extractvalue {i64, i1} %t14, 1, !dbg !17
br i1 %t16, label %tasma7, label %tamam8, !prof !0, !dbg !17
tasma7:
call void @kaba_tasma_hatasi(i64 4, ptr @.op.carp, i64 %t12, i64 %t13), !dbg !17
unreachable, !dbg !17
tamam8:
%t17 = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %t11, i64 %t15), !dbg !17
%t18 = extractvalue {i64, i1} %t17, 0, !dbg !17
%t19 = extractvalue {i64, i1} %t17, 1, !dbg !17
br i1 %t19, label %tasma9, label %tamam10, !prof !0, !dbg !17
tasma9:
%t20 = sub i64 %t18, %t15, !dbg !17
call void @kaba_tasma_hatasi(i64 4, ptr @.op.topla, i64 %t20, i64 %t15), !dbg !17
unreachable, !dbg !17
tamam10:
store i64 %t18, ptr %"v.toplam.1", !tbaa !8, !dbg !17
br label %aart6
aart6:
%t21 = load i64, ptr %y2, !tbaa !8, !dbg !16
%t22 = add i64 %t21, 1, !dbg !16
store i64 %t22, ptr %y2, !tbaa !8, !dbg !16
br label %abas4, !dbg !16
ad_hizli2:
br label %abas11
abas11:
%t23 = load i64, ptr %y2, !tbaa !8, !dbg !16
%t24 = load i64, ptr %y3, !tbaa !8, !dbg !16
%t25 = icmp sle i64 %t23, %t24, !dbg !16
br i1 %t25, label %agovde12, label %ason1, !dbg !16
agovde12:
%t26 = icmp ult i64 %t23, 1073741824, !dbg !16
call void @llvm.assume(i1 %t26), !dbg !16
store i64 %t23, ptr %"v.i.2", !tbaa !8, !dbg !16
%t27 = load i64, ptr %"v.toplam.1", !tbaa !8, !dbg !17
%t28 = load i64, ptr %"v.i.2", !tbaa !8, !dbg !17
%t29 = load i64, ptr %"v.i.2", !tbaa !8, !dbg !17
%t30 = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %t28, i64 %t29), !dbg !17
%t31 = extractvalue {i64, i1} %t30, 0, !dbg !17
%t32 = extractvalue {i64, i1} %t30, 1, !dbg !17
br i1 %t32, label %tasma14, label %tamam15, !prof !0, !dbg !17
tasma14:
call void @kaba_tasma_hatasi(i64 4, ptr @.op.carp, i64 %t28, i64 %t29), !dbg !17
unreachable, !dbg !17
tamam15:
%t33 = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %t27, i64 %t31), !dbg !17
%t34 = extractvalue {i64, i1} %t33, 0, !dbg !17
%t35 = extractvalue {i64, i1} %t33, 1, !dbg !17
br i1 %t35, label %tasma16, label %tamam17, !prof !0, !dbg !17
tasma16:
%t36 = sub i64 %t34, %t31, !dbg !17
call void @kaba_tasma_hatasi(i64 4, ptr @.op.topla, i64 %t36, i64 %t31), !dbg !17
unreachable, !dbg !17
tamam17:
store i64 %t34, ptr %"v.toplam.1", !tbaa !8, !dbg !17
br label %aart13
aart13:
%t37 = load i64, ptr %y2, !tbaa !8, !dbg !16
%t38 = add i64 %t37, 1, !dbg !16
store i64 %t38, ptr %y2, !tbaa !8, !dbg !16
br label %abas11, !dbg !16
ason1:
%t39 = load i64, ptr %"v.toplam.1", !tbaa !8, !dbg !18
ret i64 %t39, !dbg !18
}Güvenlik ve dağıtım
Hız, güvenlikten ödün vermeden
Taşma ve sınır denetimi
Taşan hesap sessizce sarmaz, sınır dışı erişim belleği
bozmaz; ikisi de .kbl satırıyla hata verir. Bu denetimler hız ölçümlerine dahildir.
Değer anlamı
Değerler atamada kopyalanır; paylaşım yalnız açıkça istendiğinde
(sayilan<T>) olur.
Tek dosya ikili
Konsol programları statik bağlanır; çalışma zamanıyla birlikte eniyilenir, kurulu bir kütüphaneye ihtiyaç duymadan çalışır.
Hız
Ne kadar hızlı?
KabaLang ve diğer diller aynı sunucuda ölçülür; sonuçlar ve canlı ölçüm hız sayfasında.
Kendiniz doğrulayın
Kendi sisteminizde doğrulama
KabaLang, KabaOS'un bir parçası olarak gelir. Aşağıdaki komutlar KabaOS'ta uçbirimden çalıştırılır.
# İkili üretir; iletinin sonunda "· LLVM" yazar
kabalang derle program.kbl
# LLVM IR'ı program.ll olarak yanına bırakır
kabalang derle --ir program.kbl
# Eniyilemesiz derleme (varsayılan -O 2)
kabalang derle -O 0 program.kbl
# Sürüm ve motor bilgisi
kabalang surumLaf değil, IR.
KabaLang ile yazılan her program, incelenebilir bir LLVM ara temsili üzerinden makine koduna dönüşür. Bu sayfadaki çıktılar her yayında yeniden üretilir.
KabaLang ve geliştirici araçları KabaOS ile birlikte sunulur; KabaOS dışındaki sistemlere ayrıca kurulum desteklenmez.