mboost-dp1

VBScript-/Visual Basic/BASIC-syntaksvarianter


Gå til bund
Gravatar #1 - Acro
24. jan. 2008 16:01
Jeg sad og kiggede på noget gammel kildekode i en tråd, og det slog mig pludselig, at der er et hul i min viden om det sprog, vi alle kender, men som vi også alle har vidt forskellige holdninger til og erfaringer med. Derfor håber jeg, at nogen herinde kan svare mig eller komme med et kvalificeret bud.

Der er særheder i de fleste sprog, og VBScript/Visual Basic/BASIC er selvfølgelig ingen undtagelse. Men der er mange muligheder for at lave løkker, og jeg kan ærlig talt ikke finde ud af, om der er nogen forskel.

Man kan bruge Do/Loop Until, Do/Loop While, Do While/Loop, Do Until/Loop, While/Wend og sikkert endnu flere, jeg har glemt. Selvfølgelig skal der nok være nogen, der synes, det er smart, at man kan bruge Until i stedet for at negere boolske udtryk, men hvor er forskellen på Do/Loop kontra While/Wend?
Gravatar #2 - arne_v
24. jan. 2008 16:33
Nu er jeg ikke VB guru men:

for
...
next

for each
...
next

= klassisk for loop med henholdsvis tæller og generel enumeration

do until
...
loop

og

do while
...
loop

= klassisk while loop (top test) bare med henholdsvis true og false som stop

do
...
loop until

do
...
loop while

= klassisk repeat until loop (bund test) med henholdsvis true og false som stop

Klassisk = Pascal familie syntax

while
...
wend

er saa vidt jeg fortstår en alternativ syntax for

do while
...
loop

som eksisterer af historiske grunde (med do while kan man dog bruge exit do statement)
Gravatar #3 - Acro
24. jan. 2008 18:14
Jeg har programmeret de sidste 11 år, så jeg er ikke i tvivl om, hvordan de virker, men tak for gennemgangen alligevel. Mit spørgsmål går på, om der er et rationale bag at implementere forskellig syntaks for ting, der som udgangspunkt er ens. For og For Each er en "særlig" konstruktion. Selvfølgelig kan man opnå det samme på en anden måde, men de tjener helt klart et formål - modsat alle de, jeg nævnte.
Gravatar #4 - zin
24. jan. 2008 18:42
Simpelt - Do Loop vil løbe en løkke igennem mindst én gang, hvorimod While Wend ikke nødvendigvis vil, hvis while-udtrykket allerede er opfyldt.
...
Det vil jeg da gætte på, i hvertfald.
Gravatar #5 - Saxov
24. jan. 2008 20:42
Den forskellige syntax er vel forskellige sprog.
Hver gang et nyt sprog laves, kommer der en syntaks, som man enten basere på sit favorit sprog (og derved laver en variant af et sprog, som fx C, der er en efterfølger til B), eller man opfinder en nye/variant af syntaksen, og starter en ny sproggren.

forskelen på om du bruger do "while...loop" eller "while...wend", er vel den samme som om man bruger "if...fi" eller "if...end if".
Gravatar #6 - Acro
24. jan. 2008 21:17
#4 ZiN:
Det kan der være noget om. Det forklarer så ikke forskellen på Do While/Loop og While/Wend, men kun på Do/Loop While og While/Wend.

#5 Saxov:
Pointen er netop, at ALLE varianterne findes i det samme sprog. Jeg forstår godt, at syntaks er forskelligt. Så meget har jeg trods alt fået ud af datalogistudiet...
Gravatar #7 - myplacedk
24. jan. 2008 21:23
Acro, hvis jeg forstår dig ret, har jeg vist kun én kommentar:

Varianter som do-while og do-until burde kunne slås sammen. Hvis man ikke kan finde ud af at negere betingelse i en do-while, så har man sgu da problemer, som ikke kan løses ved at introducere do-until. Det eneste argument jeg kan finde er, at man ønsker at gøre det mere elegant, og fejler.

Jeg kan lide reelle alternativer som Javas "for(){}else{}" kontra "()?:", da de hver har et klart formål.

Ligesådan kan for(;;) og while() sagtens erstatte hinanden, men har alligevel helt forskellige formål.

