Sync usage with man page.
[netbsd-mini2440.git] / share / doc / usd / 01.begin / u4
blob328d8f01c9c1b8413ec09c24f9f0179a0c904936
1 .\"     $NetBSD$
2 .\"
3 .\" Copyright (C) Caldera International Inc.  2001-2002.
4 .\" All rights reserved.
5 .\"
6 .\" Redistribution and use in source and binary forms, with or without
7 .\" modification, are permitted provided that the following conditions
8 .\" are met:
9 .\" 1. Redistributions of source code and documentation must retain the above
10 .\"    copyright notice, this list of conditions and the following disclaimer.
11 .\" 2. Redistributions in binary form must reproduce the above copyright
12 .\"    notice, this list of conditions and the following disclaimer in the
13 .\"    documentation and/or other materials provided with the distribution.
14 .\" 3. All advertising materials mentioning features or use of this software
15 .\"    must display the following acknowledgement:
16 .\"     This product includes software developed or owned by Caldera
17 .\"     International, Inc.
18 .\" 4. Neither the name of Caldera International, Inc. nor the names of other
19 .\"    contributors may be used to endorse or promote products derived from
20 .\"    this software without specific prior written permission.
21 .\"
22 .\" USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
23 .\" INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
24 .\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25 .\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 .\" IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE FOR ANY DIRECT,
27 .\" INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28 .\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29 .\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31 .\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
32 .\" IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 .\" POSSIBILITY OF SUCH DAMAGE.
34 .\"
35 .\"     @(#)u4  8.1 (Berkeley) 6/8/93
36 .\"
37 .SH
38 IV.  PROGRAMMING
39 .PP
40 There will be no attempt made to teach any of
41 the programming languages available
42 but a few words of advice are in order.
43 One of the reasons why the
44 .UC UNIX
45 system is a productive programming environment
46 is that there is already a rich set of tools available,
47 and facilities like pipes, I/O redirection,
48 and the capabilities of the shell
49 often make it possible to do a job
50 by pasting together programs that already exist
51 instead of writing from scratch.
52 .SH
53 The Shell
54 .PP
55 The pipe mechanism lets you fabricate quite complicated operations
56 out of spare parts that already exist.
57 For example,
58 the first draft of the
59 .UL  spell 
60 program was (roughly)
61 .P1
62 .ta .6i 1.2i
63 cat ... \f2collect the files\f3
64 | tr ...        \f2put each word on a new line\f3
65 | tr ...        \f2delete punctuation, etc.\f3
66 | sort  \f2into dictionary order\f3
67 | uniq  \f2discard duplicates\f3
68 | comm  \f2print words in text\f3
69         \f2  but not in dictionary\f3
70 .P2
71 More pieces have been added subsequently,
72 but this goes a long way
73 for such a small effort.
74 .PP
75 The editor can be made to do things that would normally
76 require special programs on other systems.
77 For example, to list the first and last lines of each of a
78 set of files, such as a book,
79 you could laboriously type
80 .P1
82 e chap1.1
85 e chap1.2
88 .ft R
89 etc.
90 .P2
91 But you can do the job much more easily.
92 One way is to type
93 .P1
94 ls chap* >temp
95 .P2
96 to get the list of filenames into a file.
97 Then edit this file to make the necessary
98 series of editing commands
99 (using the global commands of
100 .UL ed ),
101 and write it into
102 .UL script .
103 Now the command
105 ed <script
107 will produce
108 the same output as the laborious hand typing.
109 Alternately
110 (and more easily),
111 you can use the fact that the shell will perform loops,
112 repeating a set of commands over and over again
113 for a set of arguments:
115 for i in chap*
117         ed $i <script
118 done
120 This sets the shell variable
121 .UL i
122 to each file name in turn,
123 then does the command.
124 You can type this command at the terminal,
125 or put it in a file for later execution.
127 Programming the Shell
129 An option often overlooked by newcomers
130 is that the shell is itself a programming language,
131 with variables,
132 control flow
133 .UL if-else , (
134 .UL while ,
135 .UL for ,
136 .UL case ),
137 subroutines,
138 and interrupt handling.
139 Since
140 there are
141 many building-block programs,
142 you can sometimes avoid writing a new program
143 merely by piecing together some of the building blocks
144 with shell command files.
146 We will not go into any details here;
147 examples and rules can be found in
149 An Introduction to the
151 .UC UNIX
152 .IT Shell ,
153 by S. R. Bourne.
155 Programming in C
157 If you are undertaking anything substantial,
158 C is the only reasonable choice of programming language:
159 everything in
161 .UC UNIX
162 system
163 is tuned to it.
165 system
166 itself
167 is written in C,
168 as are most of the programs that run on it.
169 It is also an easy language to use
170 once you get started.
171 C is introduced and fully described in
173 The C Programming Language
175 B. W. Kernighan and D. M. Ritchie
176 (Prentice-Hall, 1978).
177 Several sections of the manual
178 describe the system interfaces, that is,
179 how you do I/O
180 and similar functions.
181 Read
183 UNIX Programming
184 for more complicated things.
186 Most input and output in C is best handled with the 
187 standard I/O library,
188 which provides a set of I/O functions
189 that exist in compatible form on most machines
190 that have C compilers.
191 In general, it's wisest to confine the system interactions
192 in a program to the facilities provided by this library.
194 C programs that don't depend too much on special features of 
195 .UC UNIX
196 (such as pipes)
197 can be moved to other computers that have C compilers.
198 The list of such machines grows daily;
199 in addition to the original
200 .UC PDP -11,
201 it currently includes
202 at least
203 Honeywell 6000,
204 IBM 370 and PC families,
205 Interdata 8/32,
206 Data General Nova and Eclipse,
207 HP 2100,
208 Harris /7,
209 Motorola 68000 family (including machines like Sun Microsystems and
210 Apple Macintosh),
211 VAX 11 family,
212 SEL 86,
214 Zilog Z80.
215 Calls to the standard I/O library will work on all of these machines.
217 There are a number of supporting programs that go with C.
218 .UL lint
219 checks C programs for potential portability problems,
220 and detects errors such as mismatched argument types
221 and uninitialized variables.
223 For larger programs
224 (anything whose source is on more than one file)
225 .UL make
226 allows you to specify the dependencies among the source files
227 and the processing steps needed to make a new version;
228 it then checks the times that the pieces were last changed
229 and does the minimal amount of recompiling
230 to create a consistent updated version.
232 The debugger
233 .UL gdb
234 is useful for digging through the dead bodies
235 of C programs,
236 but is rather hard to learn to use effectively.
237 The most effective debugging tool is still
238 careful thought, coupled with judiciously placed
239 print statements.
241 The C compiler provides a limited instrumentation service,
242 so you can find out
243 where programs spend their time and what parts are worth optimizing.
244 Compile the routines with the
245 .UL \-pg
246 option;
247 after the test run, use
248 .UL gprof
249 to print an execution profile.
250 The command
251 .UL time
252 will give you the gross run-time statistics
253 of a program, but they are not super accurate or reproducible.
255 Other Languages
257 If you 
259 have
260 to use Fortran,
261 there are two possibilities.
262 You might consider
263 Ratfor,
264 which gives you the decent control structures
265 and free-form input that characterize C,
266 yet lets you write code that
267 is still portable to other environments.
268 Bear in mind that
269 .UC UNIX
270 Fortran
271 tends to produce large and relatively slow-running
272 programs.
273 Furthermore, supporting software like
274 .UL gdb ,
275 .UL prof ,
276 etc., are all virtually useless with Fortran programs.
277 There may also be a Fortran 77 compiler on your system.
278 If so,
279 this is a viable alternative to 
280 Ratfor,
281 and has the non-trivial advantage that it is compatible with C
282 and related programs.
283 (The Ratfor processor
284 and C tools
285 can be used with Fortran 77 too.)
287 If your application requires you to translate
288 a language into a set of actions or another language,
289 you are in effect building a compiler,
290 though probably a small one.
291 In that case,
292 you should be using
294 .UL yacc
295 compiler-compiler, 
296 which helps you develop a compiler quickly.
298 .UL lex
299 lexical analyzer generator does the same job
300 for the simpler languages that can be expressed as regular expressions.
301 It can be used by itself,
302 or as a front end to recognize inputs for a
303 .UL yacc -based
304 program.
305 Both
306 .UL yacc
308 .UL lex
309 require some sophistication to use,
310 but the initial effort of learning them
311 can be repaid many times over in programs
312 that are easy to change later on.
314 Most
315 .UC UNIX
316 systems also make available other languages,
317 such as
318 Algol 68, APL, Basic, Lisp, Pascal, and Snobol.
319 Whether these are useful depends largely on the local environment:
320 if someone cares about the language and has worked on it,
321 it may be in good shape.
322 If not, the odds are strong that it
323 will be more trouble than it's worth.