|
Perl 6 is a planned major revision to the Perl programming language. Perl 6 introduces elements of many modern and historical languages. Perl 6 is not intended to be backwards-compatible with earlier versions of Perl, though a compatibility mode is part of the specification. Perl 6 has been under development for over eight years. The Perl 6 project has never had a clear timeline, although various contributors have given estimates over the years. In early 2007 Jesse Vincent, the Perl 6 Project Manager said, "The Perl 6 project has no schedule ... one doesn't want to rush a largely volunteer effort to design and implement a worthy successor to Perl 5."[1] There are currently two implementation projects of Perl 6 underway, Rakudo Perl and Pugs. Rakudo Perl is based on Parrot and PGE, and Pugs is written in Haskell.
HistoryThe Perl 6 design process was first announced on July 19, 2000, on day 4 of that year's Perl Conference,[2] by Larry Wall in his State of the Onion 2000 talk.[3] At that time, the primary goals were to remove "historical warts" from the language; "easy things should stay easy, hard things should get easier, and impossible things should get hard;" a general cleanup of the internal design and APIs. The process began with a series of requests for comments or "RFCs". This process was open to all contributors, and left no aspect of the language closed to change.[4] Once the RFC process was complete, Wall reviewed and classified each request. He then began the process of writing several "Apocalypses", a term which means "revealing." [5] While the original goal was to write one Apocalypse for each chapter of Programming Perl, it became obvious that, as each Apocalypse was written, previous Apocalypses were being invalidated by later changes. For this reason, a set of Synopses were published, each one relating the contents of an Apocalypse, but with any subsequent changes reflected in updates. Today, Perl 6 specification continues almost entirely within the Synopses.[6] There are also a series of Exegeses written by Damian Conway that explain the content of each Apocalypse in terms of practical usage. Each Exegesis consists of code examples along with discussion of the usage and implications of the examples.[7] There are three primary methods of communication used in the development of Perl 6 today. The first is the #perl6 IRC channel on freenode. The second is a set of mailing lists on The Perl Foundation's servers at perl.org.[8] The third is the Subversion source code repository used by the pugs team. Pugs is an early implementation of Perl 6; see the Implementations section for more detail. As of 2007, Perl 6 was still under development, with no planned completion date. In January 2008, one implementation of Perl 6, the version targeting the Parrot virtual machine, has been renamed "Rakudo" [9]. GoalsThe break in compatibility was mandated from the start of the project, and immediately allowed some of the changes that Larry Wall had suggested in his initial speech. "Historical warts" such as the confusion surrounding sigil usage for containers; the ambiguity between the Over the years, Perl 6 has undergone several alterations in its direction. The introduction of concepts from Python and Ruby were early influences, but as the pugs interpreter was written in the Haskell programming language, many functional programming influences were absorbed by the Perl 6 design team. ImplementationsPugs is an implementation of Perl 6 written in Haskell. It is currently the closest thing to a full implementation of Perl 6. It will be used for bootstrapping, providing a platform on which to write the Perl 6 compiler in Perl 6, and the test suite to validate it. This could, for example, involve translating the Pugs Haskell source code to Perl 6.[10] After that, Perl 6 will be self-hosted—it will be used to compile itself. Much of the implementation of Perl will then be exposed to programmers using the language. For example, this would make it possible to extend the parser from within a program or library. Pugs can execute Perl 6 code directly, and has also compiled Perl 6 to JavaScript, Perl 5 and Parrot bytecode. Lacking funding, even the key developer Audrey Tang is only working part time, so progress has not been as rapid as many wish. Parrot is a virtual machine designed for dynamic languages, primarily for Perl 6. It provides several powerful compiler tools, many of which take inspiration from Perl 6. In particular, the Parrot Grammar Engine, or PGE, provides an implementation of Perl 6 grammars. As well, the language used for building compilers is itself Not Quite Perl 6, or NQP. The Rakudo implementation of Perl 6 on Parrot takes advantage of PGE and NQP. Some portions of Rakudo are written in Perl 6 itself, though this is not a self-hosting implementation, nor are there concrete plans at this point to make Rakudo a bootstrapping compiler.
In 2007, v6-MiniPerl6 ("mp6") and its reimplementation, v6-KindaPerl6 ("kp6") were written as a means to bootstrap the Perl-6.0.0 STD, using Perl 5. The STD is a full grammar for Perl 6, and is written in Perl 6. In theory, anything capable of parsing the STD and generating executable code is a suitable bootstrapping system for Perl 6. kp6 is currently compiled by mp6 and can work with multiple backends.[12][13] mp6 and kp6 are not full Perl 6 implementations, and are designed only to implement the minimum featureset required to bootstrap a full Perl 6 compiler. Major changes from Perl 5Perl 5 and Perl 6 differ fundamentally, though in general the intent has been to "keep Perl 6 Perl". Most of the changes are intended to normalize the language, to make it easier for learning and expert programmers alike to understand, and to make "easy things easier and hard things more possible". A specificationA major, but non-technical difference between Perl 5 and Perl 6 is that Perl 6 began as a specification.[14] This means that Perl 6 can be re-implemented if needed, and it also means that programmers don't have to read the source code for the ultimate authority on any given feature. Perl 5's documentation was regarded as excellent, even outside of the Perl community where even mixed reviews typically noted its maturity and breadth. However, if the documentation and the source code of the Perl 5 interpreter disagreed, the documentation was not considered authoritative, and would be changed. A type systemIn Perl 6, the dynamic type system of Perl 5 has been augmented by the addition of static types.[15] For example: my Int $i = 0; my Num $n = 3.142; my Str $s = "Hello, world"; However, as with Perl 5, programmers can do most things without any explicit typing at all: my $i = "25" + 10; # $i is 35 Proponents of static typing claim that it is beneficial to compiler optimization, reducing programming errors and increasing maintainability, especially in large software projects. On the other hand, dynamic typing reduces input source code size, which is the bottleneck on smaller projects. It is helpful when writing quick scripts, one-liners or "one-off" code (i.e., code that is written to achieve some temporary purpose and will be run once). Perl 6 offers a hybrid typing system whereby the programmer may choose to use Static Typing, Dynamic Typing or mix the two. Formal subroutine parameter listsPerl 5 defined subroutines without formal parameter lists at all (though simple parameter counting and some very loose type checking can be done using Perl 5's "prototypes"). Subroutine arguments passed in were aliased into the elements of the array @_. If the elements of @_ were modified, the changes would be reflected in the original data. Perl 6 introduces true formal parameters to the language.[16] In Perl 6, a subroutine declaration looks like this:
sub do_something(Str $thing, Int $other) { ... }
As in Perl 5, the formal parameters (i.e., the variables in the parameter list) are aliases to the actual parameters (the values passed in), but by default, the aliases are constant so they cannot be modified. They may be declared explicitly as read-write aliases for the original value or as copies using the Parameter passing modesPerl 6 provides three basic modes of parameter passing:
Positional parameters are the typical ordered list of parameters that most programming languages use. All parameters may also be passed by using their name in an unordered way. A named-only parameter can only be passed by specifying its name (that is, it never captures a positional argument), and are indicated with a leading Here is an example of the use of all three parameter-passing modes:
sub somefunction($a, $b, :$c, :$d, *@e) {...}
somefunction(1, 2, :d<3>, 4, 5, 6); # $a=1, $b=2, $d=3, @e=(4,5,6)
somefunction(:b<2>, :a<1>); # $a=1, $b=2
Positional parameters, such as those used above are always required, unless followed by Blocks and closuresParameters can also be passed to arbitrary blocks, which act as closures. This is how, for example,
for @list -> ($a, $b, $c) { ... }
This is generally referred to as a "pointy sub" or "pointy block", and the arrow behaves almost exactly like the Sigil invarianceIn Perl 5, sigils — the punctuation characters that precede a variable name — changed depending on how the variable was used: # Perl 5 code my @array = (1, 2, 3); my $element = $array[1]; # $element equals 2 In Perl 6, sigils are invariant, which mean they do not change based on whether it is the array or the array element that is needed:[15] # Perl 6 code my @array = (1, 2, 3); my $element = @array[1]; # $element equals 2 The variance in Perl 5 was inspired by number agreement in English and many other natural languages: "This apple." # CORRECT "These apples." # CORRECT "This third apple." # CORRECT "These third apple." # WRONG The change in Perl 6 is meant to reduce the cognitive load of recognizing when to use the @ or the $. Object-oriented programmingPerl 5 supported object-oriented programming via a mechanism known as blessing. Any reference could be blessed into being an object of a particular class, a blessed object could have methods invoked on it using the "arrow syntax" which would cause Perl to locate or "dispatch" an appropriate subroutine by name, and call it with the blessed variable as its first argument. While extremely powerful—virtually any other computer language's object model could be simulated using this simple facility—it made the most common case of object orientation, a struct-like object with some associated code, unnecessarily difficult. In addition, because Perl could make no assumptions about the object model in use, method invocation could not be optimized very well. In the spirit of making the "easy things easy but hard things possible", Perl 6 retains the blessing model but supplies a more robust object model for the common cases.[17] For example, a class to encapsulate a Cartesian point could be defined and used this way:
class Point is rw {
has $.x;
has $.y;
}
my Point $point .= new( :x<1.2>, :y<-3.7> );
# Now change x (note method "x" used as lvalue):
$point.x = 2;
say "Point is at X location: ", $point.x;
The dot replaces the arrow in a nod to the many other languages (e.g. Java, Python, etc.) that have coalesced around dot as the syntax for method invocation. In the terminology of Perl 6, RolesRoles in Perl 6 take on the function of interfaces in Java, mixins in Ruby, and traits[18] in the Smalltalk variant Squeak. These are much like classes, but are entirely abstract. These are used to perform composition when used with classes rather than adding to their inheritance chain. Roles define nominal types; they provide semantic names for collections of behavior and state. The fundamental difference between a role and a class is that classes are instantiable; roles are not.[19] Essentially, a role is a bundle of (possibly abstract) methods and attributes that can be added to a class without using inheritance. A role can even be added to an individual object; in this case, Perl 6 will create an anonymous subclass, add the role to the subclass, and change the object's class to the anonymous subclass. For example, a Dog is a Mammal. Dogs inherit certain characteristics from Mammals, such as mammary glands and (through Mammal's parent, Vertebrate) a backbone. Dogs may have one of several distinct types of behavior; for example, a Dog may be a Pet, a Stray, or a Guide for the blind. However, these are simply sets of additional behaviors that can be added to a Dog; a Cat can equally be a Pet or Stray, for example. Hence, Dog and Mammal are classes, while Pet, Stray, and Guide are roles.
class Mammal is Vertebrate {...}
class Dog is Mammal {...}
role Pet {...}
role Stray {...}
role Guide {...}
Roles are added to a class or object with the
class GuideDog is Dog does Guide {...} # Subclass composes role
my $dog = new Dog;
$dog does Guide; # Individual object composes role
Although roles are distinct from classes, both are types, so a role can appear in a variable declaration where one would normally put a class. For example, a Blind role for a Human could include an attribute of type Guide; this attribute could contain a Guide Dog, a Guide Horse, a Guide Human, or even a Guide Machine.
class Human {
has Dog $dog; # Can contain any kind of Dog, whether it does the
... # Guide role or not
}
role Blind {
has Guide $guide; # Can contain any object that does the Guide role,
... # whether it is a Dog or something else
}
Regular expressionsPerl's regular expression and string-processing support has always been one of its defining features.[20] Since Perl's pattern-matching constructs have exceeded the capabilities of regular language expressions for some time,[citation needed] Perl 6 documentation will exclusively refer to them as regexes, distancing the term from the formal definition. Perl 6 provides a superset of Perl 5 features with respect to regexes, folding them into a larger framework called "rules" which provide the capabilities of context-sensitive parsing formalisms (such as the syntactic predicates of parsing expression grammars and ANTLR), as well as acting as a closure with respect to their lexical scope.[21] Rules are introduced with the In Apocalypse 5, Larry Wall enumerated 20 problems with "current regex culture". Among these were that Perl's regexes were "too compact and 'cute'", had "too much reliance on too few metacharacters", "little support for named captures", "little support for grammars", and "poor integration with [the] 'real' language".[22] Syntactic simplificationSome Perl 5 constructs have been changed in Perl 6, optimized for different syntactic cues for the most common cases. For example, the parentheses (round brackets) required in control flow constructs in Perl 5 are now optional:[23]
if is_true() {
for @array {
...
}
}
Also, the @array = 1, 2, 3, 4; now makes @array an array with exactly the elements '1', '2', '3', and '4'. Chained comparisonsPerl 6 allows comparisons to "chain". That is, a sequence of comparisons such as the following are allowed:
if C(20) <= $temperature <= C(25) { say "Room temperature!" }
This is treated as if each left-to-right comparison were performed on its own, and the result is logically combined via the Lazy evaluationPerl 6 uses the technique of lazy evaluation of lists that has been a feature of some functional programming languages such as Haskell:[24] @integers = 0..Inf; # integers from 0 to infinity The code above will not crash by attempting to assign a list of infinite size to the array This simplifies many common tasks in Perl 6 including input/output operations, list transformations and parameter passing. JunctionsPerl 6 introduces the concept of junctions: values that are composites of other values.[24] In the earliest days of Perl 6's design, these were called "superpositions", by analogy to the concept in quantum physics of quantum superpositions — waveforms that can simultaneously occupy several states until observation "collapses" them. A Perl 5 module released in 2000 by Damian Conway called In their simplest form, junctions are created by combining a set of values with junctive operators: my $any_even_digit = 0|2|4|6|8; # any(0, 2, 4, 6, 8) my $all_odd_digits = 1&3&5&7&9; # all(1, 3, 5, 7, 9)
Junctions can also be used to more richly augment the type system by introducing a style of generic programming that is constrained to junctions of types:
sub get_tint ( RGB_Color|CMYK_Color $color, num $opacity) { ... }
sub store_record (Record&Storable $rec) { ... }
AutothreadingJunctions are unordered;
for all(@array) { ... }
would indicate to the compiler that the MacrosIn low-level languages, the concept of macros has become synonymous with textual substitution of source-code due to the widespread use of the C preprocessor. However, high-level languages such as Lisp pre-dated C in their use of macros that were far more powerful.[27] It is this Lisp-like macro concept that Perl 6 will take advantage of.[16] The power of this sort of macro stems from the fact that it operates on the program as a high-level data structure, rather than as simple text, and has the full capabilities of the programming language at its disposal. A Perl 6 macro definition will look like a subroutine or method definition, and can operate on unparsed strings, an AST representing pre-parsed code, or a combination of the two. A macro definition would look like this:
macro hello($what) {
q:code { say "Hello { {{{$what}}} }" };
}
In this particular example, the macro is no more complex than a C-style textual substitution, but because parsing of the macro parameter occurs before the macro operates on the calling code, diagnostic messages would be far more informative. However, because the body of a macro is executed at compile time each time it is used, many techniques of optimization can be employed. It is even possible to entirely eliminate complex computations from resulting programs by performing the work at compile-time. Hello worldThe hello world program is a common program used to introduce a language. In Perl 6, hello world is: say 'Hello, world' — though there is more than one way to do it.The References
External linksSpecification
Implementations
Other
|
||||||||||||||||||||||||||||||||||||||
This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.
Mercedes Car
This site monitored by SitePinger.net