GoLang - компилируемый язык программирования с естественными параллелизмами разработанный компанией Google.
Разработка началась в 2007 году. А в 2009 состоялось официальное представление языка.
Основными разработчики языка были Роберт Гризмер( Robert Griesemer 1964г.р.),
Роб Пайк( Robert Pike 1956г.р. ) и Кен Томпсон( Kenneth Lane Thompson 1943 г.р. ).
Целями разработки языка Go были:
- создать современную альтернативу языку C и одновременно избежать громоздкости и тяжеловесности языка C++;
- естественным образом отобразить в языке возможность параллельных вычислений в многопроцессорных системах;
- обеспечить высокую переносимость исходных кодов между операционными системами;
- обеспечить высокую переносимость исходных кодов между аппаратными архитектурами самых различных процессорных платформ.
Стандартная инсталляция под ОС Linux Ubuntu
sudo apt install golang
go version
go version go1.18.1 linux/amd64
Есть ещё альтернативный проект GCC
sudo apt install gccgo
gccgo --version
gccgo (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Можно поставить из исходников
git clone https://go.googlesource.com/go goroot
или
wget https://go.dev/dl/go1.21.1.src.tar.gz конкретную версию
cd src
./all.bash
cd ../src/bin
./go version
go version go1.21.1 linux/amd64
В отношении скоростных показателей проектировщики ставили два скоростных требования:
- скорость компиляции аналогичного кода должна быть выше, чем у С
- скорость выполнения скомпилированного кода должна если и уступать скорости своего эквивалента на С,
то незначительно.
Для сравнения скорости выполнения эквивалентных приложений можно собрать простейшее приложение
с реализацией хорошо известного рекурсивного алгоритма вычисления чисел Фибоначчи.
--------------------------------
gcc fibo.c -o3 -o fibo_c
-------------------------------
#include <stdlib.h>
#include <stdio.h>
unsigned long fib(int n) {
return n < 2 ? 1 : fib(n-1) + fib(n-2);
}
int main(int argc, char **argv) {
unsigned num = atoi(argv[1]);
printf("%ld\n", fib(num));
return 0;
}
-------------------------------------
g++ fibo.cpp -o3 -o fibo_cpp
------------------------------------
#include <iostream>
#include <cstdlib>
using namespace std;
unsigned long fib(int n) {
return n < 2 ? 1 : fib(n-1) + fib(n-2);
}
int main(int argc, char **argv) {
unsigned num = atoi(argv[1]);
cout << fib(num) << endl;
return 0;
}
-----------------------------------
go build -o fibo_go fibo.go
----------------------------------
package main
import ("os"; "strconv")
func fib(n int) int {
if n < 2 { return 1
} else { return fib(n-1) + fib(n-2)
}
}
func main() {
n, _ := strconv.Atoi(os.Args[1])
println(fib(n))
}
----------------------
javac fibo.java
--------------------
public class fibo {
public static long fib(int n) {
return n < 2 ? 1 : fib(n-1) + fib(n-2);
}
public static void main(String[] args) {
int num = Integer.valueOf(args[0]);
System.out.println(fib(num));
}
}
----------------------------------
#!/usr/bin/python3
import sys
def fib(n):
if n < 2 : return 1
else: return fib(n-1) + fib(n-2)
print(fib(int(sys.argv[1])))
--------------------------------------------------------------------
an@mbook:~/go/fibo$ time ./fibo_c 46
2971215073
real 0m9,620s
user 0m9,619s
sys 0m0,001s
-----------------------------------------------------
an@mbook:~/go/fibo$ time ./fibo_cpp 46
2971215073
real 0m10,469s
user 0m10,464s
sys 0m0,005s
-----------------------------------------------------------
an@mbook:~/go/fibo$ time ./fibo_go 46
2971215073
real 0m7,261s
user 0m7,264s
sys 0m0,017s
----------------------------------------------------
an@mbook:~/go/fibo$ time java fibo 46
2971215073
real 0m4,952s
user 0m4,953s
sys 0m0,017s
----------------------------------------------------
an@mbook:~/go/fibo$ time ./fibo.py 46
2971215073
real 4m10,411s
user 4m10,393s
sys 0m0,008s
Хотя это вовсе не нужно расценивать как общее сравнение производительности.
Производительность радикально зависит от класса решаемых задач.