В чем разница между Даби и Джуби, и зачем мне любой из них? - PullRequest
20 голосов
/ 27 августа 2009

Согласно Чарльз Наттер , Даби - это

язык статической типизации с Ruby's синтаксис и система типов Java. Дубы поддерживает все литералы Ruby, использует вывод локального типа (единственный аргумент типы должны быть объявлены ) и выполняются как быстрый как Java (потому что он производит почти идентичный байт-код). Но с Появление invokedynamic, Duby нужен друг для игры.

1. Что вызывает динамический и почему Дуби "нужен приятель"?

Джуби , с другой стороны, это

намеревался быть в основном как Дуби, в что он использует типы Java и Ruby синтаксис. Но он использует в своих интересах новый invokedynamic опкод будет 100% динамичный. Juby - динамичный Duby, или возможно динамическая Java с Ruby синтаксис. Это не сложно понять.

На самом деле это трудно понять.

2. Может ли кто-нибудь подробнее рассказать о том, о чем идет речь?

3. Зачем нам ( нужен! ) другой язык, связанный с Ruby? Или, точнее, еще два языка, связанных с Ruby?

Ответы [ 5 ]

50 голосов
/ 29 августа 2009

Я собираюсь отвечать на вопросы не по порядку, начиная с самого простого:

2. Может ли кто-нибудь подробнее рассказать о том, о чем идет речь?

Duby имеет статическую типизацию, Surinx (это окончательное имя для того, что в течение короткого времени называлось Juby ), динамически типизируемой. Это уже все, что нужно сделать.

На самом деле, из-за этого есть одна маленькая деталь: Синтаксис * Surinx является строгим подмножеством синтаксиса Ruby , то есть любой синтаксически допустимой Surinx программы также является синтаксически верной Ruby программой. Duby OTOH является почти синтаксическим подмножеством, за исключением обязательных аннотаций типа параметра метода:

def foo(bar => Integer, baz => String) => Array
  # ...
end

Это незаконно в Ruby .

3. Зачем нам нужен (нужен!) Другой Ruby связанный язык?

Прежде всего: кроме синтаксического сходства, эти языки никоим образом, формой или формой не связаны с Ruby .

Итак, почему Чарльз Оливер Наттер создал Даби ? Он является ведущим разработчиком реализации JRuby Ruby , которая является реализацией языка программирования Ruby для JVM. Как и большинство реализаций Ruby , он написан на доминирующем языке программирования базовой платформы: MRI , YARV и tinyrb реализованы 100 % в C, MacRuby в основном в C с небольшим количеством Objective-C, Ruby.NET и IronRuby 100% в C #, HotRuby в ECMAScript , Красное Солнце в ActionScript, Кардинал в PIR и NQP и так далее. (Единственными Ruby реализациями, которые содержат значительное количество Ruby кода, являются Rubinius (около 70% Ruby , 30% C ++) и MagLev (неизвестные суммы Ruby и Smalltalk ).) И, естественно, XRuby и JRuby реализованы 100 % в Java.

Теперь забавно то, что Чарли пришел к Руби , потому что ему не нравилась его повседневная работа - заниматься разработкой на Java. И теперь он все еще пишет код Java весь день! Конечно, ему это не нравится, и поэтому он искал другой язык программирования для реализации ядра JRuby . Конечно, можно было бы просто написать все это в Ruby , но с метациклическими реализациями обычно наступает точка уменьшения отдачи, когда реализации вырождаются в академическую мастурбацию. Конечно, имеет смысл переписать библиотеки, опережающий компилятор (на самом деле , который уже делается ) и некоторые базовые классы в Ruby , но некоторые части ядро двигателя лучше написано в чем-то ближе к модели исполнения самой JVM.

Чарли просматривал доступные варианты: Scala , Groovy , Вентилятор , Clojure , Хороший , но у всех них был существенный недостаток: довольно большое время выполнения языка. Размер среды выполнения JRuby уже является большой проблемой с точки зрения потребления памяти и задержки запуска (особенно по сравнению с MRI или YARV и даже более, если вы на самом деле включить саму JVM в ваши измерения), и переписать его на языке, который добавляет к этому весу свое время выполнения, просто не нужно. К сожалению, не было никакого языка программирования, который удовлетворял бы двум основным критериям, которые искал Чарли : нет времени выполнения и компилируется в байт-код JVM, который по крайней мере так же эффективен, как эквивалентный Java.

Итак, он решил создать свой собственный. Причина, по которой он решил использовать синтаксис, подобный Ruby , на самом деле довольно проста: ему не нужно было писать для него анализатор, Duby просто использует JRuby уже существующий синтаксический анализатор с одной незначительной модификацией для поддержки аннотаций типа параметра метода. (На самом деле, ему также нравится синтаксис Ruby , который, конечно, тоже был фактором.)

