LINUX.ORG.RU

JRuby 1.0 релиз


0

0

тихо и незаметно вышла первая версия JRuby, полностью совместимая с Ruby. JRuby - это реализация языка Ruby для виртуальной Java машины. В следущей версии обещают сделать компиляцию Ruby кода в Java классы.

Уже сейчас существует возможность запуска Ruby on Rails в виде war файлов (http://dist.codehaus.org/jruby/sample...)

Интересную презентацию о пользе и возможностях JRuby вы можете прочитать здесь http://dist.codehaus.org/jruby/talks/...

>>> Подробности



Проверено: svu ()

видимо java и ruby по отдельность тормозят уже недостаточно %)

Baz
()
Ответ на: комментарий от eugine_kosenko

А что обсуждать? Make work, not talk.

Мне вот интересно, действительно ли Луговский появился или под него косят? Всегда его интересно читать было, несмотря на мат.

cab ★★★★
()
Ответ на: комментарий от xonix

> Почему вы думаете, что я их не знаю на среднем уровне? Да я и написал, что это мои досужие домыслы.

Главный недостаток Питона - отсутствие полноценной анонимной функции. Из-за этого пришлось вводить генераторы и with. Причем тот же генератор писать намного менее приятно, чем использование блоков (анонимных ф-й) в Руби. За подробностями в топик про Перл. Там продолжается дискуссия http://www.linux.org.ru/jump-message.jsp?msgid=1956779#1965826

Cris
()
Ответ на: комментарий от cab

> Мне вот интересно, действительно ли Луговский появился или под него косят?

Если веталег бы он говорил интересные вещи, его бы не эмулировали так легко.

tailgunner ★★★★★
()
Ответ на: комментарий от eugine_kosenko

>> питон - это такой шланг, специально для сосания. Ничего удивительного в том, что он высасывает моск.

> Это все потому что ты Ruby ниасилил :-).

Оговорка по Фрейду? Или ярый фонатег питона перешел в другой лагерь? :)

Cris
()
Ответ на: комментарий от Grafter

>Ruby:

>puts "Hello, World!"

>надеюсь комментарии излишни

echo Hello, World!

я тоже надеюсь.

r ★★★★★
()
Ответ на: комментарий от KRoN73

>Не будет. Ruby, как я понимаю, динамический язык. JVM - статический. Придётся постоянно дёргать рефлекшны.

Ну и что? Какая разница? Или по твоему рефлективный вызов метода медленнее обычного?

r ★★★★★
()
Ответ на: комментарий от tailgunner

> Если веталег бы он говорил интересные вещи, его бы не эмулировали так легко.

http://www.linux.org.ru/jump-message.jsp?msgid=1965185#1965699 - очень на него похоже, а в топике про перл там, похоже, закос. ВСЛ никогда под анонимом не работал, вот в чем дело. И про Питон плохо не отзывался.

cab ★★★★
()
Ответ на: комментарий от cab

>ВСЛ никогда под анонимом не работал, вот в чем дело.

Нуда нуда. Селезнева.

r ★★★★★
()
Ответ на: комментарий от cab

> ВСЛ никогда под анонимом не работал

В последние месяцы - очень даже.

tailgunner ★★★★★
()
Ответ на: комментарий от r

>Или по твоему рефлективный вызов метода медленнее обычного?

Ну ты, блин, даёшь. Измерь как-нибудь на досуге.

KRoN73 ★★★★★
()
Ответ на: комментарий от r

> Или по твоему рефлективный вызов метода медленнее обычного?

Ну, раз в 15-100 медленнее, в зависимости от обстоятельств. В лучшем (нереальном, синтетическом) случае - в 4 раза медленнее.

anonymous
()
Ответ на: комментарий от KRoN73

>Да, комментарии излишни. Об уровне Вашего опыта программирования можно из этого примера сказать всё :D

Что же можно сказать из примера "Hello World" об уровне моего программирования?)

