Döngü gövdesi atlandığında BASIC sıra dışı bir NEXT deyimini nasıl bulur?


9

Set WABAC makinesi , Sherman. Bu soru genel olarak BASIC ve özellikle Microsoft'un BASIC-80 ile ilgilidir. Eski okul temel. Satır numaraları ile.

Döngü gövdesi yürütülmediğinde ve NEXT ifadesi düzensiz göründüğünde eski okul BASIC tercümanları FOR ... NEXT döngülerini nasıl işler (ya da daha doğrusu)?

Önceki zamanlardan itibaren sıra dışı bir NEXT ifadesi:

İşte oyun bir altprogram var Awari dışı David H. Ehl yönettiği "101 Temel Bilgisayar Oyunları" :

200 K=M:GOSUB 600
205 E=0:IF K>6 THEN K=K-7
210 C=C+1:IF C<9 THEN F(N)=F(N)*6+K
215 FOR I=0 TO 5:IF B(I)<>0 THEN 230
220 NEXT I
225 RETURN
230 FOR I=7 TO 12:IF B(I)<>0 THEN E=1:RETURN
235 GOTO 220

ve burada akış kontrolü hariç her şey var:

200 GOSUB 600
215 FOR I=0 TO 5:IF ... THEN 230
220 NEXT I
225 RETURN
230 FOR I=7 TO 12:IF ... THEN RETURN
235 GOTO 220

Bu çok hoş olmayan anıları geri getiriyor mu? Mezarında Dijkstra'nın döndüğünü duyabiliyor musun?

İşte bu parçada olanların ilginç kısmı:

  • İkinci FOR döngüsü, aynı döngü değişkenini kullandığından, ilk FOR döngüsünün yerini alır
  • İki FOR döngüsü aynı NEXT deyimini paylaşır
  • İkinci FOR döngüsünün NEXT ifadesi, kaynak sırada, sonra da yürütme sırasında gelir

Öyleyse, bir FOR döngüsünü başlatan yorumlayıcının, SONRAKİ döngüsünde gerçekleşene kadar ifadeleri çalıştırdığını varsayabilirsiniz. Bu durumda kaynaktaki ifadenin sırası önemli değildir. Ancak, basic80 kılavuzunun FOR döngüleri hakkında ne söylediğine bakalım:

Basic-80 kılavuzu "moo ..." diyor

Döngünün başlangıç ​​değeri, adımın işaretinin çarpım sayısının adımın işaretinin son değerini aşması durumunda, döngü gövdesi atlanır.

Böylece, döngü gövdesi tamamen atlanabilir.

Yayınlanmış programlar biçiminde BASIC'in en azından bazı sürümlerinin NEXT ifadelerini dinamik olarak bulduğuna dair kanıtlarımız var. Bu, döngü gövdesi yürütülürken yapılacak kadar kolaydır. Bununla birlikte, FOR ifadesinin gövdesinin atlanması gerektiğinde, BASIC-80'in izin verdiği gibi, BASIC , kaynak ifadesinde FOR ifadesinden önce olabileceği düşünüldüğünde NEXT ifadesini nasıl buldu ?

  • "101 Temel Bilgisayar Oyunları" nda kullanılan BASIC sürümü, döngü gövdesini her zaman en az bir kez çalıştırdı mı?
  • BASIC-80, FOR ifadesinden sonra kaynak düzeninde bir FOR döngüsünün NEXT ifadesinin olmasını gerektirdi mi?

PS: Evet, eski okul BASIC için BASIC tercüman yazıyorum. Bu bir hastalık.


Ehl kitabı aslen DEC tarafından 1973'te yayınlanmış ve Microsoft BASIC'in iki yıl öncesine dayanmıştır. Programlar muhtemelen RT-11 BASIC veya BASIC-PLUS'ta yapılacaktır. Sisteme özgü uzantılar dışında, çoğu lehçe uyumluydu ve çok az zorluk çeken veya hiç zorluk çekmeyen birkaç sistemde kitabın DEC sürümündeki programları çalıştırdım. Applesoft BASIC ROM'un aydınlatılmış , demonte ve belgelenmiş kaynaklarını bulabilirsiniz . NEXTDeyimi uygulayan kod $ DCF9 ile başlar.
Blrfl

