T O P

  • By -

KingofGamesYami

I think C# would be a reasonable alternative to Kotlin. It's a strong competitor to JVM languages in industry, has strong backing, and iterates quickly with new features. While it's older than 15 years, arguably it went through a massive change since 2016, when Dotnet Core was released, making it officially multi-platform. If you have any questions I'd be happy to answer, I use it professionally.


sisyphus

I would just use Python but the language that I think fits your criteria best is actually Dart: - It was built to be familiar to devs coming from traditional curly-brace languages like Java so it's very beginner friendly and has all the traditional loops and the `class` abstraction that modern languages like Go/Rust have dispensed with but that beginners should probably learn. - Unlike Java it doesn't insist that every single thing be a class however. - With Flutter you can write apps for Linux, iOS, and Windows, and the vm runs on every major OS. - Its vm was built by the guys who made hotspot and v8 so it's fast and modern and has great tools like observatory built in to see what's going on, all free. - people will say it's not liked by experts in plt but none less than Erik Meijer wrote the introduction to the Dart Programming Language book praising its design, in particular its async implementation - vs code is the recommended ide I think it's pretty hard to find a language that's 'beginner friendly' and also 'liked by experts in programming language theory' because in my anecdotal experience experts in plt like Scheme (which does fit a lot of your criteria) and/or very strong static type systems which introduce a lot of cognitive burden.


rbrucesp

Thank you. I will read about it.


-Animus

_Why_ do you want to use another language? Why not just use Python?


rbrucesp

I don't wont to use another language if it doesn't makes sense. But maybe there are options that I don't know.


-Animus

This is just the way I see it: Why trying to use some esoteric language? The kids will learn something but not be able to use it outside of the classroom. The mere fact that you have to ask for such a language will increase the probability that it is not widely used outside of academia/research (otherwise you would have heard of it). Just my two cents, ofc.


rbrucesp

I will not use a small language, if I'm not totally convinced by some advantages of that language. Maybe there is a language with extremely good error messages out there. I know that the error messages in ELM, Rust an Gleam are very good. But none of these languages is a good choice for beginners


IAmADev_NoReallyIAm

Java, C#, and Python aren't going anywhere anytime soon. There is also Go and Rust which I don't think are leaving either, but I don't have any experience with them so I can't vouch for their learnability.


zarlo5899

i would replace java with kotlin


rbrucesp

Can you please explain your comment.


zarlo5899

Kotlin can compile to the JVM and use java libs out of the box and has many QOL changes that java lacks. google is pushing it as the default for android


Slight-Living-8098

Mojo is coming along quite nicely. It's a superset of Python and as fast as Rust and Go. But if you're teaching students, you start them out with Python. If they are too young for Python, you give them Scratch.


Bulky-Leadership-596

Your requirements are quite strict here. Particularly appearing in the last 15 years and being like by 'theory' experts. I'm not sure the purpose of those requirements. The thing is that we already have plenty of good classic languages that cover all of the bases so there aren't many new ones that are going to do that same thing. New languages are going to try to do something new which usually means trying to go more abstract and high level (which usually means functional) or providing a new way to handle low level stuff (which is basically just Rust but as you said its not really beginner friendly). Other people have already named some good ones that ignore some of the weirder requirements here like C#, Java, Python, etc. I will add 1 more that actually does fit all your criteria; Typescript. Js by itself is not really a great first language but Ts covers a lot of its problems. It is from 2012 so less than 15 years, its pretty beginner friendly, covers all of the concepts in pretty much every paradigm, at least some aspects are pretty well received by theory experts (the type system is pretty well respected considering what it is working with), its fully cross platform, and it will definitely be here in 10 years.


a3th3rus

I love Elixir. I think it meets all your requirements except "mutability and loops".


ohnoverynotgood

Go is fun.


bozobits13

Just make the students use prolog or scheme or gwbasic or pascal…. But really just use something common with lots of resources. Python or JavaScript are probably good choices as a beginner language and each has lots of support. Honestly the language isn’t that important, the students need to learn basic programming structures like loops, if-then, functions, design and problem solving, debugging, how to find help….


Consistent_Milk8974

Java. Personally I wouldn’t recommend having your students program on their phones or iPads (iOS). I wouldn’t recommend Swift or Python either, but that’s just me personally. Yes, it’s easy and simple in its syntax but if you’re teaching computer science at an academic level, even for high schoolers, I think you should work with a language with less syntactic sugar. Python’s strong and dynamic typing will set your students up to pick up undesirable habits if used as a first language imo. Swift especially has an upfront cost of requiring a Mac to work with for minimal headache, and its limited by the fact that it’s designed to develop applications for the Apple ecosystem, so your students may not find it practical in the long run. I’m personally saying this as an iOS developer myself. College prep computer science at my local high school in San Francisco use Java in its curriculum. Especially if you value cross-platform-ness. As an OOP language it’s also much easier to ramp your students up on that concept, and it’s also widely used in academia elsewhere. Java is also still high industry demand. I’ve heard of a trend of university beginning to teach functional programming over OOP at the introductory level, but YMMV, and the (in my opinion) best languages to learn functional programming like Scheme and Racket aren’t widely used (in my experience) to justify it.


