I side with Quora User. Lisp is too perfect for our cruel, side-effect-plagued world.
Flaws require imperfection. Imperfection requires features. Pull a pearl from an oyster. What’s the most perfect pearl? The featureless pearl.
Maybe you don’t like pearls. Maybe you’re a gold-and-rubies kinda guy. But you’ll call a flawless pearl as you see it. And by God, if any language is featureless, it’s Lisp.
What features do engineers normally complain about in a language? Let us see how deftly, how adroitly Lisp sidesteps them all, by making absolutely everything a list*:
*I’m going to get things terribly
I side with Quora User. Lisp is too perfect for our cruel, side-effect-plagued world.
Flaws require imperfection. Imperfection requires features. Pull a pearl from an oyster. What’s the most perfect pearl? The featureless pearl.
Maybe you don’t like pearls. Maybe you’re a gold-and-rubies kinda guy. But you’ll call a flawless pearl as you see it. And by God, if any language is featureless, it’s Lisp.
What features do engineers normally complain about in a language? Let us see how deftly, how adroitly Lisp sidesteps them all, by making absolutely everything a list*:
*I’m going to get things terribly wrong because it’s been a decade since I wrote any Lisp, so I’m going to confuse Common Lisp, Scheme and Clojure. I’ve admitted as much, so now you can’t yell at me.
- Scoping. “Oh no, my variable is accessible from outside my for loop / from inside my Lambda / from the rescue block”
In Lisp, your variable is either higher in the parenthesis chain, assigned by “let”, or it isn’t. The rule of law is clear: you’re either in the list, or you’re out:
- (let ((a 3)) (+ a 1))
- Loops are so dirty. You have so many choices — for, while, do-while, it goes on forever. Wouldn’t it be nicer if we could just tail recurse back into our… list?
- (let loop ((i n) (res '()))
- (if (< i 0)
- res
- (loop (- i 1) (cons (* i i) res))))
- Lambdas. My God, the time we’ve spent arguing over Lambda syntax. Should it be “ () => operation()”? “ () => {operation()}”? “function(e){operation()}”? The possibilities are truly endless and pointless.
Lisp settled this stupid debate concisely and neatly: a lambda is a list, because everything is a list:
- (lambda (x) (* x x))
- Generic methods / interfaces. No need to worry about the syntax — it’s a list (honestly, I never even knew about this before I started researching this answer, but it doesn’t surprise me in the slightest):
- (defgeneric draw (shape)
- (:documentation "Draw the given shape on the screen."))
- (defmethod draw ((shape circle))
- ...)
- (defmethod draw ((shape triangle))
- ...)
I could go on, but I won’t. Maybe you don’t like lists — it’s not like I program in (any) Lisp for fun-sies. But by paring the syntax down to the barest, simplest primitives, Lisp protects itself from any accusation of bloat, warts, or mistakes.
Lisp is a flawless, perfect Lisp. I greatly respect that it holds fast to principles the rest of us are willing to throw out for expediency. But as a flawed, highly-featured human being, I’m probably not going to use it on my next project.
I could state some design principles, declare that anything that fails to meet those principle is a flaw, and then point out the language of my choice.
I could easily come up with an argument that modulo some notation changes, Turing’s state machines are flawless. Taking some different principles (and some same ones), I could argue that Alonzo Church’s lambda calculus is a flawless programming language. Neither of those languages are actually good for direct use on the tasks we face, but that might not be something I consider a flaw.
Languages reflect choices about which principles matter in par
I could state some design principles, declare that anything that fails to meet those principle is a flaw, and then point out the language of my choice.
I could easily come up with an argument that modulo some notation changes, Turing’s state machines are flawless. Taking some different principles (and some same ones), I could argue that Alonzo Church’s lambda calculus is a flawless programming language. Neither of those languages are actually good for direct use on the tasks we face, but that might not be something I consider a flaw.
Languages reflect choices about which principles matter in particular circumstances. Go is a really terrible language in so many ways, but there are a substantial range of problems for which it is the right tool. Ee make choices about which flaws matter.
Let’s look in another domain. My piano is too heavy for me to lift. That is a flaw. It certainly would be an improvement if it had all of its other qualities, but was easier to transport. Is a flawless piano weightless (assuming no other properties are compromised)?
Ok. I’ve gotten a bit extreme, and if I continue down this road a flawless programming language and a flawless piano will both be Anselm of Canterbury’s Perfect Entity. But as silly as that may have gotten it illustrates that the question of a “flawless programming language” is just asking which flaws we tolerate and which ones we don’t.
Where do I start?
I’m a huge financial nerd, and have spent an embarrassing amount of time talking to people about their money habits.
Here are the biggest mistakes people are making and how to fix them:
Not having a separate high interest savings account
Having a separate account allows you to see the results of all your hard work and keep your money separate so you're less tempted to spend it.
Plus with rates above 5.00%, the interest you can earn compared to most banks really adds up.
Here is a list of the top savings accounts available today. Deposit $5 before moving on because this is one of th
Where do I start?
I’m a huge financial nerd, and have spent an embarrassing amount of time talking to people about their money habits.
Here are the biggest mistakes people are making and how to fix them:
Not having a separate high interest savings account
Having a separate account allows you to see the results of all your hard work and keep your money separate so you're less tempted to spend it.
Plus with rates above 5.00%, the interest you can earn compared to most banks really adds up.
Here is a list of the top savings accounts available today. Deposit $5 before moving on because this is one of the biggest mistakes and easiest ones to fix.
Overpaying on car insurance
You’ve heard it a million times before, but the average American family still overspends by $417/year on car insurance.
If you’ve been with the same insurer for years, chances are you are one of them.
Pull up Coverage.com, a free site that will compare prices for you, answer the questions on the page, and it will show you how much you could be saving.
That’s it. You’ll likely be saving a bunch of money. Here’s a link to give it a try.
Consistently being in debt
If you’ve got $10K+ in debt (credit cards…medical bills…anything really) you could use a debt relief program and potentially reduce by over 20%.
Here’s how to see if you qualify:
Head over to this Debt Relief comparison website here, then simply answer the questions to see if you qualify.
It’s as simple as that. You’ll likely end up paying less than you owed before and you could be debt free in as little as 2 years.
Missing out on free money to invest
It’s no secret that millionaires love investing, but for the rest of us, it can seem out of reach.
Times have changed. There are a number of investing platforms that will give you a bonus to open an account and get started. All you have to do is open the account and invest at least $25, and you could get up to $1000 in bonus.
Pretty sweet deal right? Here is a link to some of the best options.
Having bad credit
A low credit score can come back to bite you in so many ways in the future.
From that next rental application to getting approved for any type of loan or credit card, if you have a bad history with credit, the good news is you can fix it.
Head over to BankRate.com and answer a few questions to see if you qualify. It only takes a few minutes and could save you from a major upset down the line.
How to get started
Hope this helps! Here are the links to get started:
Have a separate savings account
Stop overpaying for car insurance
Finally get out of debt
Start investing with a free bonus
Fix your credit
Well, Phillip Lane already gave the right answer. Haskell is a perfect jewel of a language. Others have mentioned Smalltalk and Lisp, which are also perfect in their own way. Since some of the most pure and consistent languages have already been mentioned, I’ll instead take the angle of, “It’s your imperfections that make you perfect.”–and by that I don’t mean languages like C++ that consist entirely of flaws, but an almost perfect language with a few “flaws” that make it uniquely useful. That language is, of course, OCaml–the redheaded stepsister of Haskell, perfect in its imperfection.
- All va
Well, Phillip Lane already gave the right answer. Haskell is a perfect jewel of a language. Others have mentioned Smalltalk and Lisp, which are also perfect in their own way. Since some of the most pure and consistent languages have already been mentioned, I’ll instead take the angle of, “It’s your imperfections that make you perfect.”–and by that I don’t mean languages like C++ that consist entirely of flaws, but an almost perfect language with a few “flaws” that make it uniquely useful. That language is, of course, OCaml–the redheaded stepsister of Haskell, perfect in its imperfection.
- All values are immutable… except
ref
, well, and mutable record fields… and arrays, of course. Haskell obviously supports mutation as well, but it’s rather strict about when that’s allowed. OCaml provides immutability and purely functional data structures by default, but it recognizes that we live in a stateful world and allows the programmer to opt into state without adding a lot of ceremony (unlike Haskell). - You don’t need loops. Everything can be done through recursion–but you know, like, if you’re building up your mutable array because you need something to be fast, well, there’s a simple
for
loop for counting through indices, as well as awhile
loop for who knows what reason. Haskell, of course, also has looping, theloop
andwhile
constructs. You can write imperative-style loops inside of a function with do notation. Of course, it’s not really a loop because it is compiled into monads and recursion, right? Until the recursion is compiled back into a loop by GHC… - All functions are referentially transparent… except any function that contains a semicolon. What referential transparency actually means is that a function call can be replaced with its corresponding value without changing the program’s behavior. It has no side effects. This may actually be true in Haskell, but it’s impossible to tell. Once you get into the IO monad, you have functions that take and return these completely opaque IO types which are impossible to examine. It may be referentially transparent, but it’s impossible to know because you can’t reproduce the value in the first place. The one thing Haskell has going for it on this count is that, once you’re out of the IO monad, you’re… mostly guaranteed to be dealing with pure functions. (er… but
trace
.) OCaml permits the use of the semicolon anywhere, so any function could theoretically have side effects. - Ocaml is… STRICT! except for explicit lazy values and thunk-based sequences. Laziness is a beautiful thing and GHC has a lot of tricks to maintain good performance in its own lazy universe, but one thing it definitely does is make the behavior of the program more difficult to reason about.
This last point gets to the chink in Haskell’s armor: Unless you’re intimately familiar with GHC, it can be rather difficult to figure out what your program actually does at runtime. Haskell does a lot to promote referential transparency but it’s rather lacking in operational transparency.
And that’s where OCaml steps in. It offers all the best in functional programming, but it does so in a way that utterly predictable. The compiler is simple and paths to optimization are obvious. Another aspect to this predictability is the type system. In typical OCaml, all types will be statically inferred and type signatures are rarely needed. Type variants will be explicit and exhaustively accounted for. OCaml does have some escape hatches from this world of extremely strict typing such as polymorphic variants, which may be somewhat open-ended.
However, much like mutable values, imperative constructs and laziness in OCaml, features that break type inference are opt-in. The “default” style in OCaml is pure functions, immutable data, strict evaluation and statically defined polymorphism. The perfection of OCaml is that the default style leads to programs which are entirely predictable in their states and execution, moreso than any other functional language. The “flaw” that makes it even better is that you’re free to break out of the theoretical world of the perfect program and break into the real world of state and side effects without preforming the monad ritual.
And yes, I’m slightly trolling Haskell here, which is a very nice language. It’s just not quite as nice as OCaml.

No programming language is considered flawless, as each has its strengths and weaknesses, depending on the context in which it is used. However, some languages are designed to minimize certain types of errors and enhance reliability. Here are a few notable examples:
- Haskell: A purely functional programming language that emphasizes immutability and strong static typing. Its type system helps catch many errors at compile time, making it less prone to runtime errors.
- Rust: Known for its focus on memory safety without a garbage collector, Rust prevents common bugs such as null pointer dereferences a
No programming language is considered flawless, as each has its strengths and weaknesses, depending on the context in which it is used. However, some languages are designed to minimize certain types of errors and enhance reliability. Here are a few notable examples:
- Haskell: A purely functional programming language that emphasizes immutability and strong static typing. Its type system helps catch many errors at compile time, making it less prone to runtime errors.
- Rust: Known for its focus on memory safety without a garbage collector, Rust prevents common bugs such as null pointer dereferences and buffer overflows through its ownership model and strict compile-time checks.
- Ada: Designed for high-integrity and real-time systems, Ada includes strong typing, modularity, and support for concurrency, making it suitable for critical applications in aerospace and defense.
- Elm: A functional language for front-end web development that compiles to JavaScript. Elm’s architecture and strong typing system help avoid runtime exceptions, leading to more robust web applications.
While these languages strive for reliability and safety, the choice of language often depends on the specific requirements of a project, including performance, community support, and ecosystem. There is no one-size-fits-all solution, and "flawlessness" is subjective based on use cases and developer experience.
If you're asking whether there's a programming language that is suitable to all tasks and environments, the answer is no. This question would be analagous to asking if there's a hand tool that is capable of replacing hammers, screwdrivers, drills, planers, saws, pliers, diagonal cutters, wrenches, etc., etc.
If you're asking whether there's a programming language that is so good at the things it's used for that there is no way to imagine it being better, the answer is again no, but for a different reason. Software languages are implemented in software and all software is improvable in one way o
If you're asking whether there's a programming language that is suitable to all tasks and environments, the answer is no. This question would be analagous to asking if there's a hand tool that is capable of replacing hammers, screwdrivers, drills, planers, saws, pliers, diagonal cutters, wrenches, etc., etc.
If you're asking whether there's a programming language that is so good at the things it's used for that there is no way to imagine it being better, the answer is again no, but for a different reason. Software languages are implemented in software and all software is improvable in one way or another.
There are languages that are dearly loved by their communities. Perl comes to mind - the folks who use perl for quick text extraction and manipulation scripts seem to really love it. Python also comes to mind. C is particularly well-suited to the things it's still heavily used for, and is very elegant if you aren't trying to make it do things that are unnatural for it.
If you want to write better essays, it’s helpful to understand the criteria teachers use to score them. Instead of solely focusing on the grade you are given, focus on how you are being graded and how you can improve, even if you are already getting a high grade.
Development of Your Thesis
A thesis is the essence of your paper—the claim you are making, the point you are trying to prove. All the other paragraphs in your essay will revolve around this one central idea. Your thesis statement consists of the one or two sentences of your introduction that explain what your position on the topic at ha
If you want to write better essays, it’s helpful to understand the criteria teachers use to score them. Instead of solely focusing on the grade you are given, focus on how you are being graded and how you can improve, even if you are already getting a high grade.
Development of Your Thesis
A thesis is the essence of your paper—the claim you are making, the point you are trying to prove. All the other paragraphs in your essay will revolve around this one central idea. Your thesis statement consists of the one or two sentences of your introduction that explain what your position on the topic at hand is. Teachers will evaluate all your other paragraphs on how well they relate to or support this statement.
Strong Form
A good essay presents thoughts in a logical order. The format should be easy to follow. The introduction should flow naturally to the body paragraphs, and the conclusion should tie everything together. The best way to do this is to lay out the outline of your paper before you begin. After you finish your essay, review the form to see if thoughts progress naturally. Ensure your paragraphs and sentences are in a logical order, the transitions are smooth so that the paragraphs are coherently connected, and that your body paragraphs relate to the thesis statement.
Style
Just as your clothes express your personality, the style of your essay reveals your writing persona. You demonstrate your fluency by writing precise sentences that vary in form. A mature writer uses various types of sentences, idiomatic phrases, and demonstrates knowledge of genre-specific vocabulary, all the while ensuring the writing reflects your authentic voice.
Conventions
Conventions include spelling, punctuation, sentence structure, and grammar. Having lots of mistakes suggests carelessness and diminishes the credibility of your arguments. Furthermore, because most essays are written on computers these days, there is a lower tolerance for spelling mistakes, which can easily be avoided with spell-checking tools such as Grammarly. Beyond spelling, Grammarly can also help to weed out other major grammatical errors. Follow up with a close reading of your entire paper.
Support and References
Finally, your teacher will examine your resources. Select information from reliable websites, articles, and books. Use quotes and paraphrases to support your ideas, but be sure to credit your sources correctly. Also, always remember that copying five consecutive words or more from any source constitutes plagiarism. If you are concerned about unintentionally quoting your sources, Grammarly Pro offers a plagiarism detector so you can always double-check your work.
The grades you get on your essays are important, but you can never improve your writing if they are the only things you consider. Focus on improving your essays’ overall structure—the thesis development, form, style, conventions, and support. Learning to master these five elements will cause your scores to soar!
Perl 6 is pretty close to perfect from my perspective.
It offers pretty much anything you can want out of an object-oriented language, but is also pretty feature complete for functional programming. But it doesn’t force you into either of those paradigms — it can be used for quick and dirty imperative scripting too.
However, while the language design is very good, implementations are still beta-quality. They’re getting there though. In recent years, they’ve come a long way.
No.
The issue I often encounter is that conciseness and controllability are opposing forces: a language which allows you to implement functionality in fewer lines of code generally doesn't give you the control to optimize it to hundredths of a percent improvement. When that hundredths of a percent is the difference between success and failure (e.g., in high frequency trading), it matters.
Programming languages are usually suited for a particular set of tasks, and not as suitable for others. One should use the right tool for a particular job.
I think a lot of answers considers capability and power of the languages mentioned.
If we do consider that different languages have different uses then I am always amazed at what backend green screen Cobol has acheived and if you think “ease of use” and “flawlessness” for what it was intended to do etc .. there’s clearly a good reason it’s still silently executing minute after minute , hour after hour … decade after decade and doing its thing…
IMHO ofcourse 👊🏽
tamamen mükemmel bir programlama dili yoktur. Ancak, bazı programlama dilleri diğerlerinden daha güvenilirdir. Örneğin Java, mümkün olduğu kadar az uygulama özelliklerine sahip olacak şekilde özel olarak kullanılan, genel amaçlı, sınıf tabanlı, uzayan, nesnel olarak bir bilgisayar programlama dilidir1. Kararlılığı ve güvenilirliği ile bilinir. Güvenilirliği ile ilgili diğer programlama dilleri Python ve Ruby2'dir. Bununla birlikte, bir programlama dilinin güvenilirliğinin nasıl kullanıldığına ve kullanılan bağlamaya bağlı olarak bilindiğine dikkat etmek önemlidir.
With today’s modern day tools there can be an overwhelming amount of tools to choose from to build your own website. It’s important to keep in mind these considerations when deciding on which is the right fit for you including ease of use, SEO controls, high performance hosting, flexible content management tools and scalability. Webflow allows you to build with the power of code — without writing any.
You can take control of HTML5, CSS3, and JavaScript in a completely visual canvas — and let Webflow translate your design into clean, semantic code that’s ready to publish to the web, or hand off
With today’s modern day tools there can be an overwhelming amount of tools to choose from to build your own website. It’s important to keep in mind these considerations when deciding on which is the right fit for you including ease of use, SEO controls, high performance hosting, flexible content management tools and scalability. Webflow allows you to build with the power of code — without writing any.
You can take control of HTML5, CSS3, and JavaScript in a completely visual canvas — and let Webflow translate your design into clean, semantic code that’s ready to publish to the web, or hand off to developers.
If you prefer more customization you can also expand the power of Webflow by adding custom code on the page, in the <head>, or before the </head> of any page.
Trusted by over 60,000+ freelancers and agencies, explore Webflow features including:
- Designer: The power of CSS, HTML, and Javascript in a visual canvas.
- CMS: Define your own content structure, and design with real data.
- Interactions: Build websites interactions and animations visually.
- SEO: Optimize your website with controls, hosting and flexible tools.
- Hosting: Set up lightning-fast managed hosting in just a few clicks.
- Grid: Build smart, responsive, CSS grid-powered layouts in Webflow visually.
Discover why our global customers love and use Webflow.com | Create a custom website.
The art of computer languages is that they are easy for humans to program and easy for computers to run.
The main two in that category are Ada and Java. Ada is long winded but very precise, Java is easy to program but not quite as precise.
[ Even after I introduced strong/weak references and generic inheritance. ]
{ TODO: synchronous garbage collection, native compiler (c.f. Symantec ~1997) ]
[ TODO: non-exclusive thread locks http://nonex.me.uk ]
DW
NB: Ada is suitable for safety critical applications, Java isn’t there yet.
Short answer: With Ada it seems to be possible to create (almost) flawless programs. Whether that makes it a flawless language may be open to debate.
Much longer answer (or at least investigation): The perfect programming language
According to your definition of “amazing”ness.
- If you mean “amazing” as in “this is amazingly simple” then Python.
- If you mean “amazing” as in “it is amazing how popular this language is” then Java.
- If you mean “amazing” as in “holy shit! This language is so f****d up it's amazing that you can write anything in it!” then JavaScript.
- If you mean “amazing” as in “look at this freak! Amazing creature!” then C++.
- If you mean “amazing” as in “it is amazing that you can do almost everything in this language” then C.
- And above all, machine code itself. It is really amazing how a bunch of 0/1s or “current”/
According to your definition of “amazing”ness.
- If you mean “amazing” as in “this is amazingly simple” then Python.
- If you mean “amazing” as in “it is amazing how popular this language is” then Java.
- If you mean “amazing” as in “holy shit! This language is so f****d up it's amazing that you can write anything in it!” then JavaScript.
- If you mean “amazing” as in “look at this freak! Amazing creature!” then C++.
- If you mean “amazing” as in “it is amazing that you can do almost everything in this language” then C.
- And above all, machine code itself. It is really amazing how a bunch of 0/1s or “current”/”no current” can let you order a piece of hardware to do whatever you like.
Flawlessness is something found mostly in languages that don’t see very much use. The real workhorse languages have numerous flaws and quirks.
Prolog, Forth, and Inform are programming languages that are very close to flawless, and in each case this has to do with the limited niche of the language: they are optimized for what they are intended to do.
The most elegant is Haskell.
Why?
Everything works like a fine Swiss watch. Everything is designed exactly as needed, no strange superfluousness.
I don’t mean clarity or readability only, as Applescript has that too, but it’s not elegant:
It’s very clear what’s happening, it’s easy to read, and not just because a factorial is something almost everybody knows.
Elegance is in maximum simplicity, but this is paradoxical. As simplicity reaches max, it becomes something else, something different from what we normally know as ‘simple’.
Elegance is doing (or being able to do) the same thing in a way that m
The most elegant is Haskell.
Why?
Everything works like a fine Swiss watch. Everything is designed exactly as needed, no strange superfluousness.
I don’t mean clarity or readability only, as Applescript has that too, but it’s not elegant:
It’s very clear what’s happening, it’s easy to read, and not just because a factorial is something almost everybody knows.
Elegance is in maximum simplicity, but this is paradoxical. As simplicity reaches max, it becomes something else, something different from what we normally know as ‘simple’.
Elegance is doing (or being able to do) the same thing in a way that makes the process enjoyable, the end result sublime. And all the while remaining clear and simple enough to know exactly what’s going on.
Look at this Arturo example. It is the exact translation of our earlier Applescript:
- factorial: $[n][
- if? n>0 [n * factorial n-1]
- else [1]
- ]
It’s shorter, but it’s not clear and elegant.
But Arturo has ‘fold’, which makes the process somewhat enjoyable:
- factorial: $[n][
- fold.seed:1 1..n [a,b][a*b]
- ]
Yet, the end result is not sublime. It’s only marginally better than the explicitly recursive version.
Now, let’s see the same in Haskell. It ought to satisfy these criteria:
- Simple
- Easy
- Clear
- Enjoyable to write
- Sublime to behold
Here you go:
- facto k = foldr (*) 1 [1..k]
Let’s dissect it: [1..3] gives us: [1, 2, 3]. Then foldr applies * to 1 (called the accumulator) and then multiplies it to each element of the generated list, starting from right (hence, first 3 is multed to the 1 outside the list, then the result is multed to 2, then its result to the 1 inside the list):
- facto 3
- foldr (*) 1 [1, 2, 3]
- 3 * 1 * 2 * 1
- 3 * 2 * 1
- 6 * 1
- --
- 6
Nearly all modern mainstream languages have stolen the design choice of foldr
from Haskell*, but even then, their versions are not sublime:
Python:
- from functools import reduce
- def facto(n):
- return reduce(lambda x, y: x * y, range(1, n + 1), 1)
Scala:
- def facto(n: Int): Int = (1 to n).foldRight(1)(_ * _)
JavaScript (ES6):
- function facto(n) {
- return Array.from({length: n}, (_, i) => i + 1).reduceRight((a, b) => a * b, 1);
- }
Rust:
- fn facto(n: usize) -> usize {
- (1..=n).fold(1, |acc, x| acc * x)
- }
F#:
- let facto n = [1..n] |> List.foldBack (*) 1
F# comes closest to Haskell, but the design is not as intuitive.
Please note that I’m not talking only about syntax. If it came to syntactical elegance, no language would beat APL. APL’s syntax is from Mars.
In the criteria I mentioned earlier, you saw ‘enjoyable to write’. This is not based on syntax alone—although syntax plays a role. Programming language elegance is beyond syntax: it involves working with a different mindset and thinking in terms of ideas, not mere syntax.
This simple ‘foldr’ example merely scratches the surface of what’s possible in Haskell. As programs become bigger, Haskell behaves very differently, and shows maximum elegance in a world mired with mediocre languages that have been catapulted to popularity due to mere randomness**.
- * Note, I mean the specific design choice for
foldr
. The concepts (on whichfoldr
is based: that is, recursion and pattern-matching) originally were crystallized in IPL, an old language that predates Lisp (so it wasn’t Lisp that introduced them first.). In my answer, I make no claim thatfoldr
appeared in Haskell first. The languages that I listed imitate stylistic choices peculiar to Haskell, and that’s my point. - ** Language-camp answers tend to appear rather abrasive, since some people who have spent years writing programs in languages that are not as elegant as Haskell will probably find my answer a sort of ‘dis’. I assure the readers that I have meant no disrespect (except to imbeciles who can’t read or those who comment before they think. See comment below.), and only point out facts. It is very likely that such programmers, with the help of my answer, might actually begin to explore Haskell to see what the fuss is all about. Or at least find enough motivation to see for themselves whether I’m right.
—
PS: The flurry of comments that are wrong, irrelevant, or otherwise show the commenter lacks reading comprehension ability prompts me to disable comments.
Elixir (and Erlang).
What would you do if all your problems were fixed, and not just fixed but fixed decades ago with systems already running proving it.
Elixir is built on top of Erlang virtual machine. This is an absolute joy to work on. Absolutely every problem you have with every other language has been solved. Scaling? Not a problem.
In one book I own, there is a list of normal services you need to make a modern scalable application, it lists a few services like queues, Redis, databases and out of a list of 10 or so items, only 1 is the language you are using, be it C# or Python.
If you pick
Elixir (and Erlang).
What would you do if all your problems were fixed, and not just fixed but fixed decades ago with systems already running proving it.
Elixir is built on top of Erlang virtual machine. This is an absolute joy to work on. Absolutely every problem you have with every other language has been solved. Scaling? Not a problem.
In one book I own, there is a list of normal services you need to make a modern scalable application, it lists a few services like queues, Redis, databases and out of a list of 10 or so items, only 1 is the language you are using, be it C# or Python.
If you pick Elixir, you can easily do everything in Elixir. You see, as I said, all the problems you have been having are already solved. They were solved in the end of the 1990’s, by Ericsson.
But Ericsson, an enormous company absolutely mismanaged their golden egg but through sheer luck it became public. It was a system for phone operators, to handle phone calls.
Lets say this. The phone system is on version 1.0 and you and your wife are on the phone with one another, your parents are also talking to one another on the phone. This is two services running. The phone company needs to upgrade the system. What can you do?
Well, with Elixir you just update the system. All the calls that are going on will continue to run on 1.0 until they hang up. When they want to make another call they will do so on 1.1.
The system is functional, and all variables are static, so they can not be changed except to read them all again. This gives you the guarantee that you can always run the system and move data to and from workers.
It has so called green threads which means you can create 100,000 workers and never think about it again, they just finish.
Need to build services? No problem, it is built in, just follow a little format and you have a server.
It is almost impossible to explain this. It took me a few days just to comprehend what I was doing.
A lot of online gaming engines are written in Erlang and Elixir. Whatsapp had million users on a single machine, single server, and everyone chatted away.
It is absolutely something everyone should look into.
Let's start with Rust. No, not the reddish-brown metal that your grandpa's old car is probably rusting away into oblivion. I'm talking about the programming language that offers memory safety, data race freedom, and high-performance. Rust is known for its strong safety features that prevent common programming mistakes.
And then there's Haskell. Don't let its name fool you, it's not a character from a Harry Potter book. Haskell is a functional programming language that's designed to make writing code easy, maintainable, and error-free. In other words, it's like a personal assistant for your codi
Let's start with Rust. No, not the reddish-brown metal that your grandpa's old car is probably rusting away into oblivion. I'm talking about the programming language that offers memory safety, data race freedom, and high-performance. Rust is known for its strong safety features that prevent common programming mistakes.
And then there's Haskell. Don't let its name fool you, it's not a character from a Harry Potter book. Haskell is a functional programming language that's designed to make writing code easy, maintainable, and error-free. In other words, it's like a personal assistant for your coding needs, without the coffee runs or awkward small talk.
The choice of programming language depends on what you want to achieve and what you feel comfortable with.
In the end, the most impressive programming language is the one that helps you get the job done and doesn't make you want to throw your computer out the window.
None…
Each as it advantages and disadvantages. Each with strengths and weaknesses. Each has successes and mistakes.
None. There are plenty of bad languages but any good language needs to take a particular view on how to think about computation and that’s always going to be better for some things and worse for others.
This is pretty relevant.
Different programming languages are designed with different things in mind.
Some languages are made to be as simple as possible. Others are made to be as expressive as possible. Etc.
C has an enormous amount of control over memory. Java has relatively little control. Either one can be a plus depending on the situation. Unfortunately one size fits all is hard, if not impossible.
This is pretty relevant.
Different programming languages are designed with different things in mind.
Some languages are made to be as simple as possible. Others are made to be as expressive as possible. Etc.
C has an enormous amount of control over memory. Java has relatively little control. Either one can be a plus depending on the situation. Unfortunately one size fits all is hard, if not impossible.
It depends on your criteria.
What is your definition of robust? What kind of ecosystem do you want? What maturity level do you need?
I consider a robust language to be one that is difficult for the programmer to make mistakes. In this regard, nothing beats a pure functional language with strong, static types.
Purity prevents surprises due to unindented side-effects. Strong, static types allow the compiler to formally verify a large class of program correctness.
Haskell is one such language. It is quite mature, but the ecosystem is nowhere close to the level Java enjoys. That said, it is production
It depends on your criteria.
What is your definition of robust? What kind of ecosystem do you want? What maturity level do you need?
I consider a robust language to be one that is difficult for the programmer to make mistakes. In this regard, nothing beats a pure functional language with strong, static types.
Purity prevents surprises due to unindented side-effects. Strong, static types allow the compiler to formally verify a large class of program correctness.
Haskell is one such language. It is quite mature, but the ecosystem is nowhere close to the level Java enjoys. That said, it is production-ready and you are find jobs that require it as a skill.
Idris goes even further by featuring dependent types. By allowing types that can depend on values, it can further close the gap because programs and proofs. Idris is said to be Pacman-complete, which means you can write the pacman game in it, I guess. Don’t rewrite all your micro-services in Idris just yet…
Because programming languages are tools, and tools have each a specific purpose. You can't do the same things with a screwdriver, a hammer, paste, a saw and a drill. Some can be used to do similar things in different ways (you can assemble wooden pieces with screws or with nails and paste), but one is probably better than the other for a given task. It's the same with programming languages; you don't do the same things with, say Javascript, Python, C, Java and Lisp. (Even if it is technically possible, it would be a bad idea to write a compiler in Javascript or a full user interface in pure C
Because programming languages are tools, and tools have each a specific purpose. You can't do the same things with a screwdriver, a hammer, paste, a saw and a drill. Some can be used to do similar things in different ways (you can assemble wooden pieces with screws or with nails and paste), but one is probably better than the other for a given task. It's the same with programming languages; you don't do the same things with, say Javascript, Python, C, Java and Lisp. (Even if it is technically possible, it would be a bad idea to write a compiler in Javascript or a full user interface in pure C : the result would be ugly and unpractical).
Besides, tools evolve with technology. Portable electric drills were not around one century ago, and similarly, most high-level languages only appeared in the late 80s or 90s. Before that, we just didn't have the science, technology and know-how for them.
What do you think a perfect programming language would look like?
To me, the perfect programming language would be no programming language at all. You would explain what you want, and the computer would understand what that means and just do it.
It would know that you want a particular screen of a program to come up in the same place it came up last time. Unless there's something there already, in which case it should come up somewhere else. But if the thing that's there already isn't important, the screen can still come up there. If you've unplugged one of your monitors since last time the prog
What do you think a perfect programming language would look like?
To me, the perfect programming language would be no programming language at all. You would explain what you want, and the computer would understand what that means and just do it.
It would know that you want a particular screen of a program to come up in the same place it came up last time. Unless there's something there already, in which case it should come up somewhere else. But if the thing that's there already isn't important, the screen can still come up there. If you've unplugged one of your monitors since last time the program ran, it should just come up in an appropriate place.
But let's say you think about that, and realize that it's too hard. It's a generalized AI problem. So we're stuck with a programming language, even if that's not ideal. So what would a nearly-perfect programming language look like?
What pieces are important to you? How closely what you say corresponds to natural language? Terseness? Speed? Predictability? Ease of use?
Some of the things you want will conflict with other things. Being close to natural language conflicts with terseness. Speed means, among other things, using multiple threads. Using multiple threads is one way to almost certainly reduce predictability, as things on different threads may get performed in a different order each time the code runs. If you have mutable data and don't use locks, you're going to have problems with different threads reading and writing data unpredictably. If you do use locks and aren't careful, you can create deadlocks. If you are careful, you've sacrificed ease of use.
Different languages make different trade offs. People who are used to C/C++ often hate garbage collection, because they don't know when that will happen and it may introduce lag at a critical time. People who are used to garbage collection will often complain about the need to explicitly manage their own resources.
Saying what you want done in higher-level terms means that you're trusting the compiler/interpreter to do what you want at a lower level. Saying what you want done in lower-level terms mean you get to specify exactly how you want stuff done, but you lose out somewhat on expressability.
I made a scoreboard from a couple Hammer Principle pages.
The results came out:
- Smalltalk - 7 points
- Scheme - 6 points
- Haskell - 5 points
- Standard ML, Clojure, Prolog, Forth - 4 points
- F#, Python, Eiffel, Lua, Io, APL, J, Factor - 3 points
…and a whole bunch of others with only 2 or 1 points.
Sources: There is a lot of accidental complexity when writing code in this language (took bottom), Code written in this language is very readable, This language has well-organized libraries with consistent, carefully thought-out interfaces, This language has a very coherent design, This language is minimal, This
I made a scoreboard from a couple Hammer Principle pages.
The results came out:
- Smalltalk - 7 points
- Scheme - 6 points
- Haskell - 5 points
- Standard ML, Clojure, Prolog, Forth - 4 points
- F#, Python, Eiffel, Lua, Io, APL, J, Factor - 3 points
…and a whole bunch of others with only 2 or 1 points.
Sources: There is a lot of accidental complexity when writing code in this language (took bottom), Code written in this language is very readable, This language has well-organized libraries with consistent, carefully thought-out interfaces, This language has a very coherent design, This language is minimal, This language is built on a small core of orthogonal features, This language has many features which feel "tacked on" (took bottom), This language has an annoying syntax (took bottom).
That would be Haskell, for me. I might like Idris even more if I learned it, but I haven’t.
Haskell is a great language for control freaks because no functions can ever do anything you don’t know about. Functions just take arguments and evaluate values and that’s basically it. There can be side effects (because a program is useless without them), but side effects have their own types, and are executed later in a special context where you know exactly what’s happening.
While Haskell is famous for its functional programming features (like those mentioned above), it is equally sophisticated when it
That would be Haskell, for me. I might like Idris even more if I learned it, but I haven’t.
Haskell is a great language for control freaks because no functions can ever do anything you don’t know about. Functions just take arguments and evaluate values and that’s basically it. There can be side effects (because a program is useless without them), but side effects have their own types, and are executed later in a special context where you know exactly what’s happening.
While Haskell is famous for its functional programming features (like those mentioned above), it is equally sophisticated when it comes to type theory. Haskell is very different from a classical OO languages, but it provides mechanisms for all the best parts of OO design. Structs give you composition and encapsulation while polymorphism is provided not by classes, but by typeclasses (which are more like interfaces in Go, if you’re familiar with that—doesn’t matter what a type is, but what interfaces it provides), generics everywhere, algebraic data types, higher-kinded types (a.k.a. type constructors), and Hindley-Milner type inference as the cherry on top. Haskell is among the most polymorphic statically typed languages in the world.
Because Haskell gives you so many assurances about how your program works, there’s a pretty good chance your program will work correctly if it compiles.
Haskell is the closest language to perfection I know. There’s just one problem: While it is possible to do anything with Haskell, some things that are simple in other languages are kind of difficult in Haskell because all those safety features mean you have to do everything in a way that the compiler can prove. For this reason, it doesn’t have super high industry adoption except in applications where there is zero room for bugs.
For what it’s worth, my favourite language is C++, because of its universality, its suitability to most of the things I’ve worked on, and I guess because it has never let me down or made me feel unduly constrained (the dreaded “you can’t get there from here” scenario).
I find it satisfying aesthetically as well as functionally, a pleasure to work with. But for me, programming is a discipline of app
For what it’s worth, my favourite language is C++, because of its universality, its suitability to most of the things I’ve worked on, and I guess because it has never let me down or made me feel unduly constrained (the dreaded “you can’t get there from here” scenario).
I find it satisfying aesthetically as well as functionally, a pleasure to work with. But for me, programming is a discipline of applied logic, a 100% real-world proposition. Perfection is an abstract notion and not the goal. The goal is to do the best possible job with the tools best suited to the ...
“Non-complete” usually means not Turing complete — which means in common terms that there are things that cannot be done with the language, whereas Turing complete means in common terms that the language has enough constructs to formulate any type of program.
This does not mean much in the modern scheme of things — but let us do some thought experiments with this.
Say a language has no concept of “files” or access to hardware devices like mice. It would then be impossible to write a program in the language that loads and writes files or uses the mouse. Is that “incomplete”? No, not like that is
“Non-complete” usually means not Turing complete — which means in common terms that there are things that cannot be done with the language, whereas Turing complete means in common terms that the language has enough constructs to formulate any type of program.
This does not mean much in the modern scheme of things — but let us do some thought experiments with this.
Say a language has no concept of “files” or access to hardware devices like mice. It would then be impossible to write a program in the language that loads and writes files or uses the mouse. Is that “incomplete”? No, not like that is what they would say. The language is not for that.
Many languages don’t have sound built in. The language does not have the ability to make noise. Nobody calls that “incomplete”.
Just because you can’t make a video game with the language does not make it incomplete.
Completeness in modern times for a language usually means that
- You can interface with the operating system
- There are C library modules that provide system access and functions to facilitate binary processing, access to files, access to devices. They may not be visible to source code, they may have to be built-in to an interpreter.
- programs can be written to files in source form, bytecode, or compiled.
- Programs have commands, variables, memory to store things.
- Programs have symbolic interpretation — things can be stored in named entities
- variables, constants, numbers
- procedures, operations
- directives
There are very few languages out there that do not have all of that. Most have things much more powerful and complicated like:
- advanced types such as reference types, generic types, hierarchical sub-typing
- string functions, strings as a basic language feature
- recursion, function stacks, scoping
- advanced math functions, integers, floating point, decimals, roman numerals, fractions, exponents
- objects, structures, records, formats
- deferred procedures (waiting to call functions until a signal or state happens)
- continuations (storing procedures mid-calculation, and picking them up again later)
- lambda functions (unnamed procedures) do some task on data inline without
the overhead of a full function. Often used to “pass a function into a function”. - functors (function objects) objects with their own state that are used
as a function, called like a function, but can “remember” values, configurations and calculations between calls. - error procedures, exceptions, signals
- slots and signals (pluggable architectures)
- foreign function interface (ability to interact/load modules written in other languages)
- debugging facilities
Languages that lack most of the above are probably the ones you might call “incomplete.”
Completeness is not essential if the language is good enough to get its jobs done in its domain.
The language in a calculator is good enough for what it does.
Some “incomplete” languages:
- HTML (a subset of sgml) only is for other programs to render, you cannot really write “programs” in it. It provides a minimal layout language around the text and image data in the text file.
- CSS (cascades style sheets) is a layout language to modify how the browser creates the web page display from the html.
- JSON (Java Script Object Notation) is a description language for a JavaScript (JS) interpreter to create data from. It usually does not contain JS code but describes how data should be formatted for use in the JS program. It is often called a “configuration” language because it is mostly used for setting up a JS configuration.
- Scripts for interpreters such as shells (bash, telnet, etc.) These are sets of commands that trigger
the underlying interpreter to call commands. Python, Perl, TCL, are complete languages and run scripts that are full programs, but shells only accept a limited number of commands, most of the work they do is calling other programs and job control, managing input and output streams and user interactions. - Query Languages for databases (SQL, dbIV, QXL ), are usually just commands and data, and limited in many ways.
- Regular Expressions are a string matching/sifting language that only is for selecting and modifying strings out of other strings. It is powerful for working with data, but does not “do” anything else by itself.
- Template systems are a sub-language within a language that generate specific code from a generic boilerplate set of code, where certain variables are place-holders that get filled-in when the program is run or compiled. Such sub-languages are really limited to small uses, but come in handy for tasks that are repeated very often with only the values changed for each use.
The simplest language is Forth. Its syntax is read left-to-right. There are no precedence rules. It has a trivial execution model and can easily construct complex systems. Unlike most languages, it does nothing whatsoever to keep you from shooting your foot off. The language’s attitude is “If you said it, you must have meant it.” Forth is mostly used in embedded systems. It is especially useful in situations where you need a lot of functionality in very little space. Forth is an ideal first language, but it is usually a stretch for those who have already learned another language.
Lisp is anothe
The simplest language is Forth. Its syntax is read left-to-right. There are no precedence rules. It has a trivial execution model and can easily construct complex systems. Unlike most languages, it does nothing whatsoever to keep you from shooting your foot off. The language’s attitude is “If you said it, you must have meant it.” Forth is mostly used in embedded systems. It is especially useful in situations where you need a lot of functionality in very little space. Forth is an ideal first language, but it is usually a stretch for those who have already learned another language.
Lisp is another language that has almost no syntax. It has a very small semantic bootstrap, but a somewhat larger runtime package, which usually has features far beyond the minimal bootstrap. It has a simple execution model and can easily construct complex systems. For all its simplicity, it has immense abstractive power. Lisp is probably the most powerful language that has ever been built. It is used for a wide variety of applications, from the trivial to the mind-boggling. Lisp is a very good first language, but it is usually a stretch for those who have already learned another language.
Smalltalk is not as simple as Forth or Lisp, but examples of its entire syntax can still be written on a corner of one sheet of paper. Its execution model is usually explained in terms of sending messages between discrete objects. There are lots of kinds of objects in the standard library, and it is easy to create more, where each kind of object defines its own messages. There are two operators, five reserved words, and three kinds of messages. The development tools are excellent, and any other language’s tools are measured in comparison to these. Like Lisp, Smalltalk is used for a wide variety of applications. It is not as powerful as Lisp, but it comes close, and it is probably the easiest of these three languages to learn if you have already learned another language.
No, there won’t be.
Each language has strengths, weaknesses, and tradeoffs. Each is better suited to some tasks, less well suited to other tasks, and might be completely inappropriate for still other tasks. No language is ideal for all possible programming tasks.
Attempts to create an “all things to all developers and all software projects” language have failed. Ada probably came closest, but it sti
No, there won’t be.
Each language has strengths, weaknesses, and tradeoffs. Each is better suited to some tasks, less well suited to other tasks, and might be completely inappropriate for still other tasks. No language is ideal for all possible programming tasks.
Attempts to create an “all things to all developers and all software projects” language have failed. Ada probably came closest, but it still has tradeoffs.
If you think of programming languages as tools, because that’s all they are, and that you should select a tool that is appropriate to the task so that you can meet your project re...
No. There will not be a single programming language that replaces all others.
The reason all the others exist is because they are good at doing different things. Often at direct odds with other languages.
For example C is very good for working directly with the hardware. Fast. Efficient. You can see every single clock cycle reflected in the source code. Good for boot loaders, device drivers, operating system kernels, utilities and some applications.
At the opposite end are very high level languages specialized for certain things. CAS (Computer Algebra System) languages. Term rewriting languages.
No. There will not be a single programming language that replaces all others.
The reason all the others exist is because they are good at doing different things. Often at direct odds with other languages.
For example C is very good for working directly with the hardware. Fast. Efficient. You can see every single clock cycle reflected in the source code. Good for boot loaders, device drivers, operating system kernels, utilities and some applications.
At the opposite end are very high level languages specialized for certain things. CAS (Computer Algebra System) languages. Term rewriting languages. Logic languages like Prolog. Abstract languages such as various dialects of Lisp. Special purpose languages like SQL. As a rule these higher order languages abstract you far away from the low level machine. You don’t know (or care) what the width of a machine word is. An integer has no limits on its size. Need a ten thousand digit integer? No problem. And where and how such a large integer (or other structure) gets allocated or deallocated is a mere detail you don’t want to even waste your time thinking about. The language should take care of that so you can think of much higher order concepts. Thunks. Lambda Functions. Generators. Pattern matching.
Being at direct odds, it seems unlikely there could ever be a language that spans the very low level and the very high level without being bad at both.
Such a language would probably be named after some curse word.
Maybe not a language, but when I first encountered 68000 assembly in the mid 80s, it was unbelievable. I had come up from 6502 assembly, and holy shit, all those registers, all those addressing modes, and all that bus size. It made simple things that had been awkward or hard so, so easy and effortless. It wasn't just bigger and faster, it was better. And then when 68881 math co processor came along, with actual floating point registers and instructions, something incredible just got even better. That was power. I was impressed.
Never has a step up in technology ever impressed me like that.
The best programming language with a good future depends on your goals and the field you’re working in. Here’s a breakdown of some of the most promising languages, followed by a strong contender for those working in data analytics and processing:
Python continues to dominate due to its versatility, simplicity, and massive ecosystem. It’s widely used in data science, AI, and web development, and its community support ensures it will remain relevant for years.
SQL has been and will always be a critical skill for database management and querying. With the explosion of data, its role in extracting a
The best programming language with a good future depends on your goals and the field you’re working in. Here’s a breakdown of some of the most promising languages, followed by a strong contender for those working in data analytics and processing:
Python continues to dominate due to its versatility, simplicity, and massive ecosystem. It’s widely used in data science, AI, and web development, and its community support ensures it will remain relevant for years.
SQL has been and will always be a critical skill for database management and querying. With the explosion of data, its role in extracting and processing structured data is vital.
If you’re diving deep into statistical computing or academic research, R remains indispensable due to its focus on data visualization and statistical analysis.
For full-stack and web development, JavaScript (and its ecosystem) is indispensable. Technologies like Node.js ensure its utility beyond the browser.
For those in data analytics or who work extensively with structured data, I recommend looking into esProc SPL. While it’s not as mainstream as Python or SQL, it offers a specialized toolset for data analysis, ETL, and complex data calculations.
Unlike general-purpose languages, SPL is built specifically for data manipulation, making it more intuitive and efficient for such tasks.
With simplified syntax, SPL provides simpler solutions for handling complex problems that might require verbose Python or SQL code.
As for performance, it is designed for efficiency and often outperforms Python in tasks involving large datasets or intensive calculations.
SPL can work as an Excel add-in, making it a perfect bridge for analysts who want to go beyond Excel’s built-in functions.
For example, tasks like multi-field deduplication, grouped sorting, or ranking often take several lines in Python or SQL but can be handled in a single SPL expression.
If you’re working in data processing or business intelligence and need a tool that’s efficient, future-proof, and tailored for data, SPL is worth exploring. It might not replace Python or SQL entirely, but it can complement them—or even outperform them—in certain scenarios.
In conclusion, Python and SQL remain dominant choices for their versatility, but for data-related tasks, esProc SPL offers a specialized, forward-looking solution.
Hi Friend,
You can easily learn and create the application using any coding language. There are three best coding languages in current.
You can use the free online tutorial for learning a coding language. for example, the tutorial point anyone can use for learning and create applications.
Python
Python is one of the most commonly used programming languages today and it easy to write the code.
It is a free, open-source programming language with extensive support modules and community development, easy integration with web services, user-friendly data structures, and GUI-based desktop applications.
It
Hi Friend,
You can easily learn and create the application using any coding language. There are three best coding languages in current.
You can use the free online tutorial for learning a coding language. for example, the tutorial point anyone can use for learning and create applications.
Python
Python is one of the most commonly used programming languages today and it easy to write the code.
It is a free, open-source programming language with extensive support modules and community development, easy integration with web services, user-friendly data structures, and GUI-based desktop applications.
It is a popular programming language for machine learning and deep learning applications.
Python is used to develop 2D imaging and 3D animation packages like Blender, Inkscape, and Autodesk.
It has also been used to create popular video games, including Civilization IV, Vegas Trike, and Toontown.
Python is used for scientific and computational applications like FreeCAD and Abacus and also by popular websites like YouTube, Quora, Pinterest, and Instagram.
Python developers earn an average annual salary of about $72,500.
Java
Java is one of the most common, computer programming languages it has several methods and classes to solve the solution.
Owned by Oracle Corporation, this general-purpose programming language with its object-oriented structure has become a standard for applications that can be used regardless of platform (e.g., Mac, Windows, Android, iOS, etc.) because of its Write Once, Run Anywhere (WORA) capabilities.
As a result, Java is recognized for its portability across platforms, from mainframe data centers to smartphones. Today there are more than 3 billion devices running applications built with Java.
Java is widely used in web and application development as well as big data. Java is also used on the backend of several popular websites, including Google, Amazon, Twitter, and YouTube.
It is also extensively used in hundreds of applications. New Java frameworks like Spring, Struts, and Hibernate are also very popular.
With millions of Java developers worldwide, there are hundreds of ways to learn Java. Also, Java programmers have an extensive online community and support each other to solve problems.
Java is a more complex language to learn, but experienced developers with Java coding skills are in high demand.
The average Java developer earns around $79,000 each year.
Kotlin
Kotlin is a general-purpose programming language originally developed and unveiled as Project Kotlin by JetBrains in 2011.
The first version was officially released in 2016. It is interoperable with Java and supports functional programming languages.
Kotlin is used extensively for Android apps, web applications, desktop applications, and server-side application development. Kotlin was built to be better than Java, and people who use this language are convinced.
Most of the Google applications are based on Kotlin. Some companies using Kotlin as the programming language include Coursera, Pinterest, PostMates among many others.
Kotlin developers earn an average of $136,000 a year, with the potential to earn up to $171,500.
There is no one programming language that is ideal or best for all possible programming tasks. Each has strengths and weaknesses. Each contains tradeoffs. Each is better for some programming tasks, and less-well-suited to other programming tasks. There is no one language to rule them all. There never has been, and there probably won’t ever be. Attempts to create such languages have resulted in languages with lots of tradeoffs, rendering the language not well-suited to all possible programming tasks.
Rather than trying to chase the “best” language, just choose a language that is appropriate for
There is no one programming language that is ideal or best for all possible programming tasks. Each has strengths and weaknesses. Each contains tradeoffs. Each is better for some programming tasks, and less-well-suited to other programming tasks. There is no one language to rule them all. There never has been, and there probably won’t ever be. Attempts to create such languages have resulted in languages with lots of tradeoffs, rendering the language not well-suited to all possible programming tasks.
Rather than trying to chase the “best” language, just choose a language that is appropriate for the type of programming task at hand. And don’t think that you’re stuck with one language forever. Professional software developers are fully expected to learn and properly use programming languages, programming paradigms, and many other things as needed along the way. The first language you learn and use will not be your last.
Think of programming languages as tools, nothing more. You learn and use the right tool for the right task. Some projects require multiple tools, for different parts of the project.
Programming languages are just tools. If you think of programming languages as tools, and consider the wide variety of tools that exist in the world for different tasks, having different programming languages for different types of programming tasks makes sense.
Consider the real world of carpentry. All saws “essentially do the same thing” — they saw things. But consider what a “universal” saw would look like. To effectively replace all the various types of saws, it would have to strive to be equally good at all sawing tasks…just as good as a hacksaw, band saw, jig saw, back saw, coping saw, fr
Programming languages are just tools. If you think of programming languages as tools, and consider the wide variety of tools that exist in the world for different tasks, having different programming languages for different types of programming tasks makes sense.
Consider the real world of carpentry. All saws “essentially do the same thing” — they saw things. But consider what a “universal” saw would look like. To effectively replace all the various types of saws, it would have to strive to be equally good at all sawing tasks…just as good as a hacksaw, band saw, jig saw, back saw, coping saw, fret saw, rip cut saw, pruning saw, crosscut saw, bow saw, wire/cable saw, bone saw, keyhole saw, compass saw, razor saw, Japanese saw, veneer saw, carcass saw, wallboard saw, table saw, miter saw, circular saw, reciprocating saw, scroll saw, rotary saw, chainsaw, pole saw, chop saw, flooring saw, track saw, masonry saw, radial arm saw, tile saw, oscillating saw, panel saw, and concrete saw. It is neither feasible nor more practical to have a “universal” saw to replace all the various types of saws we have today. Each type of saw was designed to make some types of cutting easier. There is no way to design a single “universal” saw that can do all of these things equally well.
Now, cutting stuff is a pretty simple, basic concept. And yet, we need many different types of saws for different types of cutting tasks. Programming languages are much more complex than saws. They enable a developer to express the performance of an infinite variety of tasks, from very simple to extremely complex. Programming languages have a lot of different capabilities, not just one.
Each programming language has strengths and weaknesses, and some are better suited to some types of programming tasks than others. Attempts to design and implement new languages which have all the strengths, none of the weaknesses, and are universally appropriate for all programming tasks invariably result in languages which still have strengths, weaknesses, might be applied to most (but not all) programming tasks, and typically make some things easier for developers and some things much harder for developers. Attempts to compromise between strengths and weaknesses typically result in mediocrity for some types of programming tasks, and that in itself is a weakness. And if you improve something in the language over here, it can be at the expense of something over there.
Engineering efforts, including programming language design, always involve tradeoffs.
Let’s take one obvious programming language area: dynamic memory management.
You decide that your universal language should be garbage-collected, to make life easier for developers. Unfortunately, your universal language can’t be used in projects with real-time requirements (e.g., many embedded systems). Alarms go off, because your language isn’t universal.
So, you change your mind and say that the developer is responsible for all dynamic memory management, with no garbage collection. Suddenly, you have masses of developers crying out with one anguished voice, because they grew up on garbage-collected languages, and have no idea how to avoid dangling pointers, double deallocations, memory leaks, etc. Many opt to never deallocate anything, causing their applications, operating systems, device drivers, etc. to gobble up memory and bring systems to a grinding, thrashing, painful demise. Of course, you can attempt to train them in the ways of memory management, but that won’t work for everyone, and many those who are able to adapt will continue to complain that they have to deal with these issues themselves.
As a result, you change your mind once again and decide that the developer gets to make the decision, for each and every object, whether it will be garbage-collected or managed by the developer. This seems like a nice, “universal” approach. But then developers must make an extra non-trivial decision every time they deal with object creation. A decision like this requires a solid understanding of the implications of the decision on behavior of the software, performance characteristics, etc. Developers then have to remember which objects they are managing, and which objects they’re not managing, so they don’t get into trouble. In the end, solid knowledge and experience are required to make this decision on every allocated object. This raises the barrier to entry and barrier to success with the language, and that doesn’t bode well for the language, long term.
Ask a systems programmer for their language feature priorities, and ask an application programmer for their language feature priorities. You’re going to get two different lists, with sometimes conflicting priorities. If you try to merge the two, there will be things about the language that neither programmer likes.
Could there ever be a 'perfect' programming language?
No.
Each programming language is a mathematical notation designed for a particular problem domain.
There are no general programming language that will fit all problem domains.
Fortran is VERY good for scientific research. C++ can do the same task, just not as well as that isn’t what it was designed for.
C is VERY good at CPU and device control… but it is not as good as C++ for complex applications.
And is really horrible as a Fortran replacement.
Each language is a notation for the problem domain that is designed to make it easier to use within th
Could there ever be a 'perfect' programming language?
No.
Each programming language is a mathematical notation designed for a particular problem domain.
There are no general programming language that will fit all problem domains.
Fortran is VERY good for scientific research. C++ can do the same task, just not as well as that isn’t what it was designed for.
C is VERY good at CPU and device control… but it is not as good as C++ for complex applications.
And is really horrible as a Fortran replacement.
Each language is a notation for the problem domain that is designed to make it easier to use within that domain.
No language is good at everything.
In the natural language, English is pretty good… But don’t expect it to actually be used for legal contracts. Those use legalese with specific definitions of words that don’t necessarily line up with common English.
This question comes to most of the beginner programmers mind. When I start programming, I also had the same question in my head.
Here I give you ONLY the basic idea:
Computers can only understand electrical signals. For example, If light ON, it means 1. If light OFF, it means 0. In Mathematics, Binary is a concept where we can only represent 0’s and 1’s.
Computer scientists used Binary to represent keywords on to the computer screen.
Take a look at this picture:
This is how binary represent numbers. The same concept goes to represent alphabets and symbols.
A very long time ago where we don’t have an
This question comes to most of the beginner programmers mind. When I start programming, I also had the same question in my head.
Here I give you ONLY the basic idea:
Computers can only understand electrical signals. For example, If light ON, it means 1. If light OFF, it means 0. In Mathematics, Binary is a concept where we can only represent 0’s and 1’s.
Computer scientists used Binary to represent keywords on to the computer screen.
Take a look at this picture:
This is how binary represent numbers. The same concept goes to represent alphabets and symbols.
A very long time ago where we don’t have any programming languages, Computer Scientists used Binary Language/Machine Language to ‘progam’ since they find it very difficult to understand binary language and make programs with it, so they made programming language(human-readable) using Binary Language(Machine-readable). (Let’s say they made Assembly language using Binary)
We made another programming language using the assembly language and it goes on.
Nowdays, we have C, C++, Java, Python and so on. You know. C is a successor of B language. C++ made in C language.
Now you have an IDEA on how programming languages are made. High Five!
P.S|Kindly give editing suggestions to improve this answer.
It's hard to predict the future but here it goes:
Kotlin: The language that started as JVM only and now it can target multiplatform development (ios, android, jvm, js, ios, windows, linux). I think it strickes a pragmatic balance of legibility, productivity and performance like no other and that will continue to grow and become a powerhouse in the industry, in part because of the excellent tooling Jetbrain creates (IntelliJ IDEA and Fleet)
I am sure JS will stick around but have a poor reputation as a messy language prone to bugs. A new performance oriented language will take over its niche but
It's hard to predict the future but here it goes:
Kotlin: The language that started as JVM only and now it can target multiplatform development (ios, android, jvm, js, ios, windows, linux). I think it strickes a pragmatic balance of legibility, productivity and performance like no other and that will continue to grow and become a powerhouse in the industry, in part because of the excellent tooling Jetbrain creates (IntelliJ IDEA and Fleet)
I am sure JS will stick around but have a poor reputation as a messy language prone to bugs. A new performance oriented language will take over its niche but it is unclear which one (maybe rust).
There is an article comparing languages in respect to safety.
How Safe is Your Programming Language
This article was probably posted in 2008. It took specific classes of errors (Ex. Null Pointers, Array Index Out Of Bounds, Type Errors etc) and checked how and when a language catches them.
According to this article Haskell is the safest language. I would like to mention Haskell is a functional programming language and purely functional code is guaranteed to have no side effects and will never throw exceptions.
Now the problem with purely functional code with no side effect is that it is not that p
There is an article comparing languages in respect to safety.
How Safe is Your Programming Language
This article was probably posted in 2008. It took specific classes of errors (Ex. Null Pointers, Array Index Out Of Bounds, Type Errors etc) and checked how and when a language catches them.
According to this article Haskell is the safest language. I would like to mention Haskell is a functional programming language and purely functional code is guaranteed to have no side effects and will never throw exceptions.
Now the problem with purely functional code with no side effect is that it is not that productive. Querying database or even calling date function introduce side effect to the code. This is why you have to use monads for these sort of functionality. But that will be a whole new discussion.
Sticking with your question, There is a programming language called Rust which is a systems programming language that claims to runs blazingly fast, prevents segfaults, and guarantees thread safety. They are associating the safe word with this programming language very frequently. Now the problem is when working on system level, you need a lot of flexibility and for that reason enforced safety does not seem to always work. So, to unleash the full potential, even rust introduced unsafe code. In the following article Meet Safe and Unsafe, they mention -
Well, unlike C, Rust is a safe programming language.
But, like C, Rust is an unsafe programming language.
…
Unsafe Rust is exactly like Safe Rust with all the same rules and semantics. It just lets you do some extra things that are Definitely Not Safe
This reminds me of C. Lets talk about C++ a little bit. There is a book called Safe C++: How to avoid common mistakes by Vladimir Kushnir. This books talk about the best practices that will make C++ code safe. My point being, You can make almost any programming language safe by following best practice for making it safe.
Summery
There is a trade-off between safety and capability. For example, Assembly language is not safe. If you want to make it safe then it will not be able to tell the machine a lot of things which you might want it to do. So you have to set your priorities straight.
Being said that, Safest language is Haskell. Second safe language is safe rust. And finally, if you following best practice for making it safe then almost any language is safe including C.
A programming language is used to make a computer perform a series of tasks based on the instructions you give it.
Imagine talking to a rather dull and stoic caveman, who tends to take things too literally. He understands only the words he already knows and that too, only when they are combined in ways that he's used to. Therefore, he has a limited vocabulary and a set of grammatical rules that he can understand. In order for you to tell him to make a cup of tea, you'd need tell him how exactly to make a cup of tea. You'll have to talk using only words that he knows and use grammar that he und
A programming language is used to make a computer perform a series of tasks based on the instructions you give it.
Imagine talking to a rather dull and stoic caveman, who tends to take things too literally. He understands only the words he already knows and that too, only when they are combined in ways that he's used to. Therefore, he has a limited vocabulary and a set of grammatical rules that he can understand. In order for you to tell him to make a cup of tea, you'd need tell him how exactly to make a cup of tea. You'll have to talk using only words that he knows and use grammar that he understands.
In this analogy, our caveman is a computer and the language he understands is a programming language. Let's assume, for the sake of this analogy that the he understands only one language - his own. Further in the analogy, his vocabulary is a set of keywords and the grammar he is used to is the syntax used in the programming language.
Now comes the part about getting him to make a cup of tea. There are some programming languages which are high level, and some which are low level. A very "high-level caveman", already knows what "make", "a cup", and "tea" mean. He simply combines his knowledge about these phrases and brings you a piping hot cup of tea.
Some lower-level cavemen, however, will make you do more work. You'll have to define what some of these phrases are, define every aspect of "a cup", define "water", "milk", "tea bags" etc. These sort of programming languages although make you do more work, but they also give you more control to optimize the process according to your knowledge. Ultimately, it might happen that the low-level caveman makes a cup of tea faster than his high-level counterpart because the way he made tea was different because of the knowledge you had about this magical art. However, you might not care about how fast one makes tea etc, and can decide to use the high-level caveman because he, makes you spend less time on giving him instructions.
A programming language thus is a way for the programmer to instruct a computer to do his/her bidding.
Clarifying on our earlier assumption, in reality, the caveman/computer does understand only one language - binary machine code, which is arguably at the lowest-level. All programming languages convert instructions like "make a cup of tea", or "combine water, tea bags, milk and heat... etc" into machine code that our caveman/computer understands and follows.
‘Every Aspect’? too broad, and it would seem you have an ‘’’ motive.
Just from which systems run the world? COBOL…
Cobol was designed to run on ‘smaller’ computers, so they run well on the much larger platforms of today.
And they don’t have problems with numbers. One of the more famous failures of some of the newer languages is how they handle math and numbers.
A 5th grader divides 1.000 by 4… What answer do they get? 0.250
And what answer do some of the newer languages get? 0.2499999
All the issues can be fixed, but for some reason are not.
As long as these issues exist, COBOL will continue to be us
‘Every Aspect’? too broad, and it would seem you have an ‘’’ motive.
Just from which systems run the world? COBOL…
Cobol was designed to run on ‘smaller’ computers, so they run well on the much larger platforms of today.
And they don’t have problems with numbers. One of the more famous failures of some of the newer languages is how they handle math and numbers.
A 5th grader divides 1.000 by 4… What answer do they get? 0.250
And what answer do some of the newer languages get? 0.2499999
All the issues can be fixed, but for some reason are not.
As long as these issues exist, COBOL will continue to be used.
And for those who really want a object oriented language? COBOL++ was created. I have never used it, though.
Could there ever be a perfect car?
Not really. Some people would say that a Tesla is perfect because it is (relatively) environment friendly, fast and comfortable. But then other people would complain that you can’t fit six people and six suitcases in it, and suggest a large SUV instead. Other people again would say that both are difficult to park in narrow spaces simply because they are big. No amount of perfection could ever reconcile these issues in a single car.
The same is true with programming languages: Most will be great for some purposes but terrible for other purposes. Some might be te
Could there ever be a perfect car?
Not really. Some people would say that a Tesla is perfect because it is (relatively) environment friendly, fast and comfortable. But then other people would complain that you can’t fit six people and six suitcases in it, and suggest a large SUV instead. Other people again would say that both are difficult to park in narrow spaces simply because they are big. No amount of perfection could ever reconcile these issues in a single car.
The same is true with programming languages: Most will be great for some purposes but terrible for other purposes. Some might be terrible at everything, but none will be good for everything — no matter what proponents of a particular language might say.
But in some other sense, (nearly) all programming languages are perfect already: No new programming language would allow you to compute something that you can’t already compute with an existing language, and (nearly) all existing languages can compute the same thing. This is called Turing completeness: Languages that can emulate arbitrary Turing machines can compute everything that it is theoretically possible to compute (on machines that do not defy natural laws), and emulating Turing machines is not really difficult.
I believe Rust has a very bright future ahead of itself. It’s a relatively new systems programming language, released in 2010.
The two big systems programming languages should be familiar to everyone, C and C++. They’re not getting any younger. C is 46 years old and C++ is 33 years old. According to the TIOBE Index, they are the second and third most used programming languages in the world respectively, but they are both on the decline.
Rust is an obvious candidate to take some of that huge market share from C and C++. While it can match their blazing fast performance, it offers much better memo
I believe Rust has a very bright future ahead of itself. It’s a relatively new systems programming language, released in 2010.
The two big systems programming languages should be familiar to everyone, C and C++. They’re not getting any younger. C is 46 years old and C++ is 33 years old. According to the TIOBE Index, they are the second and third most used programming languages in the world respectively, but they are both on the decline.
Rust is an obvious candidate to take some of that huge market share from C and C++. While it can match their blazing fast performance, it offers much better memory and thread safety. It also has a nicer syntax in my humble opinion. While C was a pioneering language in its time, Rust has the advantage of standing on the shoulders of every programming language that has been introduced since.
Rust is only in 36th place on TIOBE at the moment, but it’s gaining followers. It has been voted the most loved programming language in developer surveys at Stack Overflow the last three years in a row.
Rust actually has surprisingly few opponents in the race to becoming the new systems programming language. I think the developer community has generally underestimated the continued demand for fast, hardware-oriented languages. The focus has been on high-level languages, which many thought would take completely over. With the slowing down of Moore’s law and explosive increase in data volumes, performance has actually become more important again, not less.
With a slowing down in the increasing number of transistors, we have turned to ever more cores. That means thread safety becomes more important. Again, this is where Rust shines.
Rust is also used in Parity, which may become really big if the Ethereum blockchain gains further traction.