Varolmayan bir hatta GOTO (vb.)?

Dec 07 2020

Bir BASIC tercümanı yazmak , belgelerde bahsedilmeme eğiliminde olan bir dizi ilginç bilgiyi ortaya çıkarmıştır. Örneğin:

10 PRINT"ONE";:IF 1=2 THEN PRINT"TWO":PRINT"THREE"

ONEMicrosoft kaynaklı BASIC'lere yazdıracak , Dartmouth ise üretecek ONETHREE. Yani, MS, hattın geri kalanını, THENtuhaf (ve yanlış IMHO )' nun bir parçası olarak ele alıyor . Ben örnek kod çünkü sadece bu fark etmedi Süper Star Trek başarısız olmasına neden son deyimini çalıştırın.

Hoi polloi'ye açmak istediğim başka bir örnekle karşılaştım. Bu programı düşünün:

10 PRINT"HELLO"
20 GOTO 25
30 PRINT"WORLD"

Sahip olduğum örnek kod, 25. satıra veya sonraki yüksek ifadeye bakar . Yani bu kodda 30. satır çalıştırılır. Bu kesinlikle "UNDEFN'D STATEMENT" döndüren Commodore BASIC için geçerli değildir.

Öyleyse ... BASIC'in bu şekilde çalışan bir sürümünü bilen var mı, yoksa bu (kesinlikle şüphelendiğim gibi) örnek koddaki bir hata mı?

Yanıtlar

5 Brian Dec 09 2020 at 22:36

ZX Spektrumundaki Sinclair BASIC, bir sonraki mevcut satır numarasına atlar. manuel diyor

Bir GO TO komutundaki satır numarası var olmayan bir satıra atıfta bulunuyorsa, atlama verilen numaradan sonraki satıra geçer. Aynısı RUN için de geçerli; aslında RUN tek başına RUN 0 anlamına gelir.

13 Chromatix Dec 07 2020 at 21:04

BASIC lehçelerinin detaylarda oldukça farklılık gösterdiği bilinmektedir. Daha kesin sürümlerden biri, aşağıdakileri yapan BBC BASIC'dir:

Aslında pratikte yararlı olan çoklu ifadeli IF-THEN gövdelerinin kullanımını haklı çıkaran IF-THEN-ELSE yapısına dikkat edin.

BBC BASIC V, bir ENDIF anahtar sözcüğü ve çok satırlı IF-THEN-ELSE-ENDIF blokları için tesis ekledi. Genel olarak BBC BASIC, yapılandırılmış programlamayı önceki mikrobilgisayar BASIC'lerin çoğundan daha kolay hale getirmek için tasarlanmıştır .

13 snips-n-snails Dec 08 2020 at 01:54

Örnekler hatalar değil, diğer dillerde de yaygın olan tanımlanmamış davranışlardır. Platformlar arası uyumluluk bekliyorsanız, tanımlanmamış davranışlara neden olan şeyler yapmayın.

Dahası, programcının ilk örnekteki niyeti belirsizdir ve bu da düzeltilmesi zor hatalara yol açabilir. Yine, bunu yapma. İkinci örnek daha iyidir çünkü ya programcının istediği gibi çalışır ya da ayrıştırıcı şikayet eder, bu da hatayı hızlı bir şekilde bulup düzeltmeyi kolaylaştırır.

10 Raffzahn Dec 07 2020 at 22:18

10 PRINT"ONE";:IF 1=2 THEN PRINT"TWO":PRINT"THREE"

Dartmouth ONETHREE üretirken, Microsoft kaynaklı BASIC'lere ONE yazdıracak. Yani, MS, hattın geri kalanını THEN'in bir parçası olarak görüyor, bu da ... garip (ve yanlış IMHO).

Sanırım doğru ya da yanlış yok, ama her BASIC kendi yolu. MS'in yöntemi esasen GOTO'ya ihtiyaç duymadan bir THEN cümlesi içinde bir kod bloğunun oluşturulmasına izin verir. Daha önce FORTRAN gibi o noktada çalışan Dartmouth ile THEN'in kod bloğuna atlaması ve ardından dolaşmak için bir GOTO olması gerekir:

10 PRINT"ONE";
20 IF 1=2 THEN GOTO 40
30 GOTO 50
40 PRINT"TWO"
50 PRINT"THREE"
60 REM

Peki, ya da kod bloğu etrafında atlamak için ters çevrilmiş bir cümle kullanın. Ne gerçekten harika bir yapı.

THEN'den sonra keyfi ifadelere izin vermenin daha sonraki bir eklenti olduğu ve Dartmouth BASIC'te mevcut olmadığı unutulmamalıdır. Aynı şey, iki nokta üst üste ile ayrılmış birden çok ifade için de geçerlidir.

MS'in tüm hattı (geri kalanını) o zaman bloğunun bir parçası olarak işleme yöntemi ile bu yapılara çok fazla beyin koşusu ve gotos olmadan izin verilir.

Ancak MS tarafından icat edilmedi, sadece 1972 Aralık BASIC- PLUS'tan aldılar (Sonuçta, MS BASIC, kılavuzun 3-12. Sayfalarında açıklandığı gibi, DEC BASIC'in bir klonudur):

