Re[4]: [ANN] 12 Things to Know About Google's Go
От: Gaperton http://gaperton.livejournal.com
Дата: 01.12.09 10:20
Оценка: 15 (4) +2
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, Gaperton, Вы писали:

G>>1) Методы, и "ортогональность" типов и методов.
MC>Не совсем понимаю, что ты имеешь в виду. То, что есть типы данных, а у них есть методы? Да, в лимбо так вроде бы.

В Go метод можно прицепить в к любому типу, кроме интерфейса. Можно к массиву. Можно к инту. А можно —

type SecsSince1900 int

Вот к этому. Или —

type SomeShit [][]SecsSince1900

К этому.

Это есть "ортогональность" — типы отдельно, методы отдельно. Чрезвычайно занимательное свойство, и синтаксис языка тут не причем. Это было в лимбе?

Смотри еще как можно делать в Go. Если ты напишешь

type LocalTime struct {
SecsSince1900 // указали тип, но не указали имени члена структуры
zone TimeZone
}

То все методы, которые связанны с типом SecsSince1900 перейдут к типу LocalTime. Ну очень любопытное свойство. Наследование, в таком интересном виде, в виде слегонца "подсахаренной" агрегации, пнимаете-ли . Просто и симпатично. Так можно делать в лимбе?

G>>2) Интерфейсы, и "утиная типизация"

MC>Тут в limbo по-другому. В limbo под интерфейсом понимается интерфейс модуля: функции и типы данных, им экспортируемые. Соответственно, у одного интерфейса модуля могут быть разные реализации. В go, конечно, поинтереснее сделано.

В лимбе сделано более-менее прямолинейно. Так много кто делал и делает.

А в Го — интерфейсы "ортогональны" и методам, и типам. Их суть — они добавляют полиморфизм и динамическую диспетчеризацию вызова (вызов метода у интерфейса является "виртуальным"). Причем, связывание типа с интерфейсом происходит автоматически, без лишних телодвижений. Методов у типа хватает — он соответствует интерфейсу.

Теперь, имея эту ортогональную тройку (типы-методы-интерфейсы), посмотри на это дело вот с какой стороны. Пустому интерфейсу interface{}, в котором нет методов, автоматически соответствует вообще любой тип языка. Все не есть Object, но, без дураков, все есть interface{}, прозрачно и автоматически.

Проектировать в таком "ортогональном базисе" гораздо приятнее, чем работать с классами, к которым гвоздями прибиты методы.

А схожесть синтаксиса — это ерунда. Главное, что отличает языки друг от друга — это система типов.
[ANN] 12 Things to Know About Google's Go
От: remark Россия http://www.1024cores.net/
Дата: 14.11.09 09:59
Оценка: 71 (5)
12 Things to Know About Google's Go Programming Language

Статья понравилась. На половину техническая, наполовину описывает историю создания и философию, основана на интервью с одним из основных разработчиков — Rob Pike. Вообще занятно, что за разработчиками стоят — Unix, C, HotSpot, Plan9...


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: [ANN] 12 Things to Know About Google's Go
От: Gaperton http://gaperton.livejournal.com
Дата: 03.12.09 23:00
Оценка: 16 (3)
Здравствуйте, Mr.Cat, Вы писали:

Черт возьми, я люблю этот язык . Смотри:

type Lazy interface { force() Lazy }

func ( computation func() Lazy ) force() Lazy { return computation() }


Ты видишь, что произошло? Я выше сделал объявление, что любая функция без аргументов, возвращающая Lazy, является самым настоящим, первоклассным объектом, реализующим интерфейс Lazy С ума сойти можно .
Re[3]: [ANN] 12 Things to Know About Google's Go
От: Трурль  
Дата: 17.11.09 09:36
Оценка: :)))
Здравствуйте, Cyberax, Вы писали:

C>Вроде бы и не скрывается, что Go слизан с Оберона и всяких прочих Лимбов.

Go слизан с вижуалбейсика.

From: rob pike <rob@pla...>
Subject: pascal, TeX
Date: Fri, 14 Dec 2001 13:03:50 -0500

> According to my knowledge — Java was the first language that implemented
> garbage collection...

Wrong. Young people don't know any history. The first language with
garbage collection was Visual Basic.

отсюда
Re[2]: [ANN] 12 Things to Know About Google's Go
От: z00n  
Дата: 15.11.09 17:53
Оценка: 13 (2)
Здравствуйте, Mr.Cat, Вы писали:


MC>Интересно, что нигде, где говорят про Go я еще не видел упоминания Newsqueak или Limbo, на которых, я так понимаю, основано "ядро Go" что-ли и к которым по крайней мере Пайк прикладывал лапы.


Пайк говорит что идеи заимстваны (это большей частью его собственные идеи), но реализация другая. По мне это просто чтобы избежать возможных судебных разбитательств с Bell Labs или кто там сейчас.

MC>Сравниваем.

MC>Go (http://golang.org/doc/progs/sieve1.go).

Я, как человек, который прочитал Inferno Programming with Limbo(PDF) — примеры Go даже смотреть не стал


MC>Ведь это не случайно — об использовании Go в качестве замены питоножавасям. Limbo, емнип — язык системного программирования в ОС Inferno. Да и в Plan9 вроде используется (в упомянутом видео, емнип, говорится о том, что Limbo используется в оконной системе Plan9).

Там использовали язык Alef, который в точности Newsqueak++. Потом они вынесли каналы в сишную либу.
Re[13]: [ANN] 12 Things to Know About Google's Go
От: Gaperton http://gaperton.livejournal.com
Дата: 03.12.09 10:09
Оценка: 5 (2)
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Это всё называется workarounds, а Эрланг мне не очень нравится из-за быстродействия. Кстати говоря, я не имел в виду кооперативную многозадачность.


С реальным быстродействием у Эрланга все не так плохо. То есть, рантайм, конечно, медленный, если на микротестах сравнивать. Но в жизни все сложнее.
http://www.slideshare.net/Arbow/comparing-cpp-and-erlang-for-motorola-telecoms-software

Этот отчет крайне любопытен, взгляни. Один из аспектов поведения программ на Эрланге, недостижимый на данный момент на других платформах — repeated failure (один из клиентов долбится на сервер и вызывает креш) не приводит к снижению пропускной способности как отдельного сервера, так и фермы. Из-за одного этого достаточно большая ферма в реальных условиях будет работать быстрее во многих случаях, чем аналогичная на С/С++.

Не говоря уже о понижении severity багов, ради чего можно и серверов на ферму подбросить. Скорость не имеет такого значения в наше время, как масштабируемость.
Re[15]: [ANN] 12 Things to Know About Google's Go
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 19.11.09 00:06
Оценка: +1 :)
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