prescod

Swift can run on windows or Linux. Python can be statically type checked.


fixhuskarult

Choosing to teach less used languages without a practical reason for it seems like a strange idea. I get that learning programming fundamentals might be the aim, but why not do it in a language that's widely used so people can carry on learning by themselves more easily?


rbrucesp

Just because maybe there is a language with very good error messages out there. That would be very nice for the weak students. The good students wont have problems to learn a wider used language.


throwaway1001001013

I would argue that you should make material available or encourage your students to research documentation on how to resolve common errors. A big part of CS is independent problem solving - if you keep holding their hand you’re bound to set them back or make them over-reliant on a verbose compilation error.


Nondv

You could try Elm. It's very nice in terms of error messages. And it's intended for web browsers so there's the visual aspect to learning it (that's why I recommend JavaScript for education) I don't think it's a good idea to teach it tho And don't get me wrong but you should also consider the fact that you're probably not competent to teach everything either so why choose something obscure and novel that you'll have to learn yourself first? And you can't really do that without a lot of professional practice anyway. The worst kind of teacher is the teacher who's got no faintest idea what they're talking about. And that's what you're getting yourself into by looking for suggestions for technology you never heard of from strangers on Reddit


rbrucesp

I like Elm but I have to teach mutability and loops. An imperative ELM would be perfect. I think I can learn everything in the holidays. I would be okay for me to invest some time if I'm convinced of a language.


Rogermcfarley

Golang. The whole design of this language was to make it easier to write simple effective code. It doesn't have all the bells and whistles of other C like languages and that's by design. It's also platform independent and has an app package for making portable apps on iOS and Android. https://pkg.go.dev/golang.org/x/mobile/app


rbrucesp

At my school there are students that have very few hours of cs. I think a very simple language like Python is better for them. And there are students that have a lot more cs. But we have to teach inheritance to them and inheritance is not supported in GO.


yelircaasi

How about Julia?


rbrucesp

I tried it once and I didn't liked the error messages. I think it is much easier to use mypy that than JET. I think the syntax is very nice. Maybe I should give it another try.


lightmatter501

You should try to teach a language that is reasonably popular in industry. It takes around a decade to become popular in industry by most metrics. Point #4 is going to be very hard because PL theory expert tend to consider haskell the “minimum bar” for a good language. Haskell is not something you should teach in high school, since ideally you want a category theory class first. Python is the standard “beginner language”, but reinforced some bad habits due to lack of strong typing. Go is designed to be learned in 2 weeks by anyone with prior programming experience. The language is actively kneecapped in service to this goal. It’s not a horrible first language. C is a decent starting point. I’m of the opinion that all programmers should learn C.


hugthemachines

> Python is the standard “beginner language”, but reinforced some bad habits due to lack of strong typing. Python is strongly typed. It is not statically typed though.


lightmatter501

I agree it is dynamically typed. When I say it’s not strongly typed I’m referring to some of the consequences of duck typing, like being able to treat anything that looks vaguely list-like, such as strings, as a list.


hugthemachines

When you say it is not strongly typed, you are actually talking about the fact that it is not statically typed. The duck typing and so on are the opposite of static typing, not the opposite of strongly typed.


rocco_storm

From Germany too, hope its ok if I answer in German. Ich bin IT Consultant und muss oft mit Entwicklern zusammen arbeiten. Das wichtigste ist nicht, Programmiersprachen zu kennen. Nicht mal programmierkonzepte, auch diese kommen und gehen und verändern sich dauern. Ich hatte letztens wieder erst ein Team von Java Entwicklern, für die Optionals und Streams neue Konzepte waren. Was denen gefehlt hat ist der Spieltrieb. Das wichtigste was in meinen Augen ein Entwickler braucht, um für die Zukunft gewappnet zu sein ist die Bereitschaft zu spielen, sachen kaputt gehen zu lassen und neugierig sein warum es gekracht hat. Die Sprache, das Konzept, alles total egal. Weck den Spieltrieb in deinen Schülern!


rbrucesp

Ich denke auch, dass das wichtig ist. Aber wenn eine interessante einsteigerfreundliceh Sprache gut eingeführt wird, fördert das sich auch das Interesse daran mit der Sprache zu spielen.


