Один из признаков того, что язык программирования имеет успех, – появление новых языков на его основе. Известным примером является JavaScript. На его базе возникли такие языки, как TypeScript, GorillaScript, Kaffeine, Sweet.js и так далее.

Со временем язык программирования Go, разработанный компанией Google, сможет соперничать с JavaScript по количеству надстроек и диалектов.

Миру уже был явлен Oden – функциональный язык со статической типизацией, разработанный в рамках экосистемы Go. В то же время он создавался как надстройка Go и впитал в себя его лучшие стороны.

А теперь появился новый язык – Have, который имеет все шансы стать усовершенствованной и дополненной версией Go. По крайней мере, так считает его автор – польский разработчик Марцин Врохняк.

Он признает, что пока это хобби-проект, но надеется выйти на серьезный уровень и занять почетное место в экосистеме Go. В своем блоге он рассказал о некоторых особенностях языка и его отличиях от Go.

Во-первых, Have явно отличается форматированием: Go использует фигурные скобки (как в Си):

if a() {
    b()
} else {
    c()
}

Have пошел по пути Python в этом плане:

if a():
    b()
else:
    c()

Еще одно стилевое отличие – способ объявления переменных, структур и интерфейсов.

Объявление структуры и ее метода в Go:

type A struct {
    x int
}

func (a A) String() string {
    return fmt.Sprintf("x:%d", a.x)
}

Врохняк полагает, что такой стиль объявления поможет избежать досадных ошибок:

struct A:
    x int
    func String() string:
        return fmt.Sprintf("x:%d", a.x)

interface Reader:
    func Read(p []byte) (n int, err error)

В Have реализована работа с шаблонами. Разработчики Google не стали добавлять ее в Go из соображений простоты. Тем не менее, Врохняк считает, что это важный и мощный инструмент, который должен присутствовать – must have, как говорится:

struct SampleStruct[T]:
    func Method(p T) T:
        return p

T – имя типа данных.

var a SampleStruct[int], b SampleStruct[string]
var x int = a.Method(1), y string = b.Method("one")

Аналогично шаблоны используются в функциях:

func SampleFunc[T](p T) T:
    return p

На этом разработчик не остановился и добавил так называемые специализации. В зависимости от типа внутри функции, например, может выполняться та или иная обработка данных. Ветвление осуществляется с помощью ключевого слова «when»:

func SomeFunc():
    when int
    is int:
        print("int is int, who would've thought?")
    is string:
        print("int is string, better report a compiler error!")

Подстановка того или иного типа происходит на этапе компиляции. Врохняк отмечает, что вне контекста шаблонов «when» не имеет практического применения.

func CopyBytes[T, K](src T, dst K):
    when T, K
    is []byte, implements io.Writer:
        # копируем содержимое участка памяти в поток записи
        pass
    is []byte, []byte:
	# копируем содержимое участка памяти в другой участок памяти
        pass
    implements io.Reader, is []byte:
	# копируем содержимое потока чтения в участок памяти
        pass
    implements io.Reader, io.Writer:
	# копируем содержимое потока чтения в поток записи
        pass
    default:
        # делаем что-то по умолчанию
        pass

Так как Have находится на начальном этапе развития, многие проблемы Go в нем не решены. К примеру, реализация обработки ошибок в Go требует бесполезных затрат времени для написания однотипного кода.

У автора Have большие планы, но как всегда, мало времени. В ближайшее время язык будет совершенствоваться. Существенный объем функциональности Go пока не реализован в Have. Этому и будет отдан приоритет в обозримом будущем, отмечает Врохняк.

Вторая по важности задача – обеспечение совместимости с Go: чтобы можно было программировать на Go в проектах, написанных на Have.

Go был разработан внутри компании Google. Первоначальная разработка Go началась в сентябре 2007 года, а его непосредственным проектированием занимались Роберт Гризмер, Роб Пайк и Кен Томпсон. Официально язык был представлен в ноябре 2009 года.

Язык Go разрабатывался как язык системного программирования для создания высокоэффективных программ, работающих на современных распределённых системах и многоядерных процессорах. Он может рассматриваться как попытка создать замену языку Си. По крайней мере, в это верят разработчики Go.
Поделиться с друзьями
-->