ГВ>>Так нет никакого хайпа, вроде. Может, журналисты и поднимут, конечно. Ну так у них профессия такая. А вообще ничего принципиально нового в программировании не изобретается уж лет сорок как. Только композиционная игра с перепевами старых мелодий — на всё можно найти прототипы 65-го, 72-го, 68-го года выпуска. Ну в крайнем случае — 80-го.


LCR>GADTs? Arrows? Dependent types?


ИМХО, это развитие идей лямбда-исчисления (GADT, DT) и CSP (Arrows). Некое подобие паттернов проектирования ООП, только с более развитой математической основой. В прочем, чтобы не впадать во флейм, лучше признаю, что всё-таки, кое-что относительное новое есть.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re: [ANN] 12 Things to Know About Google's Go
От: Mr.Cat  
Дата: 14.11.09 22:55
Оценка: +1
Здравствуйте, remark, Вы писали:
R>12 Things to Know About Google's Go Programming Language

Раз уж на rsdn пошли Go-треды, выражу свое мнение на этот счет.

Интересно, что нигде, где говорят про Go я еще не видел упоминания Newsqueak или Limbo, на которых, я так понимаю, основано "ядро Go" что-ли и к которым по крайней мере Пайк прикладывал лапы. Например, решето на основе каналов из тьюториала — один в один, есть в этом видео.

Сравниваем.
Go (http://golang.org/doc/progs/sieve1.go).
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import "fmt"

// Send the sequence 2, 3, 4, ... to returned channel 
func generate() chan int {
    ch := make(chan int);
    go func() {
        for i := 2; ; i++ {
            ch <- i
        }
    }();
    return ch;
}

// Filter out input values divisible by 'prime', send rest to returned channel
func filter(in chan int, prime int) chan int {
    out := make(chan int);
    go func() {
        for {
            if i := <-in; i%prime != 0 {
                out <- i
            }
        }
    }();
    return out;
}

func sieve() chan int {
    out := make(chan int);
    go func() {
        ch := generate();
        for {
            prime := <-ch;
            out <- prime;
            ch = filter(ch, prime);
        }
    }();
    return out;
}

func main() {
    primes := sieve();
    for {
        fmt.Println(<-primes)
    }
}


Newsqueak (перепечатывал со слайдов).
counter := prog(c: chan of int) {
  i := 1;
  for(;;)
    c <-= (i = i+1);
};

filter := prog(prime: int, revc: chan of int, send: chan of int) {
  i: int;
  for(;;) {
    if((i = <-recv) % prime)
      send <-= i;    
  }
};

sieve := prog(prime: chan of int) {
  c := mk(chan of int);
  begin counter(c);
  p: int;
  for(;;) {
    prime <-= p <- c;
    newc := mk(chan of int);
    begin filter(p, c, newc);
    c := newc;
  }
};

prime := mk(chan of int);
begin sieve(prime); # note pattern: begin with channel

#Use prime here


Как это называется? Терминальная стадия NIH у Гугла, которая не позволяет упоминать о предшественниках. Ну допустим у Go новый компилер (даже 2 или 3 вроде), допустим поменялась какая-то мишура, навроде системы модулей, ну подкрутили синтаксис до большей жаваподобности — но ведь это не повод забывать о легаси. Или я что-то недопонимаю, и в Go что-то принципиально сделано по-другому. Система типов? Работа с каналами?

Ведь это не случайно — об использовании Go в качестве замены питоножавасям. Limbo, емнип — язык системного программирования в ОС Inferno. Да и в Plan9 вроде используется (в упомянутом видео, емнип, говорится о том, что Limbo используется в оконной системе Plan9).

Поскольку первый Go-тред
Автор: Курилка
Дата: 11.11.09
превратился невесть во что, я с твоего позволения буду негодовать в этом.
Re[13]: [ANN] 12 Things to Know About Google's Go
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 15.11.09 16:17
Оценка: -1
Здравствуйте, Mr.Cat, Вы писали:

ГВ>>Даже если так, то как это влияет на оценку самого Go?

MC>Никак. Просто я с некоторой неприязнью отношусь к хайпу вокруг давно известных вещей.

Так нет никакого хайпа, вроде. Может, журналисты и поднимут, конечно. Ну так у них профессия такая. А вообще ничего принципиально нового в программировании не изобретается уж лет сорок как. Только композиционная игра с перепевами старых мелодий — на всё можно найти прототипы 65-го, 72-го, 68-го года выпуска. Ну в крайнем случае — 80-го.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[5]: [ANN] 12 Things to Know About Google's Go
От: z00n  
Дата: 15.11.09 21:08
Оценка: :)
Здравствуйте, z00n, Вы писали:

Z>Насколько я понимаю, Пайк давно работает в гугле. В своей презентации 2006 года он упоминал Sawzall(2003) — язык для параллельной обработки данных.

Z>Но список разработчиков подозрительно напоминает plan9 тусовку последних лет (Russ Cox например, видоизмененная Glenda на логотипе etc).

На самом деле это все прямым текстом написано в статье, которая начинает топик:

4. Google's Go owes some debt to Bell Labs' Plan 9
Plan 9 is a distributed operating system developed as the research successor to Unix at Bell Labs. Pike and Thompson were part of the original Plan 9 team at Bell Labs. And Go team member Russ Cox also was a Plan 9 developer.
Although there was not a lot of direct use of Plan 9 technology in creating Go, the link between team members is not the only connection.
The Plan 9 team produced some programming languages of its own, such as Alef and Limbo, which had a slight impact on the direction of Go. "We didn't pull out those languages and look at them again," Pike said. "But I think a better way to express it is that, particularly on the concurrency side of things—the parallel programming side of things—those languages are kind of in the same family tree and inspired by the same approach."
Pike added, "Ken's compiler is entirely new ... it uses the Plan 9 compiler suite, linker and assembler, but the Go compiler is all new. So we borrowed a little technology, but that's just the compiler, that's not the vision. And naturally some of the people working on the project were around from the Plan 9 days, so there's got to be some intellectual cross-breeding there. But this wasn't an attempt to do a Plan 9. This is a language, not an operating system, and they address different things. Go doesn't even have a Plan 9 port at this point, although it would be nice to have one."


