summaryrefslogtreecommitdiff
path: root/web/funnelAC/hackman/h_ch3.tex
blob: 5d4a5dd2262ae5f601d2888cdc6beaac0f511de0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
%==============================================================================%
%                              Start of Ch3.tex                                %
%==============================================================================%
%
% Copyright
% ---------
% Copyright (C) 1992 Ross N. Williams.
% This file contains a chapter of the FunnelWeb Hacker's Manual.
% See the main TeX file for this manual for further information.
%
%==============================================================================%

\chapter{FunnelWeb Modification}
\label{chapmod}\xx{FunnelWeb}{modification}

\section{Introduction}

This chapter deals with modifications to FunnelWeb. Although the
GNU license\xx{GNU}{license}
under which FunnelWeb is distributed allows anyone to
modify FunnelWeb and distribute the modified versions, there are a number of
dangers in doing this. This chapter explains the dangers and presents
some issues that you should think about if you intend to
distribute modified versions of FunnelWeb.

\section{The Danger of Modifying Languages}
\xx{changes}{dangers}\xx{languages}{dangers}

Whenever someone modifies a computer program they should always ask
themselves \dq{what is the impact of these changes going to be on
users}. For mature products, the degree of impact is largely determined
by the investment that users have made in particular file formats
supported by the product.

At the two extremes, there are the video game\x{video game} and the
compiler.\x{compiler}
If one changes a video game, the change affects only the future games
played. However, if one changes a compiler in particular ways,
it is likely that thousands of users will be forced to change millions
of source files to accommodate the new version. Thus the impact of changes
to a program depends largely on the investment made by users, in
source files, training, and even muscle memory!

