Хобби-проект польского разработчика — усовершенствованная и дополненная версия языка Go

cc56836390b038a3c5d98d0e90da720d.jpg

Один из признаков того, что язык программирования имеет успех, — появление новых языков на его основе. Известным примером является 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.

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

  • 26 сентября 2016 в 11:11

    0

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

    –1

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

    0

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

    +1

    Жило было 14 конкурирующих языков программирования…
  • 26 сентября 2016 в 11:31

    –3

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

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

    Что?

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

© Habrahabr.ru