What Programming Language For Linux Development? 997
k33l0r writes "Recently I've been thinking about developing (or learning to develop) for Linux. I'm an IT university student but my degree program focuses almost exclusively on Microsoft tools (Visual Studio, C#, ASP.NET, etc.) which is why I would like to expand my repertoire on my own. Personally I'm quite comfortable in a Linux environment, but have never programmed for it. Over the years I've developed a healthy fear of everything Java and I'm not too sure of what I think of Python's use of indentation to delimit blocks. The question that remains is: what language and tools should I be using?"
It doesn't matter as long as it's on Linux (Score:4, Insightful)
First, let me start by saying that the definition of an experienced programmer is that they don't care about the particulars of any given language. Experience means they have seen many languages come and go and they will continue to adapt.
That's the long-term skill that will keep putting money in your pocket. Coming out of college, it's important you know that.
That being said, congratulations on sticking with Linux in a Windows world. Purely from a job perspective, there might be more jobs on the Windows platform, but they are also more boring. So your school is doing the right thing by exposing you to as much Windows IT as possible, and you are doing the smart thing by escaping to the better side.
To answer your question: Linux is not so different from a programming point of view, but it has a set of standard libraries and utilities that can be combined in many amazing ways. I'm old-fashioned, so I still program in C++, but what I would also recommend that you explore are some of the fun scripting languages like Perl. I wouldnt' particularly recommend more modern and high-level languages on purpose: they hide too much of Linux, so what's the point for you?
Learn about true modularity: whatever it is that you are trying to build on Linux, someone already did 90% of the work. You just have to build up from there. Algorithms are the same on Windows and Linux, but that mindset makes all the difference.
This is all true however... (Score:5, Informative)
... it is also pertinent to note here that the GNU standards document, section 3.1 [gnu.org]: "Which Languages to Use" strongly advises plain old C for both performance and absolute maximum cross-platform compatibility.
Since operating system and hardware platform independence are both key factors of code re-usability and really what open source software is all about I personally think this is a strong call.
However the parent post is correct in that application intent trumps all. If you are just writing shell tools you never intend to use outside of Linux then PERL is likely fast enough and probably much easier/faster (bottom line: cheaper) for the average developer to work with.
If you're writing web software use PHP, but it will make you feel dirty inside.
Re:This is all true however... (Score:5, Insightful)
C - absolutely. C isn't going away any time soon, and it works on ALL platforms, not just linux (and in many cases porting to bsd is just a recompile and a few extra headers). You'll also have to learn to write your own make files - not a hard job.
And you'll find you'll need perl and bash scripts.
Everything else is just "for this type of app, these are what most people use ... pick whatever you feel most comfortable with."
Re:This is all true however... (Score:5, Insightful)
Why not start with assembly language? (Score:5, Funny)
...it's the only way to be sure.
Re:Why not start with assembly language? (Score:5, Insightful)
I am mostly an Assembly Language programmer and it can teach some bad habits. I don't generally trust anybody else's code, so end up coding up everything from scratch. It's a solitary practice. That said, 'pointers' and other things that seem weird and remote to many people are painfully obvious if you started out in Assembly.
Bare hardware and real memory addresses rule. However, a bare-metal assembly language programmer will mostly work with embedded controllers in this day and age. Yay for the little 8 bitters and even the 4 bitters. There are still billions being deployed.
That's what he said! (Score:4, Funny)
What is C other than a slightly higher level assembly language than nasm?
Re:This is all true however... (Score:5, Funny)
Everyone programming for Linux should start with machine code! Then after that, they should learn assembly. Only after mastering this can they begin to appreciate the power of Fortran! Finally, once they have mastered Fortran, C will finally make sense. Then, 5 years of steady C development, where they achieve Nirvana-like (the band, not the state of mind) understanding of C if they begin by handwriting the C compiler in Fortran and then transitioning it into C once the compiler is able to self-compile!
Then, only then, can you even begin to consider Object Oriented Programming. This should be jumped into arm-pit hair-first. Learn Java first -- Sun designed it to be object oriented to a fault. Then slam on the breaks, realize it's crazy, and start taking concerted steps back until you get to C++, which is C with only a modest amount of caffeine added.
Once all of that is done, you too can begin to program in Ruby or Python, Perl, or Bash scripts. That way, you will have a solid base of high performance programming to throw away when you move into the more heavy duty interpreter languages.
Or really, lets just damn it all to hell and learn Lisp -- functional languages is the way of the future. We can't all bother to learn what the computer is doing. If I program in a fancy-pants language like C, I might have to bother to learn how to write threads, locks, and all that crap to make my programs run fast. In Lisp, I have so little control over what's actually happening, I can just blame someone else when my program is slow.
Yeah. Learn Lisp first.
Re:This is all true however... (Score:5, Funny)
Everyone programming for Linux should start with machine code! Then after that, they should learn assembly.
Thats all very well, but only after they have a thorough grounding in writing microcode. How can you appreciate and optimise machine code, without knowing how it is implemented?
Anything below microcode is a hardware problem.
Re:This is all true however... (Score:5, Interesting)
Nope!
http://www.lrde.epita.fr/~didier/research/verna.06.ecoop.pdf [epita.fr]
http://portal.acm.org/citation.cfm?doid=1143997.1144168 [acm.org]
http://www.eecs.berkeley.edu/~fateman/papers/lispfloat.ps [berkeley.edu]
Good idea. :) I know /you/ were only joking but Lisp has been held back by a ton of widely believed (and massively ironic) mythology and it is very sad. The only thing really wrong with it is the lack of stuff written in/for it because of its grossly undeserved reputation.
Re: (Score:3, Informative)
You'll also have to learn to write your own make files - not a hard job.
It's not hard to write a simple Makefile (or Makefile.am), true. And I'll agree that GNU Make does its job -- executing commands based on dependency hierarchies -- very well.
But sometimes, I don't want to even think about dependency hierarchies and whatnot. If you want an alternative to e.g., autotools, I'd recommend looking at CMake (http://www.cmake.org/); it can generate build systems (makefiles or IDE project files, for example) for a number of different tools (even Visual Studio!).
And you'll find you'll need perl and bash scripts.
Not sure about the
Re:This is all true however... (Score:5, Insightful)
Another thing that C has going for it is that virtually all Linux apps are written in C. So, if you ever want to install anything from source, and something goes wrong, you'll be glad you know a thing or two about C so you can figure it out (and even submit a patch that ends up being applied to a big, established project like WINE - that's a pretty awesome feeling, let me tell you). All *other* languages interpreters are written in C - it's always worthwhile once you've gotten comfortable with a language like Java to sit down and write your own interpreter in C so you can really get a good feel for what it's actually doing.
So, yeah, I second the parent. Definitely C.
Platforms where C does not work (Score:4, Insightful)
C isn't going away any time soon, and it works on ALL platforms
C doesn't work on Xbox 360 XNA; only C# works for that. C doesn't work on smart phones that use J2ME MIDP; only Java works for that. C doesn't work for the client side of web applications; only JavaScript and ActionScript work for that. C doesn't work for the server side of web applications installed on shared hosting; generally, interpreted languages whose names start with P work for that. In general, C compilers targeting sandbox virtual machines such as these aren't high-profile, if they exist at all.
Re:This is all true however... (Score:4, Insightful)
... it is also pertinent to note here that the GNU standards document, section 3.1 [gnu.org]: "Which Languages to Use" strongly advises plain old C for both performance and absolute maximum cross-platform compatibility.
I remember for years C being considered faster on systems than C++, although I believe over the years the gap, if there still is one at all, has narrowed? What is true, someone share it with me as I am curious? Are there any incompatibilities when using C++ and migrating to different Operating System environments any more like their use to be in the dark ages?
Can you compile C++ down small enough to use in embedded devices or does C++ still pull in libraries that are not needed or too big? My guess is you can exclude the libraries that you do not need, correct? (Not trying to start anyone flaming, I honestly do NOT know.)
If you're writing web software use PHP, but it will make you feel dirty inside.
I know there are Ruby on Rails camps and Python advocates, however does not PHP still run faster than either? (Take the same programmer, writing code with expert knowledge with all three programming languages, would not his final product , from a strictly performance issue in PHP be faster than Ruby or Pythong?)
Considering that PHP was written with the web in mind and delivering web pages...do you really want anything else from strictly performance issues?
Granted I understand that you can probably prototype in other languages much faster...
Also your feel dirty comment, is that because of the ease in which a poor programmer can create unstructured code? If so would it not be the fault of the programmer and not the language specifically? (i.e. Assembly for the 8088, ..286, ..386 and IBM Mainframe made me feel dirty sometimes with they way you were forced to branch, but it was fast...and no I am far from an expert Assembly programmer.
Also from a modularity, library, procedure / function, object perspective, if you have been coding in any of them PHP, Python or Ruby on Rails, would you not have a significant library built up where the library issue becomes a non-issue?
FYI, personally I do not have a preference and simply choose what is convenient for me to use that will get the job done, period. I honestly do not know the nuances between them...and I am sure that there are some.
I do not have any Ruby on Rails or Python experience and am looking forward to learning more about them. To date I have been able to do everything I need to do with scripting and PHP...so my knowledge is very limited and I admit that freely. Further my Perl knowledge has been with simple scripting only, I have not had a 8 hour a day, 5 day a week Perl coding job.... Further when competing in an ACM Programming contest at college, of the 40 programmers who competed, I was 20th...so I have no delusions I know I am an average programmer and am okay with that. I always get the job done one way or another regardless.
Funny off-topic story...the ACM Programming contest: I finished my first problem in a little over 2 hours. A friend of mine who placed, with his team representing our university, second in the world at the international contest in a previous year, finished his first program and had it judged correct in 27 seconds. (Since he had already officially represented the University twice over the years, he was ineligible for that years team and was competing just for the fun of it.) They give you the programming packets and allow you to look at them 10 minutes before the official start time, thus when the clock started he started typing and he was much, much faster typist than my 30 wpm with 5 mistakes, lol. I have nothing but respect for all of you who can put me to shame with your incredibly fast and excellent programming skills. As f
Re:This is all true however... (Score:4, Insightful)
C vs C++
PHP vs Python
All that aside, I've done some Objective-C work lately and I think I might like Obj-C over C++, due solely to the really nice init/release/autorelease mech for memory allocation. However, for server side, rock solid 5 9s uptime, I'm still a believer in Java.
Re:This is all true however... (Score:5, Informative)
I think I might like Obj-C over C++, due solely to the really nice init/release/autorelease mech for memory allocation.
Sounds like someone needs to read up on the RAII design pattern [wikipedia.org] (not to be confused with RIAA). Sensibly written C++ will automatically release memory when it is no longer used.
Re:This is all true however... (Score:5, Insightful)
I think I might like Obj-C over C++, due solely to the really nice init/release/autorelease mech for memory allocation.
I've done just a bit of Obj-C programming, and I didn't see much advantage of init/release/autorelease over plain old C malloc()/free(). What I mean is, under C, I have to remember to free() each object that I malloc(). Under Obj-C, OTOH, I have to remember to [release] each object that I alloc (or retain). In either case I need to remember to explicitly execute a cleanup/release action to match the allocate/retain action, and if I don't get it right, the object is (effectively) leaked. That means I have to manually check every code-path to ensure that each of my ref-count-incrementing actions is matched by exactly one ref-count-decrementing action, which is tedious and error-prone. It's actually even worse than that, as Objective C has several different conventions regarding how system APIs handle ref-counts... some of them will have ref-counted the objects they return and expect you to [release] the objects when you're done with them, others don't... so it's quite easy to do the wrong thing.
Compare that to C++, where I can (and do) use templates to create a reference-counting system that automatically frees objects at the appropriate time, and no explicit calls to free()/release()/decrement_ref_count()/whatever-you-want-to-call-it() necessary, ever:
void FooBar() // MyClassRef constructor increments the new object's refcount to 1 // MyClassRef copy constructor increments the object's refcount to 2
/* anotherRef's destructor executes here, decrements the object's refcount to 1 */
/* myRef's destructor executes here, decrements the object's refcount to 0, and so the object is auto-deleted */
{
MyClassRef myRef(new MyClass);
MyClassRef anotherRef(myRef);
}
With that system, there is almost no way for me to mess things up(*). I don't have to remember explicitly to call any sort of (release) or (dealloc) function for each object I create, because it is guaranteed to be called for me by the destructor of the last Ref object.
So I must be missing some key insight about Objective C's memory management system, because even with reference counting it seems almost as error-prone as C's manual memory management.
(*) One way to still mess things up would be to create cyclic references, i.e. A refs B and B refs A. But that's a problem for any reference-counting scheme, and the solution is either to avoid cyclic references or go with a full-blown garbage collector.... and I've yet to find that I need to do the latter.
Re:This is all true however... (Score:4, Informative)
You say that you have only done a bit of Obj-C programming. The problem is that for small programs retain/release is much like malloc/free, but in bigger projects it becomes a life-safer. The conventions are very easy, even if you throw some CoreFoundation object in the equation.
The main difference between retain/release and malloc/free is that with retain = "I (object calling retain) need this object to stick around" and release = "I (object calling release) don't need this object anymore". Instead malloc = "create this", free = "nobody else in this process needs this". You can see yourself that while is usually trivial to determine if an object needs something it is referencing or not, doing so for the whole process everytime you try to get rid of an object is painful.
Note that now the Objective-C runtime offers garbage collection (except on the iPhone), which is of course a good step forward.
Re:This is all true however... (Score:5, Interesting)
...C++...
The problem with C++ is that it's a crazy, crazy language. At first, it was just a superset of C, but now there's all kinds of stuff...it's mutated into a totally different kind of thing. C has this elegant simplicity going for it. There's nothing the matter with C++...except that C is (pretty much) perfect.
Also your feel dirty comment, is that because of the ease in which a poor programmer can create unstructured code? If so would it not be the fault of the programmer and not the language specifically? (i.e. Assembly for the 8088, ..286, ..386 and IBM Mainframe made me feel dirty sometimes with they way you were forced to branch, but it was fast...and no I am far from an expert Assembly programmer.
The problem with PHP (and I code mostly in it for a living) is that it wasn't 'designed' at all. Originally it was just a pre-processor, and it's grown into a full blown language from there. This is all well and good, except that there's no sort of continuity to it at all. Naming conventions? (isset vs every other 'is' function starting with 'is_', etc) Who needs them? OO? Sure...ish. PHP is great for getting things done, but I certainly feel dirty after coding in it.
FYI, personally I do not have a preference and simply choose what is convenient for me to use that will get the job done, period. I honestly do not know the nuances between them...and I am sure that there are some.
Always a good way to be.
Re:This is all true however... (Score:5, Insightful)
The problem with C++ is that it's a crazy, crazy language. At first, it was just a superset of C, but now there's all kinds of stuff...it's mutated into a totally different kind of thing. C has this elegant simplicity going for it. There's nothing the matter with C++...except that C is (pretty much) perfect.
That's all true... but I think you're missing something: all of that crazy stuff was added to C++ because it is useful. Of course, any given program will probably only need a small subset of those features, but for the programs that really do need feature X, having it available in the language is a big time-saver.
I've done a good amount of both C and C++ programming, and these days when I need to write in C I generally end up writing a fair amount of code to manually re-implement functionality that I would get 'for free' in C++.
I'd say C++ is a lot like English: a big, overgrown, complicated, mess -- and damn useful if you want to get things done. (If you care more about elegance and simplicity, there is always Esperanto, for whatever good that does you)
Re:This is all true however... (Score:5, Funny)
all of that crazy stuff was added to C++ because it is useful.
If you want crazy stuff that was put there to be useful then why not use perl ?
ducks
Re:This is all true however... (Score:5, Insightful)
Odds are you're ignoring one of the true fundamental virtues of programming: Reusability.
You see, when you have a rock stable ABI, like C affords you, you can create these things called "Libraries", which future products can then depend on, often times even in other languages like Python and Java. And those products can then be depended on, and so on and so forth until you have a whole working system.
I laugh every time I hear someone say something like "Oh C++ has [blah] "for free"". No, you don't have it for free, someone else just coded it, stuck it in your fat C++ library and now 10 years later people bicker about whether it was actually the right approach to standardize so much of this crap, when so many different "standard libraries" are so totally and hopelessly incompatible.
C's standard library is so spartan that you can write your own "standard library" full of goodies like lists and queues and trees and other time savers, and you never have to get into such arguments to begin with.
Or, if you're incredibly lazy, you can use some of the community maintained, amazing C libraries that already exist. My personal favorite happens to be GLib, but anyone who's written enough code in C to have an opinion on the subject has probably written one of their own or come across one they like as well (such as eGLib in Mono, the Apache Portable Runtime Library in Apache, and the list just curls on...)
So yeah, all of that stuff was added to C++ because it was useful... Just as long as you're working on one project, with one version of [OS], with one compiler...
Re: (Score:3, Insightful)
Embedded device toolchains often let you use a subset of C++ that includes part of the the STL, since EC++ does include an STL Subset.
However, there is no real reason for that, as full C++ can work just fine, assuming a good C++ implementation. I'll admit that on a micro-controller, you might have severe issues with C++ (because even a tiny bit of unnecessary overhead in unacceptable on those), but somewhat less constrained applications full C++ is definitely possible. (Even though many people refuse to bel
Re:It doesn't matter as long as it's on Linux (Score:4, Insightful)
The you probably have either not used it much at all, or else you have used it far too much.
C or C++ (Score:5, Informative)
The *nix API is in C.
Alternatively, you could look at Perl, as well.
If you're really desperate, you could use Mono, but I wouldn't recommend it.
How about (Score:4, Interesting)
You really should have a good grasp of the concepts of programming languages, so that you can work with the bulk of projects that come your way.
A little scripting, a little functional, a little procedural, a little OO, all combine to make Jack a versatile hacker.
Fortran or Assembler (Score:4, Funny)
REAL PROGRAMMERS SPEAK IN UPPER CASE.
Real programmers program in FORTRAN. If it can't be done in FORTRAN, then write in assembler. If it can't be done
in assembler, it's not worth doing!
http://www.sorehands.com/humor/real1.htm [sorehands.com]
Re: (Score:3, Insightful)
Mono has to play catch-up with Microsoft's .NET framework, and is usually a full version number behind. There are also some patent concerns with parts of .NET, especially the non-standardized parts like Windows Forms. The free Java implementations had the same problem until Sun's release of the official Java under the GPL.
So yes, you can develop for Mono if you wish, but be prepared to always have to use an older version of C# and everything else related to .NET if you want full compliance.
Re:C or C++ (Score:5, Interesting)
That's only if you need features from the latest versions of MS.NET, mostly in the cases of porting existing applications. Mono is a strong platform in its own right and perfectly suitable for developing Linux applications.
And you do NOT need to use an old version of C#. The compiler is C# 3.0 compliant and they plan on adding C# 4.0 support shortly after it is released.
Thanks for playing.
Why I hate mono (Score:5, Informative)
Try it. You'll be soon warning people away from it, too. C# programming is one thing (it's just a language), but the mono/.NET libraries will have you banging your head against the desk before long.
I might have a skewed perspective. When I started working with mono, the big selling point was that we could use all the tools and processes on Windows (our development environment is standardized for the whole company's development department and has years of process development work in it), then deploy applications on our Linux servers (we were even using SuSE). Not so fast. Some of the data access libraries work different (tests that pass on .NET fail on mono). Most of those nifty widgets and reporting tools you're using in Visual Studio won't work at all, because they rely on GDI or other native Windows services/APIs.
We eventually abandoned mono (and .NET for that matter, other than existing production applications), and we are now mainly using Java (it is the COBOL of the 21st century, after all). Deployments on our JBoss servers work exactly the same, whether they are on Windows, or Linux, and so far we have not encountered a single bug that we had to work around because the vendor's response was "Yes, that's a known issue and will be fixed in the next commercial release." (!!)
I like Python (Score:5, Interesting)
Re: (Score:3, Insightful)
I don't like Python. Not one bit, but I'm willing to admit that my dislike is mostly aesthetic, which has prevented me from really exploring it, so I can't debate its pros and cons with any pretense at having made an informed decision.
That said, the idea of using whitespace as syntax ... well ... Oh God, I can't lie, it's horrible. But. But! There's ways around it. Ideally a code editor would make line-leading whitespace visible while keeping the rest invisible. Once you get more than one person working on
Re:I like Python (Score:4, Insightful)
That said, the idea of using whitespace as syntax ... well ... Oh God, I can't lie, it's horrible. But. But! There's ways around it. Ideally a code editor would make line-leading whitespace visible while keeping the rest invisible. Once you get more than one person working on a project, different indentation preferences (expand tabs to spaces vs. not) it's ridiculously easy to have weird mistakes creep in.
Look, this is everyone's biggest beef with python if they are not yet proficient at it. Somehow, we have come to believe that whitespace is sacred and that a language shouldn't tell us how to use it. I'm not sure how to convince you otherwise except this: don't knock it until you have tried it. Once you really delve into the language, you will wonder why anyone ever would program in any other language for general purpose programming.
Now, to more directly address your whitespace concerns:
So give it a try and quit spreading FUD to all of those people who want "control over their whitespace". There are bigger things to think about, like whether you or someone else will be able to comprehend or reuse your code in six months.
Re: (Score:3, Insightful)
It's not FUD, and it's not my whitespace that I'm worried about. I'm an absolute nazi about getting it right (tabs for indents, spaces for alignment!).
One issue with it is, it's a pain in the ass to get most code editors to leave it alone. Granted, that's a flaw in the code editors, but it doesn't change the reality that if you sit down at some terminal that you haven't carefully configured, editors do all kinds of funky things to your whitespace. Expand tabs to spaces. Strip blank line indentation--I know
Re:I like Python (Score:5, Insightful)
Just for your information, Python isn't picky about spacing inside of open parentheses (or brackets) so you are free to express yourself there. I used to feel the same way as you do about whitespace as syntax, but now I actually appreciate it.
The real advantage to whitespace as syntax is that everyone has to follow the same rules, and the rules are sane. I once worked in an environment where the Perl hackers that wrote the original code didn't believe in indenting at all (they all used nano as their editor). Collaborating with people that don't believe in indenting at all is quite difficult. After that, I was glad to use a language that requires some indentation.
Re:I like Python (Score:4, Funny)
import antigravity
Enough said.
Re: (Score:3, Informative)
There's a standard: It's spaces.
From http://www.python.org/dev/peps/pep-0008/ [python.org]:
Re:I like Python (Score:5, Insightful)
That'a reminds me of something else I like about Python.. its language is documented.
Re:I like Python (Score:4, Funny)
4 spaces. Not 5. 5 is right out.
Re:I like Python (Score:5, Funny)
<VOICE type="Jean-Luc-Picard>There are FOUR SPACES!</VOICE>
Re:I like Python (Score:4, Informative)
According to: PEP 8, Style Guide for Python Code, each indent should be four spaces.
http://www.python.org/dev/peps/pep-0008/ [python.org]
Re:Tabs are EVIL (Score:4, Insightful)
Therein is YOUR problem, not mine. Tabs are evil only if the programming language makes them evil. Tabs are a highly efficient way to program and keep indentation. It allows developers to view the code a bit more in their preferred style so it's easier for them to read (2 spaces, 3 spaces, 4 spaces or I've even seen 8 spaces.) Not using tabs makes it more difficult to edit the code or share code. If you create a template of code that's indented using spaces, you pass me a piece of code that doesn't look right with my code and is harder to read in the overall scope of things. Also, if you use formatting to show your intentions in the program you probably need to rework your program to better make sense or make use of the language constructs.
When I get a source file indented with spaces, I then waste time converting these spaces (and the alignment specific readability) you made. I say alignment specific readability because you thought it would be more readable to put all your arguments on a line of their own and hit just enough spaces to line them all up just right so it's readable for YOU on YOUR screen. Now I get your code and it only uses up 25% of my screen width and I now have to scroll up and down more because of your style.
By using spaces (and according to your post "tone"), you are essentially telling me that you are an arrogant programmer only thinking of your own stylistic ways and methods and that you will never work well with other people unless they do it your way. Even then, you will likely criticize that person for spacing something wrong. You strike me as a micro management type person.
Ideally, my perfect language/editor would format the file as it was loaded. Source code would not rely on indentation to function properly and line feeds would be meaningless. Each source file would be saved compressed without formatting. Each developer could open that file and it would format to their style.
Language you need to be proficient in. (Score:5, Funny)
Hindi.
Re:Language you need to be proficient in. (Score:5, Funny)
Regards,
Anonymously Cowarding
How much do you want to learn? (Score:5, Informative)
C/C++, C#, Objective-C, Java, Python, Perl, [insert language of choice]
All can be used to do Linux development.
KDE, stick to C++ and Python.
Gnome, stick to C and C# and Python.
GNUStep, stick to Objective-C
Java and Perl and any other language you choose can be used as well, but the desktop environment support for them is little to non-existent, depending on the language.
Re: (Score:3, Interesting)
Re: (Score:3, Interesting)
Yeah! I mean, it's only used in the most widely used desktop environment. And it's only leaps and bounds better than the usual drek.
Why not stick with C#? (Score:5, Interesting)
http://www.mono-project.com/ [mono-project.com]
Re: (Score:3, Insightful)
Hm, OP mentions that he already knows C#, but would like to develop on linux. Parent mentions that with Mono, C# is an option for developing on linux, even providing a helpful link. Parent gets modded down.
Sigh. Sometimes /. gets to me...
Learn C and Python (Score:5, Insightful)
C will give you a good base for learning how the system calls and libraries work, but Python is a lot more fun and better for any program where being close to the metal is not important.
And seriously, if you use a decent text editor, in a few weeks you'll forget Python's indentation conventions ever bothered you.
Re:Learn C and Python (Score:5, Informative)
"We had on average 4 bugs a week due to the indentation bullshit, each of which took multiple hours to debug."
Any chance you could name the company you work for?
Because I want to avoid your products.
Re:Learn C and Python (Score:5, Funny)
Re:Learn C and Python (Score:5, Informative)
Python is absolutely unusable on real world projects (any project where you aren't the sole developer) due to that indentation crap.
Would you mind repeating that? I don't think the guys developing the following projects heard you:
I could go on... but you get the point.
If your software team is having problems with the significance of white spaces in Python, my bet would be that, no offense, the team was to blame.
The trick is to coordinate the "white space rules" between members of the team. If it can't pull that one off, I wouldn't trust them to write code for a production system anyways.
Re:Learn C and Python (Score:4, Informative)
Python is absolutely unusable on real world projects (any project where you aren't the sole developer) due to that indentation crap.
It's fine if you don't like Python and don't want to use it, but to say that it's completely unusable on real world projects is a bit absurd [python.org]. And while you may find it hard to read, I think it's obvious because if it looks like code is a block, it is. The main trick to read and follow PEP-8, use a decent editor and write unittests.
Re: (Score:3, Insightful)
Re:Learn C and Python (Score:4, Insightful)
I like my code clean and concise. If some idiot (your term for them) is stupid enough not to either add braces to blockify the statements or use the comma operator to keep it as a single statement, they'll learn quickly enough. In a modern editor, if you cut-n-paste the code, it will adjust the indent accordingly, and it will be painfully obvious where they went wrong.
I belong to the school of thought that holds that if it looks ugly, it probably isn't done right. At the office, I'm not ashamed to have others review my code - it's cleaner, more of it fits one one screen at a time, so you can get a quicker grasp of it, etc. Those benefits outweigh the risk of an incompetent coder having a brain fart.
Remember, the purpose of source code is to communicate intent - first, to the compiler, second, to you and anyone else reviewing it. The compiler doesn't care, but people aren't compilers.
Heck, I've seen people who are so unsure of how the language works that they blockify the contents of their case statements, put a break after the last statement in a switch, and braces around every one-line else clause because they're not *sure* as to which "if" the compiler will think it belongs to. These same people always end up being the ones who have code that is indented so much that most of the action takes place in the right-hand margin, and they also indent every parameter that far as well, rather than let it word-wrap, or clean up their code. And they've done so much drag-n-drop of code that it's a mishmash of spaces and tabs.
They inevitably learned on Windows. They feel they need an IDE with auto-suggest, templates for almost every type of project, and built-in "project management" because they can't write a make file to save their lives ... when deprived of Visual Studio, they fall back on compiler shell scripts rather than ask for the nickel tour of "make", or *gasp* buy a book and read it!
Clean, concise code - it's not just good looking, it's cheaper to debug and maintain.
Re:Learn C and Python (Score:4, Informative)
Trolling? I'll bite.
Free: http://pythonide.blogspot.com/search/label/spe [blogspot.com]
Free: http://die-offenbachs.de/eric/index.html [die-offenbachs.de]
Free: http://docs.python.org/library/pdb.html#module-pdb [python.org] (and included with Python)
Commercial, but excellent (my team uses it): http://www.wingware.com/ [wingware.com]
Commercial: http://www.activestate.com/Products/komodo_ide/index.mhtml [activestate.com]
If you really love Visual Studio for some reason: http://www.activestate.com/Products/visual_python/index.plex [activestate.com]
If you love Eclipse: http://pydev.sourceforge.net/ [sourceforge.net]
And for the lazy, "import pdb; pdb.set_trace()" has always been my favorite way to debug python software. Add that line anywhere; get a breakpoint. Make it conditional with an if statement.
Not to mention introspection right down to the bytecode at runtime (there is even a Python module that lets you edit the bytecode at runtime, if you are sufficiently crazy).
In short, you have not used Python for more than 10 minutes if you really think the debugging isn't good.
IHBT. HAND.
Mono (Score:4, Informative)
Mono [mono-project.com] could make the transition very easy for you, depending on what your doing.
Re:Mono (Score:4, Insightful)
This is being modded as flamebait but it is actually a valid suggestion considering that the OP is coming from a MS background. Mono will allow the OP to ease their way into development in in a 'nix environment without having to jump in headfirst with a language or languages that bear little semblance to the tools they're already using. It's all well and good to suggest that the OP start learning C, Python, Perl, $_nonMSLanguageOfChoice but looking at it practically it makes more sense to transition more slowly.
It is also worth pointing out that the parent didn't say anything inflammatory like "Don't, just stick with MS and .NET," or "Linux is for phags!!!!1" They simply offered another option with the suggestion that they start with something familiar. Disagreeing with someone doesn't mean your mouse should instantly jump to the flamebait or troll options.
What do you want to develop? (Score:5, Informative)
Do you want to develop KDE apps? How about GTK apps? Do you want to submit kernel patches, or create system utilities?
You may want to be more specific, however - C, C++, Perl and Python are pretty much the norm.
C/C++ (Score:5, Interesting)
Take a look at Qt and Gtk. They're the two big GUI toolkits. I personally like Qt more, it's better documented and much easier to get running in Windows (and macs). As for the python, there's nothing wrong with its indenting. The problems of the language are much deeper. No language is going to be perfect, it's a tool
As for IDE's, if you're coming from a MS background take a look at the latest netbeans. It's a little slow (fine on new hardware though) and a bit better than Eclipse for C/C++ support.
Re:C/C++ (Score:5, Interesting)
C/C++ are the languages you'd want to go for. They can do *everything*, have great support, are fast etc.
Let's be honest here. C and C++ are very fast indeed if you use them well (very little can touch them; most other languages are actually implemented in terms of them) but they're also very easy to use really badly. They're genuine professional power tools: they'll do what you ask them to really quickly, even if that is just to spin on the spot chopping peoples' legs off. Care required!
If you use a higher-level language (I prefer Tcl, but you might prefer Python, Perl, Ruby, Lua, Rexx, awk, bash, etc. - the list is huge) then you probably won't go as fast. But unless you're very good at C/C++ you'll go acceptably fast at a much earlier calendar date. It's just easier for most people to be productive in higher-level languages. Well, unless you're doing something where you have to be incredibly close to the metal like a device driver, but even then it's best to keep the amount of low-level code small and to try to get to use high-level things as soon as you can.
One technique that is used quite a bit, especially by really experienced developers, is to split the program up into components that are then glued together. You can then write the components in a low-level language if necessary, but use the far superior gluing capabilities of a high-level language effectively. I know many people are very productive doing this.
Re: (Score:3, Informative)
As for C/C++ IDEs I've tried and disliked both KDevelop and Anjuta, Eclipse/CDE and Sun's netbeans based stuff are quite nice, but my poor little laptop doesn't like them.
I ended up settling with Code::Blocks, it's lightweight and native (C++/wxWidgets) and supports all the de-factor features.
Re: (Score:3, Interesting)
Comment removed (Score:5, Insightful)
Re:Java (Score:5, Insightful)
I second Java. It's very fast, very portable, well-supported, scales from embedded to enterprise, has great IDEs, is open source, and has a huge body of libraries, sample code, and support.
I'm not sure why you call your fear of Java "healthy". Fear of any particular technology is unhealthy-- it prevents you from making rational decisions about them.
Re:Java (Score:5, Insightful)
The reason to fear Java doesn't really have much at all to do with any merits of the language itself. The reason you should fear Java is that it doesn't really add anything to your resume to distinguish you. There are, frankly, a LOT of extremely mediocre programmers on the market, and a common attribute they share is that they only know Java.
That said, DO learn Java. Not knowing how to use one of the most popular tools in your field is also not a smart idea. Just don't by any means think that your education is done.
For what it's worth, here are the four major things I look for when interviewing programmers.
1. Do you know C? (whether you are going to be programming in C is irrelevant)
If you don't know C, you probably have very little understanding of how computers work. C is language you can depend on to be on pretty much every platform; C is the language external APIs and foreign function interfaces are specified in; C gets the job done when all your layers of abstraction fail you.
2. Do you know a functional language such as Lisp, Scheme, or Haskell?
Programming in a functional language changes the way you think about programming in general. Programmers that understand functional programming generally are able to produce better solutions to problems even in imperative languages. Structure and Interpretation of Computer Programs is available online for free. Read it today and improve your skillset.
3. Can you write a compiler from start to finish?
The theory surrounding language parsing (automata, state machines, regex, grammars, etc) is fundamental to computing. In fact, computing itself is usually defined in terms of it. Once you understand it, you find you apply it all the time.
The ability to translate high level languages into optimized machine instructions requires that you understand your platform at every level. This is important because it lets you understand the tradeoffs you are making when you choose one tool or method over another.
4. What is your current personal project?
What your project is doesn't matter all that much, as long as you have one. Good programmers are usually always working on some personal project that excites them.
Re:Java - A healthy fear (Score:5, Insightful)
I too have a healthy fear of Java, but that is changing.
I feel it VERY important to state that Java apps as a general rule are bloated crap.
I also feel it VERY important to state that Windows apps as a general rule are bloated crap.
I used to avoid Java like the plague due to the slow bloated feel of the apps I had used. Fortunately, recently I was forced to write a Java servlet because a library for that I wanted to use was a java library and it was the only one with a license acceptable to the project I was working on.
In the course of writing the Java servlet I came to learn that Java and the JVM aren't the problem, its just the poorly written apps that I've seen. I meantioned Windows above because it suffers from the same misconception to most non-techies (techies have their own more legitimate reasons for disliking it). Most Windows (and Java) developers suck. They aren't developers, they are people who wrote an app for some other reason. Whatever that reason my be isn't important. Whats important is that we see a lot of crappy Java and Windows apps because those are things that lots of people have easy access to. Pretty much EVERYONE has a Windows machine of some sort they can use, and most of those Windows machines hava JVM. Since you can easily setup a Windows or Java development machine for little to no cost or technical ability, the barrier to entry is low enough that those non-developers can write bad apps that give the language (or OS) a name as a poor performer, when in reality, 99% of the time, the app is the issue, not the engine under it.
I write this post as a former Java hater, who now maintains a servlet that services hundreds of thousands of hits a day, certainly not the biggest web app by any standard but it is a high performance application doing image manipulation in 'real time' for its end users. I still think you should learn C (C++ is good as well, but do C first IMO and you stand a better chance of using object oriented languages properly rather than abusively), but if you are a good programmer, Java can be an excellent language and runtime enviroment to build on. I would not have wanted to write my web servlet in C or C++ in this case.
So for the Java haters, just think about why you hate Java. Do you hate it because of the shitty apps you've used, or because there REALLY is an actually problem with it?
Re:Java (Score:4, Insightful)
That's because you can get within a few percentage points of native code performance with Java's VM.
Most of the people who are hesitant to use "managed code" are old codgers, elitist fruits and brainwashed newbies who have to be forced into new paradigms, instead of being genuinely interested in new trends.
It's best to avoid types.
Re: (Score:3, Informative)
This is generally only true if you let the Java VM use *FIVE TIMES* as much RAM as a C program. Java needs that much RAM to do efficient garbage collection. Using less than that causes more collection cycles to run, slowing everything down.
The other bad thing about Java is that if your program ever needs to use 300 MB, it will *always* use 300 MB forever after.
Re:Java (Score:5, Insightful)
Managed code performance is good enough for essentially anything aside from high-performance video games (and even that isn't far off).
"Java is slow" is a stupid old myth. Does it not occur to you that JIT compilers compile to native code?
Re:Java (Score:4, Interesting)
"Java is slow" is a stupid old myth. Does it not occur to you that JIT compilers compile to native code?
Ahah ? You should tell that to people who develop applications delivering only 1000 pages per second on a 8-core machine where equivalent plain-old C easily delivers more than 10000 pages per second on a single core of the same machine. Surely the GC is at fault, everything related to object management is at fault, the memory footprint voiding all cache efficiency is at fault, in summary, the language is at fault.
An yes, that's what I see in enterprises.
I think the real problem with Java developers is that they have been told that what they did was fast, and they believe it. But let's face it : when processing an HTTP request burns ONE JOULE there is definitely a problem. No wonder why datacenters are filling that fast...
Everytime a Java developer tried to prove me wrong, he showed me he was able to reach performance levels I was able to reach 10 years ago on an obsolete machine. "Look: 500 pages per second on this small 4-core xeon !". Well, I do 2000 on my 2.5W, battery-powered Geode computer, and that is small.
So please stop spreading bullshit about efficiency of such things, there are people who believe you and now we find their crap sucking all the power of datacenters.
Re:Java (Score:4, Insightful)
Java was designed for networked applications.
It shows because the Java stack and libraries written with it rarely have built in flaws that allow computers/servers to be compromised.
So there's one reason and it's a big one if you think about it.
Re:Java (Score:4, Insightful)
import slashdot.reply; public class Reply { public static void main(String[] args) { try { I hate Java for one single reason: to express any idea you need 3 times as much code. } catch (Exception e) { and the whole idea of checked exception is simply silly. } } }
Re:Java (Score:5, Insightful)
I was also curious about your "healthy fear of anything Java" .NET experience Java is a significantly more mature language than C#. You are more likely to get better performance and stability out of Java's virtual machines just because they've had more time to be beat up by a vast community of developers. M$ did a good job of getting C# out the door but like any child it has some growing up to do.
Really? You are way too young to be developing "healthy fears". Java, like *every other language, has its issues but there is nothing abnormally nasty about it to treat it like a plague. Specifically relating to your
As many of these posts have mentioned: Don't limit yourself. Try everything. Obviously for Linux purposes knowing C (and a healthy amount of Bash scripting and Perl) is useful purely because the OS is built on it BUT for developing applications on top of it many languages have benefits depending on what you are trying to implement and so eliminating anything from your list will hurt you in the long run.
"Free your mind and the rest will follow"
-En Vogue
Re: (Score:3, Insightful)
Specifically relating to your .NET experience Java is a significantly more mature language than C#. You are more likely to get better performance and stability out of Java's virtual machines just because they've had more time to be beat up by a vast community of developers. M$ did a good job of getting C# out the door but like any child it has some growing up to do.
Rampant bullshit. You'll get somewhat better performance out of HotSpot than the Microsoft or Mono CLRs--not that much better, but definitely better--but in almost seven years of using .NET regularly (I started in March '02), the CLR has not been the cause of a single crash in anything I do. "Good job of getting C# out the door" my ass, you troll, it's been just shy of seven years since its release!
(And if you want to be taken even remotely seriously, drop the childish "M$" crap.)
Re: (Score:3, Insightful)
It is more mature, but C# fixes a lot of what is wrong in Java (lack of automatic boxing of primitive types anyone!).
To compare them, they are both completely adequate for the same problem domain. Also consider that Java 2 was a reboot of Java so you kind of have to go off of that as your starting point, with that taken into consideration, you really only have a few more years of maturity for Java.
What do you want to program? (Score:4, Interesting)
That is the first question you should ask yourself, actually. ;)
One thing you might learn, from a tinkering-with-Linux point-of-view, is shell scripts. Surprised no one mentioned them yet. They aren't really "programming" in the sense of creating apps, but they are fun and a cool part of Linux.
Re:What do you want to program? (Score:5, Interesting)
* for example using kdialog
A valuable skill (Score:4, Insightful)
learn to write cross-platform applications
It isn't that hard, just pick a programming language that's available on both Linux and Windows and try to write programs that work on both Operating Systems. It can be done with some care!
Re:A valuable skill (Score:4, Insightful)
Exactly, and the best tool to do that with is QT4 from Trolltech.
Using their new, free, Qt-Creator GUI RAD IDE one can write source once and compile for either Linux or Windows.
Qt-Creator is available for free on both platforms.
With careful use of compiler defines one can also, with the same code, write against Oracle and PostgreSQL in the same source and compile on either platform without changing a line of code.
Compile in the static mode and you won't have to worry about missing libraries.
Re:A valuable skill (Score:4, Informative)
And you're stuck GPLing everything or paying for a license before you do any development. Stupid and shitty.
Re:A valuable skill (Score:5, Insightful)
None. (Score:4, Insightful)
Re: (Score:3, Insightful)
Damn straight. Focusing on one language will cripple you. Learn as many languages as you can; you'll be a better programmer for it. Learning Smalltalk taught me about OO. Learning Forth taught me about code factoring and reuse. Learning assembly taught me C (and learning C taught me assembly). Learning Python taught me about the joys of good libraries, and learning Lua taught me how awesome a tiny, fast scripting language can be. And learning Haskell taught me how much I have still to learn.
There are a lot
C, Java and Python. (Score:5, Insightful)
This question is remarkably easy.
The UNIX API is written in C. If you don't know C, you won't be able to understand UNIX system calls.
Beyond that, learn Java and learn Python. You yourself say you have a "fear of Java." Sounds like a pretty good reason to learn it. Likewise, you say you're not sure about Python's use of indentation. Sounds like another good reason to learn it.
It is usually good practice to learn one new language a year. These recommendations should be seen as beginnings not endings.
My final bit of advice is to learn PROLOG, LISP, Haskell or Erlang. And by 'learn,' I mean 'become fluent in.' These languages are radically different from anything you've experienced before. Learning how to think differently about problems will make you a much better programmer, regardless of what language you ultimately wind up using in the private sector.
Re:C, Java and Python. (Score:5, Insightful)
My final bit of advice is to learn PROLOG, LISP, Haskell or Erlang
If the original poster ignores every other post, and every other sentence from your post, and just reads this, then they will have the correct answer.
Learning `Linux' means learning POSIX / SUS. Then it means learning whatever library you use on top of these. It's not an interesting problem. Learning Prolog, Lisp, Haskell, Erlang, FORTH, and Smalltalk will teach you how to think about writing code, even if you never use any of these languages to write a real application.
There is no such thing as C/C++. (Score:4, Insightful)
As usual, people are talking of "C/C++".
However there is no such thing. There is C, and then there is C++. They are very different languages.
C++ suffers from a rather poor reputation because most people don't really know it, and because most code that has been written in it is really C-ish (C with classes) or worse, Java-ish (as if C++ was about OOP...).
Anyway, my point is that it's a language that needs to be learnt separately from C altogether.
It's both as low-level and as high-level as you want, bringing you the best (or worse, depending on how you use it) of both worlds.
Re:There is no such thing as C/C++. (Score:4, Insightful)
Another person complaining about the use of the term "C/C++". I hear this all the time, "it's so ignorant when people say C/C++".
Well perhaps it isn't an ignorant lumping-together of two distinct programming language, but a mention of the common ground between the languages, or shorthand for "C or C++".
For instance, I might say, "You should never dereference a null pointer in C/C++". Here I am not naively referring to C/C++ as a language. I am merely saying that you should never dereference a pointer in C, or C++ -- take your pick which language I am referring to because my statement applies to both.
I could just as well say "types are computed at runtime in Perl/Python", for the same reason.
Please try to keep up. (Score:3, Funny)
Erlang and Haskell, of course. Just the other day here Intel told us all how only functional programming can save Moore's law.
C first, then whatever you want (Score:5, Insightful)
C first. It is the lingua franca of the Unix world. Even if you don't use it for yourself, you have to understand it because so much is written in it. And if you don't understand it, no one will take you seriously. One of my first Linux installs was so I could teach myself C cheaply and I needed a free, as in beer, compiler.
Then after that, any language that you think might be interesting. Try multiple languages. I personally like Ada and there's a free GNAT Ada compiler for Linux.
Fear of Whitespace (Score:5, Insightful)
I just started learning Python a couple of months ago (I come from a Perl/PHP web development background).
Really, get over the whitespace-indentation thing. It's such a small thing to get hung up on compared to how much more powerful, elegant, and flexible the syntax is (for starters). That, and it encourages you to indent source code properly anyway.
IndentationError (Score:5, Insightful)
If something like indentation is a show-stopper for your choice of language, then you are missing the point.
Computer languages are about data structures and idioms for manipulating them efficiently. In contrast, whitespace is a cosmetic, superficial thing.
Yes, I adore Python. (I wish I had paid attention to it ten years sooner than I did.)
LOLCODE (Score:5, Funny)
Develop in LOLCODE:
http://lolcode.com
"HAI WORLD" Example:
HAI
CAN HAS STDIO?
VISIBLE "HAI WORLD!"
KTHXBYE
I'm doing contract work right now, and won't my client be pleasantly surprised to see the project completed in LOLCODE... ROFLMAO!!! I can haz milestone payment?!?
Indenting code (Score:3, Insightful)
Have you ever actually tried using python? I am very much in favor of capital punishment for everyone who doesn't properly indent his code in other languages anyhow, so being forced to indent in python wasn't really a problem for me. I do not understand why people keep bringing up this argument, there are valid reasons [python.org] why python was designed this way and it is something you get used to after 5 minutes. And if you really insist on using braces, you can still use them:
if button_pressed: #{
launch_missiles() #this line must be indented but slashdot does not allow me to
#}
Re:Indenting code (Score:5, Insightful)
this line must be indented but slashdot does not allow me to
A very good reason to use a language that delimits its blocks explicitly. C will work great even in forums that lose their linebreaks. (Perl too? I don't use it enough to know.)
Re: (Score:3, Insightful)
Programming for Linux? (Score:5, Insightful)
Your first problem is thinking a programming language is for linux development, and perhaps another is for windows development.
What you should actually be asking yourself is, what is the problem I'm trying to solve, not what is the os I can use.
Your question as stated has a million unquantifiable answers (heck, if you don't have a problem to solve, ASP.NET is just fine on linux). Ask the right question, what programming language should I use to solve problem x, and now you will get intelligent answers, and at least one remark about turing complete languages are all turing complete.
/rant off
Lern LOGO! (Score:5, Funny)
I hear it's going to make a comeback as soon as they add support for DirectX 10!
PEN DOWN
FORWARD 10
TURN RIGHT
FORWARD 10
TURN RIGHT
FORWARD 10
TURN RIGHT
FORWARD 10
Re: (Score:3, Informative)
There are some languages that legitimately aren't going anywhere any time soon. This is especially true on *nix platforms.
C, C++, Common Lisp, Java, Perl5, Bash scripts. They were here 10 years ago, and they'll be here 10 years from now.