bu devasa fark şundan kaynaklanıyor. basic precompile edilmeyen ve interpreted bir dil. bu ne demek? yani her basic kodunu yazıp "run" dediğinizde ya da satır numarasız olarak bir basic satırı yazıp enterladığınızda öncelikle feci bir işlem devreye girer. parsing! yani text olarak yazdığınız kodların bilgisayarın anlayabileceği komut ve parametrelere dönüştürülme işlemi. bu 1 Mhz'in altındaki bir bilgisayar için korkunç bir süre almaktadır. örneğin;
print sin(1.2345)
ile
print sin(1.2345000000000000000)
bu ikisini karşılaştıralım. küsüratta sağdaki sıfırın değeri olmadığından sonuç aynı çıkar doğru mu? doğru. peki süre olarak hangisi hızlıdır? ilki, yani 1.2345. sebebi ise siz bu satırı yazıp enterladığınızda basic parserının bir kısmı devreye girer ve print, sin gibi komutları tek bytelık komutlara çevirir. ancak parametre o anda float gibi küsüratlı bir sayı değişkenine çevrilmez. çünkü çevrilirse yazdığınız değerin değişme ihtimali var değişken sınırlarından dolayı. liste aldığınızda enterladığınız satırdaki bazı değerleri değişmiş görebilirsiniz bu durumda. aslında ben kodlayacak olsam böyle kodlardım, sonuçta süper bir hız optimizasyonu olurdu. her neyse, bu bölüm string olarak hafızada saklanır ve run dedikten sonra çalıştırılırken bu string sayısal bir değere dönüştürülür. "1.2345" = 6 karakterlik bir çevirme işlemi demekken "1.2345000000000000000" = 21 karakterlik bir string'in çevirme işlemi demektir. yani komik bir biçimde değeri olmayan sıfırlar kodu yavaşlatmıştır.
gelelim parsing ve convertion sonrasına. artık elimizde şunlar var. print ve sin komutları, sin komutunun sayısal değere çevrilmiş parametresi. ne yapılacak bu noktada? sin değeri hesaplanıp ekrana basılacak. ama nasıl? tüm komutlar birer alt rutin olarak duruyorlar. her komut için bir jsr ve bir rts komutu çalışmak zorunda arka planda.
tam olarak doğru olmayan örnek asm karşılığı:
lda sinusDegeri
jsr sinusFonksiyonu
jsr printFonksiyonu
sinusFonksiyonu
;sinus kodu
rts
printFonksiyonu
;print kodu
rts
her bir jsr ve rts 12 cycle zaman yer. bu da tek taramadaki toplam CPU gücünün 1638'de 1'idir. çok fazla gibi gözükmese de siz yüzlerce komut çalıştırmayı denediğinizde sırf interpreting size CPU'nun önemli bir bölümünü kaybettirecektir. asm'de ise alt rutin kullanmaksızın:
lda sinusDegeri
;sinus kodu
;print kodu
şeklinde peş peşe yazma imkanınız vardır. elbette ki burada bahsettiğim sinus ve print komutları da çok yavaştır basic'de. neden? çünkü çok genel amaçlı yazılmışlardır. print dediğinizde öncelikle gider ekran nerede diye bakar (ekran adresleri değiştirilebilen adreslerdir). halbuki siz kendi kodunuzda ekranı başta istediğiniz bir pozisyona koyduktan sonra her defasında ekran nerede diye bakmak zorunda değilsinizdir. ama basic her print komutunda arada değişip değişmediğini bilmediği için buna bakmak zorundadır. sinus komutu ise süper hassas bir sonuç üretir, hesap makinelerinde olduğu gibi. ancak sizin ihtiyacınız o kadar yüksek hassasiyet değilse çok daha hızlı çalışan ama virgülden sonra daha az basamakta doğru sonuç veren bir sinus yazabilirsiniz.
sanırım 600-700 kat nereden geliyor açıklayıcı olmuştur.
