Chinaunix首页 | 论坛 | 博客
  • 博客访问: 266198
  • 博文数量: 83
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 868
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-10 20:53
个人简介

静是从容,淡是境界

文章分类

全部博文(83)

分类:

2007-04-12 00:07:53

本文作者:Patrick Jordan

   Java 和 C 最流行的开发语言,计算机语言教学也大多围绕其展开,对于初学者来说Python语言可能会是一个更好的选择。

***

例子

BASIC, C, Java 和 Python来做示例。

"Hello World" 程序测试两个方面:

  • 花多少时间编写和调试
  • 学习者在编写过程中需要理解的东西

BASIC

10 INPUT A
20 INPUT B
30 C=A+B
40 PRINT C

RUN

Time to write:

15 seconds. I admit I don't have a BASIC interpreter handy and did not test this, but I just know it works. (OK, I fired up the TRS-80 emulator and actually ran it - it works...)

Things to explain:

  • Line numbers
  • Variables
  • INPUT
  • PRINT
  • RUN

Pros and Cons

BASIC is very easy for beginners to get started with, but it is an old, poorly designed language, lacking in almost every modern feature. Visual BASIC adds a lot to "good 'ol BASIC", but it is not appropriate (I believe) to teach a single-platform proprietary language. And it's still not really a good language....


C

#include 

int main(int argc, char*argv[])
{
int a,b,c;

scanf("%d",&a);
scanf("%d",&b);

c = a+b;
printf("%d\n",c);
}

%> gcc -o add add.c
%> ./add

Time to write:

about three minutes, including debugging.

