Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 1 Jul 2016 11:57:10 +0400
From:      Dimitri Minaev <minaev@gmail.com>
To:        Allen <bsd_atog@comcast.net>, freebsd-questions@freebsd.org
Subject:   Re: "Simple" Languages in FreeBSD
Message-ID:  <57762256.7070106@gmail.com>
In-Reply-To: <20160630175243.063e07a7@KoggyBSD.org>
References:  <20160630175243.063e07a7@KoggyBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 07/01/2016 01:52 AM, Allen wrote:

> Literally anyone who responds with an opinion, I'm interested. Being
> easy to learn for someone who isn't great with Math but does understand
> Unix is a plus but not a requirement. I was starting to teach myself
> Ruby on a Linux box I was using for a while and Ruby did seem to be
> going OK, but a lot of the FreeBSD Books I've bought recommend Perl,
> and I've also had just as many reasons from people saying to try
> Python, so basically any Language and what reasons would be great.

A huge part of my job is automation in UNIX and 99% of it is done in 
Bash. IMHO, shell is a must for anyone working with UNIX, even though 
it's not really a programming language in the common sense. About 15 
years ago I used Perl often and I remember it as a very natural language 
very similar to shell, but better. The syntax may sometimes look 
strange, but most of the time Perl by default does exactly what you want 
it to do.

The Python is in fashion these days. They say it's easy to learn and has 
a clean syntax. Perhaps, I'm getting too old to learn new languages, but 
I found Python verbose and awkward. The trend introduced by the 
object-oriented languages of the last decades makes the programmer use 
various helpers, wrappers, proxy objects, singletons and other 
doubtlessly useful but clumsy contraptions. For example, let's write a 
simple script that runs a program, reads its output and feeds it to the 
stdin of another program. In Perl, it's as straightforward as this:

open(P1, "ls -la |");
open(P2, "|grep ^d");
while (my $l = <P1>) {
	print P2 $l;
}

Quite natural, eh? Now, Python:

import subprocess
a = subprocess.Popen(["ls", "-la"], stdout=subprocess.PIPE)
b = subprocess.Popen(["grep", "^d"], stdin=subprocess.PIPE, 
stdout=subprocess.PIPE)
ls = a.communicate()[0]
r = b.communicate(input=ls)[0]
print(r.decode())

I'm sure there are other ways to do the same in a more concise way using 
external Python modules like 'sh', but the idiomatic way, AFAIK, is the 
one used above.

Besides, Python, however logical it is, may be unpredictable. For example:

In [1]: a=99
In [2]: b=999
In [3]: a is 99
Out[3]: True
In [4]: b is 999
Out[4]: False

I found Ruby to be more like Perl. Even though it is an object-oriented 
language, it has many shortcuts that make things simpler, like using $_ 
variable to store the last read string. But I never liked OOP and put 
Ruby away.

So, from the practical point of view I would vote for Perl. Some would 
say it's too old, but hey, it's still more popular than Ruby, according 
to TIOBE index: http://www.tiobe.com/tiobe_index

But the popularity shouldn't be crucial in the language choice. If 
you're going to learn programming languages for fun, have a look at some 
less popular alternatives. One of them is my favorite Tcl. It's a 
language with very simple syntax, underestimated but powerful. Many 
utilities used in other languages, were born in Tcl: Sqlite, Expect and 
Tk GUI, to name a few. It's still very popular as a built-in language in 
network hardware. It may lack some libraries supporting modern protocols 
(AMQP, for example), but programming in Tcl just feels great.

Another interesting language is Scheme. There are many dialects of this 
uncommon but beautiful language. Racket has one of the largest 
libraries, but it's rather a language for students and teachers than for 
the real world applications. Chicken Scheme and Guile are way more 
practical and just as rich.

Other options include Erlang and Haskell. Go language is also 
interesting, but it is IMHO a language for real programmers.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?57762256.7070106>