|
Softpanorama
(slightly skeptical)
Open Source Software Educational Society |
May the
source be with you,
but remember the KISS principle ;-)
|
Scriptorama: A Slightly Skeptical View
on Scripting Languages
This is the central
page of the Softpanorama WEB site because I am strongly convinced that the development
of scripting languages, not the replication of the efforts of BSD group undertaken
by Stallman and Torvalds is the central part of open source. See
Introduction for more details.
Contents
Standard topics
Main Representatives of the family
Related topics
History
As scripting languages are really important computer science phenomena usually
happily ignored in university curriculums instead of mini-tutorial this area
deserves a well research article on Softpanorama. This even more important in
view that this site that promotes scripting language as an alternative to mainstream
reliance on "Java and friends" for almost a decade. Please read my introduction
to the topic that was recently converted into the article:
A Slightly Skeptical View on Scripting Languages.
The uniqueness of this site is that this it can be considered to be one of very
few site that has a neutral toward different scripting languages. I consider
none of them perfect and recommend to use several as the fate of any single
scripting language can quickly change if the leading developer abandons the
project or became seriously ill. Perl 6 saga is just a warning. But due to the
lack of time I currently (more or less) maintain pages for only five major scripting
languages: Perl, TCL, Python, JavaScript/Flash and PHP (the latter is currently
very primitive as I do not use it much personally).
Although personally I use mainly Perl and Python, the language comparisons I
offer here are not intended, in any way, to slight any language. I try to find
strong points of each language and to show that the selection of the language
much depends on the spectrum of tasks that most frequently perform. It is one
thing to write WEB portals and the other supporting Unix administration scripts
(for example hardening scripts). Also some scripting languages are slightly
higher level then others although all of them are higher level them Java and
C++ (in a sense that programs for a particular set of problems are shorter).
The also differ in a level of integration with base OS (for example, Unix).
Unix proved that treating everything like a file is a powerful OS paradigm.
Is a similar way scripting languages proved that "everything is a string" is
also extremely powerful programming paradigm.
| Unix proved that treating everything
like a file is a powerful OS paradigm. Is a similar way scripting
languages proved that "everything is a string" is also extremely
powerful programming paradigm. |
Along with pages devoted to major scripting languages this site has many pages
devoted to scripting in different applications. There are more then a
dozen of "Perl/Scripting tools for a particular area" type of pages. The most
well developed and up-to-date pages of this set are probably
Shells and
Perl. This page main purpose is to
follow the changes in programming practices that can be called the "rise of
scripting," as predicted in the famous
John Ousterhout
article
Scripting:
Higher Level Programming for the 21st Century in IEEE COMPUTER (1998). In
this brilliant paper he wrote:
...Scripting languages such as
Perl and Tcl represent a very different style of programming than system
programming languages such as C or Java. Scripting languages are designed
for "gluing" applications; they use typeless approaches to achieve a higher
level of programming and more rapid application development than system
programming languages. Increases in computer speed and changes in
the application mix are making scripting languages more and more important
for applications of the future.
...Scripting languages and system programming
languages are complementary, and most major computing platforms since the
1960's have provided both kinds of languages. The languages are typically
used together in component frameworks, where components are created with
system programming languages and glued together with scripting languages.
However, several recent trends, such as faster machines, better scripting
languages, the increasing importance of graphical user interfaces and component
architectures, and the growth of the Internet, have greatly increased the
applicability of scripting languages. These trends will continue over
the next decade, with more and more new applications written entirely in
scripting languages and system programming languages used primarily for
creating components.
My e-book Portraits of Open Source
Pioneers contains several chapters on scripting (most are in early draft stage).
The reader must understand that the treatment of the scripting languages in press,
and especially academic press is far from being fair: entrenched academic interests
often promote old or commercially supported paradigms until they retire, so change
of paradigm often is possible only with the change of generations. And people tend
to live longer those days... Please also be aware that even respectable academic
magazines like Communications of ACM and IEEE Software often promote
"Cargo cult software engineering" like
Capability Maturity (CMM)
model.
Dr. Nikolai Bezroukov
Notes:
- Those pages are written by people for whom English is not a
native language. Some amount of grammar and spelling errors
should be expected.
- This is a Spartan WHYFF (We Help You For Free) site. It
cannot replace the best teachers and
the
best books.
- The site contain some obsolete pages as it develops like a
living tree... Some links on older pages
are broken. Please
try to use Google, Open directory, etc. to find a replacement link
(see
HOWTO search the WEB for details).
We would appreciate if you can
mail us a correct link.
|
|
Andrew Binstock and Donald Knuth converse on the success of
open source, the problem with multicore architecture, the disappointing lack
of interest in literate programming, the menace of reusable code, and that
urban legend about winning a programming contest with a single compilation.
Andrew Binstock: You are one of the fathers of the open-source
revolution, even if you aren’t widely heralded as such. You previously have
stated that you released
TeX
as open source because of the problem of proprietary implementations at the
time, and to invite corrections to the code—both of which are key drivers
for open-source projects today. Have you been surprised by the success of
open source since that time?
Donald Knuth: The success of open source code is perhaps the only thing
in the computer field that hasn’t surprised me during the past
several decades. But it still hasn’t reached its full potential;
I believe
that open-source programs will begin to be completely dominant as the
economy moves more and more from products towards services, and as more and
more volunteers arise to improve the code.
For example, open-source code can produce thousands of binaries, tuned
perfectly to the configurations of individual users, whereas commercial
software usually will exist in only a few versions. A generic binary
executable file must include things like inefficient "sync" instructions
that are totally inappropriate for many installations; such wastage goes
away when the source code is highly configurable. This should be a huge win
for open source.
Yet I think that a few programs, such as Adobe Photoshop, will always be
superior to competitors like the Gimp—for some reason, I really don’t know
why! I’m quite willing to pay good money for really good software,
if I
believe that it has been produced by the best programmers.
Remember, though, that my opinion on economic questions is highly
suspect, since I’m just an educator and scientist. I understand almost
nothing about the marketplace.
Andrew: A story states that you once entered a programming
contest at Stanford (I believe) and you submitted the winning entry, which
worked correctly after a single compilation. Is this story true? In
that vein, today’s developers frequently build programs writing small code
increments followed by immediate compilation and the creation and running of
unit tests. What are your thoughts on this approach to software development?
Donald: The story you heard is typical of legends that are based on only
a small kernel of truth. Here’s what actually happened:
John McCarthy decided in 1971 to have a Memorial Day Programming Race.
All of the contestants except me worked at his AI Lab up in the hills above
Stanford, using the WAITS time-sharing system; I was down on the main
campus, where the only computer available to me was a mainframe for which I
had to punch cards and submit them for processing in batch mode. I used
Wirth’s ALGOL W system
(the predecessor of Pascal). My program didn’t work the first time,
but fortunately I could use Ed Satterthwaite’s excellent offline debugging
system for ALGOL W, so I needed only two runs. Meanwhile, the folks using
WAITS couldn’t get enough machine cycles because their machine was so
overloaded. (I think that the second-place finisher, using that "modern"
approach, came in about an hour after I had submitted the winning entry with
old-fangled methods.) It wasn’t a fair contest.
As to your real question, the idea of immediate compilation and "unit
tests" appeals to me only rarely, when I’m feeling my way in a totally
unknown environment and need feedback about what works and what doesn’t.
Otherwise, lots of time is wasted on activities that I simply never need to
perform or even think about. Nothing needs to be "mocked up."
Andrew: One of the emerging problems for developers, especially
client-side developers, is changing their thinking to write programs in
terms of threads. This concern, driven by the advent of inexpensive
multicore PCs, surely will require that many algorithms be recast for
multithreading, or at least to be thread-safe. So far, much of the work
you’ve published for Volume 4 of
The Art
of Computer Programming (TAOCP) doesn’t seem to touch
on this dimension. Do you expect to enter into problems of concurrency and
parallel programming in upcoming work, especially since it would seem to be
a natural fit with the combinatorial topics you’re currently working on?
Donald: The field of combinatorial algorithms is so vast that I’ll be
lucky to pack its sequential aspects into three or four physical
volumes, and I don’t think the sequential methods are ever going to be
unimportant. Conversely, the half-life of parallel techniques is very short,
because hardware changes rapidly and each new machine needs a somewhat
different approach. So I decided long ago to stick to what I know best.
Other people understand parallel machines much better than I do; programmers
should listen to them, not me, for guidance on how to deal with
simultaneity.
Andrew: Vendors of multicore processors have expressed
frustration at the difficulty of moving developers to this model. As a
former professor, what thoughts do you have on this transition and how to
make it happen? Is it a question of proper tools, such as better native
support for concurrency in languages, or of execution frameworks? Or are
there other solutions?
Donald: I don’t want to duck your question entirely. I might as well
flame a bit about my personal unhappiness with the current trend toward
multicore architecture. To me, it looks more or less like the hardware
designers have run out of ideas, and that they’re trying to pass the blame
for the future demise of Moore’s Law to the software writers by giving us
machines that work faster only on a few key benchmarks! I won’t be surprised
at all if the whole multithreading idea turns out to be a flop, worse than
the "Titanium" approach
that was supposed to be so terrific—until it turned out that the wished-for
compilers were basically impossible to write.
Let me put it this way: During the past 50 years, I’ve written well over
a thousand programs, many of which have substantial size. I can’t think of
even five of those programs that would have been enhanced
noticeably by parallelism or multithreading. Surely, for example, multiple
processors are no help to TeX.[1]
How many programmers do you know who are enthusiastic about these
promised machines of the future? I hear almost nothing but grief from
software people, although the hardware folks in our department assure me
that I’m wrong.
I know that important applications for parallelism exist—rendering
graphics, breaking codes, scanning images, simulating physical and
biological processes, etc. But all these applications require dedicated code
and special-purpose techniques, which will need to be changed substantially
every few years.
Even if I knew enough about such methods to write about them in TAOCP,
my time would be largely wasted, because soon there would be little reason
for anybody to read those parts. (Similarly, when I prepare the third
edition of
Volume
3 I plan to rip out much of the material about how to sort on magnetic
tapes. That stuff was once one of the hottest topics in the whole software
field, but now it largely wastes paper when the book is printed.)
The machine I use today has dual processors. I get to use them both only
when I’m running two independent jobs at the same time; that’s nice, but it
happens only a few minutes every week. If I had four processors, or eight,
or more, I still wouldn’t be any better off, considering the kind of work I
do—even though I’m using my computer almost every day during most of the
day. So why should I be so happy about the future that hardware vendors
promise? They think a magic bullet will come along to make multicores speed
up my kind of work; I think it’s a pipe dream. (No—that’s the wrong
metaphor! "Pipelines" actually work for me, but threads don’t. Maybe the
word I want is "bubble.")
From the opposite point of view, I do grant that web browsing probably
will get better with multicores. I’ve been talking about my technical work,
however, not recreation. I also admit that I haven’t got many bright ideas
about what I wish hardware designers would provide instead of multicores,
now that they’ve begun to hit a wall with respect to sequential computation.
(But my MMIX
design contains several ideas that would substantially improve the current
performance of the kinds of programs that concern me most—at the cost of
incompatibility with legacy x86 programs.)
Andrew: One of the few projects of yours that hasn’t been
embraced by a widespread community is
literate programming.
What are your thoughts about why literate programming didn’t catch on? And
is there anything you’d have done differently in retrospect regarding
literate programming?
Donald: Literate programming is a very personal thing. I think it’s
terrific, but that might well be because I’m a very strange person. It has
tens of thousands of fans, but not millions.
In my experience, software created with literate programming has turned
out to be significantly better than software developed in more traditional
ways. Yet ordinary software is usually okay—I’d give it a grade of C (or
maybe C++), but not F; hence, the traditional methods stay with us. Since
they’re understood by a vast community of programmers, most people have no
big incentive to change, just as I’m not motivated to learn Esperanto even
though it might be preferable to English and German and French and Russian
(if everybody switched).
Jon Bentley
probably hit the nail on the head when he once was asked why literate
programming hasn’t taken the whole world by storm.
He observed that a small
percentage of the world’s population is good at programming, and a small
percentage is good at writing; apparently I am asking everybody to be in
both subsets.
Yet to me, literate programming is certainly the most important thing
that came out of the TeX project. Not only has it enabled me to write and
maintain programs faster and more reliably than ever before, and been one of
my greatest sources of joy since the 1980s—it has actually been indispensable at times. Some of my major programs, such as the MMIX
meta-simulator, could not have been written with any other methodology that
I’ve ever heard of. The complexity was simply too daunting for my limited
brain to handle; without literate programming, the whole enterprise would
have flopped miserably.
If people do discover nice ways to use the newfangled multithreaded
machines, I would expect the discovery to come from people who routinely use
literate programming. Literate programming is what you need to rise above
the ordinary level of achievement. But I don’t believe in forcing ideas on
anybody. If literate programming isn’t your style, please forget it and do
what you like. If nobody likes it but me, let it die.
On a positive note, I’ve been pleased to discover that the conventions of
CWEB are already standard equipment within preinstalled software such as
Makefiles, when I get off-the-shelf Linux these days.
Andrew: In
Fascicle 1 of Volume 1, you reintroduced the MMIX computer,
which is the 64-bit upgrade to the venerable MIX machine comp-sci students
have come to know over many years. You previously described MMIX in great
detail in
MMIXware.
I’ve read portions of both books, but can’t tell whether the Fascicle
updates or changes anything that appeared in MMIXware, or whether it’s a
pure synopsis. Could you clarify?
Donald: Volume 1 Fascicle 1 is a programmer’s introduction, which
includes instructive exercises and such things. The MMIXware book is a
detailed reference manual, somewhat terse and dry, plus a bunch of literate
programs that describe prototype software for people to build upon. Both
books define the same computer (once the errata to MMIXware are incorporated
from my website). For most readers of TAOCP, the first fascicle
contains everything about MMIX that they’ll ever need or want to know.
I should point out, however, that MMIX isn’t a single machine; it’s an
architecture with almost unlimited varieties of implementations, depending
on different choices of functional units, different pipeline configurations,
different approaches to multiple-instruction-issue, different ways to do
branch prediction, different cache sizes, different strategies for cache
replacement, different bus speeds, etc. Some instructions and/or registers
can be emulated with software on "cheaper" versions of the hardware. And so
on. It’s a test bed, all simulatable with my meta-simulator, even though
advanced versions would be impossible to build effectively until another
five years go by (and then we could ask for even further advances just by
advancing the meta-simulator specs another notch).
Suppose you want to know if five separate multiplier units and/or
three-way instruction issuing would speed up a given MMIX program. Or maybe
the instruction and/or data cache could be made larger or smaller or more
associative. Just fire up the meta-simulator and see what happens.
Andrew: As I suspect you don’t use unit testing with MMIXAL,
could you step me through how you go about making sure that your code works
correctly under a wide variety of conditions and inputs? If you have a
specific work routine around verification, could you describe it?
Donald: Most examples of machine language code in TAOCP appear
in Volumes 1-3; by the time we get to Volume 4, such low-level detail is
largely unnecessary and we can work safely at a higher level of abstraction.
Thus, I’ve needed to write only a dozen or so MMIX programs while preparing
the opening parts of Volume 4, and they’re all pretty much toy
programs—nothing substantial. For little things like that, I just use
informal verification methods, based on the theory that I’ve written up for
the book, together with the MMIXAL assembler and MMIX simulator that are
readily available on the Net (and described in full detail in the MMIXware
book).
That simulator includes debugging features like the ones I found so
useful in Ed Satterthwaite’s system for ALGOL W, mentioned earlier. I always
feel quite confident after checking a program with those tools.
Andrew: Despite its formulation many years ago, TeX is still
thriving, primarily as the foundation for
LaTeX. While TeX
has been effectively frozen at your request, are there features that you
would want to change or add to it, if you had the time and bandwidth? If so,
what are the major items you add/change?
Donald: I believe changes to TeX would cause much more harm than good.
Other people who want other features are creating their own systems, and
I’ve always encouraged further development—except that nobody should give
their program the same name as mine. I want to take permanent responsibility
for TeX and Metafont,
and for all the nitty-gritty things that affect existing documents that rely
on my work, such as the precise dimensions of characters in the Computer
Modern fonts.
Andrew: One of the little-discussed aspects of software
development is how to do design work on software in a completely new domain.
You were faced with this issue when you undertook TeX: No prior art was
available to you as source code, and it was a domain in which you weren’t an
expert. How did you approach the design, and how long did it take before you
were comfortable entering into the coding portion?
Donald: That’s another good question! I’ve discussed the answer in great
detail in Chapter 10 of my book
Literate Programming, together with Chapters 1 and 2 of my book
Digital Typography. I think that anybody who is really interested in
this topic will enjoy reading those chapters. (See also Digital
Typography Chapters 24 and 25 for the complete first and second drafts
of my initial design of TeX in 1977.)
Andrew: The books on TeX and the program itself show a clear
concern for limiting memory usage—an important problem for systems of that
era. Today, the concern for memory usage in programs has more to do with
cache sizes. As someone who has designed a processor in software, the issues
of cache-aware and
cache-oblivious algorithms surely must have crossed your radar
screen. Is the role of processor caches on algorithm design something that
you expect to cover, even if indirectly, in your upcoming work?
Donald: I mentioned earlier that MMIX provides a test bed for many
varieties of cache. And it’s a software-implemented machine, so we can
perform experiments that will be repeatable even a hundred years from now.
Certainly the next editions of Volumes 1-3 will discuss the behavior of
various basic algorithms with respect to different cache parameters.
In Volume 4 so far, I count about a dozen references to cache memory and
cache-friendly approaches (not to mention a "memo cache," which is a
different but related idea in software).
Andrew: What set of tools do you use today for writing TAOCP?
Do you use TeX? LaTeX? CWEB? Word processor? And what do you use for the
coding?
Donald: My general working style is to write everything first with pencil
and paper, sitting beside a big wastebasket. Then I use Emacs to enter the
text into my machine, using the conventions of TeX. I use tex, dvips, and gv
to see the results, which appear on my screen almost instantaneously these
days. I check my math with Mathematica.
I program every algorithm that’s discussed (so that I can thoroughly
understand it) using CWEB, which works splendidly with the GDB debugger. I
make the illustrations with MetaPost (or, in rare cases, on a Mac with Adobe Photoshop or
Illustrator). I have some homemade tools, like my own spell-checker for TeX
and CWEB within Emacs. I designed my own bitmap font for use with Emacs,
because I hate the way the ASCII apostrophe and the left open quote have
morphed into independent symbols that no longer match each other visually. I
have special Emacs modes to help me classify all the tens of thousands of
papers and notes in my files, and special Emacs keyboard shortcuts that make
bookwriting a little bit like playing an organ. I prefer
rxvt to xterm for terminal
input. Since last December, I’ve been using a file backup system called
backupfs, which meets
my need beautifully to archive the daily state of every file.
According to the current directories on my machine, I’ve written 68
different CWEB programs so far this year. There were about 100 in 2007, 90
in 2006, 100 in 2005, 90 in 2004, etc. Furthermore, CWEB has an extremely
convenient "change file" mechanism, with which I can rapidly create multiple
versions and variations on a theme; so far in 2008 I’ve made 73 variations
on those 68 themes. (Some of the variations are quite short, only a few
bytes; others are 5KB or more. Some of the CWEB programs are quite
substantial, like the 55-page BDD package that I completed in January.)
Thus, you can see how important literate programming is in my life.
I currently use Ubuntu Linux, on a
standalone laptop—it has no Internet connection. I occasionally carry flash
memory drives between this machine and the Macs that I use for network
surfing and graphics; but I trust my family jewels only to Linux.
Incidentally, with Linux I much prefer the keyboard focus that I can get
with classic FVWM to the
GNOME and KDE environments that other people seem to like better. To each
his own.
Andrew: You state in the preface of
Fascicle 0 of Volume 4 of
TAOCP that Volume 4 surely
will comprise three volumes and possibly more. It’s clear from the text that
you’re really enjoying writing on this topic. Given that, what is your
confidence in the note posted on the TAOCP website that Volume 5
will see light of day by 2015?
Donald: If you check the Wayback Machine for previous incarnations of
that web page, you will see that the number 2015 has not been constant.
You’re certainly correct that I’m having a ball writing up this material,
because I keep running into fascinating facts that simply can’t be left
out—even though more than half of my notes don’t make the final cut.
Precise time estimates are impossible, because I can’t tell until getting
deep into each section how much of the stuff in my files is going to be
really fundamental and how much of it is going to be irrelevant to my book
or too advanced. A lot of the recent literature is academic one-upmanship of
limited interest to me; authors these days often introduce arcane methods
that outperform the simpler techniques only when the problem size exceeds
the number of protons in the universe. Such algorithms could never be
important in a real computer application. I read hundreds of such papers to
see if they might contain nuggets for programmers, but most of them wind up
getting short shrift.
From a scheduling standpoint, all I know at present is that I must
someday digest a huge amount of material that I’ve been collecting and
filing for 45 years. I gain important time by working in batch mode: I don’t
read a paper in depth until I can deal with dozens of others on the same
topic during the same week. When I finally am ready to read what has been
collected about a topic, I might find out that I can zoom ahead because most
of it is eminently forgettable for my purposes. On the other hand, I might
discover that it’s fundamental and deserves weeks of study; then I’d have to
edit my website and push that number 2015 closer to infinity.
Andrew: In late 2006, you were diagnosed with prostate cancer.
How is your health today?
Donald: Naturally, the cancer will be a serious concern. I have superb
doctors. At the moment I feel as healthy as ever, modulo being 70 years old.
Words flow freely as I write TAOCP and as I write the literate
programs that precede drafts of TAOCP. I wake up in the morning
with ideas that please me, and some of those ideas actually please me also
later in the day when I’ve entered them into my computer.
On the other hand, I willingly put myself in God’s hands with respect to
how much more I’ll be able to do before cancer or heart disease or senility
or whatever strikes. If I should unexpectedly die tomorrow, I’ll have no
reason to complain, because my life has been incredibly blessed. Conversely,
as long as I’m able to write about computer science, I intend to do my best
to organize and expound upon the tens of thousands of technical papers that
I’ve collected and made notes on since 1962.
Andrew: On your website, you mention that the
Peoples Archive
recently made a series of videos in which you reflect on your past life. In
segment 93, "Advice to Young People," you advise that people shouldn’t do
something simply because it’s trendy. As we know all too well, software
development is as subject to fads as any other discipline. Can you give some
examples that are currently in vogue, which developers shouldn’t adopt
simply because they’re currently popular or because that’s the way they’re
currently done? Would you care to identify important examples of this
outside of software development?
Donald: Hmm. That question is almost contradictory, because I’m basically
advising young people to listen to themselves rather than to others, and I’m
one of the others. Almost every biography of every person whom you would
like to emulate will say that he or she did many things against the
"conventional wisdom" of the day.
Still, I hate to duck your questions even though I also hate to offend
other people’s sensibilities—given that software methodology has always been
akin to religion. With the caveat that there’s no reason anybody should care
about the opinions of a computer scientist/mathematician like me regarding
software development, let me just say that almost everything I’ve ever heard
associated with the term "extreme
programming" sounds like exactly the wrong way to go...with one
exception. The exception is the idea of working in teams and reading each
other’s code. That idea is crucial, and it might even mask out all the
terrible aspects of extreme programming that alarm me.
I also must confess to a strong bias against the fashion for reusable
code. To me, "re-editable code" is much, much better than an untouchable
black box or toolkit. I could go on and on about this. If you’re totally
convinced that reusable code is wonderful, I probably won’t be able to sway
you anyway, but you’ll never convince me that reusable code isn’t mostly a
menace.
Here’s a question that you may well have meant to ask: Why is the new
book called Volume 4 Fascicle 0, instead of Volume 4 Fascicle 1? The answer
is that computer programmers will understand that I wasn’t ready to begin
writing Volume 4 of TAOCP at its true beginning point, because we
know that the initialization of a program can’t be written until the program
itself takes shape. So I started in 2005 with Volume 4 Fascicle 2, after
which came Fascicles 3 and 4. (Think of Star Wars, which began with
Episode 4.)
I think the article misstates position of Perl (according to
TIOBE
index it is No.6 about above C#, Python and Ruby). Also there is an inherent
problem with their methodology (as with any web presence based metric).
This is visible in positions of C# which now definitely looks stronger then
Python and Perl (and may be even PHP) as well as in positions of bash, awk and
PowerShell. Still that means all other statements should be taken with the
grain of salt...
April 23, 2008 | DDJ
From what Paul Jansen has seen, everyone has a favorite programming language.
Paul Jansen is managing director of TIOBE Software (www.tiobe.com).
He can be contacted at Paul.Jansen@tiobe.com.
DDJ: Paul, can you tell us about the TIOBE Programming Community Index?
PJ: The TIOBE index tries to measure the popularity of programming languages
by monitoring their web presence. The most popular search engines Google, Yahoo!,
Microsoft, and YouTube are used to calculate these figures. YouTube has been added
recently as an experiment (and only counts for 4 percent of the total). Since the
TIOBE index has been published now for more than 6 years, it gives an interesting
picture about trends in the area of programming languages. I started the index because
I was curious to know whether my programming skills were still up to date and to
know for which programming languages our company should create development tools.
It is amazing to see that programming languages are something very personal.
Every
day we receive
e-mails from people that are unhappy with the position of "their" specific language
in the index. I am also a bit overwhelmed about the vast and constant traffic this
index generates.
DDJ: Which language has moved to the top of the heap, so to speak, in
terms of popularity, and why do you think this is the case?
PJ: If we take a look at the top 10
programming
languages
,
not much has happened the last five years. Only Python entered the top 10, replacing
COBOL. This comes as a surprise because the IT world is moving so fast that in most
areas, the market is usually completely changed in five years time. Python managed
to reach the top 10 because it is the truly object-oriented successor of Perl. Other
winners of the last couple of years are Visual Basic, Ruby, JavaScript, C#, and
D (a successor of C++). I expect in five years time there will be two main languages:
Java and C#, closely followed by good-old Visual Basic. There is no new paradigm
foreseen.
DDJ: Which languages seem to be losing ground?
PJ: C and C++ are definitely losing ground. There is a simple explanation
for this. Languages without automated garbage collection are getting out of fashion.
The chance of running into all kinds of memory problems is gradually outweighing
the performance penalty you have to pay for garbage collection. Another language
that has had its day is Perl. It was once the standard language for every system
administrator and build manager, but now everyone has been waiting on a new major
release for more than seven years. That is considered far too long.
DDJ: On the flip side, what other languages seem to be moving into the
limelight?
PJ: It is interesting to observe that dynamically typed object-oriented
(scripting) languages are evolving the most. A new language has hardly arrived on
the scene, only to be immediately replaced by another new emerging language. I think
this has to do with the increase in web programming. The web programming area demands
a language that is easy to learn, powerful, and secure. New languages pop up every
day, trying to be leaner and meaner than their predecessors. A couple of years ago,
Ruby was rediscovered (thanks to Rails). Recently, Lua was the hype, but now other
scripting languages such as ActionScript, Groovy, and Factor are about to claim
a top 20 position. There is quite some talk on the Internet about the NBL (next
big language). But although those web-programming languages generate a lot of attention,
there is never a real breakthrough.
DDJ: What are the benefits of introducing coding standards into an organization?
And how does an organization choose a standard that is a "right fit" for its development
goals?
PJ: Coding standards help to improve the general quality of
software. A good coding standard focuses on best programming practices (avoiding
known language pitfalls), not only on style and naming conventions. Every language
has its constructions that are perfectly legitimate according to its language definition but will lead to reliability,
security, or maintainability problems. Coding standards help engineers to stick
to a subset of a programming language to make sure that these problems do not
occur. The advantage of introducing coding standards as a means to improve quality
is that—once it is in place—it does not change too often. This is in contrast with
dynamic testing. Every change in your program calls for a change in your dynamic
tests. In short, dynamic tests are far more labor intensive than coding standards.
On the other hand, coding standards can only take care of nonfunctional defects.
Bugs concerning incorrectly implemented requirements remain undetected. The best
way to start with coding standards is to download a code checker and tweak it to
your needs. It is our experience that if you do not check the rules of your coding
standard automatically, the coding standard will soon end as a dusty document on
some shelf.
A useful Firefox plug-in
CoScripter is a system for recording, automating, and sharing processes performed
in a web browser such as printing photos online, requesting a vacation hold
for postal mail, or checking flight arrival times. Instructions for processes
are recorded and stored in easy-to-read text here on the CoScripter web site,
so anyone can make use of them. If you are having trouble with a web-based process,
check to see if someone has written a CoScript for it!
About: Tiny Eclipse is distribution of Eclipse for development with dynamic
languages for the Web, such as JSP, PHP, Ruby, TCL, and Web Services. It features
a small download size, the ability to choose the features you want to install,
and GUI installers for Win32 and Linux GTK x86.
2007-12-28 | infoworld.comSimply put, developers are saying that Java slows
them down. “There were big promises that Java would solve incompatibility problems
[across platforms]. But now there are different versions and different downloads,
creating complications,” says Peter Thoneny, CEO of Twiki.net, which produces
a certified version of the open source Twiki wiki-platform software.
“It has not gotten easier. It’s more complicated,”
concurs Ofer Ronen, CEO of Sendori, which routes domain traffic
to online advertisers and ad networks. Sendori has
moved to Ruby on Rails. Ronen says Ruby offers pre-built structures
— say, a shopping cart for an e-commerce site — that you’d have to code from
the ground up using Java.
Another area of weakness is
the development of mobile applications. Java’s UI capabilities and its memory
footprint simply don’t measure up, says Samir Shah, CEO of software testing
provider Zephyr. No wonder the mobile edition of
Java has all but disappeared, and no wonder Google is creating its own version
(Android).
These weaknesses are having
a real effect. Late last month, Info-Tech Research Group said its survey of
1,850 businesses found .Net
the choice over Java among businesses of all sizes and industries, thanks
to its promotion via Visual Studio and SharePoint.
Microsoft is driving uptake of the .Net platform at the expense of Java,"
says George Goodall, a senior research analyst at Info-Tech.
One bit of good news: developers
and analysts agree that Java is alive and well for internally developed enterprise
apps. “On the back end, there is still a substantial
amount of infrastructure available that makes Java a very strong contender,”
says Zephyr’s Shah.
The Bottom
Line: Now that Java is no longer the unchallenged champ for Internet-delivered
apps, it makes sense for companies to find programmers who are skilled in the
new languages. If you’re a Java developer, now’s the time to invest in new skills.
I think that the author of this comment is deeply mistaken: the length of the
code has tremendous influence of the cost of maintenance and number of errors and
here Java sucks.
Linux Today
|
Timh
- Subject: Java DOES "slow you down" ( Jan 3, 2008, 01:59:40 )
|
It's true. putting together an Enterprise-scale Java
application takes a considerable amount of planning, design, and co-ordination.
Scripted languages like Python are easier - just hack something out
and you've a working webapp by the end of the day.
But then you get called in at midnight, because a lot of the extra front-end
work in Java has to do with the fact that the compiler is doing major
datatype validation. You're a lot less likely to have something blow
up after it went into production, since a whole raft of potential screw-ups
get caught at build time.
Scripting systems like Python, Perl, PHP, etc. not only have late binding,
but frequently have late compiling as well, so until the offending code
is invoked, it's merely a coiled-up snake.
In fact, after many years and many languages, I'm just about convinced
that the amount of time and effort for producing a debugged major app
in just about any high-level language is about the same. Myself, I prefer
an environment that keeps me from having to wear a pager. For those
who need less sleep and more Instant Gratification, they're welcome
to embrace the other end of the spectrum. |
It's pretty strange for the
system
admin and CGI programmer prefer Python to Perl... It goes without saying
that in any case such evaluations should be taken with a grain of sslt. what makes
this comparison interesting is that author claim to have substantial programming
experience in
Perl-4,
Tcl and
Python
Before going any further,
read the disclaimer!
Some languages I've used and how I've felt about them. This may help you
figure out where I'm coming from. I'm only listing the highlights here, and
not including the exotica (Trac, SAM76, Setl, Rec, Convert, J...) and languages
I've only toyed with or programmed in my head (Algol 68, BCPL, APL, S-Algol,
Pop-2 / Pop-11, Refal, Prolog...).
- Pascal.
- My first language. Very nearly turned me off programming before I got
started. I hated it. Still do.
- Sail.
- The first language I loved, Sail was Algol 60 with zillions of extensions,
from dynamically allocated strings to Leap, a weird production system /
logic programming / database language that I never understood (and now can
barely recall), and access to every Twenex JSYS and TOPS 10 UUO! Pretty
much limited to PDP-10s; supposedly reincarnated as MAINSAIL, but I never
saw that.
- Teco.
- The first language I actually became fluent in; also the first language
I ever got paid to program in.
- Snobol4.
- The first language I actually wrote halfway-decent sizable code in,
developed a personal subroutine library for, wrote multi-platform code in,
and used on an IBM mainframe (Spitbol -- but I did all my development under
Twenex with Sitbol, thank goodness). I loved Snobol: I used to dream in
it.
- PL/I.
- The first language I ever thought was great at first and then grew to
loathe. Subset G only, but that was enough.
- Forth.
- The first language I ever ran on my own computer; also the first language
I ever wrote useful assembler in -- serial I/O routines for the Z/80 (my
first assembly language was a handful of toy programs in IBM 360 assembly
language, using the aptly-named SPASM assembler), and the first language
I thought was really wonderful but had a really difficult time writing
useful programs in. Also the first language whose implementation I actually
understood, the first language that really taught me about hardware, and
the first language implementation I installed myself. Oh and the first language
I taught.
- C.
- What can I say here? It's unpleasant, but it works, it's everywhere,
and you have to use it.
- Lisp.
- The first language I thought was truly brilliant and still think so
to this day. I programmed in Maclisp and Muddle (MDL) at first, on the PDP-10;
Franz and then Common Lisp later (but not much).
- Scheme.
- How could you improve on Lisp? Scheme is how.
- Perl.
- The first language I wrote at least hundreds of useful programs
in (Perl 4 (and earlier) only). Probably the second language I thought was
great and grew to loathe (for many of the same reasons I grew to loathe
PL/I, interestingly enough -- but it took longer).
- Lazy Functional Languages.
- How could you improve on Scheme? Lazy functional languages is how, but
can you actually do anything with them (except compile lazy functional
languages, of course)?
- Tcl.
- My previous standard, daily language. It's got a lot of problems, and
it's amazing that Tcl programs ever get around to terminating, but they
do, and astonishingly quickly (given the execution model...). I've developed
a large library of Tcl procs that allow me to whip up substantial programs
really quickly, the mark of a decent language. And it's willing to dress
up as Lisp to fulfill my kinky desires.
- Python
- My current standard, daily language. Faster than Tcl, about as fast
as Perl and with nearly as large a standard library, but with a reasonable
syntax and real data structures. It's by no means perfect -- still
kind of slow, not enough of an expression language to suit me, dynamically
typed, no macro system -- but I'm really glad I found it.
June 11, 2007 |
Linux.com
By itself, Vim is one of the best editors for shell scripting. With a little
tweaking, however, you can turn Vim into a full-fledged IDE for writing scripts.
You could do it yourself, or you can just install Fritz Mehner's
Bash Support plugin.
To install Bash Support, download the
zip archive, copy it to your ~/.vim directory, and unzip the archive. You'll
also want to edit your ~/.vimrc to include a few personal details; open the
file and add these three lines:
let g:BASH_AuthorName = 'Your Name'
let g:BASH_Email = 'my@email.com'
let g:BASH_Company = 'Company Name'
These variables will be used to fill in some headers for your projects, as
we'll see below.
The Bash Support plugin works in the Vim GUI (gVim) and text mode Vim. It's
a little easier to use in the GUI, and Bash Support doesn't implement most of
its menu functions in Vim's text mode, so you might want to stick with gVim
when scripting.
When Bash Support is installed, gVim will include a new menu, appropriately
titled Bash. This puts all of the Bash Support functions right at your fingertips
(or mouse button, if you prefer). Let's walk through some of the features, and
see how Bash Support can make Bash scripting a breeze.
Header and comments
If you believe in using extensive comments in your scripts, and I hope you
are, you'll really enjoy using Bash Support. Bash Support provides a number
of functions that make it easy to add comments to your bash scripts and programs
automatically or with just a mouse click or a few keystrokes.
When you start a non-trivial script that will be used and maintained by others,
it's a good idea to include a header with basic information -- the name of the
script, usage, description, notes, author information, copyright, and any other
info that might be useful to the next person who has to maintain the script.
Bash Support makes it a breeze to provide this information. Go to Bash -> Comments
-> File Header, and gVim will insert a header like this in your script:
#!/bin/bash
#===============================================================================
#
# FILE: test.sh
#
# USAGE: ./test.sh
#
# DESCRIPTION:
#
# OPTIONS: ---
# REQUIREMENTS: ---
# BUGS: ---
# NOTES: ---
# AUTHOR: Joe Brockmeier, jzb@zonker.net
# COMPANY: Dissociated Press
# VERSION: 1.0
# CREATED: 05/25/2007 10:31:01 PM MDT
# REVISION: ---
#===============================================================================
You'll need to fill in some of the information, but Bash Support grabs the
author, company name, and email address from your ~/.vimrc, and fills in the
file name and created date automatically. To make life even easier, if you start
Vim or gVim with a new file that ends with an .sh extension, it will insert
the header automatically.
As you're writing your script, you might want to add comment blocks for your
functions as well. To do this, go to Bash -> Comment -> Function Description
to insert a block of text like this:
#=== FUNCTION ================================================================
# NAME:
# DESCRIPTION:
# PARAMETERS:
# RETURNS:
#===============================================================================
Just fill in the relevant information and carry on coding.
The Comment menu allows you to insert other types of comments, insert the
current date and time, and turn selected code into a comment, and vice versa.
Statements and snippets
Let's say you want to add an if-else statement to your script. You could
type out the statement, or you could just use Bash Support's handy selection
of pre-made statements. Go to Bash -> Statements and you'll see a long list
of pre-made statements that you can just plug in and fill in the blanks. For
instance, if you want to add a while statement, you can go to Bash -> Statements
-> while, and you'll get the following:
while _; do
done
The cursor will be positioned where the underscore (_) is above.
All you need to do is add the test statement and the actual code you want to
run in the while statement. Sure, it'd be nice if Bash Support could do all
that too, but there's only so far an IDE can help you.
However, you can help yourself. When you do a lot of bash scripting, you
might have functions or code snippets that you reuse in new scripts. Bash Support
allows you to add your snippets and functions by highlighting the code you want
to save, then going to Bash -> Statements -> write code snippet. When you want
to grab a piece of prewritten code, go to Bash -> Statements -> read code snippet.
Bash Support ships with a few included code fragments.
Another way to add snippets to the statement collection is to just place
a text file with the snippet under the ~/.vim/bash-support/codesnippets directory.
Running and debugging scripts
Once you have a script ready to go, and it's testing and debugging time.
You could exit Vim, make the script executable, run it and see if it has any
bugs, and then go back to Vim to edit it, but that's tedious. Bash Support lets
you stay in Vim while doing your testing.
When you're ready to make the script executable, just choose Bash -> Run
-> make script executable. To save and run the script, press Ctrl-F9,
or go to Bash -> Run -> save + run script.
Bash Support also lets you call the bash debugger (bashdb) directly from
within Vim. On Ubuntu, it's not installed by default, but that's easily remedied
with apt-get install bashdb. Once it's installed, you can debug
the script you're working on with F9 or Bash -> Run -> start debugger.
If you want a "hard copy" -- a PostScript printout -- of your script, you
can generate one by going to Bash -> Run -> hardcopy to FILENAME.ps. This is
where Bash Support comes in handy for any type of file, not just bash scripts.
You can use this function within any file to generate a PostScript printout.
Bash Support has several other functions to help run and test scripts from
within Vim. One useful feature is syntax checking, which you can access with
Alt-F9. If you have no syntax errors, you'll get a quick OK. If
there are problems, you'll see a small window at the bottom of the Vim screen
with a list of syntax errors. From that window you can highlight the error and
press Enter, and you'll be taken to the line with the error.
Put away the reference book...
Don't you hate it when you need to include a regular expression or a test
in a script, but can't quite remember the syntax? That's no problem when you're
using Bash Support, because you have Regex and Tests menus with all you'll need.
For example, if you need to verify that a file exists and is owned by the correct
user ID (UID), go to Bash -> Tests -> file exists and is owned by the effective
UID. Bash Support will insert the appropriate test ([ -O _])
with your cursor in the spot where you have to fill in the file name.
To build regular expressions quickly, go to the Bash menu, select Regex,
then pick the appropriate expression from the list. It's fairly useful when
you can't remember exactly how to express "zero or one" or other regular expressions.
Bash Support also includes menus for environment variables, bash builtins,
shell options, and a lot more.
Hotkey support
Vim users can access many of Bash Support's features using hotkeys. While
not as simple as clicking the menu, the hotkeys do follow a logical scheme that
makes them easy to remember. For example, all of the comment functions are accessed
with \c, so if you want to insert a file header, you use
\ch; if you want a date inserted, type \cd; and for a line
end comment, use \cl.
Statements can be accessed with \a. Use \ac for
a case statement, \aie for an "if then else" statement, \af
for a "for in..." statement, and so on. Note that the online docs are incorrect
here, and indicate that statements begin with \s, but Bash Support
ships with a PDF reference card (under .vim/bash-support/doc/bash-hot-keys.pdf)
that gets it right.
Run commands are accessed with \r. For example, to save the
file and run a script, use \rr; to make a script executable, use
\re; and to start the debugger, type \rd. I won't
try to detail all of the
shortcuts, but you can pull up a reference using :help bashsupport-usage-vim
when in Vim, or use the PDF. The full Bash Support reference is available within
Vim by running :help bashsupport, or you can read it
online.
Of course, we've covered only a small part of Bash Support's functionality.
The next time you need to whip up a shell script, try it using Vim with Bash
Support. This plugin makes scripting in bash a lot easier.
Once and a while you may come across, what would seem to be a ‘killer’ piece
of software, or maybe a cool new programming language - something in that would
appear to give you some advantage.
That MAY be the case, but many times, it isn’t really so
- think twice before your leap!
Consider these points:
- You will have to learn this new thingamabob - that takes time.
- Often, new thingamabobs excel in one area and stink in others - problem
is that it can take time to figure this out.
- Listen to the king: “Wise men say, only fools rush in.”
Do you notice a pattern here?
Yes, it’s all about time. All this junk (software, programming
languages, markup languages etc…) have one purpose in the end: to save
you time.
Keep that in mind when you approach things - ask yourself:
‘Will using this save me time?’
OO is definitely overkill for a lot of web projects. It seems to me that
so many people use OO frameworks like Ruby and Zope because “it’s enterprise
level”. But using an ‘enterprise’ framework for small to medium sized web applications
just adds so much overhead and frustration at having to learn the framework
that it just doesnt seem worth it to me. Having said all this I must point out
that I’m distrustful of large corporations and hate their dehumanising heirarchical
structure. Therefore i am naturally drawn towards open source and away from
the whole OO/enterprise/heirarchy paradigm. Maybe people want to push open source
to the enterprise level in the hope that they will adopt the technology and
therefore they will have more job security. Get over it - go and learn Java
and .NET if you want job security and preserve open source software as an oasis
of freedom away from the corporate world. Just my 2c
===
OOP has its place, but the diversity of frameworks is just as challenging
to figure out as a new class you didn’t write, if not more. None of them work
the same or keep a standard convention between them that makes learning them
easier. Frameworks are great, but sometimes I think maybe they don’t all have
to be OO. I keep a small personal library of functions I’ve (and others have)
written procedurally and include them just like I would a class. Beyond the
overhead issues is complexity. OOP has you chasing declarations over many files
to figure out what’s happening. If you’re trying to learn how that unique class
you need works, it can be time consuming to read through it and see how the
class is structured. By the time you’re done you may as well have written the
class yourself, at least by then you’d have a solid understanding. Encapsulation
and polymorphism have their advantages, but the cost is complexity which can
equal time. And for smaller projects that will likely never expand, that time
and energy can be a waste.
Not trying to bash OOP, just to defend procedural style. They each have their
place.
===
Sorry, but I don’t like your text, because you mix Ruby and Ruby on Rails
alot. Ruby is in my oppinion easier to use then PHP, because PHP has no design-principle
beside “make it work, somehow easy to use”. Ruby has some really cool stuff
I miss quite often, when I have to program in PHP again (blocks for example),
but has a more clear and logic syntax.
Ruby on Rails is of course not that easy to use, at least when speaking about
small-scale projects. This is, because it does alot more than PHP does. Of course,
there are other good reasons to prefere PHP over Rails (like the better support
by providers, more modules, more documentation), but from my opinion, most projects
done in PHP from the complexity of a blog could profit from being programmed
in Rails, from the pure technical point of view. At least I won’t program in
PHP again unless a customer asks me.
===
I have a reasonable level of experience with PHP and Python but unfortunately
haven’t touched Ruby yet. They both seem to be a good choice for low complexity
projects. I can even say that I like Python a lot. But I would never consider
it again for projects where design is an issue. They also say it is for (rapid)
prototyping. My experience is that as long as you can’t afford a proper IDE
Python is maybe the best place to go to. But a properly “equipped” environment
can formidably boost your productivity with a statically typed language like
Java. In that case Python’s advantage shrinks to the benefits of quick tests
accesible through its command line.
Another problem of Python is that it wants to be everything: simple and complete,
flexible and structured, high-level while allowing for low-level programming.
The result is a series of obscure features
Having said all that I must give Python all the credits of a good language.
It’s just not perfect. Maybe it’s Ruby