Тот пост предназначался человеку, который не мог понять, какой смысл в том, чтобы использовать какие-то другие языки на JVM кроме самой Java. Мне кажется что пример это ясно иллюстрирует. Или мне нужно было скопировать не менее банальный пример с факториалом?

Grafter
() автор топика
Ответ на: комментарий от KRoN73

>Ну ты, блин, даёшь. Измерь как-нибудь на досуге.

Ну ладно. Все равно цифры говорят за себя:

ruby:

#!/usr/bin/ruby
class Summator
def initialize()
@sum = 0;
end
def add(a)
@sum += a;
end
end
s = Summator.new;
t = Time.now
for i in 0...100000000
s.add(1);
end
print "by time ", (Time.now.usec - t.usec), "\n";

>>> by time 317152

Жаба:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Summator {
int sum = 0;

public void add( int a ) {
sum += a;
}

public static void main( String[] args ) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
Summator s = new Summator();
long l = System.currentTimeMillis();
for( int i = 0; i < 100000000; i++ )
s.add( 1 );
long direct = ( System.currentTimeMillis() - l );
Method method = Summator.class.getMethod( "add", int.class );
l = System.currentTimeMillis();
for( int i = 0; i < 100000000; i++ )
method.invoke( s, 1 );
System.out.println( "Reflective: " + ( System.currentTimeMillis() - l ) + " millis" );
System.out.println( "Direct: " + direct + " millis" );
System.out.println( "No optimization " + s.sum );
}

}

>>>>Direct: 364 millis
>>>>Reflective: 28160 millis

То бишь как не крути даже если рефлективный вызов в 100 раз медленнее обычного - это все равно в 10 раз быстрее руби.

jruby:

by time 596000

ндя:)

r ★★★★★
()
Ответ на: комментарий от cab

Кстати, в гостевухе лорквотес выяснилось, что Батарейкин в рид-онли тоже ходит на ЛОР.

anonymous
()
Ответ на: комментарий от Cris

> Оговорка по Фрейду?

Неоспоримый факт. Бугмакер надысь сам признавался. :-)

> Или ярый фонатег питона перешел в другой лагерь? :)

С какого бодуна? :-)

eugine_kosenko ★★★
()
Ответ на: комментарий от anonymous

> Так его обсуждать будем, когда хоть какой релизик выйдет.

Ну тогда пока можно обсудить вот это:

http://www.kenliu.name/software/lisp51/lisp51.html

Или вот это:

http://sply.livejournal.com/250496.html

"Вот, кстати, все эти Jsmth являются отличным примером, как сейчас можно быстро и просто создавать самому Domain Specific Languages. Ведь джава столько снимает забот по рулению памятью, компиляции, плюс дает доступ к куче готовых библиотек."

:-)

eugine_kosenko ★★★
()
Ответ на: комментарий от cab

> Make work, not talk.

1. От работы; кони дохнут (C)

2. Пусть комп работает. Он железный (C)

:-)

eugine_kosenko ★★★
()
Ответ на: комментарий от r

могу сам ответить - ничего. Сложит и не вякнет. На этом вся эстетика и кончается. Да еще и в 1000 раз медленее жабы.

r ★★★★★
()
Ответ на: комментарий от r

>То бишь как не крути даже если рефлективный вызов в 100 раз медленнее обычного - это все равно в 10 раз быстрее руби.

С этой точки зрения - оно, конечно :)

KRoN73 ★★★★★
()

>Мне интересно что он скажет на 5.minutes + 10.megabytes + 17.millimeters ?
в ответ на глупость ожидать чего-то умного не приходится...

anonymous
()
Ответ на: комментарий от r

> 5.minutes + 10.megabytes + 17.millimeters ?

Гы. Лет 15 назад, когда я писал курсовики по процессам и аппаратам,
я обсчитывал из на Си++. И юзал такие дефайны:

#define ata  *101325
#define g    *9.81

Ну и писалось потом  в духе:

double pressure = 5 ata;
// ...
double accel = 2 g;

