BASIC neden hat numaralarını kullandı?


95

Neden eski BASIC'ler (ve belki başka diller) kaynak kodun bir parçası olarak satır numaralarını kullandılar?

Yani, hangi problemleri çözmeyi denedi?


27
Halihazırda ciddi araştırma çalışmaları yaptıysanız, bu konudaki bilgileri yorumların içine gömmeyin, sorunuzu buna göre düzenleyin. Dahası, Google beni doğrudan buraya aldı: stackoverflow.com/questions/541421/… ve burada stackoverflow.com/questions/2435488/…
Doc Brown

13
Bu soruyu konu dışı olarak kapatmak için oy veriyorum, çünkü cevap zaten stackoverflow'da .
Andres F.

6
Applesoft BASIC öğrendiğim ilk programlama diliydi. Pascal'ın satır numaralarına sahip olmadığını ve "Ama satır numarasız bir GOTO'yu nasıl yaparım?"
Jens Schauder,

14
Komik, en son kontrol ettiğimde, sorunun diğer sitelerin içeriğine değil, içeriğe dayanarak konuyla ilgili olup olmadığına karar vermiştik (ve muhtemelen orada yatan cevapları).
MatthewRock

Yanıtlar:


130

TEMEL, çağdaş dilleri ile bağlam içinde ele alınmalıdır: erken dönem fortran, kobol ve montaj.

Ben edildi Geri zaman 6502 aksamındaki dabbling olmadan etiket, bu size sıkıca paketlenmiş kod ortasında bir yerde bir talimat eklemek için gerekli olduğunu bulduğumda (sonradan eklenen anlamına geliyordu NOP sen atlama tüm geçmesi ve yeniden yapmak gerekli ler) adresleri. Bu zaman alıcıydı.

Fortran, BASIC’i geride bırakan, hat numaralı bir sistemdi. Fortran'da, 1-5 sütunları dallanma hedefleri için kullanılacak bir satır numarasıydı. Fortran ile kilit nokta, derleyicilerin BASIC tercümanından biraz daha zeki olma eğilimindeydi ve birkaç talimat eklemenin sadece bazı kartları delme ve onları doğru yere yerleştirme meselesi olmasıydı.

Öte yandan, TEMEL, talimatlarının tümünü düzenli tutmak zorundaydı. 'Önceki çizginin devamı' kavramı çok fazla değildi. Bunun yerine, Applesoft BASIC'te (aşina olduğum ve bilgi bulabildiğim çok kullanılan lehçelerden biri) bellekteki her satır şöyle temsil edildi:

NN NN   TT TT   AA BB CC DD .. .. 00

Bir sonraki satırın adresi için iki bayt vardı ( NN NN). Bu satırın satır numarası için iki bayt ( TT TT) ve ardından AA BB CC DD .. ..satır işaretçisinin ( 00) sonunda bir jeton listesi ( ). (Bu, Apple İçi'nin 84-88. Sayfalarındaki ) e )

Bu bellek temsiline bakarken fark edilmesi gereken önemli bir nokta, çizgilerin düzensiz bellekte saklanabilmesidir. Hafızanın yapısı, yapının içinde 'sonraki satır' işaretçisi bulunan bağlantılı bir listeydi. Bu, iki satır arasına yeni satırlar eklemeyi kolaylaştırdı - ancak düzgün çalışması için her satırı numaralandırmanız gerekiyordu.

BASIC ile çalışırken Çoğu zaman, aslında çalışıyorlardı içinde BASIC kendisi. Özellikle, belirli bir dize satır numarası ve TEMEL talimatlar veya temel yorumlayıcı için bir komut ya oldu RUNya LIST. Bu, kodu komutlardan ayırt etmeyi kolaylaştırdı - tüm kodlar sayılarla başlar.

Bu iki bilgi, sayıların neden kullanıldığını tanımlar - 16 bitte çok fazla bilgi edinebilirsiniz. Dize tabanlı etiketler çok daha fazla yer kaplar ve sipariş vermeleri daha zordur. Sayılarla çalışmak kolaydır, anlaşılır ve temsil edilmesi kolaydır.

Değildin Sonra TEMEL lehçeleri içinde tercüman her zaman uzak her satır numaralandırılmış ve bunun yerine yalnızca şube hedefti satırları numara gereken ilgisi başardık. Aslında, etiketler.


3
İyi sos, Mini Assembler'ı unutmuşum. Bu anıları geri getiriyor .
Blrfl

3
@Blrfl Eğer hafıza çalışıyorsa ... ] CALL -936 * F666 G $ ... Evet, başlamak için temel FP