(мне это слегка напоминает "ебаа нобаа" из "Little Britain"
Re[4]: [ANN] 12 Things to Know About Google's Go
От: Cyberax Марс  
Дата: 17.11.09 10:14
Оценка: :)
Здравствуйте, Трурль, Вы писали:

Т>Wrong. Young people don't know any history. The first language with

Т>garbage collection was Visual Basic.[/q]
Какой VisualBasic? Первым языком с GC были перфокарты! Каждый день приходил garbage collector и выметал лишние.
Sapienti sat!
Re[7]: [ANN] 12 Things to Know About Google's Go
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.11.09 16:42
Оценка: :)
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, Красин, Вы писали:

К>>Ничего себе вскользь! Language Design FAQ
К>>

What are Go's ancestors?
К>>Go is mostly in the C family (basic syntax), with significant input from the Pascal/Modula/Oberon family (declarations, packages), plus some ideas from languages inspired by Tony Hoare's CSP, such as Newsqueak and Limbo (concurrency).

MC>Это как раз вскользь — "some ideas".

Дык а так оно и есть. Синтаксис из С, модули и многое другое из Оберона, конкаранси из Newsqueak и Limbo.

Лично для меня как раз конкаранси фичи — это мелочевка, а основное — это база языка. А в базе там очень явно проступает оберон с С-подобным синтаксисом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: [ANN] 12 Things to Know About Google's Go
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 19.11.09 18:15
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Лично для меня как раз конкаранси фичи — это мелочевка [...]


Что и требовалось доказать. Спасибо, ты очень вовремя.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[16]: [ANN] 12 Things to Know About Google's Go
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 20.11.09 22:41
Оценка: +1
Здравствуйте, VladD2, Вы писали:

ГВ>>Можно, конечно. Только смущает ограничение на количество потоков ОС.

VD>Это которое? Создавай потоки с мелким стеком и будет тебе их тысячи.

Попробуй сделать полмиллиона потоков. Просто полмиллиона потоков на одной машине.

VD>Только вот я хоть у бей не пойму зачем нужно потоков существенно больше чем есть процессоров?


Тут я лучше ограничусь простым постулированием того, что такая потребность есть.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[15]: [ANN] 12 Things to Know About Google's Go
От: Gaperton http://gaperton.livejournal.com
Дата: 03.12.09 10:03
Оценка: +1
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Можно, конечно. Только смущает ограничение на количество потоков ОС.


А также их дороговизна. Большое время создания, переключения контекста, взаимодействия, итд.
Re[5]: [ANN] 12 Things to Know About Google's Go
От: WolfHound  
Дата: 04.12.09 09:13
Оценка: +1
Здравствуйте, Gaperton, Вы писали:

G>Ты видишь, что произошло? Я выше сделал объявление, что любая функция без аргументов, возвращающая Lazy, является самым настоящим, первоклассным объектом, реализующим интерфейс Lazy

Осталось понять нафига это нужно.
Также не ясно сколько раз нужно будет дернуть force чтобы таки вычислить выражение. Ибо computation может вернуть как вычисленное значение так и еще один computation. Кстати для всех значений также придется реализовать интерфейс Lazy.
И самое противное что даже если мы таки узнаем когда значение вычислилось то для того чтобы им воспользоваться нам придется приводить к нужному нам типу явно.
Короче мягко говоря многовато грязи и неопределенности для первоклассного объекта.

G>С ума сойти можно .

Угу. Отличный способ шифрования кода.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: [ANN] 12 Things to Know About Google's Go
От: Gaperton http://gaperton.livejournal.com
Дата: 04.12.09 17:33
Оценка: :)
Здравствуйте, Геннадий Васильев, Вы писали:

G>>Это есть "ортогональность" — типы отдельно, методы отдельно. Чрезвычайно занимательное свойство, и синтаксис языка тут не причем.


ГВ>Правда, тут есть ложка дёгтя — о защищённости данных можно забыть. Хотя, конечно, можно интерфейсами обыграть.


Защищенность данных есть иллюзия.

#define private public
#include "uber_mega_protected_data.h"



Но если про нее не забывать — в Go положено это делать интерфейсами.
Re[9]: [ANN] 12 Things to Know About Google's Go
От: WolfHound  
Дата: 05.12.09 18:32
Оценка: :)
Здравствуйте, Gaperton, Вы писали:

G>type adder int

G>interface {} ( x adder ) transform( value interface{} ) { return x + value(.int) }
Это вместо простого и понятного x + _ ?
Замечательный язык.

G>В третьих, чтобы судить о практическом применении того или иного приема в некотором языке, надо дать себе труд с языком ознакомиться. Тебе пока судить об этом рановато.

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

G>>>1) в отличии от С++, все будет работать в динамике

WH>>Это минус.
G>Это плюс.
Проверки времени исполнения там где их можно легко избежать всегда минус.

G>Мало-ли что можно не к месту вспомнить.

Вот и не вспоминай С++ не к месту.

G>Я в посте говорю о функциях как объектах, и о том, как это делается в Go. У тебя есть, что сказать по существу — говори.

Функции как объекты не нужны.
Вообще не нужны.
Замыканий которые могут захватывать изменяемые данные более чем достаточно.

G>>>Ясно. Один раз.

WH>>А если computation вернет computation?
G>То будет ошибка.
Когда?

G>
G>type LazyValue interface {
G>    force() interface{}
G>} 
G>

G>А теперь? Если тебя так волнует именно ленивость, то так более правильно.
Теперь мне совсем не ясно чем оно лучше просто функции.

WH>>Еще вопрос где и когда помечать типы ленивыми. Ибо у нас может возникнуть проблема что тип пометят ленивым в нескольких модулях...