Do-until gør bare sproget unødigt kompliceret.
Gravatar #8 - Acro
24. jan. 2008 21:41
#7 myplacedk:
Netop, men hvorfor har man så lavet sproget sådan. Vi kan have nok så meget diskussion, om et sprog skal tage udgangspunkt Fortran-syntaks eller C, og den personlige præference skal der for så vidt også være plads til. Derfor synes jeg bare ikke, at det giver mening at have flere ting, der gør der gør det samme - mere eller mindre. Syntaktisk sukker tjener helt klart sin anvendelse - f.eks. coalesce-operatoren, du nævner, men der må være grænser. Som jeg også skrev i #3, har for og while sin berettigelse, fordi det er et så tilpas andet formål, men det giver ikke mening at lave ekstra ting, så man undgår at negere.
Gravatar #9 - rackbox
24. jan. 2008 22:15
Der er vel i grunden kun to typer af løkkestrukturer:

1. løkker, der tjekker for udfald efter kørsel af løkkens blok. Har altid mindst 1 kørsel.
2. løkker, der tjekker for betingelser før kørsel af løkkens blok. Har ikke noget minimum for antallet af kørsler.

jeg kan heller ikke fortælle dig forskellen på Do While/Loop og While/Wend i praksis, men mon det kan have noget af gøre med, at det kan være praktisk at strukturere koden med henholdsvis den ene eller den anden afhængig af konteksten?

Wild guess...
Gravatar #10 - arne_v
24. jan. 2008 23:50
#3

Der er jo netop ikke helt ens.

Hvis vi nu antager at while wend er historisk betinget og blev opfundet før alle do loop varianterne og man ikke ville fjerne den, så er der ingen der er ens.

Kunne man nøjes med færre løkke strukturer ? Ja - sagtens ! Man kan nøjes med en enkelt løkke (a la TPU og Modula-2 helt generelle loop).

Men man vil jo gerne have at koden skal være så letlæselig som mulig og dem der designer programmerings sprog synes tilsyneladende overbeviste om at forskellige løkker øger læsbarheden.

Mit indtryk er at "standarden" idag er 4 løkke strukturer: en numerisk løkke, en enumeration løkke, en generel løkke med top test og en generel løkke med bund test.

Hvis vi ignorerer while wend med ovennævnte begrundelse, så følger VB faktisk den standard med en undtagelse: man har har 2 varianter af både top og bund test løkkerne.

De kan godt virke lidt søgte, men VB designerne må jo have ment at det faktisk også øgede læsbarheden.

Det er også værd at huske på at for bund tests vedkommende bruger andre sprog faktisk begge varianter - C familien har do { } while, mens Pascal familen har repeat until. Måske ville man gerne "dække" begge grupper.
Gravatar #11 - myplacedk
25. jan. 2008 05:53
#8
Netop, men hvorfor har man så lavet sproget sådan.

Jeg tror de har ønsket at lave et sprog, som er så nemt at komme i gang med som muligt. Noget som ikke kræver, at man har forstand på programmering. Noget som ikke kræver helt så veludviklet en logisk sans, som programmering jo egentlig gør.

Så har de vel taget de små ting med: Tuborg-klammer siger ikke "almindelige mennesker" noget, vi bruger ord i stedet.
Udråbstegn betyder ikke "not", vi bruger ord i stedet.

Jeg tror det er den slags, der gør at "rigtige programmører" typisk ikke kan lide sproget. Det føles bare så forkert. Så irrelevant.
Gravatar #12 - myplacedk
25. jan. 2008 05:57
(...fortsættelse)
Jeg synes i hvert fald det føles forkert at kode i Visual Basic.

Lidt ligesom at spille skak med en to-årig, så får jeg snot på mig.

Visual Basic dækker et behov jeg overhovedet ikke har. Den giver mig en fornemmelse af klistrede fingre. Jeg vil hellere lege med et mere sprog der passer bedre til "voksne".

