Я собираюсь отвечать на вопросы не по порядку, начиная с самого простого:
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 Дуби .