Язык Go от Google, Ford T с двигателем Ferrari

Google создала Go-язык, чтобы иметь возможность работать с современными многоядерными процессорами, что сложно с нынешними языками. Как всегда, новый язык отвечает на недовольство по отношению к нынешним языкам. В этом случае ему предназначалось заменить C++ для низкоуровневого программирования, чего ни Java, ни C # сделать не могут. Но это не значит, что он действительно используется для этого. Забавно, что создатели хотели сохранить синтаксис, к которому привыкли программисты, - С, но большинство используют Go, чтобы заменить Python !

Для его проектирования он обратился к нескольким ветеранам программирования, что объясняет почтенный синтаксис языка...

Langage de programmation Go, Ford T avec moteur Ferrari
Современные функции и 40-летний синтаксис!

Эти разработчики не имеют никакого отношения к C++, которая была создана Бьарне Струтструпом на базе C, что объясняет различные дизайнерские варианты, такие как композиция вместо наследства.

Цель Go - оставаться как можно ближе к языку C и при этом значительно повысить производительность, и заменить его.
Он черпает вдохновение из C, Java, Pascal, Python и даже повторяет особенности Script !
Google говорит нам в презентации :

«Мы утверждаем, что Go - современный язык».

И это правда, когда к его функциям, а не к синтаксису, датированному именно 1969 годом и языком В, и с заимствованиями у Паскаля (1970)!
Он используется в производстве в Google с мая 2010 года, но помимо того, что он очень эффективно заменяет C++, он также имеет тенденцию использоваться вместо Python и Ruby, потому что его скорость компиляции подходит для скриптинга, при этом производя быстрые исполняемые бинарники. Поэтому он может заменить все языки для программ командной строки.

Еще одна цитата автора, Роба Пайка:

Здесь главное, что наши программисты - Гоглеры, это не исследователи. Обычно они довольно молоды, свежеиспечены из школы, наверняка выучили Java, возможно, C или C++, а возможно, и Python. Они не способны понять блестящий язык, но мы хотим, чтобы они делали хорошие программы. Таким образом, язык, который мы им даем, должен быть легко понятен и легко принят.

Зачем использовать Go? Опыт пользователей...

Опыт довольно негативный у отдельных программистов, использовавших другие современные языки. Go в основном предназначен для команды, где повторяющееся добавление/замена программиста. Он позволяет быстро работать даже новичкам.
Его синтаксис и то, как он относится к объектам, предназначенным в основном для программирования на серверах в качестве замены Perl, Python или PHP. Он позволяет как быстро развиваться, так и выполнять велоскрипты.
Он с самого начала обладает конкурентными функциями и коллекционным гарбагом. Собирающий гараж обычно не подходит для выполнения ОС, драйверов, но специально оптимизирован для достижения перерывов менее 100 микро-волн!

Его можно использовать для создания серверного ПО и, например, для построения CMS и генерации HTML-страниц - домена, где он превосходит Python и Java.

Она проще C++, более адаптируема, чем Java, быстрее и безопаснее Python, имеет полную и хорошо продуманную библиотеку (с серверной стороны) и предоставляет необходимые услуги для веб-приложений, таких как WebSocket, клозуры.
И программы моментально компилируются, что облегчает разработку, как и точное описание возможных ошибок, в отличие от других языков вроде C++.

Синтаксис языка C

Синтаксис повышает производительность.

Технология CSP (Communicating Sequential Processes) управляет связью между программами и помогает управлять многоядерными процессорами.

Вперед против Java

Java задумывался как язык для Сети и благодаря этому стал популярным. Он может работать на сервере или клиентском компьютере с помощью апплетов (они устарели).
Его главный интерес - очень обширная библиотека графического интерфейса.
Go как Java позволяет сразу тестировать развивающуюся программу или скрипт, но она производит двоичный код, поэтому быстрее и компактнее.

Go vs C++

Даже если он повторяет тот же синтаксис 70-х годов, Go упрощает программирование по сравнению с C++. Некоторые частые ошибки синтаксиса удаляются.
Многопоточная работа становится простой, с одной командой.
Коллекционный гараж облегчает управление памятью.

Сравнение синтаксисов...

Показать сообщение.

Го

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

C++

#include <stdio.h>

void main() {      
  puts("Hello, World!");  
}
Объявить переменную. Тип может быть определен путем вывода в Go.

Го: два эквивалентных заявления.

var i : int = 10
var i = 10

C++

int i = 10;
Объявить строку. Тип может быть назначен путем вывода.

Го

var str = "Hello in Go"
fmt.Println(str)

C++

string str = "Hello in C++";
puts(str);
Константа...

Го

const a = 1

C++

const int a = 1;
Заявление. Мы можем объединить их. Есть перестановки в отношении С++, но явного преимущества нет.

Го

var b int = 2
var x, y, z int
var i, j, k int = 5, 10 , 20
b += x 

C++

int b = 2;
int x, y, z;
int i = 5, j = 10, k = 20 b += x;
В функции переменная может быть объявлена неявно. Она всегда прямо заявлена в C++.

Го

x := 2

C++

int x = 2;
Структура if. Можно включить заявление перед условием. Это ничего не приносит и делает код менее читаемым.

Го

if x < 1 {
  fmt.Println("ok")
}

