In English

Java

När jag på sistone har börjat lära mig mer om C++ och Rust har jag insett hur väldesignat Java är som språk. Folket vid Sun måste varit rätt kompetenta för att sätta så mycket rätt från början.

Jag känner att det finns behov av att underbygga denna potentiellt kontroversiella åsikt. Till att börja med pratar jag om själva språket, syntaxen, och väger alltså inte in körtidsmiljöer, portabilitet, prestanda eller något sådant. Självklart påverkar det avsedda målet för programmen designen av språket, men jag vill börja med att jämföra språken enbart grundat på syntax.

För att jag ska gilla ett språk krävs generellt tre saker, nämligen att språket är

  1. Användbart
  2. Statiskt typat
  3. Enkelt

De flesta språk med en substantiell användarbas uppfyller punkt 1. Därför är de två sista punkterna kanske mest relevanta att diskutera. Statiskt typade språk ger helt enkelt en inre tillfredsställelse. Jag har lekt runt lite med det Haskellbaserade Agda, och det finns sannerligen få saker så förlösande som när Agdakoden äntligen lyckas kompilera. För att ett imperativt eller objektsorienterat programmeringsspråk ska vara både användbart statiskt typat krävs ofta ett brett typsystem. Jämfört med C++ skiner Java här med typade generiska klasser (templates är inte typade i C++, man kommer dock närmare med concepts). Java tillåter generiska metoder i interfaces och att returtypen för abstrakta metoder specialiseras i ärvande klasser medans C++ tillåter endast sådan specialisering för råa pekare eller referenser. Jag förstår så klart från ett implementationsperspektiv anledningen till att C++ är designat på det sistnämnda sättet, men det är ändå olyckligt ur ett syntaxperspektiv. Relaterade problem med Rust är att det i skrivande stund inte går att upcasta från &Derived till &Base, eller definiera typen Box<dyn A + B>.

Vidare ska språk ska ha enkla syntaxregler, få funktionaliteter och begränsad mängd syntaktiskt socker. Det ska helt enkelt finnas så få sätt som möjligt att skriva samma sak på. Detta är anledningen till att jag försvarar public static void main, syntaktiskt socker som JEP 445 döljer bara komplexiteten och gör det svårare för folk att förstå vad språket egentligen gör. Bortsett från Oracles girighet är enkelheten och fullständigheten anledningen till att min föredragna Javaversion fortfarande är Java 8, men jag stödjer faktiskt också var som introducerades i Java 10. I min åsikt är C++ definitivt det sämsta programmeringsspråket av dem alla med anledning av sin otroligt stora och överdrivna komplexitet och på grund av det faktum att folk faktiskt använder det (C är ett avsevärt mer väldesignat språk än C++ i min mening). Jag vill också passa på att slå ett slag för namnkonventioner sanktionerade av språkets skapare.

Java gör så klart även många felsteg. Att språket är helt objektsorienterat är ett, men potentiellt ser jag det som rättfärdigat i minimalismens namn. Att det inte går att instansiera objekt av generiska typer på grund av type erasure är också olyckligt. Men i stort slås jag av hur väldesignat Java är för att vara snart 30 år gammalt och hur bra det fortfarande står sig jämfört med modernare språk.