Как вы знаете, синтаксис на самом деле является наименее важной частью языка программирования. (Его неуместность не всегда очевидна из количества споров об этом , но это только потому, что синтаксис - это единственное, о чем вы можете спорить, не имея реального понимания того, что вы говорите о.) Гораздо важнее, чем синтаксис, является система типов и семантика оценки. И тут возникает хитрость: Дуби тоже не имеет! Это только имеет синтаксис! Это как паразит: он просто «заимствует» систему типов и семантику из своей базовой платформы. Это означает, что в JVM Duby система типов является системой типов Java, а Duby семантика является семантикой Java , Другими словами: Duby вовсе не является языком программирования , скорее это "просто" альтернативный синтаксис для Java.

Это означает, что между Duby и Java нет сопоставления, затрат на преобразование и разницы в скорости. А это значит, что внутренности JRuby могут быть записаны в Duby без потери каких-либо функций.

Итак, это Дуби .

Чтобы объяснить Surinx , я сначала отвечу на ваш первый вопрос:

1. Что такое invokedynamic и почему Duby"нуждается в приятеле"?

invokedynamic - это новый байт-код, который будет добавлен в 3-е издание спецификации JVM и будет выпущен в JDK7. Однако в более общем смысле invokedynamic обычно используется в качестве замены для ссылки на целый набор функций, из которых фактический invokedynamic байт-код только один, который в настоящее время разрабатывается под эгидой JSR-292 «Поддержка динамически типизированных языков на платформе Java» . И даже в более общем смысле имя invokedynamic используется в качестве прозвища для общего изменения стратегии как в Sun, так и в JCP в целом, чтобы превратить платформу Java в языковую платформу общего назначения для всех виды языков.

Конкретная цель JSR-292 (о чем Чарли упоминает в своем блоге) состоит в том, чтобы ускорить отправку динамического метода - даже почти так же быстро, как static отправка в Java, по крайней мере, в лучшем случае.

Surinx - это язык программирования с динамической типизацией, который в основном делает то же самое, что и Duby : как Duby , он также имеет только синтаксис, как Duby , он также использовал систему типов Java. Но в отличие от Duby , он не использует семантику вызова метода Java, вместо этого он использует invokedynamic s семантика вызова метода. IOW: он динамически типизирован и использует динамическую диспетчеризацию.

Итак, это Surinx .

Теперь я могу ответить на вторую половину вашего третьего вопроса:

3. Зачем нам (нужно!) […] Еще два языка, связанных с Ruby?

Я уже ответил за Duby , вот ответ для Surinx : это то, что Groovy должно было быть - легкий (на самом деле, ноль -weight) язык динамических экспрессивных сценариев для JVM. Кроме того, в настоящее время это самый простой способ поиграться с внутренними принципами invokedynamic. (Текущие снимки разработки JRuby 1.4 также поддерживают его, но это гораздо более сложный проект.)


Две вещи, которые я пропустил: Duby фактически использует вывод типа локальной переменной, поэтому, в отличие от Java, вам нужно только объявить типы параметров метода, но все внутри метода будет выводиться по типу.

А во-вторых, Duby и Surinx на самом деле не связаны с JVM. Так как они просто крадут свою семантику и системы типов с базовой платформы, их можно перенести практически в любое место, где у вас есть грубое отображение синтаксиса Ruby на концепцию платформы. Сверху головы я мог представить порты Duby на C, C ++, Objective-C (iPhone, кто-нибудь?), D , CLI и ActionScript и порты от Surinx до DLR , Smalltalk , Parrot , ECMAScript , Python , Perl , PHP и Objectice-C. Фактически, уже есть начало порта C Дуби .

6 голосов
/ 27 августа 2009

Mirah (ранее Duby) существует, поскольку статическая типизация может привести к значительному повышению производительности с помощью Java / Hotspot. Surinx (ранее Juby) - это то же самое, за исключением того, что он также использует новую функциональную возможность, появившуюся в JDK7, для дальнейшего повышения производительности.

Функция производительности обычно называется «invokedynamic», и хорошее объяснение доступно и в блоге Наттера .

4 голосов
/ 17 ноября 2009

Только что натолкнулся на это, прямо от самого Чарльза , который частично решает вопрос (о разнице между ними):

Что подводит меня к будущему Surinx. Это даже проще, чем Будущее Даби: слияние двух. Как Я работал над Суринксом и Дуби, мне стало очевидно, что они по сути один и тот же язык с различными механизмами отправки и требования к декларации типа. А также так как Даби мог легко относиться к нетипизированным или динамически типизированные выражения как требует динамического вызова, есть нет причин, по которым Суринкс не должен быть усваивается как особенность Дуби.

3 голосов
/ 27 августа 2009

Как и в случае с языками, мы их не создаем, потому что они нам «нужны». Люди создают их по любой причине, и если они нам не нужны, они остаются неясными.

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

2 голосов
/ 27 августа 2009

Я подозреваю, что в какой-то момент я смогу прототипировать кусок кода в Plain Ol 'Dynamic Ruby и, когда он работает, но должен быть значительно быстрее, портировать его, с относительно небольшими уровнями боли, на закрытие отношение, которое будет компилироваться в оптимизированный байт-код JITted Java. Или, возможно, IronRuby # .NET, Sapphire или что-то еще.

Графические манипуляции, тяжелая математика, искусственный интеллект и все в таком духе. Я подозреваю, что мне было бы весело сделать это ...

...