Yani burada bir SONRA birden fazla ifadeye izin verilir, ancak ya bütün olarak (koşul doğruysa) yürütülür ya da hiç çalıştırılmaz.

Şimdi, 'doğru' yolları ararken, genellikle en iyisi ilk önce BASIC standartlarına bakmaktır. İlk burada olabilir

  • ECMA 55 1978'in Minimal TEMEL

    Bu, her BASIC'in taşınabilir olması için uyması gereken minimum miktarı açıklar. Esasen Dartmouth BASIC'i (Thomas Kurtz editörlerden biriydi) daha sonraki enkarnasyonlarında net ve tekrarlanabilir bir şekilde kodlar. Burada THEN deyimleri yalnızca bir satır numarasına atlamaya izin verir.

  • 1979 ANSI Minimal TEMEL

    Esasen ECMA-55'in ANSI sürümü.

Bu BTW, zamanla MS-BASIC'in normatif bir güç olmaya başladığı nokta

  • 1986 ECMA 116 TEMEL, 'Tam TEMEL' olarak da adlandırılır

    Burada çok cümle ve çok hatlı THEN yapıları ve bunların karışımları mümkündür. Çoklu ifade 'MS yolu' gibi çalışır, çoklu satır ise bloğu kapatmak için bir ENDIF (veya ELSE / ELSEIF) ifadesine ihtiyaç duyar. (Aynı zamanda modern BASIC'lerden bilinen diğer birçok özelliğe de sahiptir, sadece satır numaraları ile)

  • 1987 ANSI / ISO / IEC Tam TEMEL

    Esasen ECMA-116, birkaç açıklama / uzantı ile.

Yani MS, ECMA-116'nın söylediklerini takip ediyor ... peki ya da daha iyisi standart, MS'in daha önce yaptıklarını kodlar ve böylece fiili standart haline geldi. BASIC için uygulanabilir bir ortak yer yakalamak için bu standartlara çok fazla çalışma yapılmıştır. Bu, özellikle görünüşte net olan sorunların uç durumlarını içerir. Tartışmaya açık bir şey olduğunda onları kontrol etmenin en iyi uygulama olduğunu düşünüyorum. Özellikle de kararlaştırılmamış / hala yoruma açık konulara işaret ettikleri için.

Sahip olduğum örnek kod 25. satıra veya sonraki yüksek ifadeye [...]

Öyleyse ... BASIC'in bu şekilde çalışan bir sürümünü bilen var mı, yoksa bu (kesinlikle şüphelendiğim gibi) örnek koddaki bir hata mı?

Hesaplanmış GOTO'yu kolaylaştırmak için satırlar arasında atlamaya izin veren bir TINY BASIC'i hatırlıyorum, ancak orijinal kaynağa bu şekilde bakıldığında bir değişiklikti.

Aksine, ECMA-55 THEN / GOTO / GOSUB'da hedef olarak kullanılan hedefleri belirtir:

All line-numbers in control-statements shall refer to lines in the program.
1 Davislor Dec 08 2020 at 07:35

Pragmatik terimlerle,

  1. Tercümanınızın hangi eski kodu çalıştırmasını istediğinize karar verin

  2. Varsa, hangi uyumsuz lehçeleri seçenek olarak desteklemek istediğinize karar verin

  3. Onların yaptığı aynı şeyi yapın.

Raffzahn'ın ortaya koyduğu gibi, Microsoft'un davranışı Dartmouth'unkinden daha kullanışlıdır, çünkü Microsoft BASIC birden çok ifadeyle koşullu bir blok yazmanıza izin verir. Ayrıca Microsoft'un davranışını bekleyen programları çalıştırmak istediğinizi de söylüyorsunuz.

Benzer şekilde, herhangi bir eski kodun kasıtlı olarak GOTOmevcut olmayan bir satır olması pek olası değildir, ancak bazı mevcut programların GOTO 24yerine gibi bir yazım hatası olmasına rağmen doğru şekilde çalışması mümkündür GOTO 25.

Uyumsuz davranışa bağlı olan kodu da çalıştırmanız gerekiyorsa, bunu bir seçenek olarak sunabilirsiniz.

1 h22 Dec 09 2020 at 21:57

Kullandığım lehçe, eğer varsa, kontrolü en yakın büyük numaralı mevcut hatta geçirmekti. Değilse, bu, programı herhangi bir hata mesajı olmadan sonlandırmanın yasal yoluydu.

Kontrolü aralığın ortasına geçirmek, giriş noktasının her iki tarafına da satır eklenmesine izin verdi. Bu çok yardımcı oldu çünkü yeniden düzenleme de çok yorucuydu: Arama yoktu ve satırı değiştirmenin tek yolu, tam uzunlukta yeniden yazmaktı. Bu sürümde otomatik hat yeniden numaralandırması yoktu.

Makine bir tür Sovyet "Elektronika" ydı ama tam olarak hatırlamıyorum. Konsolda kendi iki sıralı LED ekranına sahip çok yüksek kaliteli bir hesap makinesine benziyordu, ancak zaten harici monitör ve klavyeyi destekledi.