Так и тут:
#define minutes *60
#define megabytes *1024*1024
#define millimeters *0.001

5 minutes + 10 megabytes + 17 millimeters

:)

KRoN73 ★★★★★
()
Ответ на: комментарий от anonymous

>в ответ на глупость ожидать чего-то умного не приходится...

Принцип GIGO был признан неверным лет 30 назад. Если не 40 :D

На любую глупость хорошая программа должна или выдавать ошибку или предупреждать.

KRoN73 ★★★★★
()

>На любую глупость хорошая программа должна или выдавать ошибку или предупреждать.
в корне не согласен - глупость бесконечна и дико изобретательна => не надо бежать за идиотами - это путь к личной деградации

anonymous
()
Ответ на: комментарий от anonymous

>в корне не согласен - глупость бесконечна и дико изобретательна => не надо бежать за идиотами - это путь к личной деградации

Отменим правила пожарной безопасности, дорожного движения, санитарные нормы и т.д.

Ведь глупость бесконечна и изобретательна - нафига делать тайп чек на пожарные лесницы, если можно просто не устраивать пожаров?:) Это ж очевидно:))

r ★★★★★
()
Ответ на: комментарий от r

ага
конечно
давайте всегда задаваться вопросами правильного расчета
5.minutes + 10.megabytes + 17.millimeters

anonymous
()
Ответ на: комментарий от romka

>Strongtalk - это продолжение идей Smalltalk и Self, виртуальная машина которого лягла в основу Java HotSpot. гугль знает больше ;-)

>http://smallthought.com/avi/?p=16

>http://groups.google.com/group/strongtalk-general/browse_thread/thread/5f19b8...

>http://strongtalk.org

>romka * (*) (11.06.2007 14:34:20)

strongtalk это гугно нелепое. Автор его продался в Microsoft, писать S#

anonymous
()
Ответ на: комментарий от anonymous

>но во всем надо знать меру

То что я привел - типичный пример из любого графического или полиграфического редактора. В том же PDF даже задается в чем там величины в метрах или дюймах. Выбрал по X дюймы а по Y миллиметры - и пошла жара.

r ★★★★★
()
Ответ на: комментарий от r

> Выбрал по X дюймы а по Y миллиметры - и пошла жара.

Наверное ты удивишься, но если нужно оператор + можно переопределить. Дальше при вызове методов .minutes + .megabytes + .millimeters создаем объекты нужных классов. В самом методе + ставим проверку на instance_of и все...

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

Еще вопросы есть?

Cris
()
Ответ на: комментарий от r

> Ну ладно. Все равно цифры говорят за себя:

У меня на 100000 циклах получились цифры, которые ничего подобного не говорят:

>java Summator Reflective: 152 millis Direct: 22 millis

> ruby call-01.rb by time 228633

И кстати у тебя код неправильный как минимум для руби. Он иногда показывает отрицательные цифры, usec - это милисекунды.

PS Интересно, почему у тебя комп в 100 раз быстрее моего? Я в сомнениях.

sv75 ★★★★★
()
Ответ на: комментарий от Cris

> Наверное ты удивишься, но если нужно оператор + можно 
переопределить. Дальше при вызове методов .minutes + .megabytes 
+ .millimeters создаем объекты нужных классов. В самом методе + 
ставим проверку на instance_of и все...

Гавняный способ - не Руби-вей. .minutes .hours возвращает объект типа 
Seconds с методом to_seconds. .millimeters, .cantimeters - Meter с 
методом to_meter. 

Реализация:

Делаем общую втулку для суммирования:

class SmartAdder
  def +(adder)
    method_name = "to_" + self.class.downcase  # to_meter, to_secords 
    self.send(method_name) + adder.send(method_name) 
  end
end

class Seconds
  import SmartAdder
end

class Meter
  import SmartAdder
end