(Men det er alt sammen bare mig. Jeg ved godt at der er nogle der lever ganske professionelt af at kode Visual Basic. Jeg ser ikke ned på programmørerne, det er sproget jeg ikke kan lide.)
Gravatar #13 - zin
25. jan. 2008 09:00
#6:
Acro(#1) skrev:
men hvor er forskellen på Do/Loop kontra While/Wend?


Det var det, du spurgte om! :-O
#9:
Faktisk eksisterer der jo, maskinssprogsmæssigtset, kun en
type løkker, men der varianter, der alle er baseret på goto-sætninger, med adresser på instruktioner der allerede er kørt, og if-sætninger.
Jeg kan, lige nu og her, forestille mig to forskellige praktiske anvendelser:
start:
do
do
pop
push
fuckmesideways
if (etellerandet)
goto start


start:
if (eltellerandet)
do
do
pop
push
fuckmesideways
goto start

nr. et kan ses som en do-while: Den vil altid køres mindst en gang.
nr. to kan ses som en while-wend; Den behøver ikke køres en eneste gang hvis ellers if-sætningen (i VB eller lign. vil det være while-conditionen) ikke opfyldes.
Gravatar #14 - Acro
25. jan. 2008 18:31
#11 myplacedk:
Min pointe er bare, at et sprog ikke bliver lettere at gå til, når der er flere måder at gøre det samme på - tværtimod. Noget helt andet er, at den syntaks jo ikke er opfundet med BASIC, den følger som jeg skrev Fortran-måden at gøre det på kontra C-måden. Jeg foretrækker selv sidstnævnte, men jeg tror ikke, du kan tale om, at du er mere professionel af den grund (når alt kommer til alt, ligger PHP trods alt også i den kategori). Jeg så engang et tal (og jeg tror, at det var i forbindelse med en nyhed herinde, jeg desværre ikke kan finde den), at op imod 66 % af alle programmører arbejder med VB i en eller anden sammenhæng. Det er i sig selv ret vildt, så noget er der altså gjort rigtigt, men det behøver selvfølgelig ikke at være selve sproget, der er skyld i det (snarere udbredelse, anvendelsesmuligheder, simplicitet og indlæring). Jeg afskyr selv syntaksen, selvom det var noget af det første, jeg lærte.

#13 ZiN:
Ja, løkker vil altid blive implementeret med et hop. Det er der vist ingen tvivl om. Når du så koger det ned til de to forskellige måder - altså ændrer placeringen af betingelsen, så står det også i skarp kontrast til alle de måder, man kan gøre det på i VB. While/Wend er dog formentlig af historisk herkomst, som arne_v også påpeger.
Gravatar #15 - arne_v
25. jan. 2008 22:35
#14

Jeg synes ikke at Basic har arvet meget fra Fortran. Klassisk Fortran (66 og 77 - 90, 95 og 2003 er næppe relevant i en diskussion om hvad andre sprog har lært af) har kun en løkke med en noget anderledes syntax.
Gravatar #16 - Acro
25. jan. 2008 23:56
#15 arne_v:
Jeg henviser nu også bare til Fortran, fordi syntaksen - altså det, at man bruger anvender ord og ikke tegn - minder derom. Jeg kender ikke andre sprog, der gjorde det før, men det er sikkert bare mit kendskab, den er gal med.
Gravatar #17 - arne_v
26. jan. 2008 00:15
#16

Fortran, Cobol, Algol/Pascal/Modula/Ada er alle mere "engelske" end C/C++/Java/C#/JavaScript/PHP.
Gravatar #18 - Acro
26. jan. 2008 00:31
Så er Fortran jo også det første, selvom det jo alligevel kan være forkert, når jeg taler om, at de andre sprog har "arvet" den "egenskab" fra Fortran-syntaksen...
Gravatar #19 - arne_v
26. jan. 2008 00:47
#18

Wikipedia hævder at Basic var inspireret af Fortran II og Algol 60.

Så lidt er der om snakken.

Jeg tror at nyere Basic (VB) har arvet mere fra Algol 60 end fra Fortran.

Fortran (af den årgang) har som sagt kun 1 løkke og har ikke block if, men har til gengæld 3 forskellige former for GOTO.
Gravatar #20 - myplacedk
26. jan. 2008 10:33
#14
Min pointe er bare, at et sprog ikke bliver lettere at gå til, når der er flere måder at gøre det samme på - tværtimod.

Netop. Godt argument.

men jeg tror ikke, du kan tale om, at du er mere professionel af den grund (når alt kommer til alt, ligger PHP trods alt også i den kategori).

Det vil jeg nu heller ikke påstå jeg er. Man kan vel godt være en dygtig og professionel programmer, som arbejder i Visual Basic.

Men JEG synes stadig at sproget FØLES begynder-agtigt. Al respekt for dygtige VB-programmører. :)

Jeg ved ikke helt hvad du prøver at sige om PHP. Jeg har selv levet af at lave PHP i nogle år. Selv om syntaxen er C-agtigt, synes jeg det er et meget rodet sprog, og jeg bryder mig egentlig ikke om det længere. Jeg har dog ikke fulgt med i hvad PHP5 har gjort for sproget, men jeg har da hørt at de har taget et kæmpe skridt.

Jeg så engang et tal (og jeg tror, at det var i forbindelse med en nyhed herinde, jeg desværre ikke kan finde den), at op imod 66 % af alle programmører arbejder med VB i en eller anden sammenhæng.

Det er under et år siden jeg skrev en stumpt kode i VB.