Things to explain:

  • #include, functions (main), return types, argc, argv
  • variables, types (int)
  • scanf (and pretty soon it's limitations and how to work around them)
  • printf, format strings
  • pointers (already!!)
  • compiling, braces and semicolons

Pros and Cons

C was designed by top hackers for their own use. It was designed for writing operating systems, compilers and other system tools, and in this role it has become almost totally dominant.

It can provide excellent performance (assuming good choice of algorithm and good C skills) and allows low level hardware access, but these are not normally things required by the beginner. C's use of pointers are a source of frustration and confusion for beginners, but they are essential in even fairly trivial programs (like the one above, albeit in a trivial way).

Further, C's string handling is weak compared to many other modern languages (the scanf function used above is notoriously problematic).

C is a major and very important language, and all programmers should have significant exposure to it. It is however a terrible language to teach beginners. There is too much C that has to be explained, leaving less time for explaining programming.


Java

import java.io.*;
public class Addup
{
static public void main(String args[]) {
InputStreamReader stdin = new InputStreamReader(System.in);
BufferedReader console = new BufferedReader(stdin);
int i1 = 0,i2 = 0;
String s1,s2;
try {
s1 = console.readLine();
i1 = Integer.parseInt(s1);
s2 = console.readLine();
i2 = Integer.parseInt(s2);
}
catch(IOException ioex) {
System.out.println("Input error");
System.exit(1);
}
catch(NumberFormatException nfex) {
System.out.println("\"" + nfex.getMessage() + "\" is not numeric");
System.exit(1);
}
System.out.println(i1 + " + " + i2 + " = " + (i1+i2));
System.exit(0);
}
}
%> javac Addup.java
%> java Addup

Time to write:

19 minutes! Actually, I spent about 15 minutes, failed, then searched Google for an example. The code above is copied from , which, tellingly I thought, starts with the words "It might be thought that a programme that reads in two user entered integers and prints out their sum would be a simple piece of code".

Obviously, this code is not perfectly equivalent to the other programs presented here since it does proper error checking, however Java makes it difficult not to do error checking. You must catch the exceptions, and having caught them you might as well do something with them.

I'm actually kind of embarassed I had so much trouble with this - I've been working on a commercial Java package for two years, but because it's GUI based I rarely have to deal with reading from the console. Real Java programmers will probably look down on me with a mixture of pity and disgust. Such is life.

Things to explain

  • import, classes, semicolons braces
  • public, static, void, String, main args[]
  • InputStreamReader, BufferedReader, System.in
  • variables, types
  • try, catch, exceptions, readLine, parseInt
  • System.out.println, compiling, running

Pros and Cons

Java is a useful language for cross-platform GUI development, is a robust platform for OO development, and has an extensive and highly evolved set of class libraries. Perhaps most importantly, it's the most popular language around and there's lots of jobs for Java programmers.

The extensive class library is however quite daunting. It appears there's a class for almost everything, and much of "programming in Java" seems to consist of "searching for the right class". Even after two years I find I cannot do much in Java without constant reference to the documentation.

Java enforces Object Orientation, exception checking and strict typing - these are all (arguably) good things - they make it easier for a group of programmers to robustly create large systems. But for small problems (such as those faced in introductory programming classes) these things become nothing more than a complicated, time-sucking burden.

The employment reason alone is sufficient to make Java a "must teach" lanaguage, but I believe we do our students a disservice if this is the best language we show them.


Python

import sys

a = sys.stdin.readline()
b = sys.stdin.readline()
c = int(a) + int(b)
print c

%> python add.py

Time to write:

about one minute, including testing and debugging.

Things to explain

  • import
  • variables
  • sys.stdin
  • readline (reads a string)
  • int (converts a string to an integer)
  • print

Pros and Cons

Python has an awful lot of good points:

  • enforces good programming style (indentation is meaningful)
  • OO available but not enforced
  • Exceptions used but not enforced
  • is not a toy or academic language - much real world work is done in Python
  • allows concentration on algorithms and problem, not on language features and shortcoming.
  • is cross platform and has a powerful set of libraries
  • is safe - it has dynamic run time type checking and bounds checking on arrays
  • has powerful built-in data types - dictionaries, lists, sequences, functions, sets (in 2.4)
  • has powerful built-in control structures - simple looping over sequences, map, generators, list comprehensions, regular expressions...
  • requires less lines of code for any given problem, and is more readable - thus greater productivity.
For teaching as a first language however it has some specific advantages. As can be seen from the examples above (ignoring BASIC), Python requires less time, less lines of code, and less concepts to be taught to reach a given goal. This allows more time to be spent on the important things. Further, some common student errors are completely byassed in Python:

  • end of line is end of line (no forgotten semicolons)
  • no type declarations
  • true block structure always obvious (no missing braces error)
  • dynamic memory allocation and garbage collection
Finally programming in Python is fun! Fun and frequent success breed confidence and interest in the student, who is then better placed to continue learning to program.

But Python is Just a Scripting Language

Python is often dismissed as "just a scripting language" (Perl and Ruby also suffer from this silly bigotry). This is simply incorrect. It is not "just a scripting language" - it is a full featured very high level language that is ideal for many applications, including simple scripting duties.

The fact that you can write "quick and dirty" scripts in Python is an advantage, not a disadvantage, since scripting is actually an essential part of professional programming. If students don't know Python (or Perl, or Ruby, or....), they will waste a lot of time trying to solve script-like problems in Java.

But Python is Slooooooow

Python is an interpreted language, and this does add some overhead. Dynamic bounds checking, dynamic typing and other clever Python things slow it down even further. Python can be orders of magnitude slower than equivalent C code. However

  • Many, many applications are not compute bound. To use a high performance language for them exemplifies the sin of early optimisation.
  • Python interfaces well to C - enormous gains can be made by coding critical sections in C
  • Time saved coding in Python, and the much greater simplicity of the code written, allows much more time for experimentation in more efficient algorithms - often much more fruitful than simply running a bad algorithm very quickly.

Conclusion

C and Java are important languages - for the concepts they embody, for the employment prospects, and for the classes of problems they solve. Students must be given a thorough grounding in these languages. They do not however form a sufficient arsenal for the professional programmer - a good "scripting language" is a must - nor are they good languages to teach students new to programming. They have a lot of overhead and other impediments that take a lot of the pleasure out, and make both the student's and the teacher's jobs more difficult than they ought to be.

There are people who would argue that the impediments are part of the discipline of programming - students must learn to catch their exceptions, use pointers, declare all their types and so forth. Maybe, maybe not - but there's time for that later. Let's let students have the simple joy of small successes that we (well, "I" anyway) had when we were starting. Patrick Jordan - patrick@ariel.com.au - 2004-12-14


Postscript (Feb 2006)

Aside from the comments above, a vast number of people wrote to me after this article appeared on Daily Python to point out that there was a simpler way to do it in Python:
a = input()
b = input()
c = a + b
print c

%> python add.py
(various one liners like 'print input()+input()' were also suggested and work just as well but I'd argue are less useful for teaching purposes). Further, since input() accepts any valid Python expression, this program just works for a whole range of inputs - ints, floats, strings (it'll concatenate them - but note that they must be in quotes else they'll be interpreted as variable names) or expressions such as "3.14**2". Further proof, as if it was needed, of the beauty of Python.
阅读(687) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~