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
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.