Keel D

Pean tunnistam, et vaatamata sellele, et olen D keelest korduvalt kuulnud pole ma varem kunagi seda uurinud arvates, et see on veel keerulisem variant C++ist. Sellel nädalavahetuse selgus, et tegu on väga huvitava edasiminekuga. Ning see edasiminek on toimund kõige paremat teed pidi – varem tehtud vigu on tunnistatud ja need on parandatud. Kõik mis mulle Cs ja/või C++’is ei meeldinud on lahenduse saanud. Lisaks on veel nii mõndagi huvitavat. D keele eesmärk on olla võimas ja kiire süsteemprogrameerimise keel nagu C ja C++ aga samas mugav ja kaasaegne nagu Ruby ja Python. Keelel on kõigile tuttav C stiilis süntaks. D on loomulikult ka staatiliselt tüübitud ning masinkoodiks kompileeritav – tegu ei ole kolmanda Javaga :D

Alustaks siis kõige tähtsamast – lõpuks on keeles olemas normaalne stringide tugi. Nali naljaks. Tegelikult pole see päris nii – stringid on ikka veel char tüüpi massiivid. Erinevus tuleneb see sellest, et D keeles on olemas dünaamilised massiivid ja sellest tulenevalt kaovad kõik vana lahenduse probleemid ära.

Esiteks tähendab see seda, et stringi lõppu pole enam nulli vaja. Mis juba iseenesest lahendab hulga probleeme. Ja kuna dünaamilised massiive saab võrrelda, ühendada, lõikuda tähedab see seda, et kõike seda saab teha ka stringidega.

Dünaamilised masiivid ise on siis massiivid millel puudub ettemääratud suurus ja mille suurus saab kasvada dünaamiliselt – täpselt nagu suvalises skriptikeeles. Mis tähendab ka seda, et nüüd saab massiivi suuruse vajadusel teada. Lisaks on tüüpilised sort, reverse, slice ning dup meetodid. Ja boonuseks on see, et väljaspoolt massiivi piire väärtuse küsimine viskab ArrayBoundsErrori mitte suitsu arvutikastist.

Muidugi ei saa ükski normaalne keel hakkama ilma hashmappideta – neid nimetatakse küll assotsiatiivseteks massiivideks aga sisult on nad ikkagi hashmapid. Ja mis kõige toredam, räsi arvutamiseks ei pea mingit funktsiooni ette andma, asi käib tänapäevaselt(OO), ehk siis klassidel on toHash, opCmp, opEquals meetodid mida saab vajadusel üledefineerida ning mida hashmap kasutab. No ja muidugi on hashmapil olemas values, keys, length meetodid. Tuletan meelde, et need on nüüd keele, mitte standardlibi omadused.

Palju muudatusi on ka muutujatega. Eriti oluline on minu arust see, et nüüd väärtustatakse kõik muutujad tüübi vaikimisi väärtusega. Kui tahad kaost siis saad muidugi sellest mööda minna – muutuja väärtustamine void’iga teeb täpselt seda. Tegelikult kasutatakse seda siis kui oluline on kiirus – näiteks kui lood suure masiivi ja kohe järgmisel real tahad selle ise väärtustada, pole ju mõtet selle masiivi väärtustamisele vaikimisiväärtustega aega kulutada. Huvitav võimalus on ka võimalus jätta tüüp kirjeldamata – sel juhul peab muutuja looma võtmesõnaga ‘auto’. Töötab see muidugi siis kui kompilaator saab muutuja tüübi järeldada. Näiteks: “auto fact = new CachedProductFactory();” real teeb see asjad natuke lühemaks. Kena ju, eriti tore oleks see Javas kus enterprise klassinimed on kolm lauset pikad.

Structide aligment on nüüd standardis sees. Siinkohal hüppavad saltot embedded arendajad.
Ära kadunud on makrod. Kuid selleks, et erinevaid versioone(ntx DEBUG,PC,EMBEDDED) saaks ka edaspidi teha laiendati keelt – lisandusid version ja debug blokid. Nendes olev kood kompileeritakse siis ainult õige versiooni ja/või debugi puhul. Samal teemal peab vist ära märkima “deprecated” võtmesõna lisandumine.

Kui kõik eelkirjeldatu oli rohkem keele uuendamine tänapäevastele standarditele siis väga palju on D keeles mõeldud sellele kuidas teha bugide kirjutamine võimalikult raskeks.

