Pull to refresh

Comments 11

Если не секрет, какие накладные расходы на вызов? Например для первого простого примера — сколько раз в секунду на вашем железе дернуть можно?
Немного не понял какие именно накладные расходы, на инициализацию интерпретатора или на вызов rb_string_eval?
Для второго прогнал такой тестик(первый пример миллион раз и без ввода/вывода):
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
Спасибо, то что нужно. Значит 250 тыс. вызовов в секунду.
имеет простое и удобное API

«API» в русском языке мужского рода.
Дайте ссылку на правило, исправлю. При переводе ППИ(Прикладной програмный интерфейс) — согласен. А вот при латинском написании мужской и средний род используется примерно одинаково.
Почитал, спасибо.
«Аббревиатуры, оканчивающиеся на гласный звук, не склоняются и преимущественно относятся к среднему роду»
Слово «Интерфейс» в аббревиатуре «API» мужского рода. ;)
Захотел встроить ruby в проект. Взял ruby 1.9.1 и первый пример из статьи. Вот только проблема: если ввести первой строкой $a+$b+$c (переменная $c не определялась ранее) — под windows — access violation на адрес 0x00000000, debian — segmentation fault… Как-то странно движок реагирует… Нужна какая-то особая инициализация движка для обработки ошибок?
Ну движок вполне так себе обычно реагирует, так же как и 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
Sign up to leave a comment.

Articles