ZT:History and Evolution of Computer languages



所有跟贴·加跟贴·新语丝读书论坛http://www.xys.org/cgi-bin/mainpage.pl

送交者: xinku 于 2006-3-06, 19:16:48:

History and Evolution
of Computer languages
List of programming langages with a compiler or interpreter
by D.G. Sureau

This document is (c) 2000-2006 by D.G Sureau.You can print it and reproduce it for educational purpose. You can't put this document on another website but should rather put a link on this page.

Selection criteria: A programming language enters the history if it is widely used or if it has inspirated other programming languages. New languages with innovative features are also listed.

First language
Ada Lovelace and Babbage and its nephew were writing programs for the project of difference engine, then the analytical engine, of Babbage.
In 1945, the german K. Zuse, inventor of the Z3 computer would have defined an evolved language for this engine (with arrays and records). Few documents on this language exist.

Assembly
Fsd Simtel
Assemblers exist since the beginning of computers. They associate a symbolic name to the machine-language code, for example:
add bx, 4
cmp [adr], 3
jmp address
Assembly programming is not longer frequently practiced, even for fast routines...

Autocoder - 1952
Alick E. Glennie
Implemented firstly on Mark 1, then on other computers, this is a symbolic code.

IPL - 1956 - Information Processing Language
A. Newell, H. Simon, J.C. Shaw
Low-level list processing language. Implements the RECURSIVITY.

Fortran - 1954-1958 - FORmula TRANslator system
John Backus and other researchers at IBM
Fsd
Language dedicated to mathematical calculations.
Fortran II (1958) introduced SUB-ROUTINES, FUNCTIONS, LOOPS, a primitive FOR control structure.
Identifiers were limited to six characters.

Lisp - 1958-1960 - LISt Processing
Mac Carthy
Fsd
Funtional language for list processing.
It is recursive, and not iterative. There is no difference between code and data.

IAL - 1958 - International Algebraic Logic

First name for Algol 58, never implemented.

Algol - 1960 / Algol W - 1966 / Algol 68 - ALGOrithmic Language
Defined by an international consortium of computer science specialists, coordinated by IFIP
Algol Génie
This was the fist universal language to be machine independent.
Introduces the use of the BNF (Backus Naur Form) grammar to create a syntax parser.
Introduces BLOCKS of STATEMENTS, and LOCAL VARIABLES inside a block.
Recursivity was implemented with reticence as this was considered as useless!
Use DYNAMIC ARRAYS, and this means that following language (Pascal, C) have regressed by using static arrays for better performance.
It has IF THEN ELSE, FOR, the := symbol for assignment (used then by Pascal), a SWITCH with gotos, the BEGIN END markers, the WHILE loop.

Algol W by Niklaus Wirth in 1966 was using RECORDS, that are dynamic data structures, CASE, passing parameters by value, precedence of operators.
The same year, Niklaus Wirth has created Euler, a language between Algol and Pascal.

Algol 60 was remaining a language oriented toward mathematical calculations. To try to reach the original goal of a general purpose language, a new version has been started in 1964, Algol X, renamed then Algol 68.
Algol 68 was using =+ to merge assignment with add. It has introduced UNION and CAST of types.. It has an IF THEN ELIF FI, CASE, GOTO, user-defined operators.
Incremental compiling was not allowed.

Cobol - 1960 - COmmon Business Oriented Langage
Defined by a committee, the CODASYL, COnference on DAta SYsystems Languages
Fsd
The committe under the auspices of the Department Of Defense with manufacturers, universities and users, worked from may 1959 to april 1960.
Grace Murray Hopper, who had designed Flow-Matic, a compiled language in the 50's, participated to the committee.
Classical procedural language aimed at enterprise management, in wich a program is divided in 4 divisions: identification, environment, data, procedure, and they may be divided in sections. It was founded on data and a program must describe precisely the hardware and input/ouput data format.
It introduced the RECORD data structure. Programs are documented by the syntax and are all but ligthweight ;-).

APL - 1964 - A Programming Language
K. Iverson
Fsd Simtel
Language using a mathematical notation, with lot of operators. A unique type, the array.
Defined from 1957 to 1960, implemented in 1964.

