seems like referendums are all the rage at the moment so we're gonna have 1 to decide coding style.
https://www.surveymonkey.com/s/BN38LBQ
If you work with the Moses code, please vote. This will give us a clear mandate for future development.

Polls will open until Sunday evening. All results are public

On 27/05/2015 05:16, Jeroen Vermeulen wrote:
On May 27, 2015 2:47:02 AM GMT+07:00, Ulrich Germann <[email protected]> wrote:

    Well, the second document does indeed give some darn good
    arguments for
    trailing braces: 1. "
      as shown to us by the prophets Kernighan and Ritchie
    "; 2. "
    K&R are _right_ and [...] K&R are right
    "; 3. "
      think 25-line terminal screens here
    "

    The document also has other great suggestions that we may want to
    adopt."
    Tabs are 8 characters, and thus indentations are also 8 characters
    "

    The fact is: with trailing braces and steadfast refusal to use
    vertical space to improve
    code readibility, you do need a tab width of 8 or so to be able to
    recognize code blocks.

    Incidentally, there's actually one recommendation in that document
    that IS worth
    adopting *(and in which pretty much all style guides agree
    plus-minus 5 characters or so):*

    The limit on the length of lines is 80 columns and this is a
    strongly preferred limit.

    Let me repeat that:

    The limit on the length of lines is 80 columns and this is a
    strongly preferred limit.

    And again:

    The limit on the length of lines is 80 columns and this is a
    strongly preferred limit.

    That is the only thing worth really considering from that document.

    We can safely consider the 25-line limit a thing of the past
    unless you program on
    your mobile phone. However, there is a good justification for the
    80-column
    limit: merging code, where it's useful to see the code side by
    side. When
    resolving merge conflicts in git, we are usually dealing with 3
    versions that need
    to be compared. Those three columns won't fit on my screen when
    lines are 120+
    characters long.

    I digress. Back to the braces issue. Unlike the arguments for
    trailing braces
    (K&R did it in a printed book to save paper; I'm a retro
    programmer who likes to
    do things old school; it obscures my code so people will think I'm
    really awesome
    because they can't really understand what I'm doing without lots
    of effort, just like
    Derrida and Piaget didn't write to be understood --- they wrote
    NOT to be understood),
    so unlike these arguments, there are very good arguments for
    having opening braces
    on a new line and vertically aligned with the closing bracket.

    1. It's much easier to recognize logical code blocks. It is. Try
    it out. Read code that you
        haven't written and be honest with yourself. It may seem
    unfamiliar at first, but once
        you are used to it, there's no turning back.

    2. If you want to temporarily disable a condition (e.g. in
    debugging), you just comment
        out the if statement. You do not have to THEN put an opening
    brace at the beginning
        of the line (extra editing) and remove it later (extra editing
    again) --- which also
       FORCES you to be inconsistent. (You can't always remove the
    braces because
       of variable scoping). You have the same issue when you want to
    use preprocessor
       commands to have conditions only under certain circumstances,
    so instead of
    #ifdef ENABLE_CONDITION
    if (condition)
    #endif
      {

    you'd have to write
    #ifdef ENABLE_CONDITION
    if (condition) {
    #else
    {
    #endif


    3. Which of the two makes it easier to see where the condition
    actually ends?

    if (StaticData::Instance().IsDetailedTranslationReportingEnabled() ||
    StaticData::Instance().IsDetailedALLTranslationReportingEnabled()) {
    StaticData::Instance().....

    or

    if (StaticData::Instance().IsDetailedTranslationReportingEnabled() ||
    StaticData::Instance().IsDetailedALLTranslationReportingEnabled())
    {
    StaticData::Instance().....

    In my opinion, the advantages of leading over trailing braces are
    very clear. And there are first
    converts. Ask Matthias.

    There's also an brief but illuminating explanation of the
    historical reasons for trailing braces
    here:
    
http://programmers.stackexchange.com/questions/236995/why-do-c-developers-newline-opening-brackets,
    which also hints at readability studies that appear to support my
    point.

    Finally, let's look at the Apple "goto fail" security bug. What
    happened there?

    This is a snippet of the code in question:

    if  ((err=  SSLHashSHA1.update(&hashCtx,  &signedParams))  !=  0)
         goto  fail;
         goto  fail;


    The second goto fail was copied in error, it was always executed
    and lead to skipping an
    important security check. Apart from the fact that 'goto' is
    almost always a bad idea (but
    we could run into the same problem with switch statements and
    conditional break;),
    some people argue that this just proves that you should always,
    always, always, always
    use braces around blocks

    So instead of, say

    if(condition a)
      return 1;
    if(condition b)
      return 2;
    do_more_stuff_here;

    we'd have to write

    if(condition a) {
      return 1;
    }
    if(condition b) {
      return 2;
    }

    what was that again about saving vertical space? With trailing
    braces, code like the goto fail bug
    code looks perfectly legitimate. With opening braces on a separate
    line, it is immediately clear that
    there's something amiss when two  consecutive lines after an if
    statement or a for are at the same
    indentation level. Either only the first line should be indented
    (no braces used at all), or there
    should be an opening brace between the if and the first line of
    the indented block. It may not be
    clear what the programmer's intention was, but at least we can see
    that something is wrong here.

    Trailing braces are bad, tedious and dangerous coding style. Period.

    - Uli

    On Tue, May 26, 2015 at 6:39 PM, Hieu Hoang <[email protected]
    <mailto:[email protected]>> wrote:

        ah, the style guide that no-one has ever bothered to follow
        since I originally wrote it 10 years ago.

        I changed it in Jan to reflect the style that people actually
        check in, so presumably prefer. The beautifier tries to mimick
        this style. I will change the style guide back.

        fyi - the original style is based on microsoft, eg
        http://blogs.msdn.com/b/brada/archive/2005/01/26/361363.aspx
        i guess people prefer a unix-based style, eg
        https://www.kernel.org/doc/Documentation/CodingStyle


        I think beautifying is a necessary 'cos we have a distributed
        project of committers who use different editors and OSes. It
        provides some consistency.

        I regularly see you commit changes where you've manually wrap
        long lines. Youre welcome to change the beautifier to enforce
        this. However, I prefer that the beautifier isn't changed too
        much otherwise the code will flip flop for no good reason.



        Hieu Hoang
        Researcher
        New York University, Abu Dhabi
        http://www.hoang.co.uk/hieu

        On 26 May 2015 at 20:30, Ulrich Germann
        <[email protected] <mailto:[email protected]>>
        wrote:

            Hi Jeroen,

            on the matter of style I'd like to point out that the
            official style guidelines for Moses code require opening
            braces on a separate line.

            http://www.statmt.org/moses/?n=Moses.CodeStyle

            The official style has always required this since the
            first entry about this in the Wiki back in 2009. Recently
            (Jan 16 this year) the page was vandalized by an anonymous
            editor to claim something to the contrary, but the page
            has now been restored to what it should be. So while
            you're fiddling with the beautify scripts, please fix this
            as well.

            I'm personally no friend of automatic "beautification",
            because it does far more harm than good in my opinion, but
            if you insist on doing it, it should be done right.

            Best regards - Uli

            On Sun, May 17, 2015 at 2:13 PM, Jeroen Vermeulen
            <[email protected]
            <mailto:[email protected]>> wrote:

                Hi all,

                We have a replacement for the old beautify.perl script:
                scripts/other/beautify.py.

                It does one of two things, or both:
                 * Re-format C/C++ source code, just like the old
                script did.
                 * Check for style errors and such.

                This last thing is called a "lint" check.  For this I
                chose Pocketlint,
                a checker I have good experiences with, although if
                people want a
                different one (or additional checks) I can change that.

                I fixed most of the lint that got reported, except in
                JavaScript code.
                We may add automatic reformatting for additional
                languages later.  I
                sincerely hope all of this does not cause any serious
                merge problems for
                your branches.

                Ideally, everyone would get in the habit of installing
                Pocketlint and
                running this script regularly whether they
                accidentally added any lint.
                 To see how the script works, run:

                    ./scripts/other/beautify.py -h

                The lint check processes a few files at a time.  By
                default it stops
                when it sees lint.  If you want to see a full check,
                use the -i option.


                Jeroen
                _______________________________________________
                Moses-support mailing list
                [email protected] <mailto:[email protected]>
                http://mailman.mit.edu/mailman/listinfo/moses-support




-- Ulrich Germann
            Senior Researcher
            School of Informatics
            University of Edinburgh

            _______________________________________________
            Moses-support mailing list
            [email protected] <mailto:[email protected]>
            http://mailman.mit.edu/mailman/listinfo/moses-support





-- Ulrich Germann
    Senior Researcher
    School of Informatics
    University of Edinburgh


Personally I'd be in favour of opening braces on separate lines and 80-column lines, but what I did to the beautify script was not meant to trigger a vast rewrite of the main body of code. Changing that is a whole separate discussion, involving not just what's best but also how to deal with change.

>From long experience as a software engineer I can say that automated code formatting is a good thing, provided it's done regularly and people adjust their styles to it. In fact I would prefer any style guide not to talk about things like opening braces at all: "Try to make your code look like what's already there, and be aware that the code is automatically reformatted on a regular basis. Run a lint check before committing."

(Maybe I should make the beautify script accept a list of filenames, and/or add the option to run only on files with uncommitted changes.)

I'll have a look into making astyle break long lines, but be warned: I made the lint checker accept lines up to 400 columns only because there were so many over 300! We may have to ease into it a few lines at a time.


Jeroen

--
Hieu Hoang
Researcher
New York University, Abu Dhabi
http://www.hoang.co.uk/hieu

_______________________________________________
Moses-support mailing list
[email protected]
http://mailman.mit.edu/mailman/listinfo/moses-support

Reply via email to