Need advice about which tool to choose?Ask the StackShare community!
Clojure vs Erlang: What are the differences?
Introduction
Clojure and Erlang are both functional programming languages that have gained popularity for their concurrency and fault-tolerant capabilities. However, there are several key differences between the two languages that make them unique in their own way.
Syntax: Clojure is a Lisp dialect, while Erlang has a more traditional syntax. Clojure code is written in a prefix notation, with parentheses and function names coming before their arguments. Erlang, on the other hand, uses an infix notation, with function names coming between their arguments. This fundamental difference in syntax affects the readability and writing style of code written in each language.
Concurrency Model: Clojure utilizes an implementation of Software Transactional Memory (STM) called Clojure STM to manage concurrent access to shared state. STM provides a way to control access to shared resources without the need for traditional locks, making it easier to write concurrent code. Erlang, on the other hand, follows the Actor model of concurrency, where isolated processes communicate with each other by passing messages. This message-passing concurrency model forms the foundation of Erlang's concurrency and fault-tolerant capabilities.
Platform and Ecosystem: Clojure runs on the Java Virtual Machine (JVM) and thus has access to the vast Java ecosystem and libraries. This allows Clojure developers to leverage existing Java libraries and frameworks. On the other hand, Erlang has its own runtime, the BEAM, which is highly optimized for Erlang's concurrency model. Erlang also has a rich ecosystem with libraries and tools specifically designed to support distributed and fault-tolerant systems.
Immutability: While both Clojure and Erlang encourage immutability, Clojure enforces it more strictly by providing immutable data structures by default. This design choice promotes functional programming and makes it easier to reason about code. In Erlang, data can be mutable, but the language has built-in mechanisms to facilitate immutable data and message passing between processes.
Error Handling: Clojure adopts a "fail-fast" approach to errors, where exceptions are thrown when something goes wrong. This aligns with the Java principles and allows for easier integration with Java libraries. Conversely, Erlang focuses on fault tolerance and has built-in mechanisms for handling errors. Erlang processes can trap and handle exceptions within themselves, allowing the system to continue running even in the presence of failures.
Community and Main Use Cases: Clojure has a vibrant community and is commonly used in areas such as web development, data analytics, and machine learning. It is often used alongside the Java ecosystem for building robust and scalable applications. On the other hand, Erlang has a strong presence in the telecommunications industry and is known for its use in building highly fault-tolerant and scalable systems, particularly in distributed and concurrent environments.
In Summary, Clojure and Erlang differ in their syntax, concurrency models, platform and ecosystem, approach to immutability, error handling mechanisms, and main use cases. These differences make each language suitable for different types of projects and emphasize different aspects of functional programming and concurrency.
Basically, I am looking for a good language that compiles to Java and JavaScript(and can use their libraries/frameworks). These JVM languages seem good to me, but I have no interest in Android. Which programming language is the best of these? I am looking for one with high money and something functional.
Edit: Kotlin was originally on this list but I removed it since I had no interest in Android
Clojure is a Lisp dialect, so if you like Lisp that's probably the way to go. Scala is more popular and broadly used, and has a larger job market especially for data engineering. Both are functional but Scala is more interoperable with Java libraries, probably a big factor in its popularity. I prefer Scala for a number of reasons, but in terms of jobs Scala is the clear leader.
Scala has more momentum. It is good for back-end programming. The popular big data framework Spark is written in Scala. Spark is a marketable skill.
If you need to program something very dynamic like old school A.I., Clojure is attractive. You would chose Scala if prefer a statically typed language, and Clojure if you prefer a dynamically typed language.
It's not clear exactly what you mean by "high money", you mean financial support to the language, money paid for a job, economic health of the market the language is positioned on?
In any case, it's very hard to give any advice here, since you'd need to provide details on the intended usage, what sector, kind of product/service, team size, potential customer type... Both languages are very general purpose and decently supported, each have its own pros and cons, both are functional as approach, and neither is really mainstream.
We’re a new startup so we need to be able to deliver quick changes as we find our product market fit. We’ve also got to ensure that we’re moving money safely, and keeping perfect records. The technologies we’ve chosen mix mature but well maintained frameworks like Django, with modern web-first and api-first front ends like GraphQL, NextJS, and Chakra. We use a little Golang sparingly in our backend to ensure that when we interact with financial services, we do so with statically compiled, strongly typed, and strictly limited and reviewed code.
You can read all about it in our linked blog post.
Pros of Clojure
- It is a lisp117
- Persistent data structures100
- Concise syntax100
- jvm-based language90
- Concurrency89
- Interactive repl81
- Code is data76
- Open source61
- Lazy data structures61
- Macros57
- Functional49
- Simplistic23
- Immutable by default22
- Excellent collections20
- Fast-growing community19
- Multiple host languages15
- Simple (not easy!)15
- Practical Lisp15
- Because it's really fun to use10
- Addictive10
- Community9
- Web friendly9
- Rapid development9
- It creates Reusable code9
- Minimalist8
- Programmable programming language6
- Java interop6
- Regained interest in programming5
- Compiles to JavaScript4
- Share a lot of code with clojurescript/use on frontend3
- EDN3
- Clojurescript1
Pros of Erlang
- Concurrency Support60
- Real time, distributed applications60
- Fault tolerance56
- Soft real-time35
- Open source31
- Functional programming21
- Message passing20
- Immutable data15
- Works as expected13
- Facebook chat uses it at backend5
- Practical4
- Knowledgeable community4
- Bullets included3
Sign up to add or upvote prosMake informed product decisions
Cons of Clojure
- Cryptic stacktraces11
- Need to wrap basically every java lib5
- Toxic community4
- Good code heavily relies on local conventions3
- Tonns of abandonware3
- Slow application startup3
- Usable only with REPL1
- Hiring issues1
- It's a lisp1
- Bad documented libs1
- Macros are overused by devs1
- Tricky profiling1
- IDE with high learning curve1
- Configuration bolierplate1
- Conservative community1
- Have no good and fast fmt0