Uus huvitav omadus on võimalus kirjeldada mida teha kui skoobist väljutakse. Minu arvates teeb see paljud ülesanded lihtsamaks. See on midagi mida Javas teeks finally blokiga aga imho on scope võimsam ja loogilisem.

Mäluhaldamise suurim uuendus on garbage collector – siinkohal võib jälle väikse salto hüpata. Kuigi kuidas täpselt see töötab ja mida see tegelikult tähendab(alles on ka tavalised pointerid ja malloc) ei oska hetkel veel kirjeldada. Igal juhul tundub, et tegu on paindliku ja üldse mitte pealetükkiva süsteemiga. Selge see, et malloc’iga võetud mälu ei oska ta oma peaga vabastada.

Contract programming on samuti üks asi mis nende arust parandab koodi töökindlust. Põhimõtteliselt tähendab see seda, et funktsiooni sisendeid(in), väljundeid(out) ning objektide seisu kontrollitakse alati määratud reeglite vastu. Seda muidugi siis kui koodi arendatakse – production varianti seda ei kompileerita. Sarnaselt unittestidele annavad need lepingud kasu ka koodi lugemisel – kohe on näha mida progeja eeldas.

Mis puutub unit testidesse siis ka nende tugi on keelde sisse ehitatud. Klassi kirjeldusse käib “unittest{}” blokk. Kõik unittestid käivitatakse enne main() meetodi käivitamist. Tore ju, et vigast koodi ei saa käivitada.

Kindlasti ei jõudnud ma kõike huvitavat siin kirjeldada ja soovitan huvilistel vaadata D keele võrdlust teiste keeltega. Osad asjad jätsin ka nimelt kirjeldamata kuna ma pole neis piisavalt pädev – väidetavalt on arusaadavamaks tehtud template‘i tugi, lisaks on muudatusi funktisoonide juures. Niipalju kui mina uurisin ei leidnud mina midagi mis mulle ei meeldiks ning pidevalt oli tunne, et lõpuks ometi tegite korda.
Ahjaa. Täiesti mainimata jätsin ka standardlibi – ka see on kasutatavaks tehtud. Faili lugemini näiteks käib samamoodi nagu Rubys või Pythonis.
“auto data = std.file.read(‘failinimi’)”

Ja mis põhiline, lisaks dokumentatsioonile on neil meestel ka kompilaator olemas, tõmba ja mängi.
http://www.digitalmars.com/d

1 thought on “Keel D”

  1. Kuna paljudele jäi mulje, et ma propageeriks D keelt, siis pean rõhutama, et nii ei olnud ma seda juttu mõelnud. See oli lihtsalt infoks.

    Üldiselt arvan, et millegi praktiliseks kasutamiseks on vaja ka muud kui häid omadusi aga eriti on selleks on vaja kasutajaid. Viimased tekitavad dokumentatsiooni, teeke ning otsivad vigu. Ilma kasutajabaasita ei saa midagi praktilist teha. Hea näide on Java. Piisavalt hea keel ning palju populaarsust, selle tulemusena on iga probleemi lahendamiseks keegi midagi teinud ja kiitma peab ka viimasepeal töörista- ja suurfirmade tugi.

    Mis puutub D keele hetkeseisu siis Digitalmarsi kompilaator peaks olema täitsa pädev. GCC D frontend nimega GDC on jõudnud versiooni
    0.19 ja väidetavalt on mõned asjad on veel tegemata.

    Tüüpilestele varaporditavatele asjadele on liidesed olemas –
    Gtk, wxWindows, OpenGL. Tuttav nimekiri, onju. Samas tundub, et need projektid on kõik poolsurnud. Nagu ikka, onju. Rakendusi mis oleks Ds kirjeldatud on kah vähe.

    Samas selline leht http://www.tiobe.com/tpci.htm näitab, et D populaarus tõuseb sama kiiresti kui Ruby populaarsus. Lisaks on alati variant, et keegi kirjutab D-s mingi killer-api mida kõik kasutada tahavad – umbes nagu Rails tõstis Ruby populaarsust. Kuigi kahtlen, kuna erinevus C++ ja D vahel ei ole ju väga suur. J2EE ja Railsi vahe on aga üüratu. See on muidugi puhtalt minu arvamus.

    Mina ütleks, et hetkel on tegu praktiliselt võttes mõttetu asjaga. OSS asju võid ju teha aga kui pead oma valiku eest vastutama siis veel mitte. Tulevik võib muidugi olukorda muuta. Aga see polegi oluline, vähemalt õppisite kõik ühe mõttetu asja juurde :D

Leave a Reply

Your email address will not be published. Required fields are marked *