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