Комментарии (99)


  1. BratSinot
    26.09.2016 11:11
    +15

    Лично мне не нравится идея Python'а использовать пробелы и табуляцию заместо скобок. Мне неудобно читать, писать и искать ошибки (теже не закрытые скобки).


    1. bolk
      26.09.2016 21:05
      +6

      Дело привычки.


      1. Idot
        27.09.2016 12:17

        Понятно, что отступы — дисциплинируют, но не все любят когда их заставляют из под палки.

        А кроме того, вопрос пишущим на Питоне: когда строка такой длинны, что не помещается на экран, можно ли сделать перенос начинающийся с отступа для удобства чтения? И как такое воспринимает Питон?


        1. iroln
          27.09.2016 15:54
          +1

          Можно использовать символ \ для переноса строки:


          foo = 2362366232 + 1423204837 -     1744037725 * 47494036263

          Но лучше использовать скобки. В Python можно обвернуть в скобки любое выражение, и тогда его можно переносить на новую строку.


          foo = (2362366232 + 1423204837 -
              1744037725 * 47494036263)

          Отступ перенесённой строки в этом случае роли не играет, но обычно придерживаются правил с учётом Style Guide


          1. Idot
            27.09.2016 18:43

            Спасибо!


        1. iroln
          27.09.2016 16:01

          но не все любят когда их заставляют из под палки

          Гораздо больше людей не любят читать плохо отформатированный код. Для этого принимают Style Guide и придерживаются его. Поэтому разработчику, если он работает над проектом в команде, всё равно придётся придерживаться какого-то стиля форматирования, а не писать как попало.


    1. iroln
      26.09.2016 23:30
      +4

      Незакрытые скобки должен подсвечивать ваш редактор кода.


  1. byd
    26.09.2016 11:15
    -2

    " реализация обработки ошибок в Go требует бесполезных затрат времени для написания однотипного кода" — бесполезных, серьёзно?


    1. Dionis_mgn
      26.09.2016 15:00
      +6

      Да, серьёзно. Если я вынужден писать одно и то же через каждую строку-две, это — бесполезно. И велико искушение вообще забить на обработку ошибок.


    1. Azoh
      26.09.2016 15:00
      +4

      Серьезно. Проверять ошибки вместо обработки исключений — это простейший способ бесполезно потратить кучу времени.

      Вот нужно открыть файл, прочитать оттуда, записать туда, закрыть файл. Если что-то не смогли, то дальнейшая работа должна остановиться. Отсюда получаем, что нужно 4 проверки. С исключениями это все превращается в один перехватчик.

      Более того, в большей части приложений перехватчики нужны в основном на границах модулей, что позволяет избежать написания огромной кучи кода. А, как известно, лучший вид кода — это отсутствующий код. Его не нужно поддерживать, там нет багов, он даже не требует времени на написание.

      Более того, современные способы работы с исключениями не создают дополнительного оверхеда, в отличии от проверки ошибок.


    1. avost
      26.09.2016 18:02

      Однотипного? Ну, да, вместо того чтобы писать однотипный код можно было потратить время с бОльшей пользой.


  1. impwx
    26.09.2016 11:26
    +1

    То, что автор называет генериками, на самом деле перегрузка функций (пример с CopyBytes из статьи) и макрошаблоны (пример с Max с сайта). Очень интересно, как нужно будет обращаться к этим функциям из Go.


  1. iCpu
    26.09.2016 11:28
    +10

    Жило было 14 конкурирующих языков программирования…


    1. snuk182
      26.09.2016 12:49
      +18

      а надо было сразу с дженериками создавать, а не петь мантры разработчикам «вам это не нужно»…


      1. iCpu
        26.09.2016 12:56
        +1

        Я не до конца в теме (я вообще не в теме), это что-то вроде расширяемого синтаксиса Лиспа, который позволяет плодить свои диалекты Лиспа даже не требуя пересборки исходников Лиспа?


        1. Razaz
          26.09.2016 13:15
          +7

          Просто возможность сделать

          ArrayList <MyFancyType> 
          
          и не плодить кастомных коллекций.


          1. iCpu
            26.09.2016 13:25
            +1

            Оу… Действительно… Люто-бешено плюсую воображаемыми единичками.


      1. creker
        26.09.2016 13:43
        -1

        Никто не пел. Дженерики были бы, если бы кто-то предоставил подобающее решение, которое устроит команду разработчиков. Есть идеи, исследования, но пока на этом все. Все существующие реализации отвергли по теме или иным причинам.


        1. snuk182
          26.09.2016 13:48
          +3

          ИМХО, это как раз тот случай, когда не совсем удачное решение лучше, чем нет решения вовсе.


          1. creker
            26.09.2016 13:49

            Поскольку с этим «не совсем удачным» решением пришлось бы жить годы и тащить всю жизнь языка, то наверное нет. Пора уже перестать идти на поводу у тех, кому вот прямо надо и все тут. Отлично живется без дженериков языку и не сильно его просит аудитория. Будет — скажут спасибо. Не будет — ну и ладно.


            1. TheShock
              26.09.2016 16:09
              +2

              Мне вот кажутся идеальными Дженерики в СиШарпе. Вот правда, пока дошел до него — все дженерики мне казались не очень. Например в той же Джаве из-за type erasure. В СиШарпе же они работают просто так как должны, очень мощные и гибкие. И чем они плохи для Гоу?


              1. snuk182
                26.09.2016 16:26
                +1

                На Java как образец дженериков не смотрите.
                Точнее, смотрите, как на образец «что будет, если их даже не планировать, но потом в какой-то момент осознать, что так жить дальше нельзя». Это сейчас настолько повально распространенная вещь для статически типизированных языков, что вполне должна входить в общую образовательную базу.
                По теме: Proposal, FAQ, RFC
                Показательно, что RFC по нему открыли только в апреле этого года.


                1. TheShock
                  26.09.2016 16:55

                  На Java как образец дженериков не смотрите.

                  Так я ж и говорю, что там отвратительные =) Хороши в C#, там тоже добавили не сразу, но поступили мудро, что забили на первые версии и теперь имеют нормальные дженерики.

                  Просто не получится ли с Гоу так же как с Джавой — вставят какую-то фигню через пару лет типа type erasure и потом все плеваться будут, а они только плечами двигать, мол обратная совместимость, раньше думать надо было?


                  1. snuk182
                    26.09.2016 17:06

                    Если верить FAQ — поддержка потенциальной возможности generics есть изначально, они решили сначала решить вопросы стабильности и производительности рантайма.


                  1. Sirikid
                    27.09.2016 04:35

                    > Хороши в C#, там тоже добавили не сразу, но поступили мудро, что забили на первые версии и теперь имеют нормальные дженерики.

                    Да ладно? У них до сих пор два API для коллекций.


                    1. TheShock
                      27.09.2016 06:02

                      Я ведь про дженерики, а не про стандартную библиотеку.


                      1. Sirikid
                        27.09.2016 06:14

                        Тогда что сломали, формат байткода?


                        1. TheShock
                          27.09.2016 06:18

                          ну джава на такой шаг ведь не пошла?


                          1. Sirikid
                            27.09.2016 06:57

                            Ну так у Oracle кредо такое, и я не спорю с тем что дженерики у них так себе. Мне просто интересно на что забили в MS и что сломали в C#.


                  1. creker
                    27.09.2016 11:58
                    -1

                    Дженерики если и будут, то только в Go2, на что гарантии совместимости не будут распространяться. Go1 позволяет добавлять только то, что не сломает текущий код, что позволяет вносить минимальные изменения в спецификацию.


              1. creker
                26.09.2016 16:37

                https://github.com/golang/go/issues/15292 тут вот обсуждение и ссылки на отвергнутые предложения. Я не сильно вдавался, но на поверхности выходит, что Go довольно уникальный язык и на него плохо ложатся обычные дженерик как у всех (в частности, плохо ложатся на интерфейсы), а некоторые реализации просто не хочется использовать ввиду их убогости. Вроде C++, что само собой мало кому хочется видеть. Конечно можно было давно что-то добавить, но весь цикл разработки языка прямая противоположность такому подходу — пока что-то не понравится всей команде, то этого не будет в языке. И, надо сказать, для них это отлично сработало.

                Собственно, я к этой теме потерял интересно давно и совершенно не жалею, что этого нет в языке. Больше беспокоят всякие мелочи вроде невозможности использовать := для одновременного объявления переменной и присвоения значения полю структуры. Приходится заводить заранее переменную и использовать обычный =. Мелочь, а встречается намного чаще, чем необходимость в дженериках.


                1. TheShock
                  26.09.2016 17:11
                  +1

                  Я не сильно вдавался, но на поверхности выходит, что Go довольно уникальный язык и на него плохо ложатся обычные дженерик как у всех

                  Я вот несколько раз то обуждение прочитал. Может потому что английский у меня не идеален, но я так толком и не понял, почему им не нравятся Дженерики из c#. Про С++ есть прямо: «The problem with C++ generics (without concepts) is that the generic code is the specification of the generic type. That's what creates the incomprehensible error messages. Generic code should not be the specification of a generic type». К сожалению я не совсем понял, т.к. не знаю С++.
                  Про Джаву тоже: «unlike in Java, so you can find out types at run time. You can also instantiate on primitive types, and you don't get implicit boxing in the places you really don't want it: arrays of T where T is a primitive». Но вот в C# нету такой проблемы.

                  Мне особенно «нравятся» вот такие аргументы: «One key aspect of Go is that when you write a Go program, most of what you write is code. This is different from C++ and Java, where much more of what you write is types. Genus seems to be mostly about types: you write constraints and models, rather than code». Больше подходит для политического лозунга, а не технического обсуждения.

                  «Мелочь, а встречается намного чаще, чем необходимость в дженериках» мне, все-таки, кажется, что необходимость в них может варьироваться зависимо от домена.


                  1. snuk182
                    26.09.2016 17:38

                    del


                  1. MacIn
                    26.09.2016 18:19
                    +2

                    The problem with C++ generics (without concepts) is that the generic code is the specification of the generic type. That's what creates the incomprehensible error messages. Generic code should not be the specification of a generic type

                    Тут речь идет о том, что если мы используем какой-то шаблон, ошибка выявится глубоко внутри библиотеки, там где она попробует воспользоваться заданным при специализации типом. Они предлагают определять сразу, подходит ли какой-то тип для специализации шаблона, или нет.


                    1. TheShock
                      27.09.2016 06:04

                      Спасибо.


              1. johnnymmc
                26.09.2016 16:38
                +1

                Это да. Кстати даже в прекрасном Хаскеле type erasure тоже.


              1. Sirikid
                27.09.2016 00:24
                +2

                C#-дженерики используют кодогенерацию в рантайме, у Go в рантайме только GC и многие считают что это уже слишком много.


                1. Razaz
                  27.09.2016 12:01

                  Считают. Но если даже GC слишком много, то зачем им Go? о_0 Понятно что там есть плюсы свои. Но всетаки.


                  1. creker
                    27.09.2016 12:14

                    Я не видел ничего про GC, но написано прямо черным по белому — никакой кодогенерации в рантайме. C# поэтому даже вообще не обсуждается — такой подход по определению не подходит


                    1. Razaz
                      27.09.2016 12:46

                      Вроде как для CoreRT хотели тот же рефлекшен сделать отключаемым. Но я пока активно не слежу за этим.


                      1. Sirikid
                        27.09.2016 12:53

                        Немного про другое, но все равно немного проясняет вопрос:
                        https://habrahabr.ru/post/311112/#comment_9829408


        1. Source
          26.09.2016 14:49
          +7

          Дженерики были бы, если бы кто-то предоставил подобающее решение, которое устроит команду разработчиков.

          Хм, интересная позиция… Разве команда разработчиков не в состоянии разработать решение, которое её же и устроит?


          1. creker
            26.09.2016 14:54

            Дженерики они рассматривали и все реализации их так или иначе не устроили. Некоторые серьезные проблемы исходят из самого языка, а именно — интерфейсов. Поскольку это Open Source проект, то дверь оставили открытой https://github.com/golang/go/issues/15292


            1. Source
              26.09.2016 15:06
              +7

              Ну, я не очень в теме как выстроен процесс разработки Go. Но со стороны это выглядит примерно так: "Мы тут накосячили с архитектурой языка так, что даже сами не можем придумать решение, но у нас Open Source, так что давайте теперь как-нибудь силами сообщества вопрос порешайте, а мы рассмотрим ваши предложения, может быть.."


              1. creker
                26.09.2016 15:20

                Нет, это выглядит не так. Мы придумали язык такой, какой он есть (интерфейсы самое главное преимущество языка и никакое отсутствие дженериков этому никак не мешает), а вы тут хотите сверху прикрутить что-то из абсолютно других языков, просто потому что хочется как у них. Все текущие реализации так или иначе криво работают, либо вообще не совместимы с языком. Это не проблема языка, а проблемы этих реализаций. Авторы потратили на это время, не нашли. Более смысла тратить на не очень то нужную языку фичу нет. У нас Open Source, поэтому если кто-то сможет, то пожалуйста. В данный момент есть намного более важные вещи, которые стоит добавить в язык и его библиотеку. Например, нормальная работа с многомерными массивами и вот сейчас бурно обсуждаются type alias'ы.


                1. Sirikid
                  27.09.2016 04:41

                  > сейчас бурно обсуждаются type alias'ы

                  А можно подробнее? Я просто думал обычное объявление типа это и есть type alias.


                  1. creker
                    27.09.2016 12:12

                    Вот тема https://github.com/golang/go/issues/16339 Внимание, оно огромная и все это сплошной спор. Мне, честно говоря, не особенно нравится самому эта штука и там много споров из-за того, что людям кажется, что Google проталкивает это изменение для себя и не предоставляет нормальной аргументации в пользу. Даже кажется, что поставили перед фактом и просят предоставить аргументы против. Но, в тоже время, во всех остальных языках это есть и вроде живут нормально.

                    А предложение довольно простое — возможность объявить альтернативное имя для типа/функции/т.д. Что-то вроде

                    const C => L1.C  // for regularity only, same effect as const C = L1.C
                    type  T => L1.T  // T is an alias for type L1.T
                    var   V => L1.V  // V is an alias for variable L1.V
                    func  F => L1.F  // F is an alias for function L1.F
                    


                    Основной аргумент в пользу — упрощения рефакторинга для больших кодовых баз.


                    1. Sirikid
                      27.09.2016 12:45

                      Предложение интересное, (лично мне кажется что) как раз многие языки такой возможности не имеют и это не особо мешает. Насколько понял добавление нового ключевого слова даже не рассматривается т. к. собираются добавить в 1.X релиз?


                      1. creker
                        27.09.2016 12:54

                        Думаю нет. По мне так, => неплохо смотрится. До этого было ->, но уж очень коробило сходство с операцией над каналами, поэтому поменяли.

                        Про все остальные языки я конечно погорячился, но это есть в Rust и Swift как минимум.


                        1. Sirikid
                          27.09.2016 13:02
                          +1

                          В Rust, Swift и вообще эта конструкция связана не с абстрактными типам/константами/переменными/функциями а с импортом, то есть ты импортируешь сущность и можешь её переименовать, это логично. Либо же это type aliases которые работают как сишный typedef (только для типов), я думал что type в Go работает так же, по крайне мере для интерфейсов.


                          1. DarkEld3r
                            27.09.2016 14:48
                            +1

                            В Rust, Swift и вообще эта конструкция связана не с абстрактными типам/константами/переменными/функциями а с импортом

                            Да ладно?


                            type MyMegaInt = i32;

                            typealias AudioSample = UInt16


                            1. MacIn
                              27.09.2016 15:13

                              Ой, какой Паскаль :) Удобно, на самом деле, и для специализации шаблонов тоже.


                            1. Sirikid
                              27.09.2016 15:13

                              1. Второе предложение как раз про это.
                              2. Go тоже так умеет.


                              1. DarkEld3r
                                27.09.2016 15:24
                                +1

                                Про Go ничего и не говорил. Речь о том, что "синонимы" типам в расте и свифте можно давать независимо от импорта. Или я всё-таки что-то не так понял?


                                Но всё-таки, если Go так умеет, то можно разжевать в чём же суть предложения, которое обсуждалось выше?


                                1. Sirikid
                                  27.09.2016 15:55
                                  +1

                                  В Go предлагают добавить возможность объявлять псевдонимы не только для типов но и для всего остального (констант, функций, переменных) и в любом месте пакета, при этом из нового синтаксиса будет только оператор (и на этом спасибо).


                                  1. DarkEld3r
                                    27.09.2016 16:28

                                    Теперь понятно, спасибо.


                                    Тем не менее, в расте (насчёт свифта уже не уверен) оно всё равно работает и для импорта и без него.


                                    1. Sirikid
                                      27.09.2016 16:54

                                      ~~Ты должен был победить зло, а не присоединиться к нему!~~
                                      То есть виноват, не очень понял этот момент Rust. Но Rust-вариант мне нравится больше, можно хотя бы `use` грепать а не `=>`.


  1. creker
    26.09.2016 11:31
    +4

    Python синтаксис — нет нет и нет. Тонна ошибок на ровном месте. Особенно с учетом требований Go — отсутствие необходимости писать в IDE или ее подобии (никаких вимов с тонной плагинов) и автоматическое однозначное форматирование любого кода. Один неправильный отступ и до свидания.

    В Have реализована работа с шаблонами. Разработчики Google не стали добавлять ее в Go из соображений простоты

    Их не стали добавлять из-за отсутствия реализации, которая отвечает требованиям команды разработчиков. Они довольно серьезные и не только из-за капризов разработчиков, но и других конструкций языка, с которыми шаблоны должны быть прекрасно совместимы. Issue на гитхабе открыта для предложений.

    реализация обработки ошибок в Go требует бесполезных затрат времени для написания однотипного кода.

    Что?

    Начинание правильное, но, по-моему, не те вещи он начал исправлять. Больше похоже на очередной проект, в который человек просто добавил все, что ему захотелось из других языков. Лучше было начать с github и открыть все быги с тегом Go2 — там предостаточно отличных идей и предложений, которые довольно не скоро появятся официально, т.к. судьба Go2 пока еще мутная.


    1. iroln
      26.09.2016 23:52
      +9

      Один неправильный отступ и до свидания

      Пишу на Python уже лет 7. За это время видел тонны ошибок в программах из-за динамической природы языка, но ни разу не видел ошибок из-за неправильных отступов. Может хватит уже муссировать этот миф с проблемой indent-based синтаксиса в Python?


  1. mich_ovs
    26.09.2016 12:14
    +4

    struct A:
        x int
        func String() string:
            return fmt.Sprintf("x:%d", a.x)
    

    Я одно не понял, а откуда тут имя 'a'? Похоже на ошибку копипаста.
    В целом, мне нравится новый синтаксис — стало нагляднее.


    1. Warlock_29A
      26.09.2016 13:27

      Возможно и не опечатка, в го по идеи должно было быть написано так:


      func (a A) String() string

      Тут возможно есть какое то соглашению по тому как генерируются имя переменной, чтобы обращаться к полям структуры.


    1. ufm
      26.09.2016 13:43

      Там должно быть this.x


    1. snuk182
      26.09.2016 15:13

      В оригинале есть упоминание self для указателей. Видимо, naming convension дкйствует только для методов, вызываемых по значению.

      What about pointer receivers? They are there, too. You declare them by putting a * before function name. The method receiver is always referred to as self.
      
      struct A:
          counter int
          func *Inc():
              self.counter++
      
      

      Кстати, странно, что про этот куда более используемый кейс — ни слова.


  1. baka_cirno
    26.09.2016 14:33
    +11

    Я так понимаю, про ошибки с табуляцией, «характерные для Python», в основном пишут те, кто Python никогда серьезно не использовал. Потому что те, кто работает с ним каждый день, почему-то никогда на это не жалуются.


    1. NeoCode
      26.09.2016 14:51

      Возможно. Но мне идея форматно-несвободного языка как таковая не нравится. На питоне не пишу вообще, но иногда приходится наталкиваться на какие-то экзотические вещи, в которых от случайно поставленного не там пробела или табуляции, или табуляции вместо пробелов что-то ломается и не поймешь где.


      1. euspensky
        28.09.2016 11:17
        +1

        От «случайно поставленных не там пробелов или табуляций» в 99% случаев программа просто перестает запускаться, и выдает IndentationError, с указанием строки. Поведение в точности как в других языках при случайно и не там поставленных скобочках.


    1. lookid
      26.09.2016 14:58
      +5

      Я так понимаю, про неудобство есть суп ножкой от стола, в основном пишут те, кто ножкой от стола суп никогда серьезно не ел. Потому что те, кто ест суп ножкой от стола каждый день, почему-то никогда на это не жалуются.


      1. baka_cirno
        26.09.2016 15:12
        +1

        Не аргумент. Тысячи совершенно неглупых людей уже не первый десяток лет поглощают супы ножками от стола, и чувствуют себя прекрасно.


        1. creker
          26.09.2016 15:23
          -3

          Вот это как раз не аргумент. Аргумент — это объективный недостаток решения Python в виду генерации невидимых ошибок, которые ломают код в рантайме, просто потому что где-то неправильный отступ. И все аргументы в пользу этого от питонистов сводятся к какой-то идеологической проблеме — не хочу и не буду писать скобки, потому что уже есть отступы. То, что это генерируется только новые проблемы и не решает никаких старых, это как бы не важно. Привыкли — замечательно, но это не показатель успешности решения. Показатель это тот факт, что никто из популярных языков такое решение не принял кроме питона.


          1. NeoCode
            26.09.2016 15:35

            Из популярных — нет, но судя по всему многие изучение программирования начинают с питона и это оказывает неизгладимый отпечаток. Например в Nim ввели такой же синтаксис, еще где-то видел. Возможно это действительно другая парадигма мышления — ну чтоже, пускай будут разные языки, время рассудит. Я для себя решил что в собственном языке программирования никаких невидимых отступов не будет, только старые добрые скобки :)


          1. ufm
            26.09.2016 16:45
            +5

            Почему питонистам нельзя есть суп ножкой от стола, если куча других людей едят суп ножкой от табуретки и считают что это правильно?
            Пример:
            if (a == 1) a++; b++;
            Это C, если что. Какое количество ошибок в куче программ повылазило только из-за того, что блок может состоять только из одного оператора…


            1. Sirikid
              27.09.2016 04:49
              +2

              1. Не забывайте что C написали 40 лет назад.
              2. if (a == 1) a++, b++; // Готово :)


              1. ufm
                27.09.2016 15:28
                +1

                1. С — да, старый. Но ведь это решение потом потянули везде где только можно. В Rast разве не так-же?

                2. это если человек осознанно пишет. А в таком случае и скобки написать можно.


                1. DarkEld3r
                  27.09.2016 16:30
                  +1

                  В Rast разве не так-же?

                  Неа, в Rust отсутствие скобки будет ошибкой:


                  if a == 2 a+= 1; 

                  error: expected `{`, found `a`
                   --> <anon>:4:15
                    |>
                  4 |>     if a == 2 a+= 1;
                    |>               ^
                  help: place this code inside a block


            1. creker
              27.09.2016 21:35

              И к чему это здесь? В Go такое написать нельзя, к чему здесь С? Да, там есть проблема и приходится дисциплинировать себя, чтобы ее максимально избегать. Ровно тоже самое, что питоновская строчка, которая может съехать и изменить логику всего блока кода.


          1. baka_cirno
            26.09.2016 19:49
            +6

            Дело в том, что проблемы нет. Не генерируются никакие скрытые ошибки, о которых вы пишете. Может, они в вашем представлении должны были бы генерироваться, но не генерируются. Вот такая фигня.


            1. creker
              27.09.2016 21:39
              -1

              Дело в том, что проблемы нет у вас. Проблема есть у языка и его синтаксиса. Она есть и никуда от заявлений, что у кого-то ее не было, не девается. Совершенно не случайно в современных популярных языках нет этого синтаксиса, а так же нет C синтаксиса, где можно опустить скобки. Go, Rust, Swift не дадут написать условие без скобок, что абсолютно верно.


          1. Bonart
            26.09.2016 20:11
            +1

            Вы не поверите — в Питоне нет невидимых ошибок из-за отступов. Зато есть одинаковое понимание отступов человеком и компилятором.
            Кстати, самый зрячий на ошибки компилятор у хаскеля. При той же отступной грамматике.


            1. creker
              27.09.2016 21:41
              -3

              А где не одинаковое? В языках со скобками отступы понимаются ровно точно так же как и человеком — необязательный символ форматирования кода. Проблема в том, что зачем-то невидимый символ форматирования стал частью синтаксиса и все никак не видно объективных преимуществ в пользу этого. Кругом только неприязнь скобочек и заявления, что никаких ошибок нет и не бывает.


              1. Bonart
                28.09.2016 01:13
                +3

                Необязательный?
                Начните коммитить код без отступов — и команда вас проклянет.
                Начните коммитить код с отступами, не согласованными со скобками — и коллеги вас убьют, а суд их оправдает.
                А компилятору все равно.
                Принимаются стандарты оформления, которые делают несоответствия между скобками и отступами максимально заметными.
                Отступные грамматики делают чтение отступов у транслятора таким же, как у человека. Теперь плохое оформление отступами отслеживается раньше, чем код-ревью и вообще автоматически.
                Заодно экономится куча строк, ранее занимаемых скобками.


  1. johnnymmc
    26.09.2016 15:00
    +6

    Один из признаков того, что язык программирования имеет успех, – появление новых языков на его основе. Известным примером является JavaScript. На его базе возникли такие языки, как TypeScript, GorillaScript, Kaffeine, Sweet.js и так далее.

    Несколько наивное утверждение. Главная причина появления новых языков «на базе JavaScript» — то, что он встроен в браузеры. Это как говорить о успехе машинных кодов x86 как языка программирования на основе того, что C, C++, Pascal, Haskell, Go и др. компилируются в них. Вторая причина — то, что сам он достаточно неудобен, чтобы многим хотелось как-то его улучшить и/или чем-то его заменить.


    1. Azoh
      26.09.2016 15:05

      Так наоборот, все правильно. Язык успешен и захватил зону рынка. Но неудобен для части людей. Но в силу успешности языка им приходится иметь с ним и его экосистемой дело. И они задумываются о том, что нужно создать свой язык, который нацелен на туже экосистему, но который все неприятные части убирает, а приятные добавляет.

      А не будь язык успешен, то никто не стал бы даже думать о таких вещах.


  1. Source
    26.09.2016 15:01
    +16

    Один из признаков того, что язык программирования имеет успех, – появление новых языков на его основе. Известным примером является JavaScript.

    Имхо, появление транспилеров — это признак того, что на исходном языке писать жутко неудобно/неприятно/etc., но какие-то другие факторы принуждают к этому. И JavaScript — яркий тому пример.
    Своеобразный лайфхак — писать на приятном языке, а генерацию кода на неприятном языке поручить транспилеру. Разве есть другие причины писать транспилер?


    1. ufm
      26.09.2016 17:06
      +1

      Причина писать транспайлер еще может быть в том, что destination language есть подо всё, что шевелится. Как пример, автор NIM совершенно разумно сделал транслятор в C — как следствие он получил возможность компиляции на любую железку, для которой есть C копилятор (т.е. чуть более, чем под любую).


      1. Source
        26.09.2016 18:28
        +1

        Так я не вижу здесь противоречия. Если автор Nim считал бы С идеальным ЯП, то он не стал бы делать свой язык. Получается, что ему нравятся компиляторы C, но не нравится C как язык.


        1. asdf87
          27.09.2016 04:46
          +1

          Скорее автору Nim нравятся целевые платформы компиляторов C, а не сам язык и его компиляторы.


  1. denis_g
    26.09.2016 23:58
    -1

    Первая реакция: Фу!


    (Это чисто мое мнение, оно может не / не должно совпадать с мнением большинства)


  1. Sirikid
    27.09.2016 04:58

    Интересное сочетание синтаксиса и статической типизации, из похожих только Haskell, который скорее про науку чем про production, ещё можно вспомнить Eiffel и Occam.

    NeoCode практически любой язык сейчас «форматно-несвободен» (привет code style), а тут ещё и два символа экономим :)


    1. NeoCode
      27.09.2016 08:04

      code style то я могу сам выбирать. Экономия символов это мелочи. А неприятно то, что при вставке кода из другого источника (даже из другого места этого же файла) в середину существующего кода нарушается не просто красота, а целостность синтаксической структуры. И пока ее не восстановишь — ничего работать не будет. В форматно-свободных языках можно вставить код в любое место и затем просто запустить автоматический форматтер, который все выравняет так как надо. А можно и не выравнивать, пока не будет написан необходимый с точки зрения логики код.
      С питоном нужно все делать вручную и каждый раз, потому что там выравнивание — часть синтаксиса языка.


      1. Sirikid
        27.09.2016 08:31

        Не всегда. Мелочь, а приятно. Многие IDE и даже текстовые редакторы умеют добавлять отступы в вставляемый код. (А ещё копипаст это плохо, только тсс!)


  1. WinPooh73
    27.09.2016 09:43

    Полное ощущение, что название языка выбиралось специально, чтобы превзойти go в «удобстве» поиска в интернете по ключевому слову.


    1. iCpu
      27.09.2016 12:56

      Рано или поздно на планете появится язык программирования, искать спецификацию которого на рабочем компьютере может быть излишне неловко.


      1. ufm
        27.09.2016 15:35

        например brainfuck.


    1. newmindcore
      28.09.2016 11:16
      +1

      Ключевое слово для поиска go в интернете – это golang.


      1. WinPooh73
        28.09.2016 12:30

        Да, это все знают. А для поиска игры go — ключевое слово baduk. Маленькие хитрости, неочевидные при первом знакомстве с предметом. Язык C в этом отношении избежал неоднозначности, при всей краткости названия удалось избежать совпадения с часто используемым словом. Впрочем, когда его так назвали, до поисковых машин было ещё пара десятков лет…


        1. ozkriff
          28.09.2016 12:33

          Зато, если поисковый пузырь не слишком хорошо подогнан, выдача по запросам типа "c strings" бывает неожиданной.


          1. iCpu
            29.09.2016 06:16

            А мне норм.


  1. Air_Walker
    28.09.2016 11:16

    Я бы еще добавил модульную структуру и импорты как в Python, а то в Go это почему то не добавили


  1. stokker
    28.09.2016 11:16

    Программист должен не скобочки искать или отступы считать, а думать о структуре программы и прочих более общих вещах. Всю черновую работу должны брать на себя IDE. Тогда бы и доводы за или против были бы не с точки зрения «кодерства»…