3
Hayır, bu oldu çizgi editörü. Komutlar, satır numaralarına sahip olmadan tanımlandı. İfadeler, hem ifadeler olduklarını, hem de gittiklerini ve / veya hangi çizginin üzerine yazdıklarını göstermek için satır numaralarından önce gelir. BASIC'in dahili çizgi editörü kısmıydı, ayrı bir araç ya da ortam değildi.
RBarryYoung

3
@RBarryYoung ] PRINT "FOO"hemen BASIC tercümanı tarafından yönetildi. Bu bir ifadedir. Daha sonra çalıştırmak istersen, ] 10 PRINT "FOO"sonra yaparsın ] RUN. AppleSoft BASIC ortamında, her BASIC ifadesi derhal çalıştırılabilir veya ertelenebilir - DOS tarafından sağlanan ve BASIC ifadeleri için geçerli olmayan çok az komut vardı. Şimdi bir cümle ile daha sonra bir cümle arasındaki fark satır numarasıydı. Gecikmiş bir ifadeyi, karşılık gelen satır numarasını tekrar girerek de değiştirebilirsiniz. Ayrıca bir satıra birden çok ifade koyabilirsiniz::

4
Wikipedia makalesinde belirtildiği gibi ( en.wikipedia.org/wiki/Dartmouth_BASIC ) " DTSS (Dartmouth Time Sharing System) erken bir ... etkileşimli komut satırı arayüzü uyguladı. ... Satır numarasıyla başlayan herhangi bir satır, Program, önceden kaydedilmiş herhangi bir satırın aynı numara ile değiştirilmesi, başka herhangi bir şeyin bir DTSS komutu olduğu varsayılır ve derhal yürütülür. ... Bu düzenleme yöntemi, Dartmouth Timesharing sistemi için terminal üniteleri olarak teleprinlerin kullanılması nedeniyle gerekliydi. "
RBarryYoung

50

Mikrobilgisayarların başında düzenleme satır tabanlıydı. Kaynak kodda serbestçe dolaşıp düzenleme yapamazsınız. Ekranın altında komutları yazıp kod girebileceğiniz tek bir satırınız vardı. Ekranın geri kalanı salt okunur kod listeleri ve komut çıkışıydı. Eğer programda "90" satırını söylemek isterseniz " EDIT 90" yazmışsınız ve satırın içeriği 90tek satırlık düzenleme tamponuna girmiştir. Girdiğiniz satırı düzenlediğinizde, girdiğiniz program listesi güncellendi. Bu yüzden programı düzenleyebilmek için satır numaralarına ihtiyacınız var.

Kod editörleri daha gelişmiş hale geldiğinde ve imleci kod listesinde hareket ettirmenize izin verdiğinde, artık satır numaralarına ihtiyacınız yoktu.


38
Düzenleme bir çizgi? Lüks! Kullandığım ilk TEMELLER, tüm satırı yeniden yazmanıza neden oldu. Bir alt rutini yeniden numaralandırmanız gerektiğinde gerçekten berbattı.
TMN

48
Ekran? Hangi ekran? İlk Basic'imde "ekran" bir kağıt rulosuydu.
Ddyer

18
@ddyer: Bir rulo kağıdın olmasını hayal ederdim! Tek sahip olduğumuz elektrot demetiydi. İşin yapılması gerektiği akşamları, programın doğru çalışıp çalışmadığını görmek için kendimizi üst üste dizmek zorunda kaldık ve elektrokimi kestiğimizi gözlemlememiz gerekecekti. ... - Cidden, insanların aslında o günlerde çalışma programları yazabildiklerini gördüm.
leftaroundabout