Basic - 1964 - Beginner’s All-purpose Symbolic Instruction Code
John Kemeny, Thomas Kurtz
Card
Has been designed in 1963, to be easy to learn and has been implemented in 1964. The first version was compiled, then it has become interactive and interpreted. Each line has a number to allow GOTOs jump on it!
Bill Gate and Paul Allen have win an international contest by designing and implementing a fast and compact Basic, firstly for the Altair (in 4 kb memory!) and then on other micro-computers.
Micro-computers were delivered with Basic in ROM until late 80.
In 1977, the Apple II was sold with an integer Basic. Then the Applesoft Basic of Microsoft with floating-point. Applesoft had two-letter identifiers!! Sub-programs were called by a GOSUB on a line number.
The first PC from IBM, (in 1981) was using MS-DOS from Microsoft and its interpreted Basic (Basica). In 82 Microsoft produced its first compiled Basic (Quick Basic).
Pascal and C have replaced Basic in the same decade. Microsoft still uses Basic. Visual Basic for application, Asp for the web and language extending applications (macro) are basic.
True Basic, by the original authors of the language is compiled and no longer uses line numbers.

Iswim - 1965 - If You See What I Mean
P. Landin

First purely fonctional language, in the mathematical sense. The first to use LAZY EVALUATION.

Attribute grammars - 1965
Donald Knuth

Completing the BNFmethod, attribute grammars describes the semantic of languages as functions. This type of grammar helps the building of compilers.

Simula 67 - 1962-67
Ole-Johan Dahl, Kristan Nygaard
Fsd
The Simula project started in 1962. The goal was to build a tool to describe discrete event system, or network, and a language to program simulating real world.
Was firstly designed as an Algol extension.
In 1964, Simula 1 has been implemented on Univac 1107. It was used to control administrations, airports, planning, transport, or social systems.
This was a specialized tool. In 1966, it has been decided to make it an universal language. Several projects has been launched with the help of several makers (Ibm, Univac, Digital) and this leaded to Simula 67.
This universal language has introduced CLASSES, INHERITANCE and OBJECTS that are instances of classes. Classes allow to link functions (renamed methods) to objects.

Logo - 1966
Fuerzeig, Seymour Papert, and others

Aimed to teach programming to children, near Lisp, and based on moving a "turtle" on the screen.

Snobol 4 - 1967 - StroNg Oriented symBOlic Language
D.J. Farber, R.E. Griswold, F.P. Polensky at Bells Labs

Snobol appeared in 1962.
Snobol 4 is the first stable distributed version of Snobol, available in 1967.
This is a processor or strings, founded on the principle of pattern-matching, concatenation and alternation.
It was the first language to implement associative arrays, indexed by any type of keys.
It allows to run code stored inside strings.
Data types are: string, integer, real, array, table, pattern and user-defined types.

CPL - Combined Programming Language
Cambridge and London Universities

This was a combination of Algol 60 and functional language aimed at proof of theorems. It was using polymorphic testing structures. Typed language with the "any" joker type. Had list and array.
Complex, was not implemented. I quote it only because it was a step toward the design of the C language.

BCPL - 1965? - Basic CPL
Martin Richards

It has been intended to be a simplified version of CPL.
Was using these control structures: FOR, LOOP, IF THEN, WHILE, UNTIL, REPEAT, REPEAT WHILE, SWITCH CASE, etc...
Had procedures and functions, unlike C.
Block delimiters were $( ..... $) which has inspirated perhaps the /* ... */ of C.

PL/1 - 1965? - Programming Language number One - Originally NPL (New Programming Language)
IBM
Ibm for links on compilers.
The language was designed to be of general-purpose and modular.
Keywords are reserved only in the context where they are used as keywords.
It is more hardware-independent than predecessors. These types are recognized: fixed, real, complex, character, bit, bin, pointer, picture, file, etc.... Data have default attributes (as precision for example), that depends upon the context.
These compound types are built-in: array, structures, unions, and combinations of them. IF THEN and SELECT .. WHEN .. OTHERWISE are conditional structures, and variations on the DO structure allows various conditional loops.
Storage classes are introduced: automatic, static (life of the program), controlled, based. Exceptions are implemented.

