4 ms·
Scala: Python + dataclasses [+ mypy] offers a programming experience close to pragmatic Scala. The tradeoff becomes: * worse performance * lack of immutable v
by pacala 7y ago
Scala: Python + dataclasses [+ mypy] offers a programming experience close to pragmatic Scala. The tradeoff becomes:
* worse performance
* lack of immutable vectors, alleviated via style conventions
* rarely, awkward lambdas
vs.
* wide pool of people familiar with the language
* lack of JVM lockin: Scala native is not there yet, the library ecosystem is all JVM.
* [good] batteries included
* much better reflection
* access to modern ML
* gradual typing
* no actors
Rust: Manual memory management is verbose and distracting.
Go: Manual exception handling is verbose and distracting.
Kotlin: JVM lock-in.
Swift: Apple lock-in.
- hermitdev 7y agoNo immutable vectors in Python? Are you not aware of tuples? Lambdas in Python are quite limited, but offset by natural nested local functions. Regarding performance, that's not always an issue, and depending on the use case can be addressed with async/await or using a multiprocessing pool. I have had issues with multiprocessing and some DB libs ib the past, but recently have had pretty good success. Multithreading is still an issue because of the GIL (global interpreter lock) and really only useful if you're calling into a C/C++ lib that releases the lock while it does it's native things. I've written a lot of Python in the last 15 years, and Ive written a ton of scripts that are faster than a well written identical C/C++/C# app, and was written in 1/10th of the time. It just depends on the use case.
- pacala 7y agoSorry, I meant persistent vectors. Data structures with type Vector[T] instead of Tuple[T0, T1, ...], amortized O(1) updates and list-like syntax for literals, e.g. i[x0, x1]. It's a minor annoyance, in most cases using vanilla Python lists with the convention 'any list that is part of a dataclass / is passed across function boundaries should never be mutated' is good enough. As u/joshuamorton noticed in this thread, the convention can be enforced with mypy and Sequence[T], which is great!
- joshuamorton 7y ago> * lack of immutable vectors, alleviated via style conventions Note that mypy/typed python fixes this: if you annotate a function as returning (or accepting) a Sequence/Collection/Iterable instead of a List, and attempt to mutate it, you'll get type errors. This is good practice anyway.
- pacala 7y agoThanks for the tip!
- zapzupnz 7y ago> Swift: Apple lock-in. Swift runs on Linux and has done since it was made open source in 2015, a year after its initial announcement. Windows support is being worked on but, for the time being, it runs fine in WSL. No lock in.
- pacala 7y agoHow's the cross-platform library ecosystem? My distant sentiment is that the bulk of libraries are tied to / provided by Apple, but I'd be happy to be proven wrong.
- zapzupnz 7y agoCross-platform stuff is mainly non-GUI since the main thrust of the cross-platform scene seems to be server-side Swift, and most of the GUI stuff is targeted to iOS (although with Project Catalyst, that's all implicitly valid macOS code now). I expect we may see some third-party, cross-platform reimplementations of SwiftUI very soon once the appropriate language features are set in stone and ship with the next version of Swift. Otherwise, it's fairly healthy — lots of computational libraries, database, web, etc. Plus, Swift pretty much has direct compatibility with C and Python libraries without needing to wrap anything.
- jtdev 7y ago> Plus, Swift pretty much has direct compatibility with C and Python libraries without needing to wrap anything. Could you please elaborate on this point?
- zapzupnz 7y agoC compatibility is one of the original design goals for Swift and is used extensively for the Linux version, for making Swift wrappers around existing libraries, and the Objective-C bridge on macOS. If using Xcode, one would use a bridging header; otherwise, one can use Swift Package Manager to wrap C libraries for use in Swift projects. Swift recently gained the features needed to call Python code. You can either use the Python module from Swift for Tensorflow or the PythonKit library, both of which allow calling Python code from within Swift. The features used to allow calling Python from Swift can also be used for other dynamic languages, so there may be the ability to call Ruby and other languages' libraries in future as well.
- swebs 7y ago>Scala: JVM lock-in >Kotlin: JVM lock-in You know OpenJDK has been available for over a decade, right?