От узла к ходу: грубое сравнение

Node.js Go JavaScript модульный тест

В компании XO мы изначально использовали Node и Ruby для создания взаимосвязанных сервисных систем. Нам нравятся явные преимущества производительности, которые дает Node, а также доступ к большому репозиторию пакетов, который уже существует. Мы также можем легко распространять и повторно использовать существующие плагины и модули внутри компании. Это значительно повышает эффективность разработки, позволяя нам быстро писать масштабируемые и надежные приложения. Кроме того, большое сообщество Node позволяет нашим инженерам вносить свой вклад в разработку программного обеспечения с открытым исходным кодом (например,BunnyBusиFelicity).

Пока я работал с более серьезными компилируемыми языками, такими как C++ и C#, во время учебы в колледже и какое-то время я только начинал работать, тогда я начал использовать JavaScript. Мне нравится, насколько он свободен и гибок, но в последнее время мне не хватало статических и структурированных языков, когда коллега заинтересовал меня Go.

Я перешел от написания JavaScript к написанию Go и обнаружил много общего между этими двумя языками. Оба языка быстро изучаются и их легко освоить, у обоих выразительный синтаксис, и у них много возможностей для трудоустройства в сообществе разработчиков. Идеального языка программирования не существует, поэтому вы всегда должны выбирать тот, который подходит для вашего проекта. В этой статье я собираюсь объяснить ключевые различия между двумя языками, надеясь побудить пользователей, которые раньше не использовали Go, получить возможность использовать Go.

общая разница

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

Go или Golang — это бесплатный язык программирования с открытым исходным кодом, созданный Google в 2007 году. Он был разработан с учетом скорости и простоты. Go компилируется непосредственно в машинный код, отсюда и его скорость. Отладка с скомпилированными языками довольно проста, потому что вы можете обнаружить много ошибок на ранней стадии. Go также является языком со строгой типизацией, что помогает обеспечивать целостность данных и может находить ошибки типов во время компиляции.

С другой стороны, JavaScript — язык со слабой типизацией. Помимо дополнительного бремени игнорирования типа проверочных данных и ловушек проверки правды, использование слабо типизированного языка имеет свои преимущества. чем через интерфейсinterfacesи дженерикиgenerics, карриcurryingи переменное количество формальных параметровflexible arityСделайте функции более гибкими. JavaScript интерпретируется во время выполнения, что может привести к проблемам с обработкой ошибок и отладкой. Node — это виртуальная машина Google V8 на основе Среда выполнения JavaScript, что делает ее легкой и быстрой платформой для веб-разработки.

грамматика

Как оригинальному разработчику JavaScript, мне нравится простой и интуитивно понятный синтаксис Go. Поскольку можно сказать, что синтаксис обоих языков произошел от языка C, их синтаксисы имеют много общего. Go обычно считается «легким в изучении языком». Это связано с его удобными для разработчиков инструментами, оптимизированным синтаксисом и соблюдением соглашений (аннотация LCTT: сначала соглашения).

Go включает в себя ряд встроенных функций, упрощающих разработку. Вы можете использовать стандартные инструменты сборки Go для компиляции вашей программы в двоичный исполняемый файл с помощью команды go build. Чтобы протестировать встроенный набор тестов, просто запустите go test. Такие функции, как изначально поддерживаемый параллелизм, предоставляются даже на уровне языка.

Стать разработчиком в GoogleДумаете, что нынешнее программирование слишком сложное, слишком много «бухгалтерии, дублирования труда и бумажной волокиты». Вот почему синтаксис Go разработан таким простым и понятным, чтобы уменьшить беспорядок, повысить эффективность и улучшить читаемость. Это также побуждает разработчиков писать понятный и понятный код. Идти Только25 зарезервированных ключевых слови своего рода цикл (для цикла), не такой, как в JavaScriptоколо 84 ключевых слов(включая зарезервированные ключевые слова, объекты, свойства и методы).

Чтобы проиллюстрировать некоторые различия и сходства в синтаксисе, давайте рассмотрим несколько примеров:

  • Пунктуация: Go удаляет все лишние символы для повышения эффективности и удобочитаемости. Хотя в JavaScript не так много мест, где требуются символы (см.Lisp) и часто является необязательным, но я предпочитаю Простота Go.
// JavaScript 的逗号和分号
for (var i = 0; i < 10; i++) {
  console.log(i);
}

//JavaScript 中的标点
// Go 使用最少数量标点
for i := 0; i < 10; i++ {
  fmt.Println(i)
}

// Go 中的标点
  • Присваивание: поскольку Go является строго типизированным языком, вы можете использовать оператор := для вывода типа при инициализации переменных, чтобы избежатьПовторите заявление,и JavaScript объявляет типы во время выполнения.
// JavaScript 赋值
var foo = "bar";

// JavaScript 中的赋值
// Go 的赋值
var foo string //不使用类型推导
foo = "bar"
foo := "bar" //使用类型推导