Pascal - 1970 - Named from the french mathematician Blaise Pascal
Niklaus Wirth
Card
Language aimed to ease the building of compilers, and to lead teaching by forcing to a structured programming.
UCSD Pascal, written by a group of programmers leaded away by Kenneth Bowles is the first version for micro-computers. It compiles programs in P-code, that is portable and interpreted (as Java later). It included a complete development environment, a principle used successfully further by Turbo Pascal.
In 1981, a role playing game written in Pascal, Wizardry, has had a big success on Apple II.
When Turbo Pascal (by Anders hejlsberg) appeared in 1983 , fast and having a complete IDE, the language gained success and is still widely used.
Control structures are near C ones.

Icon - 1970+
Griswold

Procedural language, with word processing function as Snobol4, and powerful constructs.
It has structured types: list, set, table (dictionary).
A list is declared: name := [ "word", "word", number, etc...]
A list may be indexed in the form a[i] or be used as a stack.
A "set" hold elements without doubloons, and has several functions: union, intersection, removing.
The RANGE construct is written: a to b where "to" is a keyword and "a" and "b" are variables..
A range may used inside an expression or as argument of a function. The expression or the function are called with each value in the range.
Ex: write(1 to 5) will display 1, 2, 3, 4 ,5.
Expression don't return a boolean value, but are either evaluated or rejected. The operation are executed if the expression may be evaluated. This is the first language where expression evaluating it leaded by the GOAL.
There is a statement of the C language: if ( x= expression) ... which means: assign to x the result of the expression, and if a is non zero, then..., this construct is generalized in Icon, if the expression may be evaluated, x gets the value, else x remains unchanged and the condition is ignored.
The EVERY..DO construct associated to an expression works as an iterator. As the range.
The ALTERNATION is another powerful construct. It allows to use a sequence of parameters until a result is obtained. The symbol is "|".
For example the statement : if a | b | c = 0 | 1 means for.... if a or b or c is 0 or 1 then ...

Forth - 1971 - Fourth reduced to Forth by the constraint of 5 letters of the IBM 1130
Charles H. Moore
Forth.org Simtel
Defined during 60+, seems to have been implemented in 1971.
Language for astronomical instruments using a stack to replace variables.
Its goal was to be the fourth generation language.

Smalltalk - 1972
Alan Kay and the Software Concept Group
Fsd
This is a fully object oriented language wich runs always inside a graphical environnment, with windows, mouse, etc...

C - 1973 - C is the successor of B, which is the successor of BCPL
Dennis Ritchie
Card
It was firstly destinated to program the UNIX operating system, but has become quickly universal thanks to its portability and speed.
Allows incremental compiling. In 1965, ATT programmers were using Bcpl to work on implementing Unix. Displeased with this language, they made it evolve to a new version named B, then to a new language named C.
This was the evolving of the hardware that instigate to create C. Bcpl and B was using integer for pointers, but this was not working on the new computers.
Bcpl has no type (as Php or other modern scripting languages!). The declarations int i, char b were created in C. Other types will appear later.


The += operator comes from Algol 68 (but was written =+)
In Bcpl, a block of statements was enclosed inside the (* and *) symbols as the comment in /* and */ and sub-expressions inside ( and ). I suppose this symbolism was intended to denote that anything is an expression in the language, and also to reduce the parsing time. The C language simplified the writting with the { and } symbols, that does the original idea doesn't remains.
Union and cast come from Algol 68.
++ was already in the B language.
The keyword "include" comes from PL/I.
The preprocessor was implemented in 1973, and C has been used from this date to write Unix, but Ritchie worked on it since 1969. The language has evolved until 1980. .

Prolog - 1970+
A. Colmerauer, D. Roussel
Inria
Has been developped both in France at Aix-en-Provence and at Edimburg.
Has introduced LOGIC PROGRAMMING. A program is made of Horn clauses.
Prolog is declarative, its system of logic inference is an engine of resolution.

Sql - 1970+ - Standard Query Language
IBM
mySQL
Language of query for relational databases. Successor of the Square language.

Awk - 1974 - First letters of authors' names
Aho, Kerninghan, Weinberger
Fsd
Word processing language based on regular expressions, using a pattern-action principle.

Scheme - 1975 - From "schemmer"
G. Steele, G. Sussman at MIT

Language inspirated by Lisp, used for scripting.

Plasma - 1975
Carl Hewitt

Language of actors. Implemented in Lisp.

Sasl - 1976 - Saint Andrews Static Language
D. Turner

Aimed to teach the functional programming.
Comes from Iswim, unlimited data structures.