Попробуешь смиксовать разные объекты - получишь No Method Exception.
За счет динамической структуры Руби создание классов типа секунды и т.п.
можно сделать еще более коротко и хитрожопо, плюс сделать такую обертку
для остальной арифметики. И где теперь Ява?

Cris
()
Ответ на: комментарий от r

> Да еще и в 1000 раз медленее жабы.

N = 10000:
>java Summator
Reflective: 143 millis
Direct: 2 millis
No optimization 20000

N = 100000:
> java Summator
Reflective: 247 millis
Direct: 13 millis
No optimization 200000

тут все нормально, но далее

N = 10000000:
>java Summator
Reflective: 1554 millis
Direct: 174 millis
No optimization 20000000

При увеличении цикла в 100 раз времени уходить стало больше в 10?

В общем это в принципе негодный тест, вотъ.

sv75 ★★★★★
()
Ответ на: комментарий от sv75

> тут все нормально, но далее

Кстати нет нормально, рефлектив стал жрать только в два раза больше времени при увеличении цила в 10 раз.

sv75 ★★★★★
()
Ответ на: комментарий от Cris

>Наверное ты удивишься, но если нужно оператор + можно переопределить.

Наверное я не удивлюсь, что можно многое сделать руками:)

r ★★★★★
()
Ответ на: комментарий от sv75

>В общем это в принципе негодный тест, вотъ.

Да уж - если написать jit-aware тест ждя жабы и напускать туда -server оптимизаций - я боюсь руби в такой жопе окажеться, что.....

r ★★★★★
()
Ответ на: комментарий от r

>>Наверное ты удивишься, но если нужно оператор + можно переопределить.

> Наверное я не удивлюсь, что можно многое сделать руками:)

Выше (под первым ответом) написан пример более Руби-вейный, где руками делается один раз и в одном месте. А покажи как эта строчка:

5.minutes + 10.megabytes + 17.millimeters

в Яве будет выглядеть :)?

Cris
()
Ответ на: комментарий от r

>Наверное ты удивишься, но если нужно оператор + можно переопределить.

Вопрос-то не в этом а в том что если ты все что можно начнешь так заворачивать проверками то и программу никогда не допишешь и не оценит никто этих сизифовых усилий Тут надо вовремя остановиться (что в реале и происходит) и собсно вывод один - _любая_ программа содержит баги - ничего идеального нет

anonymous
()
Ответ на: комментарий от anonymous

>"Ну ты сказал"(C) Это ж как надо ужраться, что бы было пофиг что у тебя под низом: Vista Ultimate за $400 или Linux free as a beer??
Мнение мягко говоря оторванное от реальности...

anonymous
()
Ответ на: комментарий от anonymous

> если ты все что можно начнешь так заворачивать проверками то и программу никогда не допишешь

Отмазка - просто классическая. Только ты немного промахнулся - выдал ее на ситуацию, которая может быть полностью проверена компилятором.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Други правильно ли я понимаю что вся прелесть JRuby в том что я в перспективе смогу использовать всё богатство Ява библиотек в Ruby коде?

anonymous
()
Ответ на: комментарий от tailgunner

> Отмазка - просто классическая. Только ты немного промахнулся - выдал ее на ситуацию, которая может быть полностью проверена компилятором.

Типа в Питоне есть статическая типизация и проверка типов? Или ты в одном топике на Питоне пишешь, а там где не удобно на С++?

Cris
()
Ответ на: комментарий от anonymous

> Други правильно ли я понимаю что вся прелесть JRuby в том что я в перспективе смогу использовать всё богатство Ява библиотек в Ruby коде?

Правильно. Но есть еще саб-фича, которая используется в одном из фаулеровских программных продуктов - дистрибуция в виде war файлов рельсовых проектов.

Cris
()
Ответ на: комментарий от tailgunner

> Отмазка - просто классическая. Только ты немного промахнулся - выдал ее на ситуацию, которая может быть полностью проверена компилятором.
Ruby компилятором??? кул.
Вообще без твоей помощи??? а ты не Alonso часом?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.