Комментарии 11
Если не секрет, какие накладные расходы на вызов? Например для первого простого примера — сколько раз в секунду на вашем железе дернуть можно?
+1
Немного не понял какие именно накладные расходы, на инициализацию интерпретатора или на вызов rb_string_eval?
Для второго прогнал такой тестик(первый пример миллион раз и без ввода/вывода):
pastie.org/368765
Результаты:
Для второго прогнал такой тестик(первый пример миллион раз и без ввода/вывода):
pastie.org/368765
Результаты:
$ sysctl -a | grep brand_string machdep.cpu.brand_string: Intel® Core(TM)2 Duo CPU T7500 @ 2.20GHz $ time ./calc real 0m4.193s user 0m4.096s sys 0m0.022s
0
имеет простое и удобное API
«API» в русском языке мужского рода.
0
спасибо за статью.
0
Захотел встроить ruby в проект. Взял ruby 1.9.1 и первый пример из статьи. Вот только проблема: если ввести первой строкой $a+$b+$c (переменная $c не определялась ранее) — под windows — access violation на адрес 0x00000000, debian — segmentation fault… Как-то странно движок реагирует… Нужна какая-то особая инициализация движка для обработки ошибок?
0
Ну движок вполне так себе обычно реагирует, так же как и stand-alone интерпретатор.
То есть, если встречает ошибку — печатает информацию о ней в stderr и вызывает exit с не нулевым кодом.
Но, а так как интерпретатор-то мы вызываем извне, то когда он выходит, запускающее приложение к этому не готово и всякие сегфолты и вылазят:)
Для обработки ошибок есть функция rb_protect. Ей передается функция-обертка, содержащая сишный эквивалент Ruby кода(rb_* функции). Последним аргументом передается число error.
Дальше механизм обработки ошибок такой:
— если error не нулевое, значит у нас ошибка, надо бы ее показать:)
— получаем глобальную переменную $!, содержащию информацию о последнем эксепшене: rb_gv_get("$!")
— конвертируем полученное значение сначала в Ruby строку, затем в сишную строку и выводим либо на экран, либо в лог, либо еще куда.
С примерами можно тут посмотреть(статья хоть и старая, но все еще актуальная):
metaeditor.sourceforge.net/embed/
А для интерпретации строк есть еще более простой способ, функция rb_eval_string_protect, которая вторым аргументом берет тот же error, что и rb_protect. И дальше, если error не нулевая — описанная выше последовательность действий.
Вот первый пример из статьи с обработкой ошибок во входной строке: pastie.org/1063030
То есть, если встречает ошибку — печатает информацию о ней в stderr и вызывает exit с не нулевым кодом.
Но, а так как интерпретатор-то мы вызываем извне, то когда он выходит, запускающее приложение к этому не готово и всякие сегфолты и вылазят:)
Для обработки ошибок есть функция rb_protect. Ей передается функция-обертка, содержащая сишный эквивалент Ruby кода(rb_* функции). Последним аргументом передается число error.
Дальше механизм обработки ошибок такой:
— если error не нулевое, значит у нас ошибка, надо бы ее показать:)
— получаем глобальную переменную $!, содержащию информацию о последнем эксепшене: rb_gv_get("$!")
— конвертируем полученное значение сначала в Ruby строку, затем в сишную строку и выводим либо на экран, либо в лог, либо еще куда.
С примерами можно тут посмотреть(статья хоть и старая, но все еще актуальная):
metaeditor.sourceforge.net/embed/
А для интерпретации строк есть еще более простой способ, функция rb_eval_string_protect, которая вторым аргументом берет тот же error, что и rb_protect. И дальше, если error не нулевая — описанная выше последовательность действий.
Вот первый пример из статьи с обработкой ошибок во входной строке: pastie.org/1063030
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Ruby и C. Часть 3.