Go-Scala-Go!Каковы основные отличия? - PullRequest
9 голосов
/ 02 июля 2010

Я только что нашел эту веб-страницу , сравнивающую некоторый код, написанный на Scala, C # и Go. Я удивлен, увидев, насколько похож код Scala и Go, гораздо больше, чем код Scala по сравнению с кодом C #.

Итак, мой вопрос: каковы наиболее существенные различия между Scala и Go?

Ответы [ 4 ]

26 голосов
/ 02 июля 2010

Честно говоря, этот код Scala написан в чрезвычайно императивном стиле.Я не функциональный пурист, но сопоставляю код этой страницы Sieve of Eratosthenes с более коротким и более разборчивым примером Sieve of Eratosthenes в начале Scaladoc для класса Stream .Код этой страницы содержит множество переменных и while-циклов, не говоря уже о битах , повсюду.Теперь, я не знаю, насколько много консенсуса относительно того, что считается идиоматическим кодом Scala, но это совершенно точно не близко к нему.Таким образом, в нем ничего не говорится о сходстве между Scala и Go, кроме того факта, что они оба являются потомками C.

14 голосов
/ 02 июля 2010

Я так не думаю, по крайней мере, концептуально они очень разные.Go гораздо больше похож на C ++ и ориентирован на «низкий уровень», чем C #, а C # имеет всего несколько функциональных возможностей, в то время как Scala позволяет писать типичный «функциональный» код (более подробный, чем OCaml или Haskell, но похожий).Система типов Scala довольно сложна, но, тем не менее, основана на Java / C # -подобной основе.С другой стороны, объектно-ориентированная часть Go выглядит совсем иначе.Я не пробовал Go, так как нашел слишком C-like и слишком низкий уровень.Как программист на Java, я знаю, что C # технически впереди, и в Java отсутствует множество приятных функций.При изучении Scala он расширил мои взгляды, дав мне преимущество и мощь функционального кода, не теряя при этом ничего хорошего из объектно-ориентированного мира.После многих лет Java-тюремного программирования в Scala это действительно освежающий и потрясающий опыт.

10 голосов
/ 02 июля 2010

Go - это еще один императивный язык, который все еще находится в подгузниках.На данный момент у Go нет генериков.Также не поддерживается функциональное программирование.

C # - это ОО / императивный язык с очень небольшой поддержкой функционального программирования.Имеет дженерики.Текущая версия не поддерживает аннотации Covariance и Contravariance (хотя они запланированы для следующей версии языка).

Scala - это гибридный язык, который пытается объединить лучшее из обоих миров (а именно, OO ифункционально) на одном языке.Как видно из следующего рисунка (Источник: http://james -iry.blogspot.com / 2010/05 / types-la-chart.html ), Scala имеет очень сложную файловую систему, что-точто и в C #, и в Go не хватает.

альтернативный текст http://www.pogofish.com/types.png

Таким образом, с точки зрения функциональности, Scala является наиболее многофункциональным языком (учитывая как ОО, так и функциональные возможности) из всех трех.C # предоставляет некоторые функциональные конструкции, но это далеко не Scala.И IMO, сравнивающий Go со Scala / C #, похож на сравнение воловьей тележки с Lamborghini.

1 голос
/ 02 июля 2010

Я видел, как некоторые люди почти напрямую конвертировали код Java в код Go, код C в код Go и т. Д. Теперь я вижу, что вы можете почти напрямую конвертировать код Scala в код Go.Когда языки имеют похожее наследие, это часто не сложно сделать.Тем не менее, сравнение должно проводиться между кодами, написанными специально, чтобы использовать идиомы конкретного языка.Я недавно посмотрел на некоторый зависимый от указателя C-код, преобразованный почти напрямую в код Go.Было не только больно читать;это также было мучительно медленно.

И, в дополнение к примеру MJP «Сито эратосфена в Скале», посмотрите подробное описание в разделе «Простые числа» Учебное пособие для языка программирования Go идиоматической реализации параллельного программирования Sieve of Eratosthenes in Go.

...