LINUX.ORG.RU

Go 1.7

 


1

5

Выпущена версия 1.7 языка программирования Go.

Наиболее значительные изменения:

  • Новый бэкенд компилятора, использующий промежуточный код на базе SSA (Static Single Assignment).
  • В фронтенде компилятора задействован новый более компактный формат экспортируемых данных, что с более эффективной обработкой деклараций импортов позволило значительно ускорить время компиляции и уменьшить размер исполняемых файлов на 20–30%.
  • Программы должны выполняться немного быстрее благодаря улучшениям в сборщике мусора и оптимизациям в стандартной библиотеке.
  • Реализован порт для Linux на IBM z Systems (s390x).
  • В состав стандартной библиотеки включён пакет context.
  • Добавлена поддержка суб-тестов и суб-бенчмарков.
  • Удалена поддержка переменной окружения GO15VENDOREXPERIMENT.

>>> Подробности

★★★★★

Проверено: Shaman007 ()
Последнее исправление: cetjs2 (всего исправлений: 2)
Ответ на: комментарий от tailgunner

Си тоже. Сначала. Просто получилось так, что будущего у Occam не было.

Правда? Как по мне, написание не только ядро ОС, но и её утилит — вполне себе универсальная ниша. А Оккам предполагал специфическое железо. И изначально — это был не слишком универсальный язык, ЕМНИП. Кстати, нагугли occam-π и KRoC — «больной» таки не мёртв.

be_nt_all ★★
()
Ответ на: комментарий от anonymous

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

Esper
()
Ответ на: комментарий от tailgunner

Окей, твое мнение ясно. По-моему, Go сложноват для потомка Оберона, но это тоже мнение анонимного сетевого эксперта.

Ну я, как основное различие (детали синтаксиса не принципиальны), отметил наличие вывода типов. Которые Вирт, как мне кажется, сознательно не пускал в свои языки (хотя тогда как-бы и рановато было для Хиндли-Миллера в мейнстримововм продакшене, в общем не уверен). Но, ИМХО, это именно то, что языкам Вирта не хватало, чтобы «захватить мир»

be_nt_all ★★
()
Ответ на: комментарий от Esper

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

anonymous
()
Ответ на: комментарий от be_nt_all

Разработчики GIMP к ним относятся?

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

anonymous
()
Ответ на: комментарий от anonymous

А можно пример, где без шаблонов прям ни в какую жить невозможно

Без шаблонов жить возможно. Это тебе любой Си-прогер скажет.

tailgunner ★★★★★
()
Ответ на: комментарий от kremator666

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

anonymous
()
Ответ на: комментарий от anonymous

Вообще, главная проблема гоу даже не сам тупой язык, а упоротая инфраструктура. Пока не будет нормального версионирования и динамической линковки, дальше песочницы бэкенда это выпускать нельзя. Хотя не знаю, гугл то его как позиционирует? Универсальность может никто и не обещал. Крутите вместо (или вместе с) PHP, и не жужжите. А фанаты Вирта тут уже губу раскатали насчет мирового господства.

anonymous
()
Ответ на: комментарий от tailgunner

У си-прогера нет мэпов, слайсов и каналов, только макросы. Так в чем же все-таки критичность шаблонов, которая делает Го нишевым языком?

anonymous
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от anonymous

Так в чем же все-таки критичность шаблонов, которая делает Го нишевым языком?

у Go-прогера нет даже void* с арифметикой указателей, которые позволили бы ему с вменяемой производительностью нагородить бойлерплэйта на любой юзкейз, выходящий за пределы мэпчиков, слайсиков и канальчиков.

Esper
()
Ответ на: комментарий от anonymous

Как вообще можно жить без нпм или апт-гет либа-которая-сделает-за-меня-все. Не понимаю.

Вот и я не понимаю. Можно конечно, но зачем?

как наши деды

Деды могли и без компутера вовсе. Но я так не хочу.

anonymous
()
Ответ на: комментарий от anonymous

У си-прогера нет мэпов, слайсов и каналов, только макросы

