mboost-dp1

Næste store JVM sprog er C#


Gå til bund
Gravatar #1 - Windcape
27. sep. 2010 19:38
Stephen Colebourne har skrevet en artikel omkring hvilket sprog han mener det er "The Next Big JVM Language".

http://www.jroller.com/scolebourne/entry/the_next_...

Mere specifikt foreslår han disse her ting som features


In terms of features, I covered a long list of features and issues that a new language should address.

- C-like syntax (familiar and good-enough)
- Static typing (dynamic is too loose and ineffective for this type of language)
- OOP with functional elements (pure functional too hard for mainstream)
- Easy access reflection (to escape the static typing restrictions)
- Properties (because getters and setters are crazy)
- Closures (capturing looping design patterns)
- Null-handling (preferably a means to declare whether each variable can or cannot hold null)
- Concurrency story (something better than raw threads and shared mutable state)
- Modules (need to be thinking in terms of larger units)
- Tools (need a language to be designed to help tool writers)
- Extensibility (allowing some additions without going back to the language designer)


Sjovt som det passer 99% med C# :-)
Gravatar #2 - arne_v
27. sep. 2010 19:54
#1

C# er vist ret langt fra 99% af den liste.

Java er endnu længere væk, men forskellene på Java og C# er et eller andet sted i Java 7 og 8 planerne, så hvis C# var nok så var der slet ikke nogen grund til at skifte - man kunne nøjes med at speede Java SE udviklingen op.
Gravatar #3 - arne_v
27. sep. 2010 20:05
#1

Jeg er iøvrigt ikke så imponeret af hans kommentarer.


1) Checked exceptions. Spring rejects them. Hibernate rejects them. Java EE rejects them. They are a failed experiment (good in theory, bad in practice). Now, many reading this blog still hold checked exceptions dear to your hearts. But I'm afraid its finally time to say "wake up and smell the coffee". Checked exceptions have been rejected by all the key industry API writers and leaders at this point. If you're still using or advocating checked exceptions, then I'm afraid your skill set is 5 to 10 years out of date. Period. (I know that may sound harsh, but to those in that camp, you seriously need to open your mind to what modern API design is about.)


Mit eksemplar af EJB 3.1 spec er stadig fuld af checked exceptions, så Java EE afviser ikke checked exceptions.
Gravatar #4 - røvskæg
27. sep. 2010 20:08
Kunne se fra overskriften Næste store JVM sprog er C# at det kom fra Windcape.
Gravatar #5 - røvskæg
27. sep. 2010 20:23
Burde et af kravene ikke også være, at det er platformuafhængigt.
Gravatar #6 - arntc
27. sep. 2010 20:30
#OP Får du penge for al den markedsføring?
Gravatar #7 - Windcape
27. sep. 2010 21:54
arne_v (2) skrev:
C# er vist ret langt fra 99% af den liste.
Well, det er jo heller ikke rene sprog features han kommer med, men også forslag til et base-class-library.

C# + .NET dækker stort set samtlige punkter.

Det er stadigvæk ironisk hvor mange af de punkter han nævner der dækkes ind af C#. De features som C# nu har haft i et pænt stykke tid (læs: årevis), har Java stadigvæk ikke fået sig nosset sammen til at få, og det ser jo ud til at Java 7 vil gemme halvdelen til Java 8, fordi de ellers aldrig bliver færdige.

C# har fået cirka 2-3 nye versioner på den tid Java har fået én.
Gravatar #8 - Windcape
27. sep. 2010 21:56
arne_v (3) skrev:
Jeg er iøvrigt ikke så imponeret af hans kommentarer.
Jeg er generelt ikke imponeret af at han lader til at have en meget begrænset viden omkring sprog uden for Java verdenen.
Gravatar #9 - Windcape
27. sep. 2010 21:57
røvskæg (5) skrev:
Burde et af kravene ikke også være, at det er platformuafhængigt.
C# er platformuafhængigt, og ISO/ECMA standardiseret (Java er ikke).

*host* Og der er færre patentproblemer end Java *host*

Vi snakker om sprog, og tilhørende base libraries, ikke platformsspecifikke libraries.
Gravatar #10 - Windcape
27. sep. 2010 22:08
#2 Som jeg ser det:

C-like syntax
- Check

Static typing
- Check

OOP with functional elements
- Check (Linq, Extension Methods, Lambda)