G>В том месте, где тип определяется.
А если тип в чужом коде который по какимто причинам нельзя править?

G>>>value.force()(.нужный_тип)

WH>>Вместо просто value.
G>Я уже сказал что я по этому поводу думаю — небольшая проблема.
Я еще могу понять любителей всяких питонов где есть кучу проверок во время исполнения но у нах хоть код чистый.
А тут и проверки времени исполнения и грязь в коде.
А если вспомнить немерле и скалу то становится вообще не понятно как можно называть го хорошим языком.

G>>>Это далеко не самое противное (к тому же, вылечится добавлением генериков). Будет гораздо противное, когда ты попытаешься сделать ленивый список в С++ или Java.

WH>>А можно я это на немерле сделаю? http://nemerle.org/Lazy_evaluation
G>Делай хоть на брейнфаке, я не против.
Очередной слив засчитан.
Ибо как только в сравнении с го появляются нормальные языки, а не старый хлам ты прячешь голову в песок.

G>Для языка, где лени нет на уровне системы типов, и где нет макросов — не многовато. А именно таким языком и является Go.

Оно даже на С++ лучше получается
#include <iostream>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <boost/noncopyable.hpp>
#include <boost/variant.hpp>

template<class Result>
class LazyValue
{
public:
    LazyValue(boost::function<Result()> fn)
        : holder_(fn)
    {}

    operator Result()
    {
        if (Result* res = boost::get<Result>(&holder_))
        {
            return *res;
        }
        else
        {
            boost::function<Result()> fn = boost::get<boost::function<Result()> >(holder_);
            Result r = fn();
            holder_ = r;
            return r;
        }
    }

private:
    boost::variant<Result, boost::function<Result()> > holder_;
};

int fn(int i)
{
    std::cout << "call" << std::endl;
    return i;
}

void print(LazyValue<int> val)
{
    std::cout << "print 1" << std::endl;
    std::cout << val << std::endl;
    std::cout << val << std::endl;
    std::cout << val << std::endl;
    std::cout << "print 2" << std::endl;
}