ML - 1973? - Meta Language
R. Milner

Functional language inspirated by Iswim.
Its goal was to proof theorem at the Edimburg University.
Functions are replaced by pattern models.
Implemented in Lisp.

Modula 2 - 1979 - MODUlar LAnguage
Niklaus Wirth
Fsd
Modula 1 would be defined in 1977. Implemented on the Lilith workstation at first.
The idea is to reduce the risk of error with coercive programming rules. However, it add to Pascal some features of C. A call of function without argument is written f() as in C rather than f as in Pascal.
A program is splitted in modules with local scope, and interfaces for other modules. Use coroutines. Allows access to the hardware.
Was only used in Universities because these new features has been added also to Pascal by the makers of compilers (the units of Turbo Pascal mainly).

Ada - 1980+ - Nickname of Ada Byron de Lovelace, first woman to program
Designed by a committee leaded by Jean Ichbiah, for the U.S. D.O.D.
Fsd
Inspirated by Pascal and Algol W. Rather heavy.
Introduces GENERICITY of algorithms and a kind of primitive object orientation, but will become really object oriented later.
Introduces PACKAGES, that are independent modules.

C++ - 1981-1986
Bjarne Stroustrup
Card
Object oriented version of C.
Introduces OPERATOR OVERLOADING. Methods may be inline.
Use // for one-line comment, that comes from Bcpl, of which C is a successor!
Further, multiple inheritance and template (generic classes or functions) has been implemented.

Objective C, invented by Brad Cox in 1984, is another objet oriented version of C, inspirated by smalltalk. No operator overloading. Used to write NextStep, the operating system of the Next computer.

Standard ML - 1984
R. Milner, University of Edimburgh and Cambridge and Inria
Search for Standard ML Moscow on a search engine.
An implementation of ML.

Eiffel - 1985
Bertrand Meyer
Card
Procedural language fully object oriented , implementing persistency and programming per contract (using precondition and postcondition on functions). Was designed for security of software.
Compiled in C. May be interfaced with other langages. Has features of functional languages, generic classes, garbage collector.
An open source version exist, Sather, (from the name of a tower at Berkeley).

GAP - 1986 - Groups, Algorithms and Programming
Johannes Meier, Werner Nickel, Alice Niemeyer, Martin Sch鰊ert and others
Gap Software
The language has been defined to program mathematical algorithms.
It is interpreted, interactive an untyped. List and records are complex variables.
The syntax is that of Pascal with some differences. Comments for exemple are introduced by #.
An end of bloc is denoted by inverted keywords: if fi, do od.
The for loop has the forms: for in list, for in from to.
The language has procedures and functions.
What made it apart if that variables point out values and not memory addresses, and the form of a function' definition is as a call: x := function(arguments) body.
A function may be embedded inside another function.

Miranda - 1989 - From the name of a Shakespeare's heroin (Miranda, means for admirable in latin)
D.Turner

Inspirated by Sasl and ML. Lazy evaluation: arguments of functions are evaluated only when they are used. Embedded pattern-matching, modules.

Caml - 1987 - Categorical Abstract Machine Language
Suarez, Weiss, Maury
Inria
Caml and Objective caml in 1996, has implemented ML.

Perl - 1987 - Practical Extracting and Report Langage
Larry Wall
Perl
Destinated to replace command line language of Unix, Sh, Sed and Awk, it kept the same ugly syntax. Used mainly for system administration, CGI scripts.
Use lists and associatives arrays. The FOREACH control structure allows to scan lists.

Oberon - 1988
Niklaus Wirth
Simtel
Successor of Modula 2 (and Pascal).
Several commonly used constructs are suppressed to reduce the risk or error!. A garbage collector is added to.

Haskell - 1990 - Nickname of a logician, Haskell Curry

Haskell
Purely functional language. Inspirated by Miranda and Sasl.
Functional arrays, pattern matching.

ABC 1980-90 - ABC (equivalent to EZ in english)
CWI - Meertens, Pemberton (et Guido Van Rossum)
CWI Simtel
Scripting language elaborated at CWI in Netherlands, and the goal of which was to become a successor to Quick Basic or scripting languages of Unix.
Perhaps the first to use INDENTING to denote statements of a block: no markers as begin/end.
Another innovation, there is no file management, but rather persistency of the global variables: the value is stored from a session to another!
There are five types: number, string, list, composed (structure without fieldnames), array.