Easy access reflection
- Missing (But C# got dynamics instead)

Properties
- Check

Closures
- Check (Delegates, lambda)

Null-handling
- Check (Nullable<T>)

Concurrency story
- Check (ConcurrentBag<T>)

Modules
- Missing

Tools
- Check (CLR, DLR)

Extensibility
- Check (Extension Methods, Annotations)
Gravatar #11 - arne_v
27. sep. 2010 22:34
Windcape (10) skrev:

Null-handling
- Check (Nullable<T>)


Nullable er ikke det han efterlyser.

Det er nærmest det modsatte.

Han vil have:

@NotNull
Foo bar = new Foo();
...
baz(bar);
...
void baz(@NotNull Foo bar) {
...
}

Konstruktionen efterlyses en gang imellem for at undgå NPE's.

Windcape (10) skrev:

Concurrency story
- Check (ConcurrentBag<T>)


Der skal noget mere end collections specialiseret for concurrency til at give en god concurrency story.

Iøvrigt fik Java sådanne i 2004.

Windcape (10) skrev:

Extensibility
- Check (Extension Methods, Annotations)


Extensions methods udvider library ikke sproget.

Annotations (som det hedder i Java) er et meget primitivt værktøj til at udvide sproget med.
Gravatar #12 - Windcape
27. sep. 2010 22:48
Ups ja, det er "Attributes" i C#.

Men mht. NPE's så kan man jo benytte sig af CodeContracts i .NET 4.0. Sprogudvidelser i stil med C++ synes jeg måske det er bedre at være foruden.

De vigtigste punkter mener jeg stadigvæk er det at et sprog er hybrid mellem imperativt og funktionelt, og at der er mulighed for closures.

Det er to ting jeg har meget svært ved at leve uden i dag. Og Java er en af de eneste mainstream sprog tilbage der ikke har understøttelse for closures!
Gravatar #13 - arne_v
27. sep. 2010 23:03
Windcape (12) skrev:
Og Java er en af de eneste mainstream sprog tilbage der ikke har understøttelse for closures!


Afhænger vist lidt af hvad du betragter som mainstream og hvad du betragter som clojures.

Men indtil #() syntaxen (eller hvad det nu ender med) kommer til Java, så må du jo nøjes med de anonyme klasser.
Gravatar #14 - Windcape
27. sep. 2010 23:06
#13

.NET sprog, javascript, php, ruby, python, c++ har alle closures.
Java har ikke.

Jeg definere closures som delegates i C#.
Gravatar #15 - Windcape
28. sep. 2010 05:05
Måske skulle jeg lige tilføje:

Jeg mener ikke at anonyme klasser er en "rigtig" implementation af closures.

Dog synes jeg det er fint at Java vælger at gå direkte til lambda med #() {} (tilsvarende () => {} i C#), frem for at definere et specifikt closure construct (delegate i C#, function i JavaScript, osv.)
Gravatar #16 - onetreehell
28. sep. 2010 05:20
i hvor høj grad er der rigtige closures i c#?
Gravatar #18 - arne_v
28. sep. 2010 14:23
Windcape (14) skrev:
#13

.NET sprog, javascript, php, ruby, python, c++ har alle closures.
Java har ikke..


Jeg tror at der er en del C programmører som vil undre sig over at Ruby og Python er mainstream men C ikke er.

Der er måske sågar nogle Cobol programmører som vil undre sig, men der vil jeg så undre mig over at de undrer sig. :-)
Gravatar #19 - arne_v
28. sep. 2010 14:32
Windcape (15) skrev:
Jeg mener ikke at anonyme klasser er en "rigtig" implementation af closures.


Det er det heller ikke. Det er et objekt og ikke en funktion.

Men den praktiske forskel er kun at man skal taste en ekstra linie ind foroven og en afslutnings parentes mere.
Gravatar #20 - Windcape
28. sep. 2010 19:00
#18

Jeg kan vel ikke nævne samtlige mainstream sprog. Nu nævnte jeg nogle stykker.

At et sprog som COBOL mangler closures er et mindre problem, end et sprog som Java gør det.

arne_v (19) skrev:
Men den praktiske forskel er kun at man skal taste en ekstra linie ind foroven og en afslutnings parentes mere.
Og bruge final over det hele!