int main()
{
    LazyValue<int> val(boost::bind(fn, 10));
    std::cout << "---====1===---" << std::endl;
    print(val);
    std::cout << "---====2===---" << std::endl;
    return 0;


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

В прошлый раз ты молча слил переведя все свое внимание на обсуждение LINQ который тебе был якобы не интересен
... << RSDN@Home 1.2.0 alpha 4 rev. 1305>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: [ANN] 12 Things to Know About Google's Go
От: Cyberax Марс  
Дата: 14.11.09 23:14
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Как это называется? Терминальная стадия NIH у Гугла, которая не позволяет упоминать о предшественниках. Ну допустим у Go новый компилер (даже 2 или 3 вроде), допустим поменялась какая-то мишура, навроде системы модулей, ну подкрутили синтаксис до большей жаваподобности — но ведь это не повод забывать о легаси. Или я что-то недопонимаю, и в Go что-то принципиально сделано по-другому. Система типов? Работа с каналами?

Вроде бы и не скрывается, что Go слизан с Оберона и всяких прочих Лимбов.

Отличие Go в том, что его всё-таки планируют дальше развивать.

MC>Ведь это не случайно — об использовании Go в качестве замены питоножавасям. Limbo, емнип — язык системного программирования в ОС Inferno. Да и в Plan9 вроде используется (в упомянутом видео, емнип, говорится о том, что Limbo используется в оконной системе Plan9).

Тут есть отличия. Лимбо не использует мусоросборщика, там классический подсчёт ссылок (со всеми их проблемами).
Sapienti sat!
Re[3]: [ANN] 12 Things to Know About Google's Go
От: Mr.Cat  
Дата: 14.11.09 23:28
Оценка:
Здравствуйте, Cyberax, Вы писали:
C>Вроде бы и не скрывается, что Go слизан с Оберона и всяких прочих Лимбов.
Мне в этой фразе видится сравнение ежа с ужом. Я не прав?

C>Отличие Go в том, что его всё-таки планируют дальше развивать.

Что нас дальше ждет? Plan9 или Inferno под торговой маркой "Гуглоось"?

C>Тут есть отличия. Лимбо не использует мусоросборщика, там классический подсчёт ссылок (со всеми их проблемами).

Это сильно влияет на дизайн языка и "паттерны программирования" лимбо? У меня есть подозрения, что нет, т.к. в том же питоне сразу и не скажешь, что нет нормального gc. Вроде еще go компилится в нативный код, а у лимбо — vm.
Re[4]: [ANN] 12 Things to Know About Google's Go
От: Mr.Cat  
Дата: 14.11.09 23:30
Оценка:
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, Cyberax, Вы писали:
C>>Вроде бы и не скрывается
И да, как-то уж совсем вскользь это упоминается.
Re[5]: [ANN] 12 Things to Know About Google's Go
От: Красин Россия  
Дата: 15.11.09 06:43
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>И да, как-то уж совсем вскользь это упоминается.

Ничего себе вскользь! Language Design FAQ

What are Go's ancestors?
Go is mostly in the C family (basic syntax), with significant input from the Pascal/Modula/Oberon family (declarations, packages), plus some ideas from languages inspired by Tony Hoare's CSP, such as Newsqueak and Limbo (concurrency).

Re[6]: [ANN] 12 Things to Know About Google's Go
От: Mr.Cat  
Дата: 15.11.09 14:21
Оценка:
Здравствуйте, Красин, Вы писали:
К>Ничего себе вскользь! Language Design FAQ
К>

What are Go's ancestors?
К>Go is mostly in the C family (basic syntax), with significant input from the Pascal/Modula/Oberon family (declarations, packages), plus some ideas from languages inspired by Tony Hoare's CSP, such as Newsqueak and Limbo (concurrency).

Это как раз вскользь — "some ideas".
Re[7]: [ANN] 12 Things to Know About Google's Go
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 15.11.09 14:39
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Это как раз вскользь — "some ideas".


ИМХО, вполне достаточный реверанс. Важно же не что откуда есть пошло, а что получилось в итоге.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[8]: [ANN] 12 Things to Know About Google's Go
От: Mr.Cat  
Дата: 15.11.09 14:53
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>ИМХО, вполне достаточный реверанс. Важно же не что откуда есть пошло, а что получилось в итоге.
В том то и дело, что я пока не понимаю, чего там получилось нового.
Re[9]: [ANN] 12 Things to Know About Google's Go
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 15.11.09 15:26
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>В том то и дело, что я пока не понимаю, чего там получилось нового.


Только и исключительно сочетание.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[10]: [ANN] 12 Things to Know About Google's Go
От: Mr.Cat  
Дата: 15.11.09 16:00
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Только и исключительно сочетание.
Надо мне будет освежить свои знания, но по-моему там сочетание лимбо с лимбо.
Re[11]: [ANN] 12 Things to Know About Google's Go
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 15.11.09 16:03
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

ГВ>>Только и исключительно сочетание.

MC>Надо мне будет освежить свои знания, но по-моему там сочетание лимбо с лимбо.

Даже если так, то как это влияет на оценку самого Go?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[12]: [ANN] 12 Things to Know About Google's Go
От: Mr.Cat  
Дата: 15.11.09 16:06
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Даже если так, то как это влияет на оценку самого Go?
Никак. Просто я с некоторой неприязнью отношусь к хайпу вокруг давно известных вещей.
Re[3]: [ANN] 12 Things to Know About Google's Go
От: Mr.Cat  
Дата: 15.11.09 20:11
Оценка:
Здравствуйте, z00n, Вы писали:
Z>Пайк говорит что идеи заимстваны (это большей частью его собственные идеи), но реализация другая. По мне это просто чтобы избежать возможных судебных разбитательств с Bell Labs или кто там сейчас.
Т.е. получается, Пайк сбежал в гугол со своим языком, там его переименовали и разработали новый компилятор?
Re[4]: [ANN] 12 Things to Know About Google's Go
От: z00n  
Дата: 15.11.09 20:50
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, z00n, Вы писали:

Z>>Пайк говорит что идеи заимстваны (это большей частью его собственные идеи), но реализация другая. По мне это просто чтобы избежать возможных судебных разбитательств с Bell Labs или кто там сейчас.
MC>Т.е. получается, Пайк сбежал в гугол со своим языком, там его переименовали и разработали новый компилятор?

Насколько я понимаю, Пайк давно работает в гугле. В своей презентации 2006 года он упоминал Sawzall(2003) — язык для параллельной обработки данных.
Но список разработчиков подозрительно напоминает plan9 тусовку последних лет (Russ Cox например, видоизмененная Glenda на логотипе etc).
Re[5]: [ANN] 12 Things to Know About Google's Go
От: Mr.Cat  
Дата: 15.11.09 23:29
Оценка:
Здравствуйте, z00n, Вы писали:
Z>Glenda
А мне всегда казалось, что это мальчик.
Re[6]: [ANN] 12 Things to Know About Google's Go
От: Mr.Cat  
Дата: 15.11.09 23:32
Оценка:
Здравствуйте, z00n, Вы писали:
Z>(мне это слегка напоминает "ебаа нобаа" из "Little Britain"
Как человек, знакомый с английским языком довольно поверхностно, поинтересуюсь на всякий случай. Юмор в том, что подсудимая (ый?) много, быстро и неразборчиво говорит — или надо вслушиваться в смысл произносимого?
Re[6]: [ANN] 12 Things to Know About Google's Go
От: z00n  
Дата: 16.11.09 01:09
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, z00n, Вы писали:

Z>>Glenda
MC>А мне всегда казалось, что это мальчик.

Это мальчик!


PS. странно, что там все так фанатели от Эда Вуда — я и 15-ти минут его фильмов не осилил, хотя фильм Бартона мне скорее понравился и даже вызвал некоторое любопытство.
Re[7]: [ANN] 12 Things to Know About Google's Go
От: z00n  
Дата: 16.11.09 01:13
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, z00n, Вы писали:

Z>>(мне это слегка напоминает "ебаа нобаа" из "Little Britain"
MC>Как человек, знакомый с английским языком довольно поверхностно, поинтересуюсь на всякий случай. Юмор в том, что подсудимая (ый?) много, быстро и неразборчиво говорит — или надо вслушиваться в смысл произносимого?

http://en.wikipedia.org/wiki/Vicky_Pollard

Я не возьмусь объяснять юмор, но мне в свое время понравилась конструкция "Yeah but no but yeah but no but ...".
Re[3]: [ANN] 12 Things to Know About Google's Go
От: frogkiller Россия  
Дата: 17.11.09 10:26
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Отличие Go в том, что его всё-таки планируют дальше развивать.


Имхо, это главное, если действительно планируют развивать. Остальное — дело вкуса
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Re[14]: [ANN] 12 Things to Know About Google's Go
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 18.11.09 11:36
Оценка:
Геннадий Васильев,

ГВ>>>Даже если так, то как это влияет на оценку самого Go?

MC>>Никак. Просто я с некоторой неприязнью отношусь к хайпу вокруг давно известных вещей.

ГВ>Так нет никакого хайпа, вроде. Может, журналисты и поднимут, конечно. Ну так у них профессия такая. А вообще ничего принципиально нового в программировании не изобретается уж лет сорок как. Только композиционная игра с перепевами старых мелодий — на всё можно найти прототипы 65-го, 72-го, 68-го года выпуска. Ну в крайнем случае — 80-го.


GADTs? Arrows? Dependent types?
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[9]: [ANN] 12 Things to Know About Google's Go
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.11.09 20:11
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

VD>>Лично для меня как раз конкаранси фичи — это мелочевка [...]


ГВ>Что и требовалось доказать. Спасибо, ты очень вовремя.


А что требовалось доказать и кому?

Есть огромный язык и есть пара фич которые можно всунить в любой язык. А в языки типа Немерле или Лисп можно всунуть в виде библиотеки, так как они поддерживают расширение синтаксиса и семантики.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: [ANN] 12 Things to Know About Google's Go
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 19.11.09 21:40
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А что требовалось доказать и кому?

VD>Есть огромный язык и есть пара фич которые можно всунить в любой язык. А в языки типа Немерле или Лисп можно всунуть в виде библиотеки, так как они поддерживают расширение синтаксиса и семантики.

Lightweight threads?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[11]: [ANN] 12 Things to Know About Google's Go
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.11.09 00:04
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Здравствуйте, VladD2, Вы писали:


VD>>А что требовалось доказать и кому?

VD>>Есть огромный язык и есть пара фич которые можно всунить в любой язык. А в языки типа Немерле или Лисп можно всунуть в виде библиотеки, так как они поддерживают расширение синтаксиса и семантики.

ГВ>Lightweight threads?


А в чем проблема то? Они что какие-то особенные в этом Гоу будут? Ну, Эрланг за счет функциональной чистоты и интерпретируемости может позволить реализовать более дешевую кооперативную многозадачность. А Гоу тот тут причем?

Возьми те же файберы и пользуйся на здоровье. Или реализуй континюэшоны.

Для работы с реальной же многозадачностью нужны потоки ОС. Так как именно они реализуют переключение между процессорами.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: [ANN] 12 Things to Know About Google's Go
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 20.11.09 02:15
Оценка:
Здравствуйте, VladD2, Вы писали:

ГВ>>Lightweight threads?


VD>А в чем проблема то? Они что какие-то особенные в этом Гоу будут? Ну, Эрланг за счет функциональной чистоты и интерпретируемости может позволить реализовать более дешевую кооперативную многозадачность. А Гоу тот тут причем?


VD>Возьми те же файберы и пользуйся на здоровье. Или реализуй континюэшоны.


Это всё называется workarounds, а Эрланг мне не очень нравится из-за быстродействия. Кстати говоря, я не имел в виду кооперативную многозадачность.

VD>Для работы с реальной же многозадачностью нужны потоки ОС. Так как именно они реализуют переключение между процессорами.


Вытесняющая многозадачность уже давно прекрасно работает на однопроцессорных машинах.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[12]: Кроме того
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 20.11.09 02:19
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Или реализуй континюэшоны.


Я не хочу связываться с реализацией continuations. Зачем тащить лишний сложный механизм?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[13]: [ANN] 12 Things to Know About Google's Go
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.11.09 14:33
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Кстати говоря, я не имел в виду кооперативную многозадачность.


Да? А что же ты имел в виду под:
ГВ>>>Lightweight threads?

Может быть ты просто не владеешь терминологией?

VD>>Для работы с реальной же многозадачностью нужны потоки ОС. Так как именно они реализуют переключение между процессорами.


ГВ>Вытесняющая многозадачность уже давно прекрасно работает на однопроцессорных машинах.


Ну, и пользуйся потоками ОС. Они доступны из любого языка. А реализовать удобный синтаксис синхронизации для обычных потоков можно для любого языка. Для Немерле можно оформить такое расширение в виде макры. Чорды и есть такое расширение.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: [ANN] 12 Things to Know About Google's Go
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 20.11.09 14:40
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>>>Для работы с реальной же многозадачностью нужны потоки ОС. Так как именно они реализуют переключение между процессорами.

ГВ>>Вытесняющая многозадачность уже давно прекрасно работает на однопроцессорных машинах.
VD>Ну, и пользуйся потоками ОС. Они доступны из любого языка. А реализовать удобный синтаксис синхронизации для обычных потоков можно для любого языка. Для Немерле можно оформить такое расширение в виде макры. Чорды и есть такое расширение.

Можно, конечно. Только смущает ограничение на количество потоков ОС.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[15]: [ANN] 12 Things to Know About Google's Go
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.11.09 15:24
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Можно, конечно. Только смущает ограничение на количество потоков ОС.


Это которое? Создавай потоки с мелким стеком и будет тебе их тысячи.

Только вот я хоть у бей не пойму зачем нужно потоков существенно больше чем есть процессоров?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [ANN] 12 Things to Know About Google's Go
От: Gaperton http://gaperton.livejournal.com
Дата: 21.11.09 00:52
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Как это называется?


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

Меня, в частности, интересуют:
1) Методы, и "ортогональность" типов и методов.
2) Интерфейсы, и "утиная типизация"

Это достаточно принципиальные вещи. А мелочи, вроде возможности возвращать несколько значений из функций, замыкания, оператор switch — это мелочи. Но они также важны.
Re[3]: [ANN] 12 Things to Know About Google's Go
От: Mr.Cat  
Дата: 28.11.09 19:13
Оценка:
Здравствуйте, Gaperton, Вы писали:
G>1) Методы, и "ортогональность" типов и методов.
Не совсем понимаю, что ты имеешь в виду. То, что есть типы данных, а у них есть методы? Да, в лимбо так вроде бы.