FunnelWeb lies very much at the compiler end of this spectrum. In fact
it lies even further. Not only does it implement a language, but it is
currently the \i{only} implementation of that language! This means that,
although they shouldn't, people will be tempted to treat the FunnelWeb
program as the definition of its input language instead of
the definition chapter in the \i{FunnelWeb User's Manual},
which takes precedence.

Because FunnelWeb defines an input language, and people will write programs
using that language, particular kinds of changes in the language will
impact severely on users. Three different kinds of change are discussed
below.

\narrowthing{Removing features:}{Removal\xx{removing}{features}
of features (featurectomy) is extremely
difficult once the user base has started using them. If a feature is
removed, users of the program will have to go through all their
programs and find a way to simulate the effect of the removed feature
with other features. Often this is so unthinkable, that bad language
constructs are tolerated far beyond their useful lifetime.}

\narrowthing{Modifying features:}{Modification\xx{features}{modification}
of features has less
direct impact than the removal of features, but can cause more subtle errors.
For example, consider the sorts of subtle errors that might arise if the
semantics of the FunnelWeb comment \p{@!} were changed so that it no
longer includes the end of line marker. Anyone modifying features should
be sure that they are not inadvertently laying traps.}

\narrowthing{Adding features:}{Although\xx{features}{adding}
the addition of features is
generally the most painless for the user community, as Hoare points
out, it is also the most dangerous in the long run.}

\begin{quotation}
\dq{When any new language design project is nearing completion, there is
always a mad rush to get new features added before standardization.
The rush is mad indeed, because it leads into a trap from which there is
no escape. A feature which is omitted can always be added later, when its
design and its implications are well understood. A feature which is
included before it is fully understood can never be removed
later.}\paper{Hoare80}
\end{quotation}

These problems exist even when there is a central authority.
If we consider the case where there is no central authority, and
users modify a language and its implementations and distribute the
modified versions, the result is even worse. For a start, the
structure of the genealogy of the program\xx{genealogy}{program}
changes from a list to a tree.
This makes it impossible to impose an ordering on the different versions
and makes it difficult to merge them once they diverge. Second, it
reduces the portability of files created under different versions.
Third, it makes adding features hazardous. If a feature is added in
one version, files will be created that use it. These files will
immediately become non-portable. Furthermore, two programmers may
introduce different features that use the same syntactical constructs,
thus preventing the two versions from ever being merged. Worse, two
programmers could introduce \i{similar} features that use the
same syntactical constructs, producing even more subtle problems.

The only way to avoid all these problems is to create some sort of
central design authority,\xx{design}{authority}
(or, at the very least, some sort of design
synchronization) that controls the language and its implementation.

The benefits of tight control over the language are enormous.

\narrowthing{Universal portability:}{Source files can be treated as portable.
If all the language
implementations in the world are singing the same tune, then someone
in Sydney could send a file to someone in New York and be
sure that it will be successfully processed.}

\narrowthing{Clear semantics:}{Doubt about the semantics of the
language will be greatly minimized.
So long as more than one slightly differing version of a language exists,
there will be confusion over the semantics of its constructs. A good
example is the confusion between the AT\&T Unix\x{Unix}
and Berkeley Unix shell languages.}

While changes to the language supported by a piece of software is the
most serious problem associated with multiple versions of software,
the lesser problem of keeping track of changes that don't affect the
language that the software implements can also cause trouble. Merging
different versions of software is extremely tedious as anyone who
has tried it will verify. However, changes not affecting the
language are far less serious because they impact only on the program
itself, not on the far more numerous source files that depend on it.

\section{Authority vs User Security}
\xx{security}{authority}

There are a number of ways of providing the
strong central design authority required to produce
the portability and semantic security desired by users,

\begin{itemize}

\item Trade mark\x{trademark}
the name of the language. Publish a specification of the
language under the trade name. Warn all users not to trust any
implementation that does not guarantee that it implements the language.
Then control implementations by only licensing the trade mark to conforming
implementations.

\item Create a single implementation of the language. Do not release
the source code to the implementation. Release only binary executables.

\item Release the source code to the implementation, but under a license
that prohibits the distribution of modified versions.

\end{itemize}

Many other variations on these themes are possible, but they are all
based on the idea of regulating either the \dq{official}
definition of the language
or all of its existing implementations.

At about this stage, a conflict arises. While users want the language
they are using to be tightly controlled, they also want to feel secure
about the availability of its implementations. If hundreds of source
files are to be created in the language, there had better be one or
more translators available when the time comes to use them.

In the case of widely-used programming languages such as~C, the problem of
securing implementations does not arise. If you don't get your
compiler from Borland, you can get it from Microsoft. However, in the
case of a newly introduced language such as FunnelWeb, there may be
very few implementations, or even just one implementation,
and this poses a danger to the
user who is committing to that format. Despite the best intentions of the
copyright owner, there are a variety of ways in which a computer
program can suddenly become
unavailable.\xx{program}{availability} Here are some examples:

\begin{itemize}

\item If the program is owned by a company and the company goes broke,
the liquidators may not bother to place the software in the public domain.

\item If the program is owned by a kindly individual who issues licenses
for free, and that individual suddenly dies, users might suddenly find
themselves negotiating with hard-nosed estate executors for the rights
to continue using the program.

\item If whoever owns the program does not upgrade the program every so
often, it is actually possible for the released
executables to \dq{expire} when new operating system upgrades appear.

\end{itemize}

These possibilities mean that users about to invest in a newly
introduced programming
tool such as FunnelWeb have legitimate concerns when they worry
about the tool's availability. For non-commercially
distributed  tools such as FunnelWeb, the simplest solution to this
problem is to make the source code available, either by placing it
into the public domain, or by releasing it under some kind of
public license, such as a GNU license.
The trouble with releasing the source code
is that it removes control from the design
authority. Once the code is \dq{out} there is no stopping anyone
from modifying the program and distributing modified versions.
All chaos can ensue.

One solution to this conflict is to take the trade mark approach. This
separates the right of the design authority to control the language and
its implementations, and the right of the users to use the source
code in any way they like (but they may have to change its name!).
However, the trade mark approach is expensive.

The solution that I (Ross Williams (\p{ross@spam.adelaide.edu.au}))
have adopted is to release the FunnelWeb source code under a GNU license
and then to write this chapter in the \i{FunnelWeb
Hacker's Manual} to dissuade possible hackers from
releasing modified versions under the FunnelWeb name.
This is about as close to the GNU/trademark approach
I can get without forking out about \$1200 for a US trademark
or paying even more to get a lawyer to attempt to draft a contract
stating \dq{thou shalt not modify the FunnelWeb language}.

\section{What I Want to Protect}
\xx{protection}{FunnelWeb}\xx{protection}{file extension}

The concerns expressed in the previous section about modifications to the
FunnelWeb program do not preclude modifications. They merely imply that
some conditions be observed when modifications are made.
In fact,
having formally released the sources under GNU, there is nothing that
I can do to stop people distributing modified versions and the conditions
to be described must be imposed voluntarily.

In the end there are two things that I want to protect/maintain:

\begin{enumerate}

\item Restriction of the name \dq{FunnelWeb} only to computer programs
that exactly implement my \dq{official} definition of the language.

\item Restriction of the FunnelWeb source file extensions \dqp{.fw}
(input files) and \dqp{.fwi} (include files) only
to source files that conform to my \dq{official} definition of the
language.

\end{enumerate}

So long as these conditions hold, source files created under \dq{FunnelWeb}
will be portable, and the language will have the potential to
be stable and well-defined. Here are my suggestions for how to
obey these rules. These suggestions are in addition to the GNU license
rules about documenting any changes that you make in the source files.

\narrowthing{Modifications that do not affect functionality:}{If you
change the FunnelWeb program in a manner that does not
affect the functionality of the program in any way (\eg{}port
it to a new machine, or just speed it up),
then you should modify the program to write out a message when it
starts up saying that
it is a modified version of FunnelWeb. No other actions need be taken.}

\narrowthing{Modifications that affect functionality:}{If you make changes
to FunnelWeb that affect its functionality (\eg{}changes to command line
options, the command language, or the input language)
you should change the name of the program so that the name
no longer contains the word
\dq{FunnelWeb}, and should choose alternative input and include-file
file extensions (the current ones are \dqp{.fw} and \dqp{.fwi}). For example,
you might call your program \dq{BananaWeb} and use the file extensions
\dqp{.bw} and \dqp{.bwi}.}

These rules are not very restrictive. Basically you can do what you like
so long as you change the name of the resulting program. I do not wish to
restrict anyone who might want to use FunnelWeb as a foundation for a more
sophisticated literate programming system. My sole aim here is to
protect the integrity of what already exists.

\section{Modifying the Manuals}
\xx{modifying}{manuals}

While it is permitted to modify the FunnelWeb program, no license has been
granted
to modify its documentation (\i{The FunnelWeb User's Manual} and
\i{The FunnelWeb Hacker's Manual}). The only operation that can be
performed on the FunnelWeb documentation is a verbatim copy in any medium.

If you have created a modified version of FunnelWeb and wish to document it,
either write your own manual from scratch, or write a manual that can be
used in conjunction with the existing manuals.

\section{How Copyright Law Works}
\xx{copyright}{law}

In order to understand the next section, some understanding of copyright
law is required. The assertions made in this section are not legal opinions;
they are merely approximations of the law, based on my understanding of it.

By default, whoever creates a \newterm{work} owns \newterm{copyright}
over it. This means that by default, that person is the only person in the
world who has the legal right to make copies of the work.

Copyright over a work usually covers all direct derivations of this work.
For example, if someone owns the source code to a computer program
then they also own any direct derivations such as the binary executable.

More than one person may own copyright over a work. If this is the case,
then the work cannot be copied without the permission of all of the people
owning the copyright.

A person (or group) owning copyright over a work
can \newterm{license} the right to make copies
of the work to anyone he likes under any conditions he likes.

If a work is modified, the result is called a \newterm{derived work}.

If copyright on a work is owned by $A$ is the work is modified by $B$,
copyright on the derived work is owned by both $A$ and $B$.

Copyright is not ownership over particular configurations of information,
but rather is the right to restrict the copying of information derived
from particular sources. For example, if two people point their cameras
out a window and take identical photographs, each person has the right
to restrict the copying of \i{their} photograph regardless of the
fact that the other person has copyright over an identical photograph.
In the unlikely event that two people wrote
novels that were letter for letter identical and it could be proven that
there was no contact between the two people when they wrote the novels,
then copyright law would each protect the right of each person to
restrict the copying of the novel originating from \i{them}. In practice,
the probability of such an event occurring is so low that the law
assumes that if two works are close or identical, that there has been
some information interchange at some point.

Thus, if I own copyright on computer program $X$, and I create
an identical copy of $X$
called $Y$ and distribute it under the terms of a license agreement,
then that license agreement does not cover the copy $X$. Once the
license agreement is signed, there is nothing I can do to undo the
license; $Y$ has gone. However, I still have total control over $X$.

Version~2 of the GNU General Public License\xx{GNU}{license}
(under which FunnelWeb is
released) specifies (in a nutshell) that software can be copied freely
so long as it is not sold, and that it can be modified and copied
freely so long as the modifications are logged and it is not sold.
In both cases, it requires that the
result of the copy or modification operation
be copied only under the conditions of the license.

Once a declaration is issued licensing a copy of a program under GNU
license, that license cannot be retracted.

\section{Management of the Official FunnelWeb}
\xx{FunnelWeb}{management}\xx{FunnelWeb}{official}

I intend to maintain an official copy of FunnelWeb and release it under
GNU license from time to time so that everyone can use it. Unfortunately
its going to be a little messy.

For a variety of reasons, I want to maintain
total control over \i{my} copy of the official version of FunnelWeb.
Some of the reasons are:

\begin{itemize}

\item If it turns out that there is an enormous demand for
FunnelWeb (unlikely) then
I want to be able to create a business based on it, or at least
be able to bundle it with other products.
This would be difficult if the only up-to-date copy available was a GNU copy.
Note: If this happens, all the GNU releases of FunnelWeb will remain
valid.

\item I want to be able to copy code from my version of FunnelWeb
into commercial products without having to worry about the GNU license.

\end{itemize}

The trouble is that (in my understanding of copyright law),
once a copy of FunnelWeb has been released under GNU license, then it
and any works derived from it fall under GNU license too. This means that
if you modify a GNU release of 
FunnelWeb and send me your modifications, and I incorporate
them into my version, then I no longer own copyright on the version I
modified. Basically, if GNU touches a work, then that copy is gone forever.

My solution to the problem is to keep a copy of FunnelWeb that is
GNU-clean and only make modifications to it that are GNU-clean. So
long as my official copy is GNU clean, any modifications that I make
myself will be GNU clean. The problem comes when someone else modifies
the GNU version and then wants me to incorporate the modifications into
my official version. As I understand the law, by default, the programmer
owns the modifications (because he made them), but the result of making
the modifications falls under GNU license. What I propose is that those
who want their modifications included in the official copy of FunnelWeb
sign an agreement transferring copyright of the modifications over to
me on condition that the result be released under GNU license within
a certain time period. \figlicense{} demonstrates the process.

\begin{figure}[htbp]
\begin{verbatim}

  +---------->----------+--------------<-------------+
  |(modifications by    |                            |
  | me)                 V                            |
  |     +----------------------------------+         |
  +--<--|  My Official Copy of FunnelWeb   |         |
        |   Copyright (C) Ross Williams    |         |
        +----------------------------------+         |
                        | (Periodic releases)       / \
                        V                          /   \  Programmers
              +------------------+                /Legal\ sign away
              | GNU Release Copy |                \Filte/ copyright on
              +------------------+                 \ r /  modifications
                        |                           \ /
                        | (Modifications made by     |
                        V  random programmers) --->--+
             +-----------------------+
             | Modified GNU Version  |
             +-----------------------+

\end{verbatim}
\mylabel{\figlicense{}: How I am going to maintain copyright over FunnelWeb.}{%
%
Once a work is released under GNU license, all derived works fall under
GNU license. However, this diagram shows how copyright can be maintained
over a work, while still making it available under GNU license.
Unfortunately, this scheme requires that copyright on
modifications to FunnelWeb be signed off by the people who make the
modifications.
%
}
\end{figure}

There are two main disadvantages to this scheme:

\begin{enumerate}

\item Getting each person who contributes modifications to FunnelWeb
to sign and send a piece of paper signing away copyright will be tedious.

\item Programmers may be reluctant to sign away copyright on modifications
because the result could be used by me for commercial purposes
by me at a later date (Note: But it must be released under GNU as well).

\end{enumerate}

These disadvantages are regrettable consequences of my decision to retain
total control over the \dq{official} version of FunnelWeb.

The upshot of all this is that:

\begin{itemize}

\item I will never allow any code from a GNU release of FunnelWeb to
touch my official copy. Only modifications will be acceptable.

\item If you make a modification to FunnelWeb and send it to me for
inclusion in the official version, I will not incorporate your
modification until I have received a signed declaration transferring copyright.
I will prepare such a contract when the first person sends me a worthy
modification!

\item If you intend to make changes to FunnelWeb that are so massive that they
will involve wide-scale modification of the source files, and you want
the modification to be part of the official version,
it might be a good idea to contact me before doing so. There are two
reasons for doing this. First, it allows me a chance to comment on your
proposed modifications and give my opinion on whether they are likely to be
incorporated into the official version. Second, I can send you a copy
(under special license) of the GNU-clean official version to work on. This will
allow you to ship back your changes as files rather than as change sections.

\end{itemize}

As a separate point from the legal issues, I am likely to turn out to be
pretty picky about what modifications I will incorporate into the
official copy. Whether a modification will be accepted will depend,
amongst other things, on the following criteria.

\begin{itemize}

\item Does the modification fit in with the design goals of FunnelWeb, or
is it just a case of creeping featurism?

\item How well coded is the modification? Would it reduce the quality of the
code?

\item If the modification changes FunnelWeb's functionality, is this a
desirable change? How will it impact on existing users?

\item Would it be quicker for me to make the modification myself than
to work out how to incorporate the submitted modification?

\end{itemize}

It is my goal to guard the integrity of the design and code of the
official version of FunnelWeb and so I will probably be rather
fussy about what I regard as a worthwhile modification. I do not wish to
lose control of the code, either technically or legally.

\section{A GNU Version?}
\xx{GNU}{version}

The controls on the official version of FunnelWeb described in the previous
section will have at most a minor impact on FunnelWeb development if
FunnelWeb already serves the needs of most of its users. However, if it
turns out that FunnelWeb is both popular, \i{and} needs
widespread modifications and enhancements, then the official feedback loop
described in the previous section will become unworkable, and there will be
a GNU breakout.

A \newterm{GNU breakout}\xs{breakout}{GNU}
will occur if FunnelWeb users become
organized enough and annoyed enough (at the official development cycle)
to start maintaining a coherent version of FunnelWeb that
diverges from the official version.
If a GNU breakout occurs, I would appreciate, as requested earlier, that
a different name and file extensions be chosen for the diverging version.

\section{Summary}

Decentralized modifications to a programming language and its implementations
can seriously damage the language's portability and semantic clarity.
Unfortunately, there is a tension between centralizing control of a
programming language and providing source code security to nervous users.
In FunnelWeb, this trade-off has been resolved to some extent by
releasing the source code along with a request
that if the functionality of the program is modified,
that the program's name be changed and a different file
extension be chosen for input files created under the modified program.
The author of FunnelWeb has decided to maintain an official version of
FunnelWeb over which he will own copyright, but which he will release
under GNU license from time to time. This means that copyright
on all changes to FunnelWeb must be signed over to the author before they
have a chance of being incorporated in the official version. Finally, it is
possible that this reluctance of the author to remove his copyrighted
version from the development cycle of the official version
will result in a GNU breakout in which a diverging GNU
version of FunnelWeb will be maintained by the GNU community. The author
hopes this won't be necessary and requests,
if this happens, that the diverging GNU version be renamed.

%==============================================================================%
%                              Start of Ch3.tex                                %
%==============================================================================%