KABAFORCEGeliştirici KabaOS'u edinin

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.

Uçbirim
$ 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.

kare.kbl
fonksiyon kare_toplami(n: sayi) -> sayi:
    toplam = 0
    dongu i icinde 1..n:
        toplam = toplam + i * i
    don toplam

yazdir(kare_toplami(10))
kare.ll · kare_toplami
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.

Uçbirim
# İ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 surum

Laf 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.