26
Elektrik! Kanlı lüks. Emirlerimizi granitte
keserdik

10
@TMN & ddyer Tamam, ikiniz de bunun nereye gittiğini biliyorsunuz, değil mi? ;-D ==> dilbert.com/strip/1992-09-08 ==> imgs.xkcd.com/comics/real_programmers.png
Baard Kopperud

45

80'lerin 8-bit ev mikro bilgisayarlarının BASIC lehçelerini düşünüyorsanız, o zaman bu bilgisayarların metin editörleri yoktu (bir kelime işlemci uygulaması satın almadığınız sürece). BASIC program kaynak kodunun "bugün bir editörde açık" olması gibi bir şey yoktu, bugün programlamada olduğu gibi. Programcı, programı gerçekten bir kaynak kod dosyası ya da metin olarak düşünmezdi.

Örnek problem

Öyleyse, kafanızda satır numaraları olmayan basit bir program olduğunu varsayalım:

FOR I=1 TO 42
PRINT I
NEXT I

Bilgisayarınızı başlattınız. Bir "hazır" ya da onun gibi bir şey istemiştiniz ve imleci bir sonraki sıraya oturtun. Bu, günümüzün farklı komut dosyası dillerinin REPL ortamları gibidir, gerçekte tam olarak satır tabanlı değil, daha çok ekran tabanlı gibi. Yani bugünün REPL'leri gibi değil, ama yakın.

Şimdi, programa girmeye başlarsanız, ilk satırdan sonra hata ile karşılaşabilirsiniz, çünkü BASIC yorumlayıcısı derhal çalıştırmaya (ve unutmaya) çalışır ve NEXT olmadan döngüyü sonlandırmanın bir anlamı yoktur. Burası metni düzenlediğiniz metin editörü değil, bilgisayara komut verdiğiniz yer!

Kısmi çözüm

Söylemenin bir yolu var, bu program satırı, sakla! Özel bir komutunuz olabilir ya da sadece hey, bu program satırıdır, saklayın. Bunu hayal edelim:

#FOR I=1 TO 42
#PRINT I
#NEXT I

Tamam, şimdi hayali BASIC yorumcumuz programı sakladı ve çalıştırabilirsiniz. Ancak şimdi PRINT satırını düzenlemek istiyorsunuz. Bunu nasıl yapıyorsun? Metin editöründe değilsiniz, sadece imleci satıra taşıyamaz ve düzenleyemezsiniz. Ya LET COUNT=COUNT+1da döngüdeki gibi başka bir satır eklemek istersiniz . Yeni satırın nereye yerleştirilmesi gerektiğini nasıl belirtirsiniz?

Çalışma çözümü

Satır numaraları, oldukça klunky bir şekilde, bunu çok kolay bir şekilde çözmek. Zaten var olan bir sayıyla bir program satırı girerseniz, eski satır değiştirilir. Artık ekran tabanlı REPL ortamı kullanışlı hale geliyor, çünkü imleci ekranda program listesine taşıyabilir , ekrandaki satırı düzenleyebilir ve kaydetmek için ENTER'a basabilirsiniz. Bu, aslında ekrandaki metni düzenlerken ve ardından tüm satırı ekrandan yenisiyle değiştirirken, satırı düzenliyormuşsunuz gibi görünüyor. Ayrıca aralarında kullanılmamış sayılar bırakırsanız, yeni satırlar eklemek kolaylaşır. Göstermek:

10 FOR I=1 TO 42
20 PRINT I
30 NEXT I

Satır 20'yi değişikliklerle tekrar girdikten ve yeni satırlar ekledikten sonra,

5 LET COUNT=0
10 FOR I=1 TO 42
20 PRINT "Index", I
25 LET COUNT=COUNT+1
30 NEXT I

Yeni çözdüğümüz daha fazla sorun

Satır numaralarını bir dil kurgusu olarak, en azından GOTOAND GOSUBkomutunun hedefi olarak kullanabilmenin yararı (veya laneti, ünlü BASIC spagetti kodunu sağlar) . Bu, etiketlerle değiştirilebilir, ancak satır numaralarını kullanmak, 80'lerin tipik bir 8-bit ev bilgisayarında hala kesin bir bonus olan BASIC yorumlayıcısında uygulanması daha basittir.