Python - 1991 - From the english TV movie "Monty Python Flying Circus"
Guido Van Rossum
Card
Scripting language with dynamic types. This is a replacement to Perl.
Inspirated by ABC, but is extensible with C libraries, and object oriented.
As ABC, used evolved types: tuple, list, dictionary.
The slicing operator [a : b] allows to extract a sub-list from a list.
There is a version that compiles in Java bytecode, jython and a port for .NET available on Active State.

Pov-Ray - 1991 - Persistence Of Vision (title of a mediocre science-fiction book).
D. & A. Collins, and contributors
PovRay
Pov-Ray is a language for describing 3D images.

DisCo - 1992 - Distributed Co-operation
Reino Kurki-Suonio
Disco
Disco is a specification language for reactive systems with Pascal-like syntax. Constructs of the language are objects, event-driven functions (named here actions), and relations. A function is activated when a state of the system occurs and mays be overwritten, this is named "refinement" in the language. Disco focuses on collective behavior. Layers are modules of the language. It is an system-oriented language with objects and behavior (not action-oriented as it is said in the presentation).

Ruby - 1994 - As the jewel, analogy with Perl
Yukihiro Matsumoto
Ruby-Lang
Ruby has been designed as successor to Perl and Python, to be clearer than the first one, and more object-oriented than the second one. The syntax comes from these two languages, it want to be without surprise and natural but may be complex.
There is no new control structure as in Scriptol, but a lot of minor innovations to let the code smaller.
It is an interpreted language easy to extend. Statements are terminated by end of line. Blocks of statement and loop are delimited by "end". Most Python's features are present: associative arrays, iterators...
Its originality is the dynamic object feature (adding methods to instances) and scope of variables denoted by a prefix.

Java - 1994 - Java (coffee)
James Gosling and other programmers at Sun
Card
Conceived at the beginning, in 1991, as an interactive language named Oak, was unsuccessful. But in 1994 has been rewritten for Internet and renamed Java. In 1995 navigators can run applets. In january 1996, Javasoft distribute JDK 1.0, the Java Developpement Kit.
Java is a classical procedural language, near C++. It compiles in bytecode, interpreted on any computer. .
It is simpler than C++: one class by file, automatic memory management, no pointers. No multiple inheritance nor operator overloading, but integrated multi-tasking.
Unlike C and C++, it has only dynamic arrays.

PHP - 1995 - Personal Home Pages Hypertext Processor
Rasmus Lerdorf
Card
Multi-platform scripting language, embedded inside Html.
Near C but no typed. Variables are prefixed by the $ symbol as the shell of Unix or as Perl. The interpreter parses a html page including php statements and delivers a pure html page.
An extended library of functions allows the Webmaster to build dynamically pages.
Microsoft uses an equivalent language under Windows, ASP, near Basic.

UML - 1996 - Unified Modeling Language
Standard by OMG (Object Management Group) - Grady Booch, Jim Rumbaugh, and Ivar Jacobson
Resources
Uml is the union of three modeling languages designed by the three authors above. The language uses a graphical notation to design software projects. A source is a diagram expressing objects and their interactions. A model is made of views and the combination of them describes a complete system. The model is abstract and domain-independent.

ECMAScript - 1997
Netscape - Standard by the european standardization organisation E.C.M.A.
More
Langage to build dynamic html pages client-side
Inventé par Netscape.
It is similar to Java but untyped and more powerful with some features common with Php.

Rebol - 1997 (The design is older) - Relative Expression-Based Object Language
Carl SassenRath
Rebol
Interpreted, extensible scripting language that produces compact code. It is aimed at communication on Internet and distributed computing.
Has 45 types using same operators (Ex: date, money...). Use [ ] to enclose blocks of statements.