// Go 的赋值
  • Экспорт: в JavaScript вы должны явно экспортировать из модуля. В Go любая функция в верхнем регистре будет экспортирована по умолчанию.
const Bar = () => {};
module.exports = {
  Bar
}

// JavaScript 中的导出
// Go 中的导出
package foo // 定义包名
func Bar (s string) string {
// Bar 将被导出
}

// Go 中的导出
  • Импорт: в то время как в JavaScript требуются библиотеки для импорта зависимостей и модулей, Go использует родное ключевое слово import для импорта модулей через путь к пакету. Еще одно отличие состоит в том, что, в отличие от центрального репозитория Node NPM, Go использует URL-адреса в качестве путей для импорта пакетов из нестандартных библиотек, чтобы клонировать зависимости непосредственно из исходного репозитория пакета.
// Javascript 的导入
var foo = require('foo');
foo.bar();

// JavaScript 的导入
// Go 的导入
import (
  "fmt" // Go 的标准库部分
  "github.com/foo/foo" // 直接从仓库导入
)
foo.Bar()

// Go 的导入
  • Возвращаемые значения: возвращаемые значения и ошибки могут быть переданы и обработаны изящно с помощью функции многозначного возврата Go, а неправильная передача значений сокращается за счет передачи по ссылке. В JavaScript вам нужно возвращать несколько значений через объект или массив.
// Javascript - 返回多值
function foo() {
  return {a: 1, b: 2};
}
const { a, b } = foo();

// JavaScript 的返回
// Go - 返回多值
func foo() (int, int) {
  return 1, 2
}
a, b := foo()

// Go 的返回
  • Обработка ошибок: Go рекомендует отлавливать ошибки там, где они возникают, а не позволять ошибкам всплывать в обратных вызовах, как это делает Node.