Daha da önemlisi, kullanıcı deneyimi açısından bakıldığında, satır numaraları gerçekten de kodu düzenlemek için şaşırtıcı derecede kolay ancak eksiksiz bir arayüzdür. Yeni kod eklemek için bir sayıyla başlayan bir satır yazın. LIST 100-200100-200 satırları göstermek için kullanın . Bir satırı düzenlemek için, ekranda listeleyin, ekrandaki metni düzenleyin ve satırı tekrar girin. Bir çizgiyi kaldırmak için boş olacak şekilde düzenleyin, bu sadece ondan sonra hiçbir şey içermeyen bir satır numarası verir. Bunu açıklamak için bir paragraf. Gibi eski metin editörü kullanımını tarif etmeye karşılaştırın edlin DOS veya ed veya eski Unix: Sadece yanlışlıkla başladığında kullanıcı, onları çıkabilirsiniz nasıl açıklamak için (sadece hafif hiberbol) Bir paragraf gerek!

Sonuç

Diğer cevaplar satır numaralarının nasıl oluştuğunu açıklar. Burada anlatmaya çalışıyorum, satır numaraları neden bu kadar uzun süre hayatta kaldılar, gerçek dünyadaki bir problemi nasıl çözdüler: Gerçek programlamayı gerçek bir editör olmadan çok basit bir şekilde yapmanın bir yolunu önerdiler. Uygun olduğunda, kullanımı kolay, tam ekranlı metin editörleri hem donanım sınırlamaları ortadan kalkarken hem de yeni şeyleri uyarlayan insanların ataleti üstesinden gelindiğinde kodu düzenlemek için ana yol haline geldi, çünkü sıra numarası tabanlı BASIC lehçeleri kullanımdan oldukça hızlı bir şekilde kayboldu, çünkü Çözdükleri temel kullanılabilirlik sorunu artık bir sorun değildi.


4
Başardın. Sadece bir tty veya tek satır yazdırmak yerine çok satırlı bir ekrana sahip olmak bunu kolaylaştırır, ancak bir kaynak dosya kavramı olmadan hala satır yönelimlidir.
JDługosz

Sistemin 8 bit mimarisi olması, gerçekte sınırlayıcı bir faktör değildir. Şimdi, sistem yalnızca RAM birkaç kilobayt ve ROM kilobayt bir avuç, (her kaset teyp kırdı varsa) hatta kalıcı bir depolama alanına sahip olabileceğini söyledi aslında ...
Bir CVn

hala bir metin editörü olmadan kodlama hayal etmek zor
phuclv

@ LưuVĩnhPhúc Neredeyse tüm 8 bit ev bilgisayarları veya MSDOS ve GWBASIC gibi dosbox'lar gibi "gerçek şey" i çalıştırmak için birçok emülatör var. Örnek olarak, birçok C64 emülatöründen birini ve daha sonra Google’ın Kullanım Kılavuzunu PDF olarak bulmak için Google :-)
hyde

1
@phuclv - Artık bir metin editörü olmadan kodlamayı hayal etmek zor. O zamanlar, bir metin editörü kullanmak, saklamak ve çalıştırılmadan önce derlemek zorunda kalmanın zorluğunu hayal etmek zordu ... ve bu gerçekten de PC dünyasının yanında geldi; Pascal ve C. Her ikisi de bir metin editörüyle serbestçe düzenlenebilir olan hem derlenmiş diller, hem de kesinlikle kendi başlarına bir programlama ortamı değil (BASIC hem programlama ortamı hem de çalışma zamanı ortamıydı). Pascal benim bir sonraki dilimdi ve birçok yönden oldukça özgürleştirici oldu. Kesinlikle daha güçlü. Ama başka şekillerde biraz daha az heyecan verici.
DavidO

17