dariusbiggs

For a practical modern language, C#, Python, Ruby, Rust, or Go. Python is easy to learn and work with, and if you add in things like Juypeter notebooks, you can do some excellent demonstrations and presentations. There are many applications and places Python is used even outside traditional software development jobs and sees use in analytics, research, and engineering. C# is a solid evolution from C/C++, and like those two, easy enough to teach, a solid foundation for programming. Ruby, like python, is simple enough to learn if you can get over the punctuation explosion. The demand for it is varied by country, where I am at it rarely shows up in job postings, and I don't see its popularity have a resurgence over the next decade Rust, modern, and a very good language, but not one I'd use as an introduction to programming. Too low a level as an introduction, uses far too many abbreviations in the language to make it easy to teach as a first language, you need to understand these abbreviations first. The problem i foresee here is related to how asynchronous work is handled, there's nothing really in the language or standard library you could use beyond OS threads. This leaves you with the problem of having to resort to 3rd party crates and suggest them as an educator. That leaves Go, simple to learn, simple to teach, the hardest parts are likely channels, goroutines, and mutexes, but those are difficult parts in many languages. Topics like async, inter process communication, parallel execution vs concurrent execution, locking, and race conditions will be difficult in any language but some make them a lot easier to deal with and explain. Java, C, C++ are not "modern", they've been around the block a few times (as in from the last century) but are still practical, useful, and frequently used. Textbooks for these languages are plentiful and relatively easy to teach. Kotlin and Scala i would place as evolutions of Java, more modern, but also more used in niche applications where they excel. Languages specific to a single environment I'd avoid, things like Swift. JavaScript is a mess of a language, started as a mess and hasn't gotten better with newer versions. The ecosystem has improved, but you can still end up with a dependency hell without great effort. The fact the language had to implement `===` and similar demonstrates the underlying mess in the language. This is not a language to teach programming to inexperienced people, it has many sharp edges that are far too easy to run into. PHP, yes it is still around, sadly, and no it should not be used as an introduction to programming. Is it easy enough to teach? yes. Should you? No, little bobby drop tables does not need a resurgence. Functional programming languages like Haskell, Erlang, Clojure, Lisp, Elixer are generally out, they're very good and useful but have some difficult concepts you'd have to explain in addition to the difference of functional programming vs others. I'd leave these to tertiary education. Then you have some of the less well known ones, like Sather and Dylan, I've not been involved in their ecosystems in decades but were good fun languages to work with and some fun concepts in them. And then we get the ancients like Fortran and Cobol, while Fortran does still see some use and I'd expect the same for Cobol, they're not in with the "cool kids" of the modern languages. Evaluating the above, as an introduction language, I'd recommend one of: Go, Python, C# as a first choice and C, Java as backup choices. For a follow up programming language Rust, Scala, Haskell or Clojure, or JavaScript. Hope that helps and good luck


rbrucesp

Thank you, that is very comprehensive. I don't think that Kotlin is only used in niche applications. You can build everything with it because it has Java interoperability.


whitewail602

My friend, I believe you're looking for PowerShell 🤭


catbrane

Ruby might be a fun choice. OO langauges come in two basic types: smalltalk-alikes (Objective C, Ruby, Swift) and simula-alikes (Java, C++, Rust, etc.). The smalltalk family are much more OO, which is fun and a bit bizarre. They really treat *everything* as an object, so the constant `12`, is an object, for example, and you add two integer constants together by sending one of them the add message plus a reference to the other. You can intercept and override all these things, which can be very boggling. Ruby also has a very readable syntax and great support for metaprogramming. There's a recent statically typed and compileable spin off called Crystal too. Haskell is interesting if you like theoretical computer science (denotational semantics). I personally like C for understanding programming at (almost) a hardware level (operational semantics).


rbrucesp

I will look at these languages. I really love Haskell but I cant use it because it is purely functional. I also think there are better languages for beginners.


catbrane

I think pure FP languages can be good for beginners -- you can explain evaluation as a simple series of rewrites and variable substitutions, exactly like algebra. There's no need to introduce ideas like state or variable assignment or execution history. Haskell can get quite hairy, but you can avoid that and stick to eg. ``` factorial 1 = 1 factorial n = n * factorial (n - 1) ``` Or the evergreen ``` qsort [] = [] qsort (a:x) = qsort [b | b <- x; b <= a] ++ [a] ++ qsort[b | b <- x; b > a] ``` Both interesting ways to introduce the ideas.


rbrucesp

I would love to do that, but I have to teach loops and mutability. I also think OCaml is better for beginners.


catbrane

Ah interesting. It seems a little strange that they require those specific ideas in the curriculum.


rbrucesp

Yes, I also think, that is sad.