(+ @Override annotation)
Gravatar #21 - arne_v
28. sep. 2010 19:07
Windcape (20) skrev:
Og bruge final over det hele!


Nogen vil betragte det som en fordel at man skal markere det der skal bruges som final.

Der er ihvertfald mange C# udviklere som har været lidt forvirret over hvad der skete i deres closures.

Windcape (20) skrev:
(+ @Override annotation)


Kun hvis det er en klasse.

Det er valid for interfaces også (fra 1.6), men efter min mening bad practice i den sammenhæng.
Gravatar #22 - onetreehell
28. sep. 2010 21:53
#17
Det var da godt nok en ringe artikel, den første. øv!
Gravatar #23 - arne_v
28. sep. 2010 22:43
#22

Hvorfor?

Jeg synes da at den rimeligt logisk forklarer hvordan tingene hænger sammen.
Gravatar #24 - zin
28. sep. 2010 22:54
C# er platformuafhængigt, og ISO/ECMA standardiseret (Java er ikke).

*host* Og der er færre patentproblemer end Java *host*

Vi snakker om sprog, og tilhørende base libraries, ikke platformsspecifikke libraries.

C# .NET dækker stort set samtlige punkter.

Et stort, stort hul, lige dér i din oprindelige udtalelse:
Sjovt som det passer 99% med C# :-)

.NET er ikke platform uafhængigt.
Ergo dækker C# ikke 99% af alle kravene, og er derfor ikke en mulig kandidat, som påpeget af #5.
Gravatar #25 - Windcape
28. sep. 2010 23:35
#24