G>2) Интерфейсы, и "утиная типизация"

Тут в limbo по-другому. В limbo под интерфейсом понимается интерфейс модуля: функции и типы данных, им экспортируемые. Соответственно, у одного интерфейса модуля могут быть разные реализации. В go, конечно, поинтереснее сделано.
Re[13]: [ANN] 12 Things to Know About Google's Go
От: Gaperton http://gaperton.livejournal.com
Дата: 03.12.09 10:13
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Это всё называется workarounds, а Эрланг мне не очень нравится из-за быстродействия. Кстати говоря, я не имел в виду кооперативную многозадачность.


Медиакодеки, впрочем, и прочий numbercrunching (небольшие, относительно простые программы, жующие большой объем данных), делать на Эрланге — больная идея. Это надо писать на С/С++ и подцеплять к управляющей логике на Эрланге. Преимущество Go может быть в том, что он позволит избежать вот таких многоязычных связок. Но пока — это не так, и он почти такой же тормозной, как Эрланг. Надо подождать полгода-год.
Re[5]: [ANN] 12 Things to Know About Google's Go
От: vdimas Россия  
Дата: 03.12.09 23:39
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Теперь, имея эту ортогональную тройку (типы-методы-интерфейсы), посмотри на это дело вот с какой стороны. Пустому интерфейсу interface{}, в котором нет методов, автоматически соответствует вообще любой тип языка. Все не есть Object, но, без дураков, все есть interface{}, прозрачно и автоматически.


