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