My apologies for not sticking too closely to the subject of the article.
===
The one thing I hate is OOP geeks trying to prove that they can write code
that does nothing usefull and nobody understands.
“You dont have to use OOP in ruby! You can do it PHP way! So you better do
your homework before making such statements!”
Then why use ruby in the first place?
“What is really OVERKILL to me, is to know the hundrets of functions, PHP
provides out of the box, and avaliable in ANY scope! So I have to be extra carefull
wheter I can use some name. And the more functions - the bigger the MESS.”
On the other hand, in ruby you use only functions avaliable for particullar
object you use.
I would rather say: “some text”.length than strlen(”some text”); which is
much more meaningful! Ruby language itself much more descriptive. I remember
myself, from my old PHP days, heaving alwayse to look up the php.net for appropriate
function, but now I can just guess!”
Yeah you must have weak memory and can`t remember wheter strlen() is for
strings or for numbers….
Doesn`t ruby have the same number of functions just stored in objects?
Look if you can`t remember strlen than invent your own classes you can make
a whole useless OOP framework for PHP in a day……
Ruby on Rails 1.1 has
been released.
Dion Hinchcliffe has
posted a blog entry at the end of which he asks the question,
will it be a nail in the coffin for .net and Java?
Rails certainly looks beautiful. It is fully object oriented, with built
in O/R mapping, powerful AJAX support, an elegant syntax, a proper implementation
of the Model-View-Controller design pattern, and even a Ruby to Javascript converter
which lets you write client side web code in Ruby.
However, I don’t think it’s the end of the line for C# and Java by a long
shot. Even if it does draw a lot of fire, there is a heck of a lot of code knocking
around in these languages, and there likely still will be for a very long time
to come. Even throwaway code and hacked together interim solutions have a habit
of living a lot longer than anyone ever expects. Look at how much code is still
out there in Fortran, COBOL and Lisp, for instance.
Like most scripting languages such as Perl, Python, PHP and so on, Ruby is
still a dynamically typed language. For this reason it will be slower than statically
typed languages such as C#, C++ and Java. So it won’t be used so much in places
where you need lots of raw power. However, most web applications don’t need
such raw power in the business layer. The main bottleneck in web development
is database access and network latency in communicating with the browser, so
using C# rather than Rails would have only a very minor impact on performance.
But some of them do, and in such cases the solutions often have different parts
of the application written in different languages and even running on different
servers. One of the solutions that we have developed, for instance, has a web
front end in PHP running on a Linux box, with a back end application server
running a combination of Python and C++ on a Windows server.
Rails certainly knocks the spots off PHP though…
April 2003 (Keynote from PyCon2003)
...I have a hunch that the main branches of the evolutionary
tree pass through the languages that have the smallest, cleanest cores. The
more of a language you can write in itself, the better.
...Languages evolve slowly because they're not really technologies. Languages
are notation. A program is a formal description of the problem you want a computer
to solve for you. So the rate of evolution in programming languages is more
like the rate of evolution in mathematical notation than, say, transportation
or communications. Mathematical notation does evolve, but not with the giant
leaps you see in technology.
...I learned to program when computer power was scarce. I can remember taking
all the spaces out of my Basic programs so they would fit into the memory of
a 4K TRS-80. The thought of all this stupendously inefficient software burning
up cycles doing the same thing over and over seems kind of gross to me. But
I think my intuitions here are wrong. I'm like someone who grew up poor, and
can't bear to spend money even for something important, like going to the doctor.
Some kinds of waste really are disgusting. SUVs, for example, would arguably
be gross even if they ran on a fuel which would never run out and generated
no pollution. SUVs are gross because they're the solution to a gross problem.
(How to make minivans look more masculine.) But not all waste is bad. Now that
we have the infrastructure to support it, counting the minutes of your long-distance
calls starts to seem niggling. If you have the resources, it's more elegant
to think of all phone calls as one kind of thing, no matter where the other
person is.
There's good waste, and bad waste. I'm interested in good waste-- the kind where,
by spending more, we can get simpler designs. How will we take advantage of
the opportunities to waste cycles that we'll get from new, faster hardware?
The desire for speed is so deeply engrained in us, with our puny computers,
that it will take a conscious effort to overcome it. In language design, we
should be consciously seeking out situations where we can trade efficiency for
even the smallest increase in convenience.
Most data structures exist because of speed. For
example, many languages today have both strings and lists. Semantically, strings
are more or less a subset of lists in which the elements are characters. So
why do you need a separate data type? You don't, really. Strings only exist
for efficiency. But it's lame to clutter up the semantics of the language with
hacks to make programs run faster. Having strings in a language seems to be
a case of premature optimization.
... Inefficient software isn't
gross. What's gross is a language that makes programmers do needless work. Wasting
programmer time is the true inefficiency, not wasting machine time. This will
become ever more clear as computers get faster
...Somehow
the idea of reusability got attached to object-oriented programming in the 1980s,
and no amount of evidence to the contrary seems to be able to shake it free.
But although some object-oriented software is reusable, what makes it reusable
is its bottom-upness, not its object-orientedness. Consider libraries: they're
reusable because they're language, whether they're written in an object-oriented
style or not.
I don't predict the demise of object-oriented programming,
by the way. Though I don't think it has much to offer good programmers, except
in certain specialized domains, it is irresistible to large organizations. Object-oriented
programming offers a sustainable way to write spaghetti code. It lets you accrete
programs as a series of patches.
Large organizations always tend to develop
software this way, and I expect this to be as true in a hundred years as it
is today.
...As
this gap widens, profilers will become increasingly important. Little attention
is paid to profiling now. Many people still seem to believe that the way to
get fast applications is to write compilers that generate fast code. As the
gap between acceptable and maximal performance widens, it will become increasingly
clear that the way to get fast applications is to have a good guide from one
to the other.
...One of the most exciting trends in the last ten years has been the rise of
open-source languages like Perl, Python, and Ruby. Language design is being
taken over by hackers. The results so far are messy, but encouraging.
There are some stunningly novel ideas in Perl, for
example. Many are stunningly bad, but that's always true of ambitious
efforts. At its current rate of mutation, God knows what Perl might evolve into
in a hundred years.
...One
helpful trick here is to use the
length of
the program as an approximation for how much work it is to write. Not the length
in characters, of course, but the length in distinct syntactic elements-- basically,
the size of the parse tree. It may not be quite
true that the shortest program is the least work to write, but it's close enough
that you're better off aiming for the solid target of brevity than the fuzzy,
nearby one of least work. Then the algorithm for language design
becomes: look at a program and ask, is there any way to write this that's shorter?
Ralph Griswold, the creator of
Snobol and
Icon programming languages, died in October 2006 of cancer. Until recently
Computer Science was a discipline where the founders were still around. That’s changing.
Griswold was an important pioneer of programming language design with Snobol sting
manipulation facilities different and somewhat faster then regular expressions.
Ralph Griswold died two weeks ago. He created several programming
languages, most notably Snobol (in the 60s) and Icon (in the 70s) — both outstandingly
innovative, integral, and efficacious in their areas. Despite the abundance
of scripting and other languages today, Snobol and Icon are still unsurpassed
in many respects, both as elegance of design and as practicality.
Ralph E. Griswold died in Tucson on October 4, 2006, of complications from pancreatic
cancer. He was Regents Professor Emeritus in the Department of Computer Science
at the University of Arizona.
Griswold was born in Modesto, California, in 1934. He was an award winner
in the 1952 Westinghouse National Science Talent Search and went on to attend
Stanford University, culminating in a PhD in Electrical Engineering in 1962.
Griswold joined the staff of Bell Telephone Laboratories in Holmdel, New
Jersey, and rose to become head of Programming Research and Development. In
1971, he came to the University of Arizona to found the Department of Computer
Science, and he served as department head through 1981. His insistence on high
standards brought the department recognition and respect. In recognition of
his work the university granted him the breastle of Regents Professor in 1990.
While at Bell Labs, Griswold led the design and implementation of the groundbreaking
SNOBOL4 programming language with its emphasis on string manipulation and high-level
data structures. At Arizona, he developed the Icon programming language, a high-level
language whose influence can be seen in Python and other recent languages.
Griswold authored numerous books and articles about computer science. After
retiring in 1997, his interests turned to weaving. While researching mathematical
aspects of weaving design he collected and digitized a large library of weaving
documents and maintained a public website. He published technical monographs
and weaving designs that inspired the work of others, and he remained active
until his final week.
-----Gregg Townsend Staff Scientist The University of Arizona
Actually Spolsky does not understand the role of scripting languages.
But hi is right of target with his critique of OO. Object oriented programming is
no silver bullet.
Dec
14, 2006
(InfoWorld) Joel Spolsky
is one of our most celebrated pundits
on the practice of software development,
and he's full of terrific insight. In
a recent blog post, he decries the fallacy
of
"Lego programming" -- the all-too-common
assumption that sophisticated new tools
will make writing applications as easy
as snapping together children's toys.
It simply isn't so, he says -- despite
the fact that people have been claiming
it for decades -- because the most important
work in software development happens
before a single line of code is written.
By way of support,
Spolsky reminds us of a quote from the
most celebrated pundit of an earlier
generation of developers. In his 1987
essay
"No Silver Bullet," Frederick P.
Brooks wrote,
"The essence of a software entity
is a construct of interlocking concepts
... I believe the hard part of building
software to be the specification, design,
and testing of this conceptual construct,
not the labor of representing it and
testing the fidelity of the representation
... If this is true, building software
will always be hard. There is inherently
no silver bullet."
As Spolsky points
out, in the 20 years since Brooks wrote
"No Silver Bullet," countless products
have reached the market heralded as
the silver bullet for effortless software
development. Similarly, in the 30 years
since Brooks published "
The Mythical Man-Month" -- in which,
among other things, he debunks the fallacy
that if one programmer can do a job
in ten months, ten programmers can do
the same job in one month -- product
managers have continued to buy into
various methodologies and tricks that
claim to make running software projects
as easy as stacking Lego bricks.
Don't you believe
it. If, as Brooks wrote, the hard part
of software development is the initial
design, then no amount of radical workflows
or agile development methods will get
a struggling project out the door, any
more than the latest GUI rapid-development
toolkit will.
And neither will
open source. Too often, commercial software
companies decide to turn over their
orphaned software to "the community"
--
if such a thing exists -- in the
naive belief that open source will be
a miracle cure to get a flagging project
back on track. This is just another
fallacy, as history demonstrates.
In 1998, Netscape
released the source code to its Mozilla
browser to the public to much fanfare,
but only lukewarm response from developers.
As it turned out, the Mozilla source
was much too complex and of too poor
quality for developers outside Netscape
to understand it. As Jamie Zawinski
recounts, the resulting decision
to rewrite the browser's rendering engine
from scratch derailed the project anywhere
from six to ten months.
This is a classic
example of the fallacy of the mythical
man-month. The problem with the Mozilla
code was poor design, not lack of an
able workforce. Throwing more bodies
at the project didn't necessarily help;
it may have even hindered it. And while
implementing a community development
process may have allowed Netscape to
sidestep its own internal management
problems, it was certainly no silver
bullet for success.
The key to developing
good software the first time around
is doing the hard work at the beginning:
good design, and rigorous testing of
that design. Fail that, and you've got
no choice but to take the hard road.
As Brooks observed all those years ago,
successful software will never be easy.
No amount of open source process will
change that, and to think otherwise
is just more Lego-programming nonsense.
It's interesting that Perl is at 30% in this survey (as unscientific as it is)
On the heels of last weekend's Ruby Conference in Denver (for a report, see
Jack Woehr's blog), Sun Microsystems made a Ruby-related announcement of
its own. Led by Charles Nutter and Thomas Enebo, the chief maintainers of
JRuby, a 100% pure
Java implementation of the Ruby language, Sun has released JRuby 0.9.1. Among
the features of this release are:
- Overall performance is 50-60% faster than JRuby 0.9.0
- New interpreter design
- Refactoring of Method dispatch, code evaluation, and block dispatch
code
- Parser performance enhancement
- Rewriting of Enumerable and StringScanner in Java
- New syntax for including Java classes into Ruby
In related news, Ola Bini has been inducted into JRuby as a core developer
during this development cycle.
Details are available at
Thomas
Enebo's blog and
Ola Bini's blog.
I was just looking at our
BookScan data mart to update a reporter on
Java vs. C# adoption. (The answer to his query: in the last twelve weeks,
Java book sales are off 4% vs. the same period last year, while C# book sales
are up 16%.) While I was looking at the data, though, I noticed something perhaps
more newsworthy: in the same period, Ruby book sales
surpassed Python book sales for the first time. Python is up
20% vs. the same period last year, but Ruby is up 1552%! (Perl is down 3%.)
Perl is still the most commonly used of the three
languages, at least according to book sales, but Python and now Ruby are narrowing
the gap.
RoR, AJAX, SOA -- these are hype. The reality is that Java, JSP, PHP, Python,
Perl, and Tcl/Tk are what people use these days. And if it's a web app, they
use PHP or JSP.
RoR is too time-consuming. It takes too long to learn and provides too few results
in that timeframe compared to a PHP developer.
AJAX is also time-consuming and assumes too much about the stability of the
browser client. And it puts way too much power into ugly Javascript. It's good
for only a smidgen of things in only a smidgen of environments.
Java and JSP is around only because of seniority. It was hyped and backed by
big companies as the only other option to Microsoft's stuff. Now we're stuck
with it. In reality, JSP and Java programmers spend too much time in meetings
going over OOP minutea. PHP programmers may use a little OOP, but they focus
most on just getting it done.
Python seems to have taken hold on Linux only as far as a rich client environment.
It's not used enough for web apps.
Re: The departure
of the hyper-enthusiasts Posted: Dec 18, 2005 5:54 PM
The issue
at hand is comparable to the "to use or not to use EJB". I, too, had a bad time
trying to use EJBs, so maybe you can demonstrate some simpathy for a now Ruby
user who can't seem to use any other language.
I claim that Ruby is simple enough for me to concentrate on the problem and
not on the language (primary tool). Maybe for you Python is cleaner, but to
me Python is harder than Ruby when I try to read the code. Ruby has a nice convention
of "CamelCase", "methods_names", "AClass.new", etc, that make the code easier
to read than a similar Python code, because in Python you don't have a good
convention for that. Also, when I require 'afile.rb' in Ruby, it's much easier
to read than the "import this.that.Something" in Python. Thus, despite the forced
indentation, I prefer the way that the Ruby code looks and feels in comparison
to the Python code.
On the supported libraries, Python has a very good selection, indeed. I would
say that the Python libraries might be very good in comparison to the Ruby libraries.
On the other hand, Ruby has very unique libraries which feel good to use. So,
even if Python has more libraries, Ruby should have some quality libraries that
compensate a lot for the difference. By considering that one should be well
served using Ruby or Python in terms of libraries, the Python's force over Ruby
diminishes quite a bit.
Finally, when you are up to the task of creating something new, like a library
or program, you may be much more well served by using Ruby if you get to the
point of fluid Ruby programming. But, if all you want is to create some web
app, maybe Rails already fulfills your requirements.
Even if you consider Python better, for example, because Googles uses
it and you want to work for Google or something, that won't make us Ruby users
give up on improving the language and the available tools. I simply
love Ruby and I will keep using it for the forseeable future -- in the future,
if I can make a major contribution to the Ruby community, I will.
The author is really incoherent in this rant (also he cannot be right by definition
as he loves Emacs ;-) and is mixing apples with oranges (greatness of a programmer
as an artist and greatness of a programmer as an innovator), but the idea that easy
extensibility is a huge advantage and openness of code does not matter much deserve
mentioning.
Any sufficiently flexible and programmable environment — say Emacs, or Ruby
on Rails, or Firefox, or even my game Wyvern — begins to take on characteristics
of both language and operating system as it grows. So I'm lumping together a
big class of programs that have similar characteristics.
I guess you could call them frameworks, or extensible
systems.
... ... ...
Not that we'd really know, because how often do we go look at the source
code for the frameworks we use? How much time have you spent examining
the source code of your favorite programming language's compiler, interpreter
or VM? And by the time such systems reach sufficient size and usefulness,
how much of that code was actually penned by the original author?
Sure, we might go look at framework code sometimes. But it just looks like,
well, code. There's usually nothing particularly famous-looking or even
glamorous about it. Go look at the source code for Emacs or Rails or
Python or Firefox, and it's just a big ball of code. In fact, often as not it's
a big hairy ball, and the original author is focused on refactoring
or even rewriting big sections of it.
I was in Barnes today, doing my usual weekend stroll through the tech section.
Helps me keep up on the latest trends. And wouldn't you know it, I skipped a
few weeks there, and suddenly Ruby and Rails have almost as many books out as
Python. I counted eleven Ruby/RoR titles tonight, and thirteen for Python (including
one Zope book). And Ruby had a big display section at the end of one of the
shelves.
Not all the publishers were O'Reilly and Pragmatic Press. I'm pretty sure there
were two or three others there, so it's not just a plot by Tim O'Reilly to sell
more books. Well, actually that's exactly what it is, but it's based on actual
market research that led him to the conclusion that Rails and Ruby are both
gathering steam like nobody's business.
... ... ...
I do a lot more programming in Python than in Ruby -- Jython in my game server,
and Python at work, since that's what everyone there uses for scripting. I have
maybe 3x more experience with Python than with Ruby (and 10x more experience
with Perl). But Perl and Python both have more unnecessary conceptual overhead,
so I find I have to consult the docs more often with both of them. And when
all's said and done, Ruby code generally winds up being the most direct and
succinct, whether it's mine or someone else's.
I have a lot of trouble writing about Ruby, because I find there's nothing to
say. It's why I almost never post to the O'Reilly Ruby blog. Ruby seems so self-explanatory
to me. It makes it almost boring; you try to focus on Ruby and you wind up talking
about some problem domain instead of the language. I think that's the goal of
all programming languages, but so far Ruby's one of the few to succeed at it
so well.
... ... ...
I think next year Ruby's going to be muscling in on Perl in terms of mindshare,
or shelf-share, at B&N.
Several weeks ago there was a
notable bit of controversy over some comments made by James Gosling, father
of the Java programming language. He has since
addressed the flame war that erupted, but the whole ordeal got me thinking
seriously about PHP and its scalability and performance abilities compared to
Java. I knew that several hugely popular Web 2.0 applications were written in
scripting languages like PHP, so I contacted Owen Byrne - Senior Software Engineer
at digg.com to learn how he
addressed any problems they encountered during their meteoric growth. This article
addresses the all-to-common false assumptions about the cost of scalability
and performance in PHP applications.
At the time Gosling’s comments were made, I was working on tuning and optimizing
the source code and server configuration for the launch of
Jobby, a Web 2.0 resume
tracking application written using the
WASP PHP framework.
I really hadn’t done any substantial research on how to best optimize PHP applications
at the time. My background is heavy in the architecture and development of highly
scalable applications in Java, but I realized there were enough substantial
differences between Java and PHP to cause me concern. In my experience, it was
certainly faster to develop web applications in languages like PHP; but I was
curious as to how much of that time savings might be lost to performance tuning
and scaling costs. What I found was both encouraging and surprising.
What are Performance and Scalability?
Before I go on, I want to make sure the ideas of performance and scalability
are understood. Performance is measured by the output behavior of the application.
In other words, performance is whether or not the app is fast. A good performing
web application is expected to render a page in around or under 1 second (depending
on the complexity of the page, of course). Scalability is the ability of the
application to maintain good performance under heavy load with the addition
of resources. For example, as the popularity of a web application grows, it
can be called scalable if you can maintain good performance metrics by simply
making small hardware additions. With that in mind, I wondered how PHP would
perform under heavy load, and whether it would scale well compared with Java.
Hardware Cost
My first concern was raw horsepower. Executing scripting language code is more
hardware intensive because to the code isn’t compiled. The hardware we had avai