Может это и не принципиально, насчет пустого interface{}, но вот "строгая утиная типизация" (оксюморон), это то, чего мне всегда не хватало, когда писал т.н. "бизнес-логику". Ибо городить и поддерживать иерархию взаимодействующих интерфейсов и реализующих их классов в современных main stream языках — это убогий процесс разработки, просто гири на ногах, т.к. на лицо непомерная цена самых простых изменений интерфейсов, вызывающая по цепочке изменения реализаций. Если одно от другого отвязать, процесс прототипирования сольется с процессом целевой разработки, как в некоторых языках/средах.

G>А в Го — интерфейсы "ортогональны" и методам, и типам. Их суть — они добавляют полиморфизм и динамическую диспетчеризацию вызова (вызов метода у интерфейса является "виртуальным"). Причем, связывание типа с интерфейсом происходит автоматически, без лишних телодвижений. Методов у типа хватает — он соответствует интерфейсу.


Вот интересно, насколько получится эффективно. А то нечто похожее в VB всегда было (если отбросить явное приведение к интерфейсу).
Re[5]: [ANN] 12 Things to Know About Google's Go
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 04.12.09 02:16
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Это есть "ортогональность" — типы отдельно, методы отдельно. Чрезвычайно занимательное свойство, и синтаксис языка тут не причем.


Правда, тут есть ложка дёгтя — о защищённости данных можно забыть. Хотя, конечно, можно интерфейсами обыграть.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[6]: [ANN] 12 Things to Know About Google's Go
От: Gaperton http://gaperton.livejournal.com
Дата: 04.12.09 17:32
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Осталось понять нафига это нужно.


Ну мне например уже понятно, зачем это может быть нужно.

Для мягкого сочетания функционального и объектного стилей. Когда требуется состояние — даешь объект. Когда его не требуется — даешь функцию. Примеров полезного применения данной возможности может быть масса. Простейший:

type Transformer interface{ transform( iterface{} ) interface{} }
type Iterable interface{
   next() (Iterable, bool)
   is_valid() bool
}

func for_each( t Transformer, it Iterable ) {
   for it.is_valid() {
      it = t( current )
      it.next()
   }
}

func ( t func( interface{} ) interface{} ) transform( value interface{} ) interface{} {
   return t( value )
}


Вот таким образом определенный for_each позволяет брать аргументом как простую функцию, так и объект. Мы можем протянуть состояние от вызова к вызову при желании — примерно так же, как с "функтором" в С++. Только здесь:
1) в отличии от С++, все будет работать в динамике
2) по причине наличия замыканий — не надо городить лишнего мусора, как в С++.
3) Данная техника подойдет для реализации ленивых вычислений и структур. Которые проще застрелиться, чем прилично изобразить в С++
4) Насчет отсутствия дженериков, и влияния этого факта на пример — не переживай. дженерики на подходе.

И это только один пример. То, что в С++ встроено в язык (функторы), здесь является одним из частных случаев системы типов.

WH>Также не ясно сколько раз нужно будет дернуть force чтобы таки вычислить выражение. Ибо computation может вернуть как вычисленное значение так и еще один computation. Кстати для всех значений также придется реализовать интерфейс Lazy.


Ясно. Один раз. Реализовать его надо не для всех значений, а только для ленивых. Это делается в одну строку для любого типа. И будет явным указанием на то, что этот тип "ленив".

WH>И самое противное что даже если мы таки узнаем когда значение вычислилось то для того чтобы им воспользоваться нам придется приводить к нужному нам типу явно.


value.force()(.нужный_тип)

Это далеко не самое противное (к тому же, вылечится добавлением генериков). Будет гораздо противное, когда ты попытаешься сделать ленивый список в С++ или Java.

WH>Короче мягко говоря многовато грязи и неопределенности для первоклассного объекта.


Не, не многовато.

G>>С ума сойти можно .

WH>Угу. Отличный способ шифрования кода.

Отличный способ шифрования кода — это перекрытые операторы, которые тебе так нравятся. А здесь все прозрачно.
Re[6]: [ANN] 12 Things to Know About Google's Go
От: Gaperton http://gaperton.livejournal.com
Дата: 04.12.09 17:35
Оценка:
Здравствуйте, vdimas, Вы писали:

G>>А в Го — интерфейсы "ортогональны" и методам, и типам. Их суть — они добавляют полиморфизм и динамическую диспетчеризацию вызова (вызов метода у интерфейса является "виртуальным"). Причем, связывание типа с интерфейсом происходит автоматически, без лишних телодвижений. Методов у типа хватает — он соответствует интерфейсу.


V>Вот интересно, насколько получится эффективно. А то нечто похожее в VB всегда было (если отбросить явное приведение к интерфейсу).


Вызов метода интерфейса — это самый обычный "виртуальный" вызов .
Re[7]: [ANN] 12 Things to Know About Google's Go
От: WolfHound  
Дата: 04.12.09 18:25
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Для мягкого сочетания функционального и объектного стилей. Когда требуется состояние — даешь объект. Когда его не требуется — даешь функцию. Примеров полезного применения данной возможности может быть масса. Простейший:

1)Где в твоем примере Lazy?
2)Твой пример не имеет практического применения ибо на практике интерфейс Transformer можно реализовать только для функции ибо если его реализовать для объекта то в одном месте нам может понадобиться одна реализация, а в другом другая и как следствие придется городить функцию.

G>1) в отличии от С++, все будет работать в динамике

Это минус.

G>2) по причине наличия замыканий — не надо городить лишнего мусора, как в С++.

Это хорошо но если вспомнить что не С++ом единым то...

G>3) Данная техника подойдет для реализации ленивых вычислений и структур. Которые проще застрелиться, чем прилично изобразить в С++

Если сравнивать с С++ то почти любой язык будет конфеткой.

G>4) Насчет отсутствия дженериков, и влияния этого факта на пример — не переживай. дженерики на подходе.

Посмотрим что у них получиться. Ибо генерики тоже можно реализовать не правильно.

G>Ясно. Один раз.

А если computation вернет computation?

G>Реализовать его надо не для всех значений, а только для ленивых. Это делается в одну строку для любого типа. И будет явным указанием на то, что этот тип "ленив".

Те для всех которые может возвращать computation.
Еще вопрос где и когда помечать типы ленивыми. Ибо у нас может возникнуть проблема что тип пометят ленивым в нескольких модулях...

G>value.force()(.нужный_тип)

Вместо просто value.