BASIC-80 hakkında bilmiyorum, ancak Commodore Basic'in (Microsoft BASIC V2 olan) her zaman döngüyü bir kez yürüttüğünden ve kaynaktaki ifadelerin sıralamasının önemli olmadığından% 100 eminim - tıpkı şüphelendiğiniz gibi.
Doc Brown

Yanıtlar:


7

Bu eski zamanları geri getiriyor ...

Kitabın bir kopyası var, 3. baskı, 1975. Girişinizi kontrol ettim ve orijinal değil. Orijinal kaynak kodunda ifadelerde boşluk yoktur ve ödevlerde LET anahtar sözcüğü bulunur. Örneğin

200 LETK=M:GOSUB600

Ağız DIGITAL PDP-11 BASIC'dir (Basic-plus veya BASIC-80 değil). Deneyimden, bu oyunların hepsi BASIC'in tüm lehçelerinde çalışmadı. Onları diğer lehçelerde çalışmak için bu oyunları birkaç yeniden kodlamak zorunda belirsiz bir hatırlama var. Bu tür korkunç döngü yapısı kesinlikle bir sorundu.

BASIC'in 20'den fazla farklı lehçesi ile deneyimim vardı ve o zamanlar bunun endişeli bir soru olduğunu söyleyebilirim. 2 ana kamp vardı.

Bir kampta, her görüldüğünde her satırı yeniden parçalayan tam tercümanlar vardı. Bir FOR döngüsünü, değişkeniyle tanımlanan bir yığının üzerine iterek ve daha sonra her NEXT ile bir eşleşme için tarayarak işlediler. Bir döngüyü atlarlarsa, SONRAKİ için kaynağı taramaları gerekir. Bazıları yaptı, bazıları yapmadı.

Diğer kamp tokenizerler veya yarı-derleyicilerdi. Yürütmeden önce tüm satırları tararlar ve bir tür dahili formata dönüştürürlerdi. Ayrıca FOR / NEXT döngülerini eşleştirdiler ve eksik GOTO ve GOSUB hedeflerini kontrol ettiler. Hatırladığım kadarıyla DEC ve BASIC-80 bu kamptaydı, ama uzun zaman önceydi.

Sorularınıza cevap olarak,

  1. Evet, BASIC lehçesi başlangıçta memnun kalırsa bir döngüyü atlar
  2. Hayır, FOR NEXT dizilişi belgelenmiş bir gereklilik değildi, ancak davranış tanımlanmadı. Bir profesyonel olarak, hiç yapmadım. :)

Bu yardımcı olur umarım. Bunlar korkunç diller, ama eğer yapmanız gerekiyorsa ...


Bu çok faydalı, teşekkürler. Kitabın DEC sürümü, TRS-80 sürümü ve mikrobilgisayar sürümü var. Mikrobilgisayar sürümündeki programlar Microsoft 8080 basic (MITS Altair Basic Rev 4.0); benim tercümanımın hedefi bu.
Wayne Conrad

1980'lerde CP / M'de MBASIC kullandım, ancak önceki hobi makinelerinin hiçbiri yoktu. Bir dosya sistemine ihtiyacınız var! Birçok yönden bir DEC / DG / HP / CAI / Prime / Interdata / Tektronix Basic'in reenkarnasyonunu daha ilginç bulabilirim, ancak neden olmasın anlayabiliyorum. İyi şanslar! Yardım edebilirsem bana ulaşın.
david.pfx

2

Önümdeki bu eski BASIC tercümanlardan birinin spesifikasyonunun bir kopyasına sahip değilim (hatta mevcut olmayabilir), ancak bir uzuv çıkacağım ve BASIC yorumlayıcısının bir Döngü değişkeni aynı ada sahip olsa bile , kendisine ait olmayan bir FOR döngüsünde İLERİ .

Yani, başka bir deyişle, örneğinizde

200 K=M:GOSUB 600
205 E=0:IF K>6 THEN K=K-7
210 C=C+1:IF C<9 THEN F(N)=F(N)*6+K
215 FOR I=0 TO 5:IF B(I)<>0 THEN 230
220 NEXT I
225 RETURN
230 FOR I=7 TO 12:IF B(I)<>0 THEN E=1:RETURN
235 GOTO 220

235 numaralı hat yürütüldüğünde ve 220 numaralı satıra gittiğinde, 220 numaralı satır altta değil üst FOR döngüsünü İLERLEYECEKTİR.

