Недавно я слушал видео Мартина Одерского, где он пытается объяснить фундаментальное преимущество функциональных языков (таких как Scala, но, конечно, не обязательно Scala) над ООП или процедурными языками.
Перефразируя, он объясняет, что Закон Мура в последнее время подводит нас, и поэтому для ускорения процессоров вместо того, чтобы удваивать число транзисторов в ядрах, производители процессоров просто предлагают больше ядер. Это, в свою очередь, позволяет более эффективно использовать ЦП параллельными / многопоточными приложениями. Итак, первоочередная задача заключалась в следующем: чем более параллельным является приложение, тем больше фрагментов его кода выполняется одновременно на разных ядрах и с большим количеством ядер в ЦП, что в целом ускоряет выполнение программы.
Пока все хорошо.
То, что он не смог объяснить (или, скорее всего, то, что я не смог понять), это , почему функциональные языки, такие как Scala, пригодны для того, чтобы быть более параллельными, чем другие нефункциональные языки. Поскольку мы случайно говорим о пространстве JVM, давайте сделаем быстрое сравнение Java и Scala. Что это за программа Scala, которая, если бы вместо этого была реализована на чистой Java, затруднила бы параллелизацию / параллелизм, , особенно если она все компилируется до байт-кода JVM и работает на тех же JVM с одинаковыми родные возможности? ?
Это означает, что у меня есть два приложения JVM: App1, написанное на Java, и App2, написанное на Scala. Они оба выполняют одни и те же задачи и выполняют одни и те же вещи. Оба компилируются в байт-код JVM и запускаются на одном компьютере с той же JVM, установленной на нем. Как приложение Scala может «задействовать» возможности JVM, которые делают его более подходящим для параллелизма, чем Java (и, следовательно, быстрее на процессоре с большим количеством ядер)?