// Node 的错误处理
foo('bar', function(err, data) {
  // 处理错误
}

// JavaScript 的错误处理
//Go 的错误处理
foo, err := bar()
if err != nil {
  // 用 defer、 panic、 recover 或 log.fatal 等等处理错误.
}

// Go 的错误处理
  • Функции с переменными аргументами: функции Go и JavaScript поддерживают неопределенное количество аргументов.
function foo (...args) {
console.log(args.length);
}
foo(); // 0
foo(1, 2, 3); // 3

// JavaScript 中的可变参数函数
func foo (args ...int) {
fmt.Println(len(args))
}
func main() {
  foo() // 0
  foo(1,2,3) // 3
}

// Go 中的可变参数函数

Сообщество

Если сравнивать более удобные парадигмы программирования, предлагаемые Go и Node, то с обеих сторон есть разные сторонники. Node полностью превосходит Go по количеству пакетов и размеру сообщества. Node Package Manager (NPM), крупнейший репозиторий программного обеспечения в мире,Более 410 000 упаковок, число которых растет с невероятной скоростью: 555 новых упаковок в день.. Это число может показаться удивительным (и это так), но важно отметить, что многие из этих пакетов дублируются и имеют недостаточное качество для использования в производственной среде. Для сравнения, в Go около 130 000 пакетов.

Количество пакетов Node и Go

Хотя Node и Go примерно одного возраста, JavaScript используется более широко и имеет огромное сообщество разработчиков и открытого исходного кода. Поскольку Node был разработан для всех и начинался с надежного менеджера пакетов, Go был разработан специально для Google. следующееТаблица лидеров спектраПоказывает топ языков веб-разработки, которые сейчас популярны.

7 лучших языков веб-разработки

Популярность JavaScript, по-видимому, остается относительно стабильной в последние годы, в то время какGo находится в восходящем тренде.

тренды в языках программирования

представление

Что делать, если вас больше всего волнует скорость? Кажется, что сегодня оптимизации производительности уделяется больше внимания, чем когда-либо прежде. Пользователи не любят ждать информации. На самом деле, если страница загружается более 3 секунд,40% пользователей покинут ваш сайт.

Node часто считается высокопроизводительным языком из-за его неблокирующего асинхронного ввода-вывода. Кроме того, как я упоминал ранее, Node работает на движке Google V8, оптимизированном для динамических языков. И Go был разработан с учетом скорости.разработчики GoogleЭто было достигнуто за счет создания «выразительной и легкой системы типов, механизмов параллелизма и сборки мусора, принудительного управления версиями зависимостей и т. д.».

Я провел несколько тестов, чтобы сравнить производительность между Node и Go. Эти тесты сосредоточены на основных компетенциях, предоставляемых языком. Если я собираюсь тестировать, например, HTTP-запросы или операции с интенсивным использованием ЦП, я буду использовать инструменты параллелизма на уровне языка Go (горутины/каналы). Но я больше сосредотачиваюсь на основных функциях, предоставляемых каждым языком (см.Три метода параллелизмаУзнайте больше о горутинах и каналах).

Я также включил Python в тесты, так что мы все равно остались довольны результатами для Node и Go.

Циклы/Арифметика

Переберите более миллиарда элементов и сложите их:

var r = 0;
for (var c = 0; c < 1000000000; c++) {
   r += c;
}

// Node
package main
func main() {
var r int
for c := 0; c < 1000000000; c++ {
       r += c
}
}

// Go
sum(xrange(1000000000))

// Python

результат

Проигравшим здесь, несомненно, является Python, занимающий более 7 секунд процессорного времени. В то время как Node и Go довольно эффективны, занимая 900 мс и 408 мс соответственно.

ИСПРАВЛЕНО: некоторые комментарии предполагают, что производительность Python все еще может быть улучшена. Я обновил результаты, чтобы отразить эти изменения. В то же время использование PyPy значительно повышает производительность. При работе с Python 3.6.1 и PyPy 3.5.7 производительность улучшилась до 1,234 секунды, но все же не так хорошо, как в Go и Node.

I/O

Перебрать более миллиона чисел и записать их в файл.

var fs = require('fs');
var wstream = fs.createWriteStream('node');

for (var c = 0; c < 1000000; ++c) {
  wstream.write(c.toString());
}
wstream.end();

// Node
package main

import (
  "bufio"
  "os"
  "strconv"
)

func main() {
  file, _ := os.Create("go")
  b := bufio.NewWriter(file)
  for c := 0; c < 1000000; c++ {
    num := strconv.Itoa(c)
    b.WriteString(num)
  }
  file.Close()
}

// Go
with open("python", "a") as text_file:
for i in range(1000000):
    text_file.write(str(i))

// Python

результат

Python снова занял третье место с результатом 7,82 секунды. В этом тесте разница между Node и Go велика: Node занимает около 1,172 секунды, а Go — 213 миллисекунд. Что действительно впечатляет, так это то, что большая часть времени обработки Go тратится на компиляцию. Если мы скомпилируем код и запустим его как двоичный файл, этот тест ввода-вывода займет всего 78 миллисекунд — в 15 раз быстрее, чем Node.

Исправление: изменен код Go для реализации кэшированного ввода-вывода.

Пузырьковая сортировка

Отсортируйте массив из десяти элементов десять миллионов раз.

function bubbleSort(input) {
    var n = input.length;
    var swapped = true;
    while (swapped) {
        swapped = false;
        for (var i = 0; i < n; i++) {
            if (input[i - 1] > input [i]) {
                [input[i], input[i - 1]] = [input[i - 1], input[i]];
                swapped = true;
            }
        }
    }
}
for (var c = 0; c < 1000000; c++) {
    const toBeSorted = [1, 3, 2, 4, 8, 6, 7, 2, 3, 0];
    bubbleSort(toBeSorted);
}

// Node
package main
var toBeSorted [10]int = [10]int{1, 3, 2, 4, 8, 6, 7, 2, 3, 0}
func bubbleSort(input [10]int) {
    n := len(input)
    swapped := true
    for swapped {
        swapped = false
        for i := 1; i < n; i++ {
            if input[i-1] > input[i] {
                input[i], input[i-1] = input[i-1], input[i]
                swapped = true
            }
        }
    }
}
func main() {
    for c := 0; c < 1000000; c++ {
        bubbleSort(toBeSorted)
    }
}

// Go
def bubbleSort(input):
    length = len(input)
    swapped = True
    while swapped:
        swapped = False
        for i in range(1,length):
            if input[i - 1] > input[i]:
                input[i], input[i - 1] = input[i - 1], input[i]
                swapped = True
for i in range(1000000):
    toBeSorted = [1, 3, 2, 4, 8, 6, 7, 2, 3, 0]
    bubbleSort(toBeSorted)

//Python

результат

Как и прежде, Python был худшим исполнителем, на выполнение задачи уходило около 15 секунд. Go выполняет задачи в 16 раз быстрее, чем Node.

суждение

Go был явным победителем во всех трех тестах, в то время как Node по большей части показал хорошие результаты. Python также показал хорошие результаты. Чтобы было ясно, производительность — это не все, что вам нужно учитывать при выборе языка программирования. Если вашему приложению не требуется обрабатывать большие объемы данных, разница в производительности между Node и Go может быть незначительной. Для некоторых других сравнений производительности см. следующее:

в заключении

Этот пост не о доказательстве того, что один язык лучше другого. Каждый язык программирования занимает свое место в сообществе разработчиков программного обеспечения по разным причинам. Я намерен выделить различия между Go и Node и облегчить представление нового языка веб-разработки. При выборе языка для проекта необходимо учитывать различные факторы, такие как осведомленность разработчиков, стоимость и доступность. Я рекомендую проводить тщательный низкоуровневый анализ при принятии решения о том, какой язык вам подходит.

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

материал

Если вы заинтересованы в изучении языка Go, вы можете обратиться к следующим ресурсам:


via: https://medium.com/xo-tech/from-node-to-go-a-high-level-comparison-56c8b717324a#.byltlz535

автор:John StamatakosПереводчик:trnhoeВычитка:wxy

Эта статья написанаLCTTоригинальная компиляция,Linux КитайЧесть запуска