Bu "FOR olmadan SONRAKİ" hata iletisinde belirgindir; BASIC yorumlayıcısı karşılık gelen bir FOR bulamadığı herhangi bir SONRAKİ reddeder. Bu, tipik olarak, SONRAKİ durumunuzu,

100 FOR I = 1 to 10
110 FOR J = 1 to 10
120 ...
130 NEXT I
140 NEXT J

Madde işaretli sorularınızı cevaplamak için:

  • Döngü değişkeni FOR aralığının içindeyse evet.
  • Evet, bence, durum böyle.

2
"BASIC tercümanı, kendisine ait olmayan bir FOR döngüsünde SONRAKİ yürütmeyecektir" - Bu ifadenin yanlış olduğu en az bir eski BASIC tercüman ailesini biliyorum, bunu "tüm eski BASIC tercümanlara" genelleştiremezsiniz.
Doc Brown

Spesifikasyon var. PDP-11 BASIC'i arayın.
david.pfx

1
Bu garip soruya bir bıçak attığın için teşekkürler. Kitapta kullanılan BASIC'in, aynı sayaç değişkenine sahip ikinci FOR ifadesiyle karşılaştığında, ilk FOR ifadesini unuttuğunu ve ikinciden döngüyü yeniden başlattığını doğruladım. Bu karanlıktaki bıçağınızla çelişir. Döngüler yazmanın garip bir yolu, ama BASIC yine de kötü kokulu şeyler.
Wayne Conrad

2

"101 Bilgisayar Oyunları" BASIC ne yapar

"101 Bilgisayar Oyunları" nın Mikrobilgisayar baskısında kullanılan BASIC lehçesi, FOR ... NEXT döngüsünün gövdesini en az bir kez çalıştıracaktır. Bu BASIC-80 v.5'ten farklıdır .

S. i12 , "normal" TEMEL ile ilgili istisnaları listeler:

İÇİN ... TO ... ADIM

Standart BASIC'te olduğu gibi, ilmeğin sonlandırılması testi, yürütüldükten sonra h yapılır. Yani, bu program çalıştırıldığında:

10 FOR X=2 TO 1
20 PRINT "HI"
30 NEXT X
40 END

"HI" yazdırılacak ...

Bu nedenle, BASIC'in bu lehçesinde NEXT ifadesini bulmak veya bir sonraki ifadeyi birden çok FOR ifadesiyle paylaşmakta sorun yoktur. Statik analiz gerekli değildir. Her ifadeyi gerçekleştiği gibi yürütünüz ve sonunda nerede olursanız olun NEXT ifadesine ulaşırsınız.

BASIC-80'in sıra dışı bir İLERİ kullanması mümkün mü?

Bir FOR deyiminin BASIC-80 v.5 izin verdiği ve çoğu durumda sıra dışı NEXT deyimlerine izin verdiği için döngü gövdesini atlaması mümkündür. Bunu nasıl yapacağınız aşağıda açıklanmıştır:

  • Tercüman iki durum alır: "çalışıyor" ve "SONRAKİ'ye atlıyor"
  • "Çalışıyor" durumundayken, yorumlayıcı her ifadeyi normal olarak yürütür.
  • FOR ifadesini değerlendirirken, döngü gövdesi atlanacaksa, durum "İLERİ'ye atlama" olarak değiştirilir
  • "Bir sonrakine atlama" durumundayken, tercüman NEXT ve koşulsuz GOTO hariç her ifadeyi atlar .
    • Koşulsuz bir GOTO ifadesi izlenir
    • Bir NEXT deyimi, değişkeni FOR deyiminin değişkeniyle eşleşiyorsa (veya değişken belirtilmemişse), "çalışan" duruma geri döner. Değişken eşleşmezse, yorumlayıcı "İLERİ'ye atlama" durumunda kalır.

Bu, sorudaki gibi basit patolojik dizileri ele alacaktır. İLERİ'ye bir IF ... GOTO deyimi veya bir GOSUB tarafından ulaşılan durumları ele almaz. Bunu yapan kod, yorumlayıcının bu tür durumları desteklemeyeceğini basit bir şekilde bildirmenin mantıksız olmadığı sorusundaki zaten kötü koddan çok daha kötüdür. Tercümanın böyle bir kodu ateşe vermesine bile izin verilebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.