Smalltalk против схемы, JavaScript и Java
Smalltalk - потрясающий язык. Это идеальный учебный язык для обучения программированию как детей, так и взрослых. Его очень легко изучить и он чрезвычайно универсален, как JavaScript, но без всей ерунды, которую JavaScript навязывает незадачливым программистам. Smalltalk хорошо сравнивается с Java, когда дело доходит до написания надежного, крупномасштабного программного обеспечения, несмотря на то, что он динамически типизирован.
В этой статье я выделю ключевые различия между Smalltalk и Scheme в учебных целях, между Smalltalk и JavaScript для обеспечения безопасности и полезности, а также между Smalltalk и Java для тяжелого промышленного программирования.
Схема
Smalltalk был специально разработан Аланом Кей для обучения программированию детей. Идеально подходит и для взрослых. Smalltalk очень чистый, простой и элегантный. Практически не имеет синтаксиса!
Но Smalltalk - не единственный язык, обладающий этими качествами. В течение многих лет Массачусетский технологический институт преподавал программирование первокурсникам, используя Scheme и ее прекрасную книгу-компаньон «Структура и интерпретация компьютерных программ», ласково известная как SICP (произносится «больной горошек»). Они выбрали Scheme именно из-за его простоты, так что язык не мешает новичку. Как и в Smalltalk, в Scheme нет отвлекающих функций и багажа, который переносится из промышленного использования.
Однако у этих двух языков есть интересные различия. Во-первых, синтаксис Scheme страдает от бесконечных скобок, которые могут затруднить читаемость. Неустанная функциональная нотация prefix в схеме может быть неудобной (особенно для арифметических, реляционных и логических операторов). Например,
;;; make-matrix creates a matrix (a vector of vectors). (define make-matrix (lambda (rows columns) (do ((m (make-vector rows)) (i 0 (+ i 1))) ((= i rows) m) (vector-set! m i (make-vector columns)))))
Smalltalk, с другой стороны, читается почти как естественный язык благодаря использованию унарных, двоичных сообщений и сообщений с ключевыми словами: прочтите мою основополагающую статью о Smalltalk под названием Как изучение Smalltalk может сделать вас лучшим разработчиком.
Еще одно важное отличие состоит в том, что Scheme в значительной степени функциональна по своей природе, тогда как Smalltalk является чисто объектно-ориентированным на основе классов. Хотя классы и объектно-ориентированное программирование (ООП) можно моделировать в Scheme, это не совсем удобно, так же как функциональное программирование можно моделировать в Smalltalk, но довольно неэлегантно.
Есть веская причина, по которой Smalltalk широко считается ведущим языком ООП, тем, что почти все другие языки стремятся подражать (Java, Python, JavaScript, C #, C ++, PHP, Ruby, Objective-C, Perl, Scala, Groovy, Dart , CLOS, Swift и т. Д.). Когда дело касается ООП, было бы грехом не знать Smalltalk.
Smalltalk также очень практичный язык. Он используется в коммерческих целях более трех десятилетий и до сих пор пользуется успехом. Схема же практически нигде не используется. Его старший брат, Common Lisp, имеет некоторое коммерческое приложение, но только Clojure (язык Lispy) может считаться сильным языком корпоративного программирования.
JavaScript
Создатель JavaScript утверждает, что он был вдохновлен Scheme. Евангелист Дуглас Крокфорд называет JavaScript «Лиспом в одежде Си». Но правда в том, что JavaScript не похож ни на Lisp, ни на Scheme сколько-нибудь существенным образом:
- C-подобный синтаксис JavaScript лишает язык чистых, элегантных обозначений Scheme.
- Центральная структура данных Лиспа - это список. В JavaScript нет типа данных списка. Центральной структурой данных JavaScript является ассоциативный массив, который часто маскируется под какой-либо другой тип данных.
- Лисп является гомоиконным, то есть его код и его данные имеют одно и то же первичное представление. JavaScript нет. Даже не немного.
- Гомиконность Лиспа обеспечивает мощную макросистему. В JavaScript нет макросов.
- Lambdas не делает JavaScript Lisp-подобным, как и C ++, Java, Python, Haskell и Smalltalk похожи на Lisp.
JavaScript также был вдохновлен Self, языком, основанным на объектных прототипах. Это очень необычный способ работы с ООП. Сторонники JavaScript описывают прототипы как мощный и чудесный способ программирования. Однако прототипы объектов настолько хороши, что ни один другой известный язык программирования за последние 30 лет не принял их, кроме Lua. Все остальные предпочитают классы объектов.
Как я указывал ранее, Smalltalk - это лучший объектно-ориентированный язык. Даже с синтаксическим сахаром ECMAScript 2015 для классов JavaScript не может сравниться с Smalltalk для объектно-ориентированного программирования.
JavaScript чрезвычайно популярен для веб-разработки, но не по тем причинам, о которых вы можете подумать. JavaScript - единственный язык, поддерживаемый в веб-браузере, поэтому веб-разработчикам ничего не остается, кроме как использовать его. С технической точки зрения предпочтительнее любой другой язык программирования. К счастью, есть обходной путь: вы можете использовать языки, которые транслируют в JavaScript. Amber Smalltalk - один из лучших примеров этого.
Даже на стороне сервера, где Node.js оказался успешным, есть лучшие альтернативы, такие как Go. Об этом я писал в Падении дома узла. Зачем навязывать себе JavaScript? (Между прочим, JavaScript находит свое применение в других областях ИТ, таких как настольные компьютеры, мобильные устройства, Интернет вещей и игры, но он не особенно популярен.)
JavaScript хорошо известен своим длинным списком недостатков, поэтому я не буду вдаваться в подробности здесь. Я просто дам вам небольшую выборку чуши, с которой вам нужно мириться в этом вопросе StackOverflow. Напротив, в Smalltalk очень мало проблем, вызывающих споры и путаницу, гораздо меньше, чем в любом другом языке, который я знаю. О прекрасном дизайне Smalltalk хорошо говорит тот факт, что спустя четыре десятилетия с момента его появления Smalltalk остается таким же чистым и чистым, как пригнанный снег.
Джава
Основное различие между Java и Smalltalk состоит в том, что один типизируется статически, а другой - динамически. В остальном у двух языков есть несколько общих черт:
- оба являются объектно-ориентированными (OO) языками (кроме примитивных типов Java)
- оба компилируются в байтовый код, который выполняется на виртуальной машине; оба собираются мусором
- оба чрезвычайно универсальны и используются в самых разных областях, таких как Интернет, настольные компьютеры, мобильные устройства, робототехника, Интернет вещей, числовые вычисления, машинное обучение и т. д.
- оба вполне способны писать большие и удобные в обслуживании программные системы.
Последний пункт в значительной степени связан с хорошим управлением проектами, хотя языки действительно предлагают отличную поддержку модульности и организации кода. Статическая типизация Java обеспечивает определенную степень безопасности, но в остальном не является панацеей для управления большими базами кода. Некоторые крупные Java-проекты оказались катастрофическими, в то время как некоторые крупные проекты Smalltalk оказались чрезвычайно управляемыми. В качестве примера можно привести JWARS, программу моделирования сражений на миллион строк, написанную объединенными военными США на Smalltalk в начале 2000-х годов. Он даже превзошел аналогичную симуляцию под названием STORM, написанную ВВС США на C ++.
Фактически, Smalltalk настолько хорош для крупных корпоративных систем, что на сегодняшний день он почти стал корпоративным стандартным языком программирования. В начале 1990-х IBM выбрала Smalltalk в качестве центрального элемента своей корпоративной инициативы VisualAge по замене COBOL. IBM не приняла бы это решение, если бы Smalltalk не справлялся с задачей крупномасштабной разработки. (К сожалению, эта роль в конечном итоге была узурпирована новым языком под названием Java, который хорошо продавался Sun Microsystems.)
Следует отметить, что Java значительно усложняет ООП, чем Smalltalk. Вот почему Java так многословна. Концепции объектно-ориентированного программирования в Smalltalk чрезвычайно просты и понятны. Это превращает ООП в чистое удовольствие. Не так уж и много для Java.
Если вы программист на Java и интересуетесь Smalltalk, этот небольшой учебник может подогреть ваш аппетит.