И ничего, живут же. Таким образом, доказано, что дженерики не нужны.

Так в чем же все-таки критичность шаблонов

define критичность. Мне критично уметь определять форматы данных, параметризованные типами.

которая делает Го нишевым языком?

Я говорил об убогости, а не нишевости.

tailgunner ★★★★★
()
Ответ на: комментарий от Esper

Слайсики говоришь?

import «syscall» func VAlloc(size uint) ([]byte, error) { return syscall.Mmap(-1, 0, int(size), syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_ANON|syscall.MAP_PRIVATE) } func VFree(mem []byte) error { return syscall.Munmap(mem) }

Дальше расписывать или сам додумаешь?

anonymous
()
Ответ на: комментарий от anonymous

Дальше расписывать

Расписывай. Например, мне нужен массив записей определенного типа в этом отображенном файле.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

define критичность. Мне критично уметь определять форматы данных, параметризованные типами.

критичность - это когда язык нельзя использовать из-за отсутствия какой-то фишки (типа потоков в ноде)

Я говорил об убогости, а не нишевости.

Я без личностей, просто прочитал тут, что отсутствие шаблонов делает Го нишевым языком.

anonymous
()
Ответ на: комментарий от anonymous

Дальше расписывать или сам додумаешь?

Расписывай дальше. Если расскажешь, как твой []byte кастануть к []MyCoolStruct, моё мнение о Го поднимется чуть выше плинтуса.

Esper
()
Ответ на: комментарий от anonymous

Так в чем же все-таки критичность шаблонов

Без них есть два пути решения обобщенных задач: дублирование кода и ослабление типизации. Оба подхода говно, проверено временем. Закладывать в новый язык такие древние грабли, это я не знаю кем надо быть. Наверно мамонтом, проспавшим 40 лет в криокамере.

anonymous
()
Ответ на: комментарий от anonymous

критичность - это когда язык нельзя использовать из-за отсутствия какой-то фишки

Тогда см. выше о Си.

(типа потоков в ноде)

Ноду используют без потоков => потоки не нужны.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от tailgunner

Массив:

import (
	"reflect"
	"unsafe"
)
type yourType struct {
	field1 int
	filed2 int
	filed3 int
}
const yourTypeSize = int(unsafe.Sizeof(yourType{}))
func allocYourTypeSlice(size int) []yourType {
	bytes := VAlloc(size * yourTypeSize)
	slice := reflect.SliceHeader{
		Data: (*reflect.SliceHeader)(unsafe.Pointer(&bytes)).Data,
		Len:  size,
		Cap:  size,
	}
	return *(*[]yourType)(unsafe.Pointer(&slice))
}
func freeYourTypeSlice(yts []yourType) {
	VFree(*(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{
		Data: (*reflect.SliceHeader)(unsafe.Pointer(&yts)).Data,
		Len:  len(yts) * yourTypeSize,
		Cap:  len(yts) * yourTypeSize,
	})))
}

anonymous
()
Ответ на: комментарий от anonymous

А зачем тебе обобщенное решение проблем? Ты пишешь библиотеки, которые потом используют миллионы счастливых хомячков?

anonymous
()
Ответ на: комментарий от anonymous

Ты пишешь библиотеки, которые потом используют миллионы счастливых хомячков?

За него не скажу - а я счастливый хомячок, использующий библиотеки, предоставляющие обобщённое решение моих проблем. А если нужных библиотек нет или у них интерфейс в стиле «back to 80's» потому, что язык не предоставляет средств обобщенного решения моих проблем - я быстро стану несчастным хомячком и пойду искать своего хомячкового счастья в другом языке.

Esper
()
Ответ на: комментарий от Esper

А каст []byte к yourType - это *(*yourType)(unsafe.Pointer(&bytes))?

Да, именно так.

Это даже страшнее Сишки, но ладно, принимается.