BCL er platformsuafhængigt! (Og begrebet .NET dækker over BCL for Visual C#)
Gravatar #26 - zin
29. sep. 2010 06:31
#25: Nej, begrebet .NET dækker (antager jeg) over .NET Framework'et. Et framework der p.t. er Windows ONLY.
Gravatar #27 - Windcape
29. sep. 2010 06:50
#26

Visse libraries i .NET er platformspecifikke. Men du skulle sætte dig ind i hvad BCL er.
Gravatar #28 - zin
29. sep. 2010 07:30
#27: Det er meget muligt, men når du siger .NET går jeg udfra, at du mener .NET og ikke et subset af .NET, eller lignende.
Gravatar #29 - onetreehell
29. sep. 2010 07:48
#23
Det er måske en okay artikel hvis man er (meget) inde i C# og er interesseret i hvordan det er i de forskellige versioner. Og man godt kan lide at se hvor grimt det er i java så man kan fryde sig.
Jeg er ikke interesseret i at få at vide gang på gang at man ikke har closures.
Jeg mangler stadig at vide hvad der sker når funktionen(/metoden) closuren er lukket under er færdig med at udfør og måske mere interessant er hvad der sker hvis den bliver kaldt igen.
Jeg er ikke vant til closures i sprog hvor man muterer rundt på alle objekter, så jeg ved ikke rigtigt hvordan det fungerer.

Edit:
Jeg gad godt at vide mere om følgende:
- Concurrency
- Extensibility (allowing some additions without going back to the language designer)
Skal det forstås således at det er nemt at lave parsere i C#?
Gravatar #30 - illishar
29. sep. 2010 07:51
Personligt tror jeg ikke at C# bør/kan bliver det næste store JVM sprog. C# inkorporerer muligvis en del af punkterne, men det er også efterhånden blevet til det datalogiske svar på biksemad. (Um! Det er godt, det putter vi også i) Et sprog defineres også i høj grad af de muligheder det *ikke* giver. Ellers ville C være da shizzle!

Og hans holdning til checked exceptions (og den tilhørende philosofi) er da ret trist.

ZiN (24) skrev:
.NET er ikke platform uafhængigt

Nej, men C# er heller ikke nødvendigvis == .NET
Gravatar #31 - Windcape
29. sep. 2010 08:02
illishar (30) skrev:
men det er også efterhånden blevet til det datalogiske svar på biksemad
Skyldes i høj grad Hejlsbergs pragmatiske tilgang til alting.

Jeg ser det som en fordel.
Gravatar #32 - zin
29. sep. 2010 10:42
#30: Nej, men hvis du læser lidt, kan du se at Windcape retter sin oprindelige udtalelse med at C# dækker 99% af omtalte krav til at C# .NET gør. Som han så åbenbart har rettet igen til at C# .NET (BCL) gør.
Gravatar #33 - arne_v
29. sep. 2010 14:46
illishar (30) skrev:
C# inkorporerer muligvis en del af punkterne, men det er også efterhånden blevet til det datalogiske svar på biksemad. (Um! Det er godt, det putter vi også i)


Windcape (31) skrev:
Skyldes i høj grad Hejlsbergs pragmatiske tilgang til alting.


MS har tydeligvis ingen problemer med feature creep.

Jeg betragter det som en risikabel strategi. De sidste to sprog der forsøgte at kunne alt var Ada95 og PL/I - og de var ikke nogen stor success.
Gravatar #34 - arne_v
29. sep. 2010 15:05
onetreehell (29) skrev:

- Extensibility (allowing some additions without going back to the language designer)
Skal det forstås således at det er nemt at lave parsere i C#?


Det er vist ca. det samme som i Java.

Windcape nævner extension methods under extensibility.

Men jeg kan ikke se at det skulle være specielt relevant for parsere.
Gravatar #35 - arne_v
29. sep. 2010 15:09
#extension methods

De fungerer som:

Du savner en .ToHexString() method på int, så du laver en:


public static class MyExtensions
{
public static string ToHexString(this int o)
{
return o.ToString("X");
}
public static string ToVmsString(this DateTime o)
}


og så kan du bruge:

i.ToHexString()

Det kan være ret bekvemt når man vil tilføje ny funktionalitet til nogle klasser uden at ændre klasserne.

Men det kan godt blive lidt grumset at finde ud af hvor den extension method kommer fra.
Gravatar #36 - Windcape
29. sep. 2010 15:37
arne_v (35) skrev:
Men det kan godt blive lidt grumset at finde ud af hvor den extension method kommer fra.
Mtjah, intellisense gør det meget fint.

Og da Visual Studio tillader man kan gå til definition, endda selvom det er i et assembly uden vedhæftet kildekode, er det ikke noget jeg betragter som et problem.

Der er visse konventioner, som man så kan bruge til at gøre det nemmere.

F.eks. IntExtensions.cs for extensions til int.
Gravatar #37 - arne_v
29. sep. 2010 16:51
Windcape (36) skrev:

Mtjah, intellisense gør det meget fint.


Det er jo som en bil der vælter uden ESP.

Det virker - men er ikke imponerende.
Gravatar #38 - Windcape
29. sep. 2010 17:17
Forklar mig lige hvorfor man har brug for at lede efter en extension metode, uden brug af søge værktøjer?

Det er da ikke værre end hvilken som helst anden metode.
Gravatar #39 - arne_v
29. sep. 2010 17:19
#38

Det hænder at man gerne vil se hvad en metode gør i forbindelse med fejlsøgning.

For andre metoder ved du hvilken klasser (eller ihvertfald hvilke mulige klasser) metoden er defineret i.
Gravatar #40 - Windcape
29. sep. 2010 17:31
#39

Til testing tilgår man jo bare sin extension som static.

ie.


int i = 10;
string hex = MyExtensions.ToHexString(i);
Assert.AreEqual("A", hex);
Gravatar #41 - Corholio
29. sep. 2010 20:12
Windcape (40) skrev:
Til testing tilgår man jo bare sin extension som static.


Test as kode og fejlsøgning er ikke det samme.

Når du skriver en test ved du rent faktisk hvilken kode du tester.

Når du fejlsøger et problem i en applikation, kan du sagtens være i tvivl om hvilken del af koden "den er gal med".
Gravatar #42 - squad2nd
1. okt. 2010 23:27
#26

Men du skulle sætte dig ind i hvad BCL er.


Enhver idiot ved hvad BCL er. Det er jo flydende stege-margarine.


Gravatar #43 - csstener
4. okt. 2010 06:31
squad2nd (42) skrev:
#26

Enhver idiot ved hvad BCL er. Det er jo flydende stege-margarine.


He he den var enlig god.
Gravatar #44 - arne_v
4. okt. 2010 12:35
Gravatar #45 - arne_v
4. okt. 2010 16:28
Windcape (40) skrev:
Til testing tilgår man jo bare sin extension som static.


Forhåbentligt ikke. Så tester man nemlig ikke det som man bruger.

(det var iøvrigt heller ikke lige det jeg mente med fejlsøgning)
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login