Jeg skulle teste noget software, som havde API'er i en masse forskellige sprog. Ingen af dem var noget jeg kendte, men der var et passende kodeeksempel i VB, og det kunne jeg arbejde på uden at installere kompiler, IDE eller noget som helst.

Det er i sig selv ret vildt, så noget er der altså gjort rigtigt, men det behøver selvfølgelig ikke at være selve sproget, der er skyld i det (snarere udbredelse, anvendelsesmuligheder, simplicitet og indlæring).

Det de har gjort rigtigt har jo nok netop været at det er nemt for begyndere. Folk der egentlig ikke har forstand på programmering. Plus de jo nok har gjort det meget tilgængeligt, i forhold til alternativerne.

Mine første GUI/Windows-programmer var da også skrevet i VB.

Jeg afskyr selv syntaksen, selvom det var noget af det første, jeg lærte.

Samme her. Dog en række andre basic-varianter før Visual Basic.
(Commodore BASIC, GW BASIC og QuickBasic, for eksempel. Yep, jeg kendte også kun Microsoft engang.)
Gravatar #21 - illishar
5. feb. 2008 16:26
#20 myplacedk
Godt nok er jeg selv også mest til C-syntax, men ide'en om at det ser mere voksen ud, er nu lidt off.
Tag eks. et sprog som LISP. Meget voksen syntax:

(MyVar = (/ (+ (Conv (StrConv "1" "2" "3") INT) 1 45) 2))

(Damn, det er stadigvæk svært)

Men derfor er det stadigvæk fucked up. Derimod så er VB-syntaxen ofte meget tæt pseudo-kode. (Hvilket også var målet) Et koncept der da er lidt interessant. (Prøv at overvej at skriv dit pseudo-kode i udviklingsfacen, for derefter blot at kunne trykke på knappen og så teste det. Så kan du jo altid implementere det rigtigt senere ;)
Gravatar #22 - myplacedk
5. feb. 2008 17:43
#20
Godt nok er jeg selv også mest til C-syntax, men ide'en om at det ser mere voksen ud, er nu lidt off.

Synes du ikke selv det er liiige subjektivt nok til at du kan sige, at det er forkert? ;-)

Tag eks. et sprog som LISP. Meget voksen syntax

Voksen? Jeg vil nu hellere bruge ord som "rodet" og "uoverskueligt". Jeg aner ikke engang hvad den linje gør, og jeg har ellers kodet i en Lisp-variant.
Det hjælper en del med en fornuftig indrykning, og sikkert også at blive vant til syntaxen.

Derimod så er VB-syntaxen ofte meget tæt pseudo-kode. (Hvilket også var målet) Et koncept der da er lidt interessant. (Prøv at overvej at skriv dit pseudo-kode i udviklingsfacen, for derefter blot at kunne trykke på knappen og så teste det. Så kan du jo altid implementere det rigtigt senere ;)

Tjah, proving my point. Det jeg hører dig sige er: Ligner mere pseudo-kode end "rigtig" god, god til at lave en prototype, inden man laver det "rigtige" produkt i et "rigtigt" sprog.

(Husk at jeg siger intet om at VB er dårligt. Kun hvad jeg synes om selv at kode i det. No offence. Jeg ved det er et følsomt emne, især for VB-programmører (gode eller ej) der har fået at vide rigeligt mange gange at VB er et amatør-sprog der kun bruges af amatører.)
Gravatar #23 - illishar
6. feb. 2008 08:22
Præcis. VB kan bruges lidt ligesom udvikling i MatLab. Let læsbart kode, uden for meget crap. (Her tænkes på VBs berygtede late bindings, implicit casts og default properties)Godt til hurtigt at teste ideer, design og algoritmer.
Men der er trods alt mange, især virksomheder, der ikke har tid til at lave en "rigtig" version af softwaren. Især ikke når nu tingene allerede virker i "skitsen".

Dog er der med indførslen af .NET jo blevet udgivet en kæmpe stribe af "RAD-sprog". (Rapid Application Development) Og dermed er der ikke helt de samme argumenter for brug af VB mere. Omend C# jo også kan oversættes linie for linie til VB.NET. VB.NET er derfor næppe mere amatør-aktig end C#, J#, Delphi.NET mm.

Men jeg tilslutter mig gerne den fordomsfulde, lidt snoppede anti-VB-bevægelse, som man møder over alt. C# *er* bedre og vil på sigt måske også kunne tilvende alle n00bs'ene til at skrive *rigtig* kode, aka native C++. LOL
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login