Это сделано специально так страшно: «так делать нельзя, но если очень хочется - то можно, стреляйте себе в ногу». Так же не делают ради массива из десяти элементов. А делают ради массива из сотен миллионов элементов. Если я досконально когда этот массив родится, когда должен умереть, что в нем лежит - зачем мне напрягать лишний раз сборщик мусора? Пример с тремя интами в структуре не очень, так как сборщик мусора и так знает что в слайсе нет указателей и не полезет его сканировать. Все становится гораздо интереснее с графом из нескольких сот миллионов узлов. Отвадить сборщик от такой структуры гораздо полезнее. А вообще я не знаю, нахрена это нужно. Проще подцепить модуль на Си, который будет перемалывать этот граф.

anonymous
()
Ответ на: комментарий от tailgunner

Что в твоем понимании «обобщенное». Тебе написать пул для объектов такого типа или аналог маллока для них сгородить или что.

anonymous
()
Ответ на: комментарий от anonymous

Что в твоем понимании «обобщенное»

Тип yourType - параметр.

Тебе написать пул для объектов такого типа

Например. Или у меня файлы с записями разных форматов.

tailgunner ★★★★★
()
Ответ на: комментарий от Esper

Что за библиотеки-то. Можно конкретные примеры для расширения кругозора. А то я все сам, своими руками как-то интереснее.

anonymous
()
Ответ на: комментарий от anonymous

Это сделано специально так страшно

Просто если ты, например, юзаешь структуру данных из third-party библиотеки с интерфейсом а-ля *(*yourType)(unsafe.Pointer(lib.GetNode(key))), такие касты выглядят вдвойне печально.

А вообще я не знаю, нахрена это нужно. Проще подцепить модуль на Си, который будет перемалывать этот граф.

Тут просто некоторые товарищи хотели заменять Гой Сишку, вот мне и стало интересно, можно ли в принципе такие сишные вещи сделать в Го.

Esper
()
Ответ на: комментарий от tailgunner

Пул:

import (
  "github.com/pi/goal/gut"
)
type yourType1 struct {
  f1, f2, f3 int
}
type yourType2 struct {
  f1, f2, f3, f4 int
}
func test() {
  p := gut.NewUnsafeMemoryPool(100000)
  for i := 0; i < 1000; i++ {
    o1 := *yourType1(p.Alloc(unsafe.Sizeof(yourType1{}))
    o2 := *yourType2(p.Alloc(unsafe.Sizeof(yourType2{}))
  }
  p.Done()
}
Файлы тут каким боком? Это сериализация, а не работа с указателями. Выбирай формат: https://golang.org/pkg/encoding/

anonymous
()
Ответ на: комментарий от Esper

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

anonymous
()
Ответ на: комментарий от anonymous

Вот и я не понимаю. Можно конечно, но зачем?

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

anonymous
()
Ответ на: комментарий от anonymous

Я не могу себе предаставить ситуации, когда так надо извращаться с нативной библиотекой.

А какой интерфейс будет у библиотеки, которая, допустим, предоставляет какое-нибудь бинарное дерево, в котором могут быть любые типы? На interface {}? Так у него, вроде, производительность ни к чёрту, ибо там обязательно анбоксинг и полноценная рантайм-рефлексия.

Esper
()
Ответ на: комментарий от Esper

Да, eface (interface{}). Но если использовать это дерево как-то обобщенно, то проблема производительности скорее всего не стоит. А если тебе нужна высокая производительность, то ты ведь наверняка напишешь что-то специализированное, потому что обобщенная реализация может быть не совсем оптимальной. Допустим, для того же бинарного дерева int->string ключ и короткое значение лучше хранить вместе, а вот для string->struct{...} алгоритм работы может быть несколько другим, допустим ты вместе с ключом будешь хранить его короткий префикс для ускорения сравнения.

anonymous
()
Ответ на: комментарий от anonymous

Но если использовать это дерево как-то обобщенно, то проблема производительности скорее всего не стоит.

Как раз таки стоит, если уж полез искать такое в сторонних библиотеках, а не заюзал обычную мапу.

А если тебе нужна высокая производительность, то ты ведь наверняка напишешь что-то специализированное

Почти наверняка кто-то написал до меня.

Esper
()
Ответ на: комментарий от Esper

Почти наверняка кто-то написал до меня.

Вполне вероятно. Я просто люблю все сам делать, поэтому и отсутствие шаблонов меня не особо напрягает. Я не утверждаю, что шаблоны - это плохо и они не нужны. Я просто говорю, что их значимость сильно преувеличена. Я бы и сам не отказался от шаблонов, что бы запилить min/max/abs а не городить тучу minInt maxFloat etc.

anonymous
()
Ответ на: комментарий от anonymous

o1 := *yourType1(p.Alloc(unsafe.Sizeof(yourType1{}))

Безопасность Си и краткость Явы.

Файлы тут каким боком?

Твоим же - ты начал с mmap. А так - мне данные с устройства приходят.

Это сериализация

Что «это»? Я точно говорил не о сериализации.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Я просто люблю все сам делать

Работодатель, наверное, тоже любит оплачивать твои человекочасы, потраченные на изобретение велосипедов?

Я бы и сам не отказался от шаблонов, что бы запилить min/max/abs а не городить тучу minInt maxFloat etc.

Ещё всякая функциональщина и статистика помогает.

Esper
()
Ответ на: комментарий от tailgunner

Твоим же - ты начал с mmap.

Там был анонимный mmap. Его иногда юзают, как malloc на стероидах.

Esper
()
Ответ на: комментарий от Esper

Как раз таки стоит, если уж полез искать такое в сторонних библиотеках, а не заюзал обычную мапу.

Вероятно по замыслу гугля структуры данных сложнее мапы пограмистам на гоу не понадобятся. Ну может оно и правильно, для транзита БД -> json -> клиент хватает, а других задач для гоу нет.

anonymous
()
Ответ на: комментарий от tailgunner

Безопасность Си и краткость Явы.

Да, синтаксис такой, что бы отбивать желание им пользоваться. Но тем не менее, возможность работы памятью с памятью вне гц-хипа етсь.

Твоим же - ты начал с mmap. А так - мне данные с устройства приходят.

Ну чтение из файла и запись в структуру в памяти это и есть сериализация. Тоже надо извращаться с unsafe.Pointer. Что бы неповадно было создавать непереносимый из-за ширины нативного слова и порядка байт в нем код. Я бы это сделал через bufio.Reader(file) и encoding/binary.Order. Ну или через json какой-нибудь или gob, если есть возможность задать формат выдачи в устройстве.

anonymous
()
Ответ на: комментарий от anonymous

Транзит свой пиши на пистоне/ноде, не стреляй из пушки по воробьям. К слову, компилятор Го написан на самом Го. Это к вопросу о задачах, которые можно решать на Го.

anonymous
()
Ответ на: комментарий от anonymous

А PyPy написан на пытоне. Так что даже на динамическом скриптоговне можно решать любые задачи, вопрос какой ценой.

anonymous
()
Ответ на: комментарий от anonymous

Транзит свой пиши на пистоне/ноде, не стреляй из пушки по воробьям.

По каким птицам тогда останется стрелять из ГоПушки?

К слову, компилятор Го написан на самом Го.

И работает как Го.

Esper
()
Ответ на: комментарий от anonymous

Так что даже на динамическом скриптоговне можно решать любые задачи

Компилятор - это не «любые задачи».

Esper
()
Ответ на: комментарий от Esper

По каким птицам тогда останется стрелять из ГоПушки?

По тем, по которым сейчас стреляют с++ и джава.

И работает как Го.

Вот тут не понял. Работает очень быстро, бинарники генерирует работающие (быстро). В чем проблема?

anonymous
()
Ответ на: комментарий от anonymous

В чем проблема?

бинарники генерирует работающие (быстро)

this. Недавно новость проскакивала, писали, что паузы GC уменьшили в десятки(!) раз. Раз у них такие улучшения в версии 1.6, по поводу производительности они там не особо заморачивались. Подозреваю, что и сейчас там остались такие вот места для улучшения.

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

Esper
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.