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