Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Re: Why should any one use/learn Perl 6?

by haj (Vicar)
on Jun 07, 2018 at 15:17 UTC ( [id://1216120]=note: print w/replies, xml ) Need Help??


in reply to Why should any one use/learn Perl 6?

I've been following this discussion for some time... because right now I am about to learn Perl 6. I have been intending to do this for quite a while now, occasionally invigorated by problems which are cumbersome to solve in Perl 5. The main motivations were:

  • The object system: I liked the ideas set out for Perl 6's object system from the beginning. But then, it turned out that it was easier to bolt on many of the ideas onto Perl 5 with Moose than for Perl 6 to come close to maturity. Moose is awesome but somewhat syntactically challenged because it needs to feed its stuff to a Perl 5 parser, so Perl 6 still has a slight edge here.
  • The grammars: Several years ago I had a problem which could be easily formulated as a grammar, but was tedious to do with regexes. Unfortunately, the same several years ago Perl 6 was just too slow to process a 15MB file. I'd expect this to be no longer an issue as of today, but I won't re-implement my Perl 5 program (because I don't have that problem any more, for a start).
  • Parallelism: Doing this right in Perl 5 needs a lot of boilerplate which can go away with the Perl 6 builtin mechanisms.
On Perl 6 IRC I see a lot of nifty one-liner solutions in Perl 6 for problems which I never had in the past, and probably never will have in the future. I'll simply ignore those, though they add noise to the manuals. So while I am walking through the Perl 6 intro and am typing experimental stuff into an interactive Perl 6 shell, I am also accumulating a list of things I would prefer not to see in productive code. I'll most certainly never use these myself. Here are a few of them:
  • Single quotes and minus signs in variable names.
  • Letters with diacritics in variable names. I'm getting old, my eyesight isn't the best. For my own code, I'll stick to ASCII.
  • Literals like ½ for numbers.
  • Quoting functions with three or more letters. qqw qww qqww. Seriously? The whole quoting manpage looks more than scary for me.
  • Unicode operators which I don't see on my keyboard.
  • ...and maybe more to come.
Bottom line: I will continue to learn Perl 6, though I'm slightly annoyed by the noise of incredibly clever features which don't contribute much to solving my problems. I expect to see benefits from using Perl 6 in case of complex object setups (the syntax is easier on the eye than Moose can ever achieve), for server software (parallelism, and also the builtin exceptions), event handling (where is the Perl 6 native GUI?) and the like.

Replies are listed 'Best First'.
Re^2: (Easy Perl concurrency with MCE)
by 1nickt (Canon) on Jun 08, 2018 at 12:45 UTC

    Parallelism: Doing this right in Perl 5 needs a lot of boilerplate ...

    Fake news!

    See MCE and MCE::Shared.

    Consider the following utility script to delete records from a customer account in a global cloud services provider using their API:

    use strict; use warnings; use feature 'say'; use Data::Dumper; use MyClient; my $client = MyClient->new; my $list = $client->call('ListCustomers'); $list->parse_json_payload; say sprintf 'Start: Found %d accounts.', $list->payload->{totalCount}; my %results; for my $account ( @{ $list->payload->{items} } ) { my $id = $account->{id}; say "Deleting $id"; my $call = $client->call('DeleteCustomer', { account_id => $id }); say 'Status: ' . $call->status; $call->status == 204 ? $results{OK}++ : $results{NOT_OK}++; } say 'Results: ' . Dumper \%results; __END__

    Now, parallelized with MCE. Too much boilerplate?

    use strict; use warnings; use feature 'say'; use Data::Dumper; use MyClient; use MCE; use MCE::Shared; my $client = MyClient->new; my $list = $client->call('ListCustomers'); $list->parse_json_payload; say sprintf 'Start: Found %d accounts.', $list->payload->{totalCount}; tie my %results, 'MCE::Shared'; sub task { my $id = $_->{id}; my $output = "Deleting $id\n"; my $call = $client->call('DeleteCustomer', { account_id => $id }); say $output . 'Status: ' . $call->status; $call->status == 204 ? $results{OK}++ : $results{NOT_OK}++; } MCE->new( chunk_size => 1, max_workers => 7, user_func => \&task ); MCE->process( $list->payload->{items} ); MCE->shutdown; say 'Results: ' . Dumper \%results; __END__

    Note that in the second version, we can still just use $call->status == 204 ? $results{OK}++ : $results{NOT_OK}++; even though we have 7 workers writing to the same hash.

    (Also note that MCE provides comprehensive signal handling, so if you use an END block (not shown here) to print out your results hash (for example), you can kill the script eg with CTRL-C, and all workers will exit gracefully, while only the parent prints out the data so far.)

    You sure as hell don't need Cuckoo, errr, notPerl "6", or anything other than Perl to write clean, fast, correct, parallel code that can be used today in performance-critical environments, aka Real Life.

    Hope this helps!


    The way forward always starts with a minimal test.
      You sure as hell don't need Cuckoo, errr, notPerl "6", or anything other than Perl to write clean, fast, correct, parallel code that can be used today in performance-critical environments, aka Real Life.

      Why can't you just be positive? Always so negative!

      I hadn't heard about MCE yet. By the looks of it, it has taken the ideas I had when I implemented the forks and ThreadPool modules to the next level. Kudos to Mario Roy.

      Now to get back to your example, but then in Perl 6:

      use MyClient; my $client = MyClient.new; my $list = $client.call('ListCustomers'); $list.parse_json_payload; say "Start: Found $list.payload.totalCount() accounts"; my %results; for $list.payload.items -> $account { my $id = $account.id; say "Deleting $id"; my $call = $client->call('DeleteCustomer', account_id => $id); say 'Status: ' . $call.status; $call.status == 204 ?? %results<OK>++ !! %results<NOT_OK>++; } say "Results: %results.perl()"

      To make this run on multiple CPU's, one basically needs to do only one thing: prefix the for with a hyper;

      hyper for $list.payload.items -> $account {

      There is however one caveat: hashes in Perl 6 are not thread safe in the sense that they might lose updates when being updated from multiple threads. If you're just interested in number of successes / fails, why not make it two counters instead of elements in a hash? When updating integers from multiple threads, you should use atomic integers (otherwise you would have the same problem as with the hash elements). So the code becomes:

      use MyClient; my $client = MyClient.new; my $list = $client.call('ListCustomers'); $list.parse_json_payload; say "Start: Found $list.payload.totalCount() accounts"; my atomicint $ok; my atomicint $not-ok; hyper for $list.payload.items -> $account { my $id = $account.id; say "Deleting $id"; my $call = $client->call('DeleteCustomer', account_id => $id); say 'Status: ' . $call.status; $call.status == 204 ?? atomic-inc-fetch($ok) !! atomic-inc-fetch($ +not-ok) } say "Results: ok = $ok, not-ok = $not-ok"

      I've used the ASCII equivalent of the atomic increment operator, since PerlMonks does not display the unicode equivalent "++⚛️" inside code blocks properly.

      So I would argue three things here:

      1. Perl 6 has less boilerplate to begin with (no use statements needed)
      2. Perl 6 needs less boilerplate to parallelize (just adding "hyper" will do in many cases
      3. Some thought needs to go into updating data structures from multiple threads at the same time

      Note that the Perl 5 solution to updating shared data structures requires tieing and locking, neither of which is good for performance. The Perl 6 solution using atomic increment is lockless and uses hardware features of the CPU.

      Hope this clarifies.

      EDIT: fixed $results{} -> %results<> non-migrato, haj++

        I'd have expected Perl 6 to have less boilerplate than Perl 5 for parallel processing. It's just that the advantage is smaller when you know about MCE than when you try to figure all of that out with Perl 5 core. So this is a Perl 6 benefit in the same order of magnitude as with objects, where I need to use Moose; in Perl 5 to get the object magic.

        Two minor nitpickings:

        • $call.status == 204 ?? $results<OK>++ !! $results<NOT_OK>++; seems somewhat Perl5ish. Shouldn't that read like that:
          $call.status == 204 ?? %results<OK>++ !! %results<NOT_OK>++;
        • You write: "I've used the ASCII equivalent of the atomic increment operator, since PerlMonks does not display the unicode equivalent "++⚛️" inside code blocks properly.". I'm glad you did, because this is another example why I don't like these unicode operators: I have no idea how to enter it into my keyboard easily, and my preferred font in my preferred editor doesn't have a glyph for it. There also seems to be another, quite similar symbol: "++⚛" which has an almost identical glyph in the textarea field into which I'm typing right now. I am pretty sure that I'll never use these symbols, and I hope I'll never need to maintain code which contains them.

        "hashes in Cuckoo are not thread safe in the sense that they might lose updates when being updated from multiple threads"

        Oh, dear. Sounds like a rather significant deficiency compared to Perl, when we are discussing concurrency. (By the way, note that MCE does not require threads to parallelize.)

        "Note that the Perl 5 solution to updating shared data structures requires tieing and locking."

        Wrong. It does not.

        Why can't you just be positive? Always so negative!

        I'm negative about your project because it is still squatting on Perl's name, duh.


        The way forward always starts with a minimal test.

      I wasn't aware of that module (MCE). Thanks for the info!

      I still prefer to refer to Perl 6 as "Camelia" :)

        MCE is incredibly powerful, and offers a number of different models to approach parallel tasks. In many cases there is both an OO and a traditional interface. All this power and flexibility can make it difficult to know how to implement the toolset in your app. Luckily, the author marioroy can usually be summoned to these halls to provide assistance.

        (That is, I suppose, one of the pluses about the fact that MCE and MCE::Shared are so far not widely known. As you no doubt know, the authors of similarly scoped toolsets tend not to be available for one-on-one support. I don't imagine it can stay that way forever in the case of MCE either ...)


        The way forward always starts with a minimal test.
Re^2: Why should any one use/learn Perl 6?
by tyil (Initiate) on Jun 13, 2018 at 09:15 UTC
    I am also accumulating a list of things I would prefer not to see in productive code. I'll most certainly never use these myself.
    Knowing what keeps people from learning Perl 6 is interesting to note, especially as I've submitted a TPF grant proposal to write a book to help people learn it. I'd like to process the points you list here, and see if we can reach a common ground.
    Single quotes and minus signs in variable names.
    Generally, I use double quotes for strings, unless there's a reason that those don't work well. Very few programmers want to care about which kind of quote to use per string, they'd rather just have a single go-to quoting character that works in almost every case. It's also very common to want to show something in your string that is not just static text, so double-quote string interpolation is often used. On the minus signs in variable names, I was unsure about this when I started with Perl 6 as well, because I was not used to it. I tried to avoid them in variables and sub names. But they're completely valid in Perl 6, and read pretty nice. They're also correctly handled in interpolated strings, which was my biggest worry. Once I realized they're not breaking anything I started using them more often than underscores, since a minus is easier to produce (no shift required) and they read nicer to me.
    Letters with diacritics in variable names.
    These I still avoid, since they're hard to produce for many people. Generally, I write my code in an English mindset, so words with diacritics aren't a common sight anyway.
    Literals like ½ for numbers. Unicode operators which I don't see on my keyboard.
    I'm gonna take these two together as they are the same issue as far as I'm concerned. Fancy Unicode characters that people don't have as a generic key on their keyboard. I actually do not avoid these. I'm using vim as my editor, which has a plugin to convert Texas ops to Unicode ops on-the-fly. I wonder if CommaIDE does the same. If it doesn't, it should. You note yourself that it's explicitly about Unicode operators you don't see on your keyboard. Would you oppose these operators still if there was a clean solution to create these operators that worked for you? Like your editor automatically converting them for you, or a certain script that you could run over your source files that would convert them automatically (which could be hooked into another process).
    Quoting functions with three or more letters. qqw qww qqww.
    I think many of these "large quoting constructs" are confusing, especially to people new to the language. I personally avoid them.
      About 3.5 years ago, I posted Quoting on Steroids, which hopefully made some sense to some. :-)

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1216120]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others exploiting the Monastery: (4)
As of 2024-03-28 18:18 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found