G>Это далеко не самое противное (к тому же, вылечится добавлением генериков). Будет гораздо противное, когда ты попытаешься сделать ленивый список в С++ или Java.

А можно я это на немерле сделаю? http://nemerle.org/Lazy_evaluation

WH>>Короче мягко говоря многовато грязи и неопределенности для первоклассного объекта.

G>Не, не многовато.
Многовато даже по сравнению с немерлом куда это пришлось встраивать. А если сравнивать с языком где лень есть на уровне системы типов...

G>Отличный способ шифрования кода — это перекрытые операторы, которые тебе так нравятся. А здесь все прозрачно.

Те ты готов отказаться от операторов для арифметических выражений? Или для операций над int'ами и float'ами использовать разные операторы?
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[8]: [ANN] 12 Things to Know About Google's Go
От: Gaperton http://gaperton.livejournal.com
Дата: 05.12.09 15:59
Оценка:
Здравствуйте, WolfHound, Вы писали:

G>>Для мягкого сочетания функционального и объектного стилей. Когда требуется состояние — даешь объект. Когда его не требуется — даешь функцию. Примеров полезного применения данной возможности может быть масса. Простейший:

WH>1)Где в твоем примере Lazy?

Я достаточно внятно объяснил все в абзаце выше.

WH>2)Твой пример не имеет практического применения ибо на практике интерфейс Transformer можно реализовать только для функции ибо если его реализовать для объекта то в одном месте нам может понадобиться одна реализация, а в другом другая и как следствие придется городить функцию.


Во-первых, такого типа как "объект" в Go нет, во-вторых — этот интерфейс одинаково реализуется для любого типа данных, нет совершенно никакой разницы. Например:

type adder int
interface {} ( x adder ) transform( value interface{} ) { return x + value(.int) }

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

G>>1) в отличии от С++, все будет работать в динамике

WH>Это минус.
Это плюс.

G>>2) по причине наличия замыканий — не надо городить лишнего мусора, как в С++.

WH>Это хорошо но если вспомнить что не С++ом единым то...

Мало-ли что можно не к месту вспомнить. Я в посте говорю о функциях как объектах, и о том, как это делается в Go. У тебя есть, что сказать по существу — говори.

G>>3) Данная техника подойдет для реализации ленивых вычислений и структур. Которые проще застрелиться, чем прилично изобразить в С++

WH>Если сравнивать с С++ то почти любой язык будет конфеткой.

Не будет.

G>>4) Насчет отсутствия дженериков, и влияния этого факта на пример — не переживай. дженерики на подходе.

WH>Посмотрим что у них получиться. Ибо генерики тоже можно реализовать не правильно.

Посмотрим. Можно.

G>>Ясно. Один раз.

WH>А если computation вернет computation?

То будет ошибка.

G>>Реализовать его надо не для всех значений, а только для ленивых. Это делается в одну строку для любого типа. И будет явным указанием на то, что этот тип "ленив".

WH>Те для всех которые может возвращать computation.

type LazyValue interface {
    force() interface{}
}


А теперь? Если тебя так волнует именно ленивость, то так более правильно.

WH>Еще вопрос где и когда помечать типы ленивыми. Ибо у нас может возникнуть проблема что тип пометят ленивым в нескольких модулях...


В том месте, где тип определяется.

G>>value.force()(.нужный_тип)

WH>Вместо просто value.

Я уже сказал что я по этому поводу думаю — небольшая проблема.

G>>Это далеко не самое противное (к тому же, вылечится добавлением генериков). Будет гораздо противное, когда ты попытаешься сделать ленивый список в С++ или Java.

WH>А можно я это на немерле сделаю? http://nemerle.org/Lazy_evaluation

Делай хоть на брейнфаке, я не против.

WH>>>Короче мягко говоря многовато грязи и неопределенности для первоклассного объекта.

G>>Не, не многовато.
WH>Многовато даже по сравнению с немерлом куда это пришлось встраивать. А если сравнивать с языком где лень есть на уровне системы типов...

Для языка, где лени нет на уровне системы типов, и где нет макросов — не многовато. А именно таким языком и является Go.

G>>Отличный способ шифрования кода — это перекрытые операторы, которые тебе так нравятся. А здесь все прозрачно.

WH>Те ты готов отказаться от операторов для арифметических выражений? Или для операций над int'ами и float'ами использовать разные операторы?

Я тебе достаточно подробно объяснил в прошлый раз, почему я так считаю. Не вижу смысла это мусолить.
Re[6]: [ANN] 12 Things to Know About Google's Go
От: Gaperton http://gaperton.livejournal.com
Дата: 05.12.09 16:18
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Вот интересно, насколько получится эффективно. А то нечто похожее в VB всегда было (если отбросить явное приведение к интерфейсу).


Кстати, действительно во многом похоже на модель COM и VB. Только в COM с VB не было "ортогональности" и "утиности". А эти вещи очень существенны. Они, я бы сказал, являются определяющим отличием.
Re[10]: [ANN] 12 Things to Know About Google's Go
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 06.12.09 14:49
Оценка:
Здравствуйте, WolfHound, Вы писали:

G>>Я в посте говорю о функциях как объектах, и о том, как это делается в Go. У тебя есть, что сказать по существу — говори.

WH>Функции как объекты не нужны.
WH>Вообще не нужны.
WH>Замыканий которые могут захватывать изменяемые данные более чем достаточно.

Вероятно ты это писал не всерьёз, на счет функции как объекты.
Re[11]: [ANN] 12 Things to Know About Google's Go
От: WolfHound  
Дата: 06.12.09 16:22
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Вероятно ты это писал не всерьёз, на счет функции как объекты.

Я вот про это извращение.
type Transformer interface{ transform( iterface{} ) interface{} }
type Iterable interface{
   next() (Iterable, bool)
   is_valid() bool
}

func for_each( t Transformer, it Iterable ) {
   for it.is_valid() {
      it = t( current )
      it.next()
   }
}

func ( t func( interface{} ) interface{} ) transform( value interface{} ) interface{} {
   return t( value )
}

И я обсолютно серьезно.
Извращения со всякими Transformer'ами при наличии первокласных функций не нужны.
... << RSDN@Home 1.2.0 alpha 4 rev. 1305>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.