C# - 2000 - (C-sharp), want to succeed to C++, the musical note means melody perhaps?
Anders Hejlsberg / Microsoft
Card
This is the main language of the .NET environment, to program software working thought Internet. As Java, it keeps the C syntax (a 30 years old language!) with same improvments: garbage collector, no pointer, interfaces, multi-tasking...
C# compiles to intermediate language, the MSIL (MicroSoft Intermediate Language), and uses a multi-languages library, the CLR (Common Language Runtime). The originality of the .Net system is that various language may be compiled to MSIL and share their classes.
Other new features come with this language:
- structs are now special kind of object, passed by values.
- litterals are objects also, with methods..
- attributes are descriptive objects attached to elements of the program and used by the runtime.
- properties: methods that may be used as variables (prop = 5 is equivalent to prop(5).
- foreach() to scan arrays (new only for Java and C++).
- delegate replaces pointer of functions of C.
There are improvments on Java also:
- event management is improved.
- operator overloading is present.
- simpler access to the native system.

AspectJ - 2001 - Aspect for Java
Palo Alto Research Center
Card
Aspect J is a Java extension that implements aspect-oriented programming. A technique that modularize crosscutting concerns. The unit is not the class, but a concern, that spans multiple classes. Concern may be for example properties, area of interest, of a system and AOP describes their relationship, and compose them together into a program. Aspects encapsulate behavior that concern multiple classes.

Scriptol - 2001 - Scriptwriter Oriented Language
Denis G. Sureau
Card
The most recent, the most powerful among procedural languages. Scriptol is either compiled in PHP or in C++ or native, giving it a great portability. It is both a language for applications, for scripting and to make dynamic web pages.
Blocs of statements and control structures are not closed by "end" or "}" but, as xml, with the form "/if", " /for", "/while" and so ones instead...
The language has new control structures: "for in", "while let", "scan by", etc... The "composite if" eases to implement rules.
Variables and litterals are objects. Basic object (number, text, etc...) and compound ones are created by direct assignment of a value or a list of arguments to the name.
Scriptol is destinated to evolve and to have, along classes, other high-level structures to allow programs to be nearest human thought.
Since October 2003, Scriptol allows to use Xml as internal data structure.

Scala - February 2004
Ecole Polytechnique Federale de Lausanne
EPFL
Scala is a pure object-oriented language that implements some Python features in the Java syntax. It is statically typed and both procedural and functional. It currently runs on JVM and .Net.

E4X - June 2004 - EcmaScript For Xml (E four X)
ECMA
Ecma
E4X is not a language but an addition to a language. In the same manner Scriptol use Xml as data structure with its own Dom instance, E4X allows to assign Xml to EcmaScript variables, and to access elements by indices or attributes.

The future

Some trends:

Scripting languages
Several modern scripting languages offer a simple, natural syntax: NetRexx, Python, Ruby, Scriptol. Python is the most widely used for now. Scriptol is the more innovative.
Internet languages
These languages allows to embed code inside html page and thus to combine statements and data. Php, Asp, JavaScript are the most used ones. Future plateforms as .Net will allow any language to be embedded into data.
Markup languages
The most recent trend is to turn xml documents into executables.
- Starting with version 4.1, scriptol embeds xml into scriptol sources as a data structure, that is usable by any statement in the source. That's is a next step beyond object-oriented programming.
- Xul is a Mozilla project that embeds JavaScript into Xml to easily produce GUI (the one of Mozilla for example). You have just to integrate XulRunner, the runtime.
- Microsoft uses Xaml and has also a conservative approach to integrate Xml, a project named Xen or X# to serialize a xml declaration into a class the user has to define for holding it.

A new C++ language, C++0x, probably C++09 standard. This new version should be easier to use and learn. It has tuples and garbage collector and an extended standard library with regular expression and threads.

Conclusion
The .Net or compatible platforms will ease to put code inside data, but xml may be an alternative. C# will be a leader language of such platform at start, but its success will come that programmers are used with the C++ and Java syntax. As the platform allows to use any language with common resources, it will permit new and powerful languages to emerge. The .net platform uses Xml by converting it into objects. The future is in using directly as data structure instead.
Other trends are higher level for languages, programming by aspects, or by schemas with uml and further concepts.


Resources and informations

Dmoz Mondial directory.
Wikipedia More details about main languages.
The complete list of programming languages, in alphabetical order.
Comments, parenthesis In several languages.
Brief history of programming languages.


(c) 2001-2006 Denis G.Sureau, January 2001 - Last revision March 2006
Home



所有跟贴:


加跟贴

笔名: 密码(可选项): 注册笔名请按这里

标题:

内容(可选项):

URL(可选项):
URL标题(可选项):
图像(可选项):


所有跟贴·加跟贴·新语丝读书论坛http://www.xys.org/cgi-bin/mainpage.pl