JavaScript против Pharo

JavaScript захватывает мир ИТ. Это происходит из-за повсеместного распространения Интернета. Количество веб-разработчиков - легион. Следовательно, эти разработчики внедряют JavaScript во всевозможные области, где вы не ожидаете, что он будет полезен… настольные компьютеры, мобильные устройства, серверы, Интернет вещей, робототехника и т. Д.

К сожалению, по своей сути JavaScript - это язык с глубокими недостатками. Он пронизан темными углами, ловушками и ловушками. Это огромный и сложный язык - последняя версия ECMAScript имеет языковую спецификацию, превышающую 800 страниц.

Знаете ли вы, что существует гораздо более простой и приятный язык, который не уступает по возможностям JavaScript? Он называется Pharo, современный вариант Smalltalk. Давайте сравним два…

Простота, лаконичность и элегантность

Pharo намного проще, чем JavaScript. В нем всего шесть зарезервированных слов. Полный синтаксис умещается на открытке!

Вы, черт возьми, не можете этого сделать с помощью JavaScript!

Вы можете выучить весь язык за 15 минут: Learn Smalltalk с ProfStef. Вы, черт возьми, не можете этого сделать с помощью JavaScript!

Pharo удивительно лаконичен и элегантен. Вот несколько замечательных однострочников:

"Compute difference in days between two dates"
('2014-07-01' asDate - '2013/2/1' asDate) days
"Set up an HTTP server that returns the current timestamp"
(ZnServer startDefaultOn: 8080) 
  onRequestRespond: [ :request | 
    ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]
"Split a string on dashes, reverse the order of the elements and join them using slashes"
$/ join: ($- split: '1969-07-20') reverse
"Sum of the primes up to 64"
(Integer primesUpTo: 64) sum
"Extract a Unix format timestamp from the 5th to 8th byte of a byte array given in hex"
DateAndTime fromUnixTime:
  ((ByteArray readHexFrom: 'CAFEBABE4422334400FF') 
      copyFrom: 5 to: 8) asInteger
"Return the weekday of a date"
'2013/5/7' asDate dayOfWeekName
"Save the HTML source of a web page to a file"
'http://www.pharo.org' asUrl saveContentsToFile: 'page.html'
"Count the number of, or show the leap years between two years"
(1914 to: 1945) count: [ :each | Year isLeapYear: each ].
(1895 to: 1915) select: [ :each | Year isLeapYear: each ].
"Encode the same string using Latin1, UTF-8 and UTF-16"
#(latin1 utf8 utf16) collect: [ :each | 
  (ZnCharacterEncoder newForEncoding: each)
    encodeString: 'Les élèves Français' ]

Код Pharo читается почти как пиджин-английский! JavaScript не читается как английский в ваши лучшие дни.

Объектно-ориентированное программирование

Pharo полностью объектно-ориентирован сверху вниз. Его ясность и последовательность в этом отношении не имеют себе равных ни в одном другом языке.

С другой стороны, JavaScript - это, по сути, процедурный язык с некоторыми объектно-ориентированными возможностями. Более того, эта возможность не основана на традиционной объектно-ориентированной концепции с использованием классов, а основана на концепции прототипов. Прототипы очень редки - только два других значимых языка используют прототипы, Self и Lua. Для этого есть веские причины: прототипы не масштабируются. Программное обеспечение, основанное на прототипах, рухнет под собственной тяжестью, когда вы увеличите размер до многих десятков тысяч строк.

В последней версии JavaScript есть «классы», но они не более чем синтаксический сахар для прототипов.

Функциональное программирование

JavaScript часто рекламируется за его функциональные возможности. Но несмотря на то, что Pharo является чисто объектно-ориентированным языком, он также вполне способен в этой области. В Pharo есть прекрасная реализация лямбда-выражений в своих «блоках». Фактически, он может делать все, что может JavaScript, функционально. Библиотека классов Pharo содержит множество функциональных конструкций.

IDE (интегрированная среда разработки)

Pharo имеет прекрасную встроенную среду IDE живого кодирования, которая так же проста и удобна в использовании, как и сам язык. Живое кодирование позволяет вам проверять и изменять код и данные в вашей программе во время ее работы! Этот мощный метод практически исключает традиционный цикл редактирования-компиляции-тестирования-отладки, который мешал разработчикам более полувека. . Это основная причина, по которой Pharo (Smalltalk) является самым производительным языком программирования общего назначения в мире, согласно исследованию, проведенному Namcook Analytics.

JavaScript в какой-то мере может выполнять «живое кодирование», но он далеко не так удобен и эффективен.

Производительность и простота разработки

Namcook Analytics сообщает нам, что Pharo (Smalltalk) в два раза производительнее JavaScript. Это в среднем. Во многих случаях Pharo будет намного продуктивнее, иногда в пять раз!

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

Экосистема

JavaScript имеет обширную экосистему библиотек. Это слабое место для Pharo. Несмотря на это, Pharo невероятно универсален. Он используется для самых разных приложений. Например, Pharo очень хорош для веб-разработки, благодаря Seaside web framework и Teapot micro framework.

Благодаря PharoJS Pharo очень хорош для фронтенд-разработки.

Pharo хорош для науки о данных благодаря PolyMath и Roassal.

Pharo хорош для виртуальной реальности:

Pharo хорош для Интернета вещей и встроенного программирования. См. Научитесь программировать.

Pharo используется для написания сценария игрового движка Unreal:

Pharo используется для борьбы с лихорадкой Эбола!

Pharo используется для крупномасштабной визуализации данных по лекарствам в 16 странах.

Pharo используется для обработки естественного языка.

Pharo используется для машинного обучения и обработки нейронных сетей.

Smalltalk в целом универсален. Объединенные военные США использовали Smalltalk для написания симулятора боя на миллион строк под названием JWARS. Фактически она превзошла программу моделирования под названием STORM, написанную на C ++ ВВС США. Ого! Это потрясающе!

Smalltalk использовался JP Morgan для написания своей массивной системы управления финансовыми рисками под названием Kapital.

Orient Overseas Container Lines использовала Smalltalk для разработки своей системы управления перевозками IRIS-2.

Если Pharo находится в невыгодном положении из-за своей экосистемы, это, конечно, не замедляет его.

Важно отметить, что подавляющее большинство библиотек JavaScript в основном бесполезны. Они написаны детишками сценария и относительно неопытными программистами. Таким образом, экосистема JavaScript не так впечатляет по сравнению с более профессиональными и надежными коллекциями из C ++, C #, Java и Ruby.

Метапрограммирование

Поскольку Pharo полностью рефлексивен, он обладает замечательной способностью к метапрограммированию, сравнимой с Lisp! Другими словами, Pharo очень хорошо расширяется. Более того, в отличие от Lisp, расширения кода Pharo читаются так же, как Pharo! Вам не нужно изучать новый синтаксис для вашего DSL (предметно-ориентированного языка).

С другой стороны, JavaScript имеет более ограничительные и неудобные возможности метапрограммирования с использованием объектов Symbol, Reflect и Proxy.

Минное поле JavaScript

JavaScript - это катастрофа языкового дизайна. JavaScript пронизан темными углами, ловушками и ловушками. См. Минное поле JavaScript.

Это один из немногих языков программирования на планете, который может молча выйти из строя из-за синтаксической ошибки! Это сделано намеренно, потому что Брендан Эйх хотел, чтобы JavaScript был очень прощающим ошибки, чтобы не мешать взаимодействию пользователя с его программным обеспечением.

JavaScript уже много лет является предметом шуток. Например, см. Ват.