Basic geliştirildiği zaman ve yerde, mevcut en iyi I / O cihazı bir teletipti. Bir programın düzenlenmesi, tüm programın bir listesini veya kağıda yazdırarak ya da programın ilginç bir kısmını yazarak ve sonra satır numaralarını içeren yeni satırlar yazarak yapıldı.

Bu yüzden varsayılan satır numaralandırması 10'du, bu nedenle mevcut satırlar arasında kullanılmayan sayılar olacaktır.


1
Aslında, kart okuyucular (tuş takımları ile birlikte) ve satır yazıcısı, bir teleprinterden daha iyi G / Ç cihazlarıydı ancak teleprinters çok daha ucuzdu.
supercat, 13.03.2015

10'a kadar satır numaralandırması, kesin bir gereklilik değil fiili bir standarttır. Ve birçok BASIC'in renyeniden numaralandırılması için bir ' ' komutu vardı . Tipik bir çağırma ren 10, 10(ondan başlayarak, on ile artan yeniden numaralandırma - biri yeni girilmişse varsayılan davranış ren. gotoVe gosubve then (linenumber)komutları otomatik olarak güncellenecektir. Ancak bu, en eski BASIC'lerde kesinlikle mevcut değildi. Tamsayılı Temel, Applesoft FP temel, TI Temel / Genişletilmiş Temel, MS Temel / GW Temel, vb.
DavidO

13

"Satır numaraları" birkaç farklı anlama gelir.

Her şeyden önce, "çizgiler" kavramının sonsuza kadar etrafında olmadığını aklınızda bulundurun. Bu çağda birçok programlama dili delikli kartlar kullandı ve sıra numaralarına (genellikle kartın son birkaç sütununda) sahip olmak, desteyi düştüğünüzde doğru sırayla kurtarmanıza ya da kart okuyucusunda korkunç bir şey olmasına yardımcı oldu. Bunu otomatik olarak yapan makineler vardı.

GOTOİfadelerin hedefi olarak kullanılacak satır numaraları tamamen farklı bir kavramdır. FORTRAN IV'te, isteğe bağlıydılar ve ifadeden önce geldiler (1-5 sütunlarında). Serbest biçimli etiketlerden daha kolay uygulanmasının yanı sıra, rasgele bir satır numarasına atlamanıza izin veren hesaplanmış ve atanmış GOTO konsepti de vardı . Bu, çoğu modern programlama dilinin sahip olmadığı bir şeydi ( switchifadeler yaklaşsa da), ancak assembler programcıları için tanıdık bir numaraydı.

BASIC, FORTRAN'dan türetildi ve uygulanması ve anlaşılması daha kolay olması için, her "satırı" bir satır numarasına (hem sıralama için hem de GOTO/ GOSUBifadelerin hedefi olarak) sahip olmaya zorlama muhtemelen bu nedenle verilen bir tasarım kararıydı.


2
Ah, hesaplanmış ve gotos atandı. PL / 1'deki etiket değişkenleri dizilerinin hatıraları, bir eşleşme bulmak için bir diziyi geçip ardından bir dizi yapmak için etiket değişkenleri dizisindeki dizin olarak dizini dizine eşleyen diziyi kullanmak. Veya Cobol gotos değiştirdi. Ve ne satır numaraları kullanarak! BBC basic, çok faydalı bir yeniden numaralandırma bildirisine sahipti.
Kickstart

GCC, hesaplanan GOTO'ların bir uzantı olarak kullanılmasına izin verir (doğrudan satır numarası olmasa da) - gibi şeyler yapabilirsinizgoto array_of_labels[some_computation()];
immibis

Küçük: FORTRAN GOTO(veya ASSIGN) hedefleri ve orijinal aka aritmetik aka üç yolunun IF(ve nadiren kullanılan) CALLhedeflerinin DOve FORMATifadelerinin ( ve tabii ki sınırlayıcıların) hedeflerinin sıralamasında ve sıralamasında alternatif ifadeler için etiketler istedi . Diğer ifadelerde isteğe bağlıydılar.
dave_thompson_085

Bazı BASIC'ler (örneğin, Atari'ler) GOTO ifadelerinde keyfi sayısal ifadelerin kullanılmasına bile izin verdi. Böylece, doğru bir hat numaralandırma sözleşmesiyle, GOTO 1000+N*100bir switchifadeyi taklit etmek için yazabilirsiniz .
dan04 23

