BASIC dili
aukimi'nin klasik BASIC lehçesi: tipler, yapılar, iki kısayol ve herkesi yakalayan kurallar. Arkasında 2 237 komut var.
Tek cümleyle#
aukimi, klasik bir BASIC lehçesi sunar: bir oyuncak makro sistemi değil,
tam bir dil; tipli sayısal değerler, kayıtlar, metotlar, referanslar,
yapılandırılmış hatalar, koroutinler ve WebGPU hesaplaması ile. Engine'in
TXT görüntü alanı modunda ve betik editörünün BASIC görünümünde yaşar.
JavaScript, kanonik betik API'si olmaya devam ediyor. BASIC, isteğe bağlı bir ön yüzdür: ikisi de aynı özel dağıtıcıya derlenir, yani bir BASIC programı ile bir JavaScript programı tam olarak aynı motora ulaşır. Hiçbir şey ikinci sınıf değildir ve ayrı bir çalışma zamanı yoktur.
Herkesi yakalayan kural#
Bir komut çağrısı her zaman parantez taşır.
mode = ClipSpaceMode()
SpritePosition(player, 320, 180)
Bu bir stil meselesi değildir. Derleyicinin bir komutu bir değişkenden ayırt etmesini sağlayan şey budur, ve bir yazım hatasının artık derleme zamanında yakalanmasının nedeni de budur:
| Yazdığınız | Eskiden olan | Şimdi olan |
|---|---|---|
SpritePositon(1, 10, 20) | temiz bir şekilde derlenirdi, sprite hareket etmezdi ve arıza daha sonra ... is not defined olarak ortaya çıkardı | derleme hatası, en yakın katalog yazımı önerisiyle birlikte |
Blorp(1, 2) | üretilen JavaScript'e olduğu gibi aktarılırdı | derleme hatası |
ceci nest pas du basic | bir ifade olarak yayımlanırdı | derleme hatası |
Bir yazım hatası, kendini bir motor hatası olarak sunardı. 84 demoluk gövde üzerinde ölçüldüğünde, koruma sıfır yanlış pozitif üretti ve iki gerçek sessiz arızayı buldu,
SetMusicSystemVolumeveGetLightSensorExists; katalog bunları yalnızcaMusicSystemVolumeveLightSensorExistsolarak biliyor.
İki sızıntı bilerek açık bırakıldı: console.log("x") ve window.x = 1 hâlâ
geçiyor. Bunlar için bir koruma yazıldı, ölçüldü ve geri alındı: BASIC,
derleyicinin numaralandıramayacağı isimler sağlayan bir bağlam içinde çalışır;
bu yüzden bilinmeyen bir kökü reddetmek geçerli programları da reddediyordu.
Buradaki bir yanlış pozitif, sızıntıdan daha kötüdür.
Print çizer. Console günlüğe yazar.#
En sık karşılaşılan sürpriz:
Print(...) | ekrana çizer, ve bir program bunu her karede çağırır |
Console(...) | editörün konsoluna yazar, başka hiçbir şey yapmaz |
Debug(...) | kas hafızası için, PureBasic'in adı altındaki aynı komut |
ConsoleWarning, ConsoleError, ClearConsole | günlüğün geri kalanı |
Bir kare döngüsündeki Print, konsoldaki her gerçek hatayı boğar; bunların
bir bayrakla tek komut yerine iki ayrı komut olmasının nedeni budur.
Tipler#
Sayısal tipler gerçektir ve her hedefte, editörde, HTML dışa aktarımında ve Bevy/native derlemesinde birebir aynı davranır:
- 8, 16, 32 ve 64 bit işaretli ve işaretsiz tamsayılar, deterministik
dönüştürme, tamsayı
DIVve sarma (wrapping) taşmasıyla. - float32 ve float64.
- Klasik sigiller hâlâ çalışır:
name$bir dizedir,speed#bir kayan noktadır.
OPTION EXPLICIT isteğe bağlıdır, ve klasik örtük değişkenler
içe aktarılan programların hâlâ çalışması için varsayılan olarak kalır.
Bunu açmak, onsuz güvenli olamayan iki özelliğin ön koşuludur: sayısal
tipleme ve referanslar; çünkü yanlış yazılmış bir atamanın sessizce bir
değişken oluşturması ikisini de bozar.
Yapılar#
Kayıtlar#
TYPE, bir kayıt bildirir. Bunlar keyfi şekilde iç içe geçebilir ve değer
semantiğine sahiptir: bir atama, iç içe geçmiş diziler ve koleksiyonlar
dahil, derin bir kopya çıkarır.
Metotlar#
METHOD, bir fonksiyonu bir örneğe bağlar; içinde SELF bulunur, New
inşa eder ve Delete yok eder. Derin kopyalar metot açısından güvenli kalır.
Referanslar#
REF ve BYREF, iki yazımla aynı şeydir ve ikisi de bir skaler, bir kayıt,
tek bir alan, bir dizi, bir liste imleci ya da bir harita girdisi için canlı
okuma/yazma parametresi verir. Referanslar çağrılar boyunca ilerler ve
sınırda sabit genişlikli tiplere dönüştürülür.
Tutamaçlar#
@hedef, birinci sınıf bir referans alır. HANDLE ve POINTER, denetimli
okuma, yazma, geçerlilik ve serbest bırakmayla bunun tipli biçimleridir; ve
silinmiş bir kayda giden bir tutamaç, sarkık bırakılmak yerine geçersiz
kılınır.
Kontrol ve güvenlik#
Yapılandırılmış hatalar: TRY / CATCH / FINALLY, iç içe, THROW,
korumalı RETHROW ve hem yapılandırılmış hem dizeye dayalı yakalamalarla.
Koşullu derleme: #IF / #ELSEIF / #ELSE / #ENDIF, iç içe, özellik
bayrakları ve editör, HTML, Bevy, native/wasm ve debug/release için açık
profillerle. Her hedefte, dahil etmelerden önce çözülür.
Zengin fonksiyonlar: varsayılan değerler, OPTIONAL, sonda bir
PARAMARRAY (ya da ...), güvenli aritelik aşırı yüklemeler, tipli dönüş
dönüştürmesi ve klonlanmış kayıt ve dizi dönüşleri.
Çok dosyalı programlar#
#INCLUDE, #INSERT ve IncludeFile, bir programı birden çok dosya hâline
getirir. Editör, proje modülleri oluşturur ve içe aktarır, dahil etme
yollarını tamamlar, bağımlılık grafını tutar ve her çalışma zamanı hedefi
bunun için hazırlanmıştır.
Koroutinler, ve bilerek dışarıda bırakılan şey#
İşbirlikçi görevler etikete dayalıdır; tipli tutamaçlar, bir sonuç ve hata durumu, verim noktalarında iptal ve tek bir görev ya da bir grup üzerinde bekleme ile. Her hedefte oyun zamanlayıcısını paylaşırlar.
Paylaşımlı bellekli iş parçacıkları bilerek dışlanmıştır. "Henüz değil" değil, dışlanmış. Üzerine akıl yürütebileceğiniz işbirlikçi bir zamanlayıcı, yeniden üretemeyeceğiniz bir veri yarışından iyidir.
WebGPU hesaplaması#
Tipli f32 / i32 / u32 depolama tamponları, ham WGSL işlem hatları,
kareye göre sıralanmış gönderim ve memblock geri okuma; BASIC'ten gerçek GPU
hesaplaması.
⚠️ Yalnızca Engine. HTML hedefi açık bir yetenek hatası fırlatır, ve Bevy hedefi, ilk gönderimde başarısız olan bir ikili üretmek yerine uyumsuzluğu derlemeden önce bildirir.
Aynı sorun için iki kısayol#
Komutların 597'si Set/Get<Nesne><Özellik> olarak adlandırılır: Sprite
66, Tween 58, Text 32, Edit 29. Nesnenin adı fonksiyon adının içindedir ve
kimliği her satırın ilk argümanıdır. Aşağıdaki iki kısayol da bu tekrarı
kaldırır ve hiçbiri yeni bir API değildir: derleyici gerçek komut adını
yeniden inşa eder ve onu katalogda arar.
Bir blok içinde WITH <aile>#
WITH SPRITE s
\position 100, 200 ` SpritePosition(s, 100, 200)
\size 64, 64 ` SpriteSize(s, 64, 64)
x# = \x ` SpriteX(s)
ENDWITH
Bir ifadenin başında \özellik yazar; başka her yerde okur. Konum
karar verir, bu yüzden öğrenilecek ikinci bir gösterim yoktur. WITH hero,
tek bir jeton, hâlâ kayıt bloğudur; WITH SPRITE s katalogdan bir aile
seçer.
Her yerde başka s.position(...)#
s = CreateSprite(img) ` aile, oluşturma komutundan ÇIKARILIR
s.position(100, 200) ` SpritePosition(s, 100, 200)
s.visible = 1 ` SpriteVisible(s, 1)
x# = s.x ` SpriteX(s)
Aile, Create<F> / Load<F> / Clone<F>'den, ya da kimlik başka bir yerden
geldiğinde açık bir s AS Sprite'tan gelir. Yalnızca ailesi bilinen
değişkenler yeniden yazılır: kayıtlar alanlarını korur, listeler metotlarını
korur, SELF.alan dokunulmadan kalır.
⚠️ Tipli bir parametre tanınmaz. FUNCTION move(s AS Sprite), s'ye bir
aile vermez; geçiş yalnızca ifade düzeyindeki bildirimleri ve atamaları okur.
Bu burada söyleniyor çünkü bu gerçek bir sınırdır, avlanacak bir hata değil.
⚠️ Katalog, özelliklerde fiili düşürür ve yaşam döngüsünde tutar.
SpritePosition yazar, SpriteX okur, ve ikisinden hiçbiri Set ya da Get
taşımaz: tüm katalogda 4 komut Set ile başlar, ve hiçbiri Get ile
başlamaz. Fiil, bir şeyin var olduğu ya da sona erdiği yerde hayatta kalır:
CreateSprite, LoadImage, DeleteSprite.
Bunu bilmek işe yarar çünkü bir yazım hatası bir derleme hatasıdır ve
Set…, insanların yanlarında getirdiği tam olarak o hatadır. Katalog
otoritedir, ve referans ondan üretilir.
Dize ilintileme, isteğe bağlı#
Print($"score: {points}") ` "score: " + Str(points)
{{ ve }}, gerçek süslü parantezler yazar.
⚠️ $ öneki zorunludur ve süs değildir. Her sabit değeri ilintilemek,
dünya API'sinin rutin olarak aldığı, elle yazılmış JSON'u bozardı:
CreateTerrain("island", "{\"preset\":\"island\",\"size\":256}")
Orada süslü parantezler veridir, delik değil. Önekli olmayan bir dize, içinde ne olursa olsun dokunulmadan bırakılır.
Adlandırmak, göstermektir#
Klasik bir program yüzlerce nesne üretir. Yalnızca ADLANDIRDIKLARI
Scene Graph'a girer; SpriteName(id, "player") ve benzerleri, bir nesneyi
Engine'in geri kalanının görebileceği ağaca yerleştiren şeydir. LightName
ve ParticlesName de aynı şeyi bir ışık ve bir yayıcı için yapar.
Programınızın oluşturduğu şeyi adlandırın eğitimi bunu adım adım anlatır: aynı sahne, bir kez ağaç boş, bir kez üç girdiyle.
Komut kataloğu#
2 237 komut, 2 550 genel aşırı yükleme, 43 kategori. En büyükleri:
| 3D | 286 | Studio | 106 | File | 61 |
| Core | 200 | Input | 95 | Memblock | 43 |
| Tweening | 149 | Input-Raw | 94 | 3D Particles | 41 |
| 3D Physics | 144 | Multiplayer | 91 | World | 40 |
| Sprite | 135 | Text | 68 | Particles | 38 |
| Platform | 111 | 2D Physics | 66 | Sound | 37 |
artı JSON (36), Image (35), Skeleton (34), XML (34), Music (29), Preference (27), Extras (21), HTTP (21), String (21), Math (19), Regular Expression (19), Video (18), Dictionary (17), Benchmarking (15), Compute (14), Date (13), Maths (12), Time (12), StringBuilder (9), Compression (7), Font (8), Error (4), Array (3), Cipher (2), Sort (2).
Studio ve Compute, aukimi'nin klasik lehçeye kendi eklemeleridir: konsol komutları, nesne adlandırma ve WebGPU işlem hattı.
Eksiksiz komut referansı, hepsini her parametresi ve her aşırı yüklemesiyle listeler; kendi aramasıyla birlikte, bu sayfanın saydığı aynı katalogdan üretilir, bu yüzden ondan geride kalamaz. Editörün kendi API paneli de aynı kataloğu okur.
Bu sayfa dili belgeliyor; o sayfa komutları belgeliyor.
Sınırlar ve sık karşılaşılan arızalar#
- Bir komutta parantezler isteğe bağlı değildir. PureBasic'in çıplak
biçimi (
Debug "x") reddedilir, çünkü bu, derleme zamanı korumasının dayandığı değişken/komut belirsizliğini yeniden açar. - Kullanıcı fonksiyonu, aynı adlı bir katalog komutunu geçersiz kılar, ve bir değişken, tipli bir bildirimde, bir atamanın solunda ya da bir yolun kökünde bir komutla aynı adı taşıyabilir.
- Değişkenler ve kullanıcı fonksiyonları büyük/küçük harfe duyarsızdır, ve sembol alanları katalogunkinden gerçekten ayrıdır.
Printbir günlük değildir. Yukarıya bakın; bir konsolu dolduran hata budur.- Compute dışa aktarılmaz. Ona güvenmeden önce geri dönüş yolunu yazın.