if x = mult(y, 100); x < 1000 {
  fmt.Prinfln("ok")
}  

C++

if(x < 10) {
  puts("ok");
}
  
x = mult(y, 100);
if(x < 1000) {
  puts("ok");
}  
La structure switch. La différence avec C++ est la disparition du break terminal, dont l'omission permettait d'associer plusieurs cas à un même traitement. Mais on peut avoir le même résultat avec le mot réservé fallthrough qui joue le rôle opposé à break.

Go

switch x {
 case "a":
     fmt.Println("a")
 case "b":
     fallthrough
 case "c":
     fmt.Println("b ou c")
 default:
    fmt.Println("x")
}

C++ 11

switch(x) {
  case "a": 
    puts("a"); 
    break;
  case "b": 
  case "c": 
    puts("b ou c"); 
    break;
  default:
    puts("x");  
}
La boucle for est la seule structure de contrôle pour les itérations. On notera la disparition des parenthèses. Cela rend obligatoires les accolades.

Go

for i:= 0; i < 10; i++ {
  fmt.Println(i)
}

C

int i;
for(i = 0; i <= 10; i++) 
  puts(i);
For dispense de while et cela ne paraît pas un choix judicieux. "while i < 10" signifie: "tant que i est inférieur à 10" et est compréhensible, mais "for i < 10" signifie "pour i inférieur à 10" et cela n'a pas de sens.

Go

var i  = 0
for i < 10 {
  fmt.Println(i)
  i += 1
}

C

int i = 0;
while(i < 10) {
  puts(i);
  i += 1;
}
Une boucle infinie est très simplifiée. Rust quand à lui a choisi d'inventer inutilement une nouvelle structure, mais aucun n'offre de sécurité, que l'on obtient avec l'incrément obligatoire en fin de boucle comme le fait le langage .

Go

for {
  if condition {
  	break
  }
}

C++

while(true) {
  if(condition) 
    break;
}

For ... each. Cela se fait avec le mot range. Mais c'est plus simple en C++ 11.

Go

var arr = []int { 10,20,30 }
for i, v := range arr {
  fmt.Println(v)
  ...
}

C++ version 11

int arr[] = { 10,20,30 };
for(x : arr) {
  puts(x);
  ...  
}
Déclaration d'une fonction. Notons que JavaScript utilise le mot réservé function, Python def, Rust fn, Go func. Chacun cherche à se distinguer, pourquoi ne pas appeler une fonction function?
La syntaxe de Go pour déclarer une fonction reste simple, celle de Rust étant inutilement compliquée et abscon.
Si plusieurs arguments sont de même type, on déclare le type une seule fois. Mais cela reste des types statiques dans les deux langages et n'offre pas le multiple dispatch de Julia.

Go

func mult(x int, y int) int {
  return x * y
}

C++

int mult(int x, int y) {
  return (x * y);
}
Par contre, une fonction peut retourner plusieurs valeurs sous forme de tuple alors que C++ doit recourir à un tableau, ou un objet tuple, mais sans assignement direct.

Go

func ftuple(x int, y int) (int, int) {
  return x * 2, y * 2
}
x, y = ftuple(10, 15)

C++

int[] ftuple(int x, int y) {
  return { x * 2, y * 2 };
}
int z[] = ftuple(10, 15);
x = z[0]; y = z[0];
Les structures de données sont déclarées à la mode verlan. Les auteurs du langage ne roulent pas en voiture. Ils roulent en véhicule de type voiture, c'est bien mieux.

Go

type Point struct {
    x int
    y int
}

C++

struct Point {
    int x;
    int y;
}
Exemple de script: afficher les lettres d'une chaîne avec une boucle for.

Go

package main  
import ("os";"flag";)

func main() {
  var s = "Démonstration"
  for i := 0; i < s; i++  {
    fmt.Println(s[i])
  }
}

C++

#include <stdio>
#include <string>

void main() {
  string s = "Démonstration";
  for(i : s) {
     puts(i);
  }
}

 

Sur le plan des bibliothèques, Go va directement à l'encontre de C++, non seulement il n'y a pas de fichiers d'en-têtes, mais on peut même inclure des modules externes directement depuis un site distant, car toute l'information pour l'intégration est stockée dans les modules.
En général cela facilite la distribution des programmes, mais cela à des inconvénients. Les modules importés directement cessent d'être compatibles et obligent à réécrire les logiciels...

Polémique au sujet du nom

Lors du lancement public du langage, un ticket a été créé sur le forum du langage avec pour code d'identification issue 9.
L'auteur d'un langage totalement inconnu clame que le nom Go est déjà celui de son propre langage. Le fait est qu'un livre a été écrit sur celui-ci, sous le titre Let's Go!
Mais ce langage s'appelle Go! et non pas go, et le mot Go appartient au domaine public: il s'agit d'un jeu de tableau chinois qui existe depuis plusieurs milliers d'années! (Et aussi le verbe "aller" en anglais).

Sites et outils pour Go

Programming and data languages Asm.js - Бейсик - C - C++ - C # - Дарт - Эйфель - Го - Ява - JavaScript - Джулия - Паскаль - PHP - Питон - Пролог - Руби - Ла Скала - Скриптол - Свифт - TypeScript - HTML - Васм - XML - XAML - SQL