Skrivet av mpat:
Det sägs ofta i debatten att vi i Sverige har en större andel stora företag jämfört med många andra länder. Kan det vara så att när dessa företag skriver egna program så blir det .Net istället för webapplikationer? Det är åtminstone min personliga erfarenhet från arbetsgivare, att det är mer egenutvecklade ”riktiga” program hos svenska arbetsgivare, och att om det skrivs något nytt så är det .Net. Stort amerikanske företag så var det webbapplikationer för hela slanten.
Sen en anekdot: jag är för all del inte alls programmerare och har bara gått lite strökurser i programmering under skoltiden, men jag vill minnas att de flesta av de lärarna snackade enormt med skit om C++. Som jag minns det var Java det enda moderna språket de ville befatta sig med, och lärde ut C/C++ för att det i det läget (sent 90-tal) var så vanligt och folk valde det. Har t.o.m gått en komplett meningslös FORTRAN-kurs som var obligatorisk i det läget och jag absolut aldrig använt.
Delar din erfarenhet kring C++ från 90-talets KTH. Där verkade man föredra språk som ingen vettig organisation skulle välja att använda, som Scheme (fast personligen gillar jag Lisp, Clojure är helcoolt!!!), Modula 2, ANSI Pascal (vem f-n har någonsin använt något annat än Turbo Pascal?), Smalltalk etc.
C#/.Net är nog primärt populärt som "back-end" språk. Sökt en del på vilka desktop-applikationer som är skrivna primärt i .Net. Det jag hittar är ett par övergivna Linux-applikationer som använder GTK#, sedan finns Paint.NET...
Visual Studio är det närmaste en större applikation som kan anses vara skriven i .NET, men den är en kombination av C++ ("back-end") och .NET ("front-end"). Finns sedan ett gäng multi-OS applikationer som använder WPF som "front-end" på Windows, medan huvuddelen är skriven i C eller C++. Ett exempel Handbreak, sedan har MacOS har någon ObjC front-end, Linux kör GTK+ vilket är rätt typiskt.
Enda egentliga konkurrenten till C och C++ som "desktop applikationsspråk" är JS/TS tack vare att allt fler applikationer använder Electron.
Skrivet av zaibuf:
Vill bara flika in att mycket som görs idag inom enterprise är webb och där används också .NET för backend. Tror generellt att Microsoft är omtyckt i Sverige och stora företag har partnerskap med Microsoft och då faller det naturligt att använda .NET.
Nu är ju också .NET (Core/5/6) riktigt trevligt att jobba med då det blivit open-source och inte längre är låst till Windows.
Tror du slår huvudet på spiken med att Microsoft Sverige gör ett väldigt bra arbete. Efter lite mer efterforskningar verkar ändå Sverige inte sticka ut så mycket, är nog mer på forum som SweC som de som jobbar med programmering i större utsträckning använder .NET/C#. Det är nog en effekt av att SweC drar till sig många som primärt använder datorn för spel, Windows är total-dominant för just spel.
Kollar man jobbannonser ser det rätt lika ut här som i resten av världen. Python och Java efterfrågas i ungefär dubbelt så många annonser som C# och C++. Det är en viss bias mot C# här, i de flesta undersökningar ligger C# och C++ rätt lika sett över världen men min lilla "undersökning" (kollar annonser på LinkedIn och liknande) så är C# ~20-25 % mer efterfrågat än C++. Men är inte mer övervikt än så och Java är mer än dubbelt så efterfrågat!
JS får två resultat. Kollar man enbart JS får man nästan lika mycket träffar som för Java, men då är det rätt många som kör Java eller C# i "back-end" och har JS i "front-end". Söker man i stället på NodeJS, d.v.s. JS/TS i backend, hamnar man i nivå ungefär med C++.
Så Sverige verkar som sagt vara rätt likt resten av världen!
Personligen har jag lite svårt att se folks entusiasm för just C#. Visst såg jag poängen strax efter millennieskiftet, dels är VS en riktigt bra IDE, då var C# trevligare än både Java och framförallt än C++. Idag har jag svårt att se fördelen med C# över "modern C++" och även om jag föredrar Kotlin över Java så har Java från version 8 blivit rätt trevligt.
Största problemet jag har med .NET är att det ofta finns allt för många sätt att rent logiskt göra samma sak, ofta fungerar majoriteten av dessa rätt kasst i praktiken vilket gör det rätt tidsödande att reda ut vilket "rätt" sätt är. Java må vara långsammare på att ta in saker, men där tenderar man få till själva implementationen bättre.
Både Java och C# fick ju kritik redan när de var nya att de egentligen inte tillförde något nytt av värde, de var egentligen bara något bättre versioner av dåtida C++. De språk som ligger i toppen på listan i början av denna tråd har alla faktiskt tillfört något till datorvärlden.
De programspråk folk planerar migrera till tillför alla något relevant
Go: visst var Erlang före med exekveringsmodellen, men Go har en syntax som en större publik inte upplever som allt för "galen". Go är också betydligt närmare C++ i "råprestanda", Erlang är rätt långsamt på ren "compute". Likt Erlang är Go:s modell guld värd för program som är primärt I/O-bundna.
Kotlin: Java har i.o.f.s. rykt upp sig en del från Java 8 framåt rent syntaxmässigt. För egen del känns ändå Kotlin som "Java done right". Det Java världens verkligen fått rätt är JVM, prestanda är direkt lysande, framförallt multicore! Med Kotlin kan man få tillgång till JVM-miljön med ett fantastiskt designat modernt språk!
TypeScript: JS lämnar kanske på syntax-delen. Men går inte att blunda för att JS är webbens "assembler", så det är och lär förbli en av de absolut viktigaste språken. Tack vare Electron växer ju också populariteten för TS/JS som applikationsspråk. TS är specifikt designat för att IDE:er ska kunna göra ett lysande jobb.
Python: även om det lämnar en hel del att önska rent prestandamässigt är det få språk/miljöer som gör en så produktiv som Python. Vidare är Python en dröm för maskininlärning (PyTorch och TensorFlow), datoreseende (OpenCV) och matrisberäkningar (NumPy). I dessa områden får man både produktiviteten från Python och prestandan från C++, detta då beräkningarna utförs i SIMD-optimerade C++ bibliotek medan man egentligen bara beskriver vad som ska beräknas i Python.
Rust: stora grejen här att man redan vid kompilering kan hitta minnesproblem samt, än mer värdefullt, data-race! Det samtidigt som program skrivna i Rust är lika effektiva som C och C++ program!
Roade mig att parallellisera det "korkade" sättet att beräkna Fibonacci. Testade det dels på x86_64 (Skylake 6650U) och ARM64 (RPi4 körandes 64-bitars versionen av Ubuntu).
sfib() är i alla fallen den seriella implementationen, d.v.s. i C++
uint32_t sfib(uint32_t n)
{
if (n < 2) {
return n;
}
return sfib(n - 1) + sfib(n - 2);
}
Den anrops om n < 30 (testade olika värden, ~30 var mest effektivt i alla språk)
Rust
fn pfib(n: u32, thresh: u32) -> u32 {
if thresh > n {
return sfib(n);
}
return vec![n-1, n-2].par_iter().map(|&n| pfib(n, thresh)).sum()
}
C#/PLIQ
static int Pfib(int n)
{
if (n < thresh)
{
return Sfib(n);
}
return new int[] { n-1, n-2 }.AsParallel().Sum(n => Pfib(n));
}
C#/TPL
static int Pfib2(int n)
{
if (n < thresh)
{
return Sfib(n);
}
Task<int> n1 = Task<int>.Factory.StartNew(() => Pfib2(n - 1));
int n2 = Pfib2(n - 2);
return n1.Result + n2;
}
Go
func pfib(n uint32, thresh uint32) uint32 {
if n < thresh {
return sfib(n)
}
n1 := make(chan uint32)
go func() {
n1 <- pfib(n-1, thresh)
}()
n2 := pfib(n-2, thresh)
return <-n1 + n2
}
Java8
static int pfib(int n) {
if (n < thresh) {
return sfib(n);
}
return Arrays.asList(n-1, n-2).parallelStream().mapToInt(v -> pfib(v)).sum();
}
C++/OpenMP
uint32_t pfib(uint32_t n)
{
if (n < thresh) {
return sfib(n);
}
uint32_t n1;
#pragma omp task shared(n1)
n1 = pfib(n - 1);
uint32_t n2 = pfib(n - 2);
#pragma omp taskwait
return n1 + n2;
}
Satt thresh som en statisk variabel i Java och C# och global variabel i C++ (i praktiken en konstant som bara sätts vid uppstart).
C#/PLINQ är väldigt lik Rust och Java versionen, men den varianten är totalt värdelös då den var >10 gånger långsammare än att köra på en enda kärna.
C#/TPL gav en hyfsat skalning över CPU-kärnor, men det var ändå den långsammaste versionen (körde senaste versionen av .NET Core 5). Inte så långt efter på x86_64, men rätt bedrövlig prestanda på ARM64.
Java8 imponerande stort, nästan lika snabbt som C++/OpenMP på x86_64 och faktiskt marginellt snabbare på RPi4!
Go låg i nivå med Java8 och C++. Mest imponerade Rust/rayon, den lösningen är inte bara en av de mest eleganta utan den presterade också klart bäste både på x86_64 och ARM64.
Vet inte om jag gör "fel" saker, men just dålig skalning över CPU-kärnor är något jag återkommande upplever är ett problem i .NET samtidigt som det fungerar bra på JVM:s. Kanske finns det en orsak varför Java behåller sin popularitet trots att "ingen" verkar gilla Java som språk?
Jaja, kanske lite för mycket fritid så här på semestern...