6

Her satırın 1-6 sütunlarında satır numaralarını kullanan COBOL'de programlama yapmaya başladım. 1970'lerde hiçbir IDE bulunmadığından, her şey delikli kartlarla yapıldı ve orijinal kaynaktaki hangi satırların değiştirileceğini ve hangi yeni satırların eklendiğini belirlemek için satır numarası kullanıldı. Daha fazla satır ekleyebilmemiz için satır sayısını 100 artırırdık.


14
COBOL bu satır numaralarını kullanmadı. Kesinlikle elverişliydiler, bu yüzden bazı kötü schlublar destesini düşürdüğünde ve kartlar her yere gittiğinde, onları doğru sıraya sokmak için onları toplayıp kart sıralayıcıya koyabilirdi. Satır numaralarını kartlara atmanız gerekmedi. (Öğrenciler yapmadılar. Üretim dükkanları
yaptılar

5

BASIC, hat-terminal döneminde, FORTRAN'dan daha sonra ortaya çıktı. Bir kart destesinden daha etkileşimli bir okuma-exe-print-loop ortamı içeriyordu.

BASIC'te 24 karakterlik tek bir ekran üzerinde programlamayı öğrendim . Satır numaraları, bir satırın nereye gitmek istediğinizi, bir düzenlemeyi veya başkaları arasına ekleme yapıp yapmadığınızı belirtmenin doğal bir yoluydu.

Başka nasıl yaptığını hayal bile edemiyorum.


2
bu, önceki 4
cevapta

2
Bu kötü mü? Bence Jaques, satır ekleme ve kodu zihinsel olarak izlemeye ilişkin tek satırlık düzenlemenin özünü gerçekten örtmedi.
JDługosz

1
@jameslarge "BASIC ile çalışırken birçok kez" ile başlayan paragraftaki bu noktayı özlüyor muyum? BASIC'i işletim sistemi olarak çağırmaktan da çekiniyorum. DOS'du. Ve DOS'un

2
@ Bu doğru olsa da, io (Dartmouth Time Sharing System) için teletipler kullanan bir sistem için tasarlandı .
Jules,

3
@MichaelT, Oops! Yorumumun yarısını geri çekeceğim, ancak bazı bilgisayarlarda işletim sistemi olma konusunda BASIC'in yanında olacağım. Düşünüyorum; Elma] [, TI 99/4, IBM 5100, HP 9830a, Compucolor 8001, TRS-80 Model 1, Comodore Vic20, Sinclair ZX80 ve diğerleri. Hepsi ROM'dan BASIC'e başlatıldı. Bazılarında, disket sürücüye ekstra $$ ödediyseniz, ses kasetinden veya disketten yüklenebilecek isteğe bağlı bir işletim sistemi vardı .
Süleyman Yavaş

1

Henüz kimsenin bahsetmediği bir nokta, yeni başlayanların, dal hedeflerinin açık olduğu program akışıyla ilgili olarak akıl yürütmesinin daha kolay olması. BEGIN / END ifadeleriyle (ya da hangi blok sınırlayıcıları kullanıldıysa) eşleştirmek (muhtemelen iç içe geçmiş) kullanmak yerine kontrol akışının nereye gittiği oldukça açıktı. Bu BASIC hedef kitlesi (o verilen muhtemelen faydalı oldu Başlangıç sonuçta Çok amaçlı Sembolik Talimat Kodu).


1

Dartmouth Time Sharing System bir teletype arayüzü kullandı. Böylece komut tabanlı bir arayüz kullanılır. Başlangıçta, satır numaraları programı düzenlemek için sadece bir araç olarak kullanıldı. Satır numarası kullanarak ekleyebilir, değiştirebilir veya silebilirsiniz. İlk sürümün, goto ifadeleri için satır numaralarını kullandığı görülmüyor, ancak bu daha sonra dilin bir parçasıydı.

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.