Operaattorit ja bitinnypläys



On yleisesti tunnustettu totuus, että C:n operaattorien sidontajärjestys tarvitsee välttämättä vertailu- ja bittioperaatioiden vaihdon. Esimerkki: a >> 5 & 3 == 1 && b >> 7 & 15 == 8. Melko selkeästi tarkoitetaan (((a >> 5) & 3) == 1) && (((b >> 7) & 15) == 8), mutta C:ssä, ja sen vaikutuksesta yllättävän monessa ohjelmointikielessä, kääntäjä ei tätä näin tulkitse. Sen sijaan jäsennys on ((a >> 5) & (3 == 1)) && ((b >> 7) & (15 == 8)), mikä on sekä eri asia kuin mitä tarkoitettiin, että suoraan sanottuna aivan järjetöntä.

Laadukkaampien kehitysympäristöjen eduksi on sanottava, että ne varoittavat tässä tilanteessa siitä, että luultavasti nyt ei tapahdu mitä kehittäjä luulee.

Joissain ohjelmointikielissä on järjestelty operaattorien sidonta uusiksi niin, että se on intuitiivisempi. Mielenkiintoinen kysymys on, miksi monessa uudessakaan kielessä, joka on tehnyt selkeän pesäeron menneisyyteen, ei ole koskettu sidontajärjestykseen. Tähän on kaksi kilpailevaa selitystä, joista helppo (ja luultavasti väärä) on se, etteivät kielen kehittäjät ole ymmärtäneet, että vaikka on olemassa status quo, se on virheellinen. Tämä ei ole uskottava selitys, koska kielten kehittäjät ovat yleisesti sekä älykkäitä että hyvin perehtyneitä ohjelmistotuotannon käytäntöihin.

Toinen selitys on, että pidetään C:mäisen syntaksin mindshareen kuuluvana asiana, että operaattorien merkitys ja sidontajärjestys on juuri se, mikä se oli C:ssä. Vaikka itse en aluksi pitänyt tätä uskottavana, sen puolesta puhuisi, että järjestyksen korjanneista kielistä C:mäisin on Ruby, eikä sekään ole mitenkään erityisen C:mäinen.

Ohjelmointikielien ryhmittely operaattorilogiikan mukaan

Kaavioon on ryhmitelty yleisesti käytössäolevia ohjelmointikieliä sen mukaan, miten ne sijoittuvat tarkasteltaessa niiden operaattorien logiikkaa tämän käyttötapauksen puitteissa. Oikean ja väärän lisäksi on kolme kysymyksenväistämiskategoriaa.

Ensimmäinen, Awk, Cobol, Modula-3, Lua ja SML ei tarjoa ensinkään operaattoreita bitinnypläykseen. Näissä kielissä pitää käyttää kirjastofunktioita.

Toinen kategoria on kielet, joissa syntaktiset käytännöt ovat riittävästi erilaiset, ettei ongelmaa oikeasti voi olla olemassakaan. Lispissä ja Schemessä suoritusjärjestys on tiukasti ilmaistu sulkeilla. Forthissa ja Joyssa suoritusjärjestys on yhtä tiukasti ilmaistu sillä, että ohjelmakoodi koostuu vuorottaisista parametrien asettelusta pinoon ja operaatioista, jotka ottavat syötteensä pinosta ja jättävät pinoon tuloksensa.

Kolmas kategoria on Smalltalk, Apl ja J. Nyt tarkkana: Nämä kielet näyttävät sikäli normaaleilta, että voi kirjoittaa lausekkeen 1 + 2 * 3 kun tarkoittaa 7. Vai voiko? Eipä voikaan, koska kaikki operaattorit ovat näissä samanarvoisia, ja lausekkeen arvo onkin 9, koska operaattorit käytetään vasemmalta oikealle, jos sulkeita ei ole.

Tässä käsitellyt ominaisuudet tuskin ovat toimineet kertaakaan ohjelmistotuotannon historiassa ensisijaisena toteutuskielen valintaperusteena. Todelliset valintakriteerit eivät ole näin järkeviä, mutta jos haluatte lukea niistä, Steve Yegge kirjoitti aiheesta jo vuosia sitten, eikä asiassa ole oikeasti muuttunut sen jälkeen mikään.

Tämän artikkelin on kirjoittanut Teemu Kalvas ja sitä ovat sittemmin muokanneet muut Codenton työntekijät.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *