ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/common-sense/sense.pm
Revision: 1.32
Committed: Fri Feb 19 14:58:40 2010 UTC (14 years, 2 months ago) by root
Branch: MAIN
CVS Tags: HEAD
Changes since 1.31: +0 -0 lines
State: FILE REMOVED
Log Message:
*** empty log message ***

File Contents

# Content
1 =head1 NAME
2
3 common::sense - save a tree AND a kitten, use common::sense!
4
5 =head1 SYNOPSIS
6
7 use common::sense;
8
9 # supposed to be the same, with much lower memory usage, as:
10 #
11 # use utf8;
12 # use strict qw(vars subs);
13 # use feature qw(say state switch);
14 # no warnings;
15 # use warnings qw(FATAL closed threads internal debugging pack substr malloc
16 # portable prototype inplace io pipe unpack regexp
17 # deprecated exiting glob digit printf layer
18 # reserved parenthesis taint closure semicolon);
19 # no warnings qw(exec newline unopened);
20
21 =head1 DESCRIPTION
22
23 This module implements some sane defaults for Perl programs, as defined by
24 two typical (or not so typical - use your common sense) specimens of Perl
25 coders. In fact, after working out details on which warnings and strict
26 modes to enable and make fatal, we found that we (and our code written so
27 far, and others) fully agree on every option, even though we never used
28 warnings before, so it seems this module indeed reflects a "common" sense
29 among some long-time Perl coders.
30
31 The basic philosophy behind the choices made in common::sense can be
32 summarised as: "enforcing strict policies to catch as many bugs as
33 possible, while at the same time, not limiting the expressive power
34 available to the programmer".
35
36 Two typical examples of how this philosophy is applied in practise is the
37 handling of uninitialised and malloc warnings:
38
39 =over 4
40
41 =item I<uninitialised>
42
43 C<undef> is a well-defined feature of perl, and enabling warnings for
44 using it rarely catches any bugs, but considerably limits you in what you
45 can do, so uninitialised warnings are disabled.
46
47 =item I<malloc>
48
49 Freeing something twice on the C level is a serious bug, usually causing
50 memory corruption. It often leads to side effects much later in the
51 program and there are no advantages to not reporting this, so malloc
52 warnings are fatal by default.
53
54 =back
55
56 What follows is a more thorough discussion of what this module does,
57 and why it does it, and what the advantages (and disadvantages) of this
58 approach are.
59
60 =head1 RATIONALE
61
62 =over 4
63
64 =item use utf8
65
66 While it's not common sense to write your programs in UTF-8, it's quickly
67 becoming the most common encoding, is the designated future default
68 encoding for perl sources, and the most convenient encoding available
69 (you can do really nice quoting tricks...). Experience has shown that our
70 programs were either all pure ascii or utf-8, both of which will stay the
71 same.
72
73 There are few drawbacks to enabling UTF-8 source code by default (mainly
74 some speed hits due to bugs in older versions of perl), so this module
75 enables UTF-8 source code encoding by default.
76
77
78 =item use strict qw(subs vars)
79
80 Using C<use strict> is definitely common sense, but C<use strict
81 'refs'> definitely overshoots its usefulness. After almost two
82 decades of Perl hacking, we decided that it does more harm than being
83 useful. Specifically, constructs like these:
84
85 @{ $var->[0] }
86
87 Must be written like this (or similarly), when C<use strict 'refs'> is in
88 scope, and C<$var> can legally be C<undef>:
89
90 @{ $var->[0] || [] }
91
92 This is annoying, and doesn't shield against obvious mistakes such as
93 using C<"">, so one would even have to write (at least for the time
94 being):
95
96 @{ defined $var->[0] ? $var->[0] : [] }
97
98 ... which nobody with a bit of common sense would consider
99 writing: clear code is clearly something else.
100
101 Curiously enough, sometimes perl is not so strict, as this works even with
102 C<use strict> in scope:
103
104 for (@{ $var->[0] }) { ...
105
106 If that isn't hypocrisy! And all that from a mere program!
107
108
109 =item use feature qw(say state given)
110
111 We found it annoying that we always have to enable extra features. If
112 something breaks because it didn't anticipate future changes, so be
113 it. 5.10 broke almost all our XS modules and nobody cared either (or at
114 least I know of nobody who really complained about gratuitous changes -
115 as opposed to bugs).
116
117 Few modules that are not actively maintained work with newer versions of
118 Perl, regardless of use feature or not, so a new major perl release means
119 changes to many modules - new keywords are just the tip of the iceberg.
120
121 If your code isn't alive, it's dead, Jim - be an active maintainer.
122
123 But nobody forces you to use those extra features in modules meant for
124 older versions of perl - common::sense of course works there as well.
125 There is also an important other mode where having additional features by
126 default is useful: commandline hacks and internal use scripts: See "much
127 reduced typing", below.
128
129
130 =item no warnings, but a lot of new errors
131
132 Ah, the dreaded warnings. Even worse, the horribly dreaded C<-w>
133 switch: Even though we don't care if other people use warnings (and
134 certainly there are useful ones), a lot of warnings simply go against the
135 spirit of Perl.
136
137 Most prominently, the warnings related to C<undef>. There is nothing wrong
138 with C<undef>: it has well-defined semantics, it is useful, and spitting
139 out warnings you never asked for is just evil.
140
141 The result was that every one of our modules did C<no warnings> in the
142 past, to avoid somebody accidentally using and forcing his bad standards
143 on our code. Of course, this switched off all warnings, even the useful
144 ones. Not a good situation. Really, the C<-w> switch should only enable
145 warnings for the main program only.
146
147 Funnily enough, L<perllexwarn> explicitly mentions C<-w> (and not in a
148 favourable way, calling it outright "wrong"), but standard utilities, such
149 as L<prove>, or MakeMaker when running C<make test>, still enable them
150 blindly.
151
152 For version 2 of common::sense, we finally sat down a few hours and went
153 through I<every single warning message>, identifiying - according to
154 common sense - all the useful ones.
155
156 This resulted in the rather impressive list in the SYNOPSIS. When we
157 weren't sure, we didn't include the warning, so the list might grow in
158 the future (we might have made a mistake, too, so the list might shrink
159 as well).
160
161 Note the presence of C<FATAL> in the list: we do not think that the
162 conditions caught by these warnings are worthy of a warning, we I<insist>
163 that they are worthy of I<stopping> your program, I<instantly>. They are
164 I<bugs>!
165
166 Therefore we consider C<common::sense> to be much stricter than C<use
167 warnings>, which is good if you are into strict things (we are not,
168 actually, but these things tend to be subjective).
169
170 After deciding on the list, we ran the module against all of our code that
171 uses C<common::sense> (that is almost all of our code), and found only one
172 occurence where one of them caused a problem: one of elmex's (unreleased)
173 modules contained:
174
175 $fmt =~ s/([^\s\[]*)\[( [^\]]* )\]/\x0$1\x1$2\x0/xgo;
176
177 We quickly agreed that indeed the code should be changed, even though it
178 happened to do the right thing when the warning was switched off.
179
180
181 =item much reduced typing
182
183 Especially with version 2.0 of common::sense, the amount of boilerplate
184 code you need to add to gte I<this> policy is daunting. Nobody would write
185 this out in throwaway scripts, commandline hacks or in quick internal-use
186 scripts.
187
188 By using common::sense you get a defined set of policies (ours, but maybe
189 yours, too, if you accept them), and they are easy to apply to your
190 scripts: typing C<use common::sense;> is even shorter than C<use warnings;
191 use strict; use feature ...>.
192
193 And you can immediately use the features of your installed perl, which
194 is more difficult in code you release, but not usually an issue for
195 internal-use code (downgrades of your production perl should be rare,
196 right?).
197
198
199 =item mucho reduced memory usage
200
201 Just using all those pragmas mentioned in the SYNOPSIS together wastes
202 <blink>I<< B<776> kilobytes >></blink> of precious memory in my perl, for
203 I<every single perl process using our code>, which on our machines, is a
204 lot. In comparison, this module only uses I<< B<four> >> kilobytes (I even
205 had to write it out so it looks like more) of memory on the same platform.
206
207 The money/time/effort/electricity invested in these gigabytes (probably
208 petabytes globally!) of wasted memory could easily save 42 trees, and a
209 kitten!
210
211 Unfortunately, until everybods applies more common sense, there will still
212 often be modules that pull in the monster pragmas. But one can hope...
213
214 =cut
215
216 package common::sense;
217
218 our $VERSION = '3.0';
219
220 # paste this into perl to find bitmask
221
222 # no warnings;
223 # use warnings qw(FATAL closed threads internal debugging pack substr malloc portable prototype
224 # inplace io pipe unpack regexp deprecated exiting glob digit printf
225 # layer reserved parenthesis taint closure semicolon);
226 # no warnings qw(exec newline unopened);
227 # BEGIN { warn join "", map "\\x$_", unpack "(H2)*", ${^WARNING_BITS}; exit 0 };
228
229 # overload should be included
230
231 sub import {
232 # verified with perl 5.8.0, 5.10.0
233 ${^WARNING_BITS} ^= ${^WARNING_BITS} ^ "\xfc\x3f\x33\x00\x0f\xf3\xcf\xc0\xf3\xfc\x33\x00";
234
235 # use utf8, strict vars subs
236 $^H |= 0x00800600;
237
238 # use feature
239 $^H{feature_switch} =
240 $^H{feature_say} =
241 $^H{feature_state} = 1;
242 }
243
244 1;
245
246 =back
247
248 =head1 THERE IS NO 'no common::sense'!!!! !!!! !!
249
250 This module doesn't offer an unimport. First of all, it wastes even more
251 memory, second, and more importantly, who with even a bit of common sense
252 would want no common sense?
253
254 =head1 STABILITY AND FUTURE VERSIONS
255
256 Future versions might change just about everything in this module. We
257 might test our modules and upload new ones working with newer versions of
258 this module, and leave you standing in the rain because we didn't tell
259 you. In fact, we did so when switching from 1.0 to 2.0, which enabled gobs
260 of warnings, and made them FATAL on top.
261
262 Maybe we will load some nifty modules that try to emulate C<say> or so
263 with perls older than 5.10 (this module, of course, should work with older
264 perl versions - supporting 5.8 for example is just common sense at this
265 time. Maybe not in the future, but of course you can trust our common
266 sense to be consistent with, uhm, our opinion).
267
268 =head1 WHAT OTHER PEOPLE HAD TO SAY ABOUT THIS MODULE
269
270 apeiron
271
272 "... wow"
273 "I hope common::sense is a joke."
274
275 crab
276
277 "i wonder how it would be if joerg schilling wrote perl modules."
278
279 Adam Kennedy
280
281 "Very interesting, efficient, and potentially something I'd use all the time."
282 [...]
283 "So no common::sense for me, alas."
284
285 H.Merijn Brand
286
287 "Just one more reason to drop JSON::XS from my distribution list"
288
289 Pista Palo
290
291 "Something in short supply these days..."
292
293 Steffen Schwigon
294
295 "This module is quite for sure *not* just a repetition of all the other
296 'use strict, use warnings'-approaches, and it's also not the opposite.
297 [...] And for its chosen middle-way it's also not the worst name ever.
298 And everything is documented."
299
300 BKB
301
302 "[Deleted - thanks to Steffen Schwigon for pointing out this review was
303 in error.]"
304
305 Somni
306
307 "the arrogance of the guy"
308 "I swear he tacked somenoe else's name onto the module
309 just so he could use the royal 'we' in the documentation"
310
311 Anonymous Monk
312
313 "You just gotta love this thing, its got META.json!!!"
314
315 dngor
316
317 "Heh. '"<elmex at ta-sa.org>"' The quotes are semantic
318 distancing from that e-mail address."
319
320 Jerad Pierce
321
322 "Awful name (not a proper pragma), and the SYNOPSIS doesn't tell you
323 anything either. Nor is it clear what features have to do with "common
324 sense" or discipline."
325
326 acme
327
328 "THERE IS NO 'no common::sense'!!!! !!!! !!"
329
330 apeiron (meta-comment about us commenting^Wquoting his comment)
331
332 "How about quoting this: get a clue, you fucktarded amoeba."
333
334 quanth
335
336 "common sense is beautiful, json::xs is fast, Anyevent, EV are fast and
337 furious. I love mlehmannware ;)"
338
339 apeiron
340
341 "... it's mlehmann's view of what common sense is. His view of common
342 sense is certainly uncommon, insofar as anyone with a clue disagrees
343 with him."
344
345 apeiron (another meta-comment)
346
347 "apeiron wonders if his little informant is here to steal more quotes"
348
349 ew73
350
351 "... I never got past the SYNOPSIS before calling it shit."
352 [...]
353 How come no one ever quotes me. :("
354
355 =head1 FREQUENTLY ASKED QUESTIONS
356
357 Or frequently-come-up confusions.
358
359 =over 4
360
361 =item Is this module meant to be serious?
362
363 Yes, we would have put it under the C<Acme::> namespace otherwise.
364
365 =item But the manpage is written in a funny/stupid/... way?
366
367 This was meant to make it clear that our common sense is a subjective
368 thing and other people can use their own notions, taking the steam out
369 of anybody who might be offended (as some people are always offended no
370 matter what you do).
371
372 This was a failure.
373
374 But we hope the manpage still is somewhat entertaining even though it
375 explains boring rationale.
376
377 =item Why do you impose your conventions on my code?
378
379 For some reason people keep thinking that C<common::sense> imposes
380 process-wide limits, even though the SYNOPSIS makes it clear that it works
381 like other similar modules - i.e. only within the scope that C<use>s them.
382
383 So, no, we don't - nobody is forced to use this module, and using a module
384 that relies on common::sense does not impose anything on you.
385
386 =item Why do you think only your notion of common::sense is valid?
387
388 Well, we don't, and have clearly written this in the documentation to
389 every single release. We were just faster than anybody else w.r.t. to
390 grabbing the namespace.
391
392 =item But everybody knows that you have to use strict and use warnings,
393 why do you disable them?
394
395 Well, we don't do this either - we selectively disagree with the
396 usefulness of some warnings over others. This module is aimed at
397 experienced Perl programmers, not people migrating from other languages
398 who might be surprised about stuff such as C<undef>. On the other hand,
399 this does not exclude the usefulness of this module for total newbies, due
400 to its strictness in enforcing policy, while at the same time not limiting
401 the expresive power of perl.
402
403 This module is considerably I<more> strict than the canonical C<use
404 strict; use warnings>, as it makes all its warnings fatal in nature, so
405 you can not get away with as many things as with the canonical approach.
406
407 This was not implemented in version 1.0 because of the daunting number
408 of warning categories and the difficulty in getting exactly the set of
409 warnings you wish (i.e. look at the SYNOPSIS in how complicated it is to
410 get a specific set of warnings - it is not reasonable to put this into
411 every module, the maintainance effort would be enourmous).
412
413 =item But many modules C<use strict> or C<use warnings>, so the memory
414 savings do not apply?
415
416 I suddenly feel sad...
417
418 But yes, that's true. Fortunately C<common::sense> still uses only a
419 miniscule amount of RAM.
420
421 =item But it adds another dependency to your modules!
422
423 It's a fact, yeah. But it's trivial to install, most popular modules have
424 many more dependencies and we consider dependencies a good thing - it
425 leads to better APIs, more thought about interworking of modules and so
426 on.
427
428 =item Why do you use JSON and not YAML for your META.yml?
429
430 This is not true - YAML supports a large subset of JSON, and this subset
431 is what META.yml is written in, so it would be correct to say "the
432 META.yml is written in a common subset of YAML and JSON".
433
434 The META.yml follows the YAML, JSON and META.yml specifications, and is
435 correctly parsed by CPAN, so if you have trouble with it, the problem is
436 likely on your side.
437
438 =item But! But!
439
440 Yeah, we know.
441
442 =back
443
444 =head1 AUTHOR
445
446 Marc Lehmann <schmorp@schmorp.de>
447 http://home.schmorp.de/
448
449 Robin Redeker, "<elmex at ta-sa.org>".
450
451 =cut
452