metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-08-28 02:31 pm

Странное

А вот почему ни в одном имеющемся под руками языке программирования нет функции "компилятор сам подставляет в вызов логгера имя функции, из которой его вызвали"?
Я понимаю, в log4net я могу подключить вывод фреймов стека, прямо в конфиге, но они достаточно знатно все тормозят в рантайме, а так бы на этапе компиляции подставлять имена функций в виде строковых констант.
В препроцессорах C и C++ есть __LINE__ и __FILE__, а больше я ничего подходящего вроде и не видел.

[identity profile] redplait.blogspot.com (from livejournal.com) 2012-08-28 11:35 am (UTC)(link)
functions inlining ?

[identity profile] http://users.livejournal.com/_slw/ 2012-08-28 11:38 am (UTC)(link)
/usr/src/contrib/binutils/bfd/bfd-in2.h: (warn_deprecated ("bfd_read", __FILE__, __LINE__, __FUNCTION__), \

[identity profile] justy-tylor.livejournal.com 2012-08-28 11:38 am (UTC)(link)
Бывает __func__, __FUNC__, __FUNCTION__, ...

В зависимости от компилятора.

[identity profile] falcrum.livejournal.com 2012-08-28 11:39 am (UTC)(link)
Уже задавался таким вопросом - было бы неплохо, да...

[identity profile] enternet.livejournal.com 2012-08-28 11:40 am (UTC)(link)
Да не надо это никому. Вот и весь секрет. Кому надо, тот и стек раскрутит и в лог запишет то, что захочет.

Уж на что в дотнете это просто делается, да и то бывает лениво. Последнее время компилирую всё с отладочной информацией, консольный вывод перенаправляю в файл. Вот и лог нахаляву.

[identity profile] potan.livejournal.com 2012-08-28 11:41 am (UTC)(link)
В Erlang и OCaml аналогичные фичи точно есть.

[identity profile] avnik.livejournal.com 2012-08-28 11:42 am (UTC)(link)
В питоне можно так сделать.
Стандартный logging не умеет, но http://packages.python.org/Logbook/ вроде бы умеет

(Anonymous) 2012-08-28 11:42 am (UTC)(link)
опана что я нашел:
http://msdn.microsoft.com/en-us/library/hh534540.aspx

[identity profile] volodymir-k.livejournal.com 2012-08-28 11:45 am (UTC)(link)
какое это имеет отношение к константам времени компиляции? никакого

[identity profile] volodymir-k.livejournal.com 2012-08-28 11:48 am (UTC)(link)
целую языковую фичу вводить ради одного, неочевидно нужного ли, применения?

если приспичит экономить полпроцента "тормозов", ну сделайте свой препроцессор

[identity profile] zerthurd.livejournal.com 2012-08-28 11:51 am (UTC)(link)
В Erlang точно нет (http://www.erlang.org/doc/reference_manual/macros.html)

[identity profile] plumqqz.livejournal.com 2012-08-28 11:53 am (UTC)(link)
perldoc -f caller

[identity profile] metaclass.livejournal.com 2012-08-28 11:58 am (UTC)(link)
2012 студия. Не прошло и 10 лет.

[identity profile] bambr77.livejournal.com 2012-08-28 12:04 pm (UTC)(link)
Это типа так:

if {$debugMode == 1} {puts [info level 0]}
Edited 2012-08-28 12:04 (UTC)

[identity profile] jakobz.livejournal.com 2012-08-28 12:13 pm (UTC)(link)
Только это должно быть не в языке, а в средствах интроспекции. Что-то типа
var caller = currentThread.Reflection.GetStack().GetItem(1);
log(caller.FunctionName + " " + caller.LineNumber);

[identity profile] jakobz.livejournal.com 2012-08-28 12:17 pm (UTC)(link)
О, а кстати в .net-то есть такое:
using System.Diagnostics;

// get call stack
StackTrace stackTrace = new StackTrace();

// get calling method name
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name);

[identity profile] metaclass.livejournal.com 2012-08-28 12:19 pm (UTC)(link)
В средствах, как минимум в дотнете есть. Подтормаживает.

[identity profile] xeno-by.livejournal.com 2012-08-28 12:20 pm (UTC)(link)
Помню, я где-то читал, что эта штука может факапнуться из-за инлайнинга.

[identity profile] xeno-by.livejournal.com 2012-08-28 12:20 pm (UTC)(link)
Плюс, да, тормозит.

[identity profile] vit-r.livejournal.com 2012-08-28 12:48 pm (UTC)(link)
Perl caller

Но я это использую только в одном месте: специально написанные функции типа warn и assert в модуле диагностики.

[identity profile] potan.livejournal.com 2012-08-28 12:48 pm (UTC)(link)

-module(f).
-export([start/0]).

start() ->
        io:write([?FILE, ?LINE]).

[identity profile] plumqqz.livejournal.com 2012-08-28 12:52 pm (UTC)(link)
(Thread.currentThread().getStackTrace())[2].getMethodName()

[identity profile] denisioru.livejournal.com 2012-08-28 01:05 pm (UTC)(link)
После обработки сборки обфускатором сиё будет выдавать невразумительный бред. И это другое, это run-time. А речь про compile time.

[identity profile] zelanton.livejournal.com 2012-08-28 01:27 pm (UTC)(link)
напиши уже парсер исходников, который будет расставлять соотв. константы.
Edited 2012-08-28 13:42 (UTC)

[identity profile] familom.livejournal.com 2012-08-28 01:56 pm (UTC)(link)
http://www.gnu.org/savannah-checkouts/non-gnu/libunwind/man/libunwind%283%29.html

[identity profile] migmit.livejournal.com 2012-08-28 02:48 pm (UTC)(link)
А в чём проблема использовать CPP с другими языками?

[identity profile] vaddimka.livejournal.com 2012-08-28 03:42 pm (UTC)(link)
__FUNCTION__ же
что в студии, что в gcc
для log4cxx элементарно делается дефайн который сам вставляет имя функции

[identity profile] slonopotamus.livejournal.com 2012-08-28 03:48 pm (UTC)(link)
В поддержке средой разработки.

[identity profile] thedeemon.livejournal.com 2012-08-28 04:59 pm (UTC)(link)
И где там пишется имя функции?

[identity profile] cottidianus.livejournal.com 2012-08-28 05:13 pm (UTC)(link)
http://pastebin.com/qFyLDW9Z строка 26, __func__

[identity profile] cottidianus.livejournal.com 2012-08-28 05:16 pm (UTC)(link)
причём __func__ - это не препроцессорная константа

[identity profile] redplait.blogspot.nl (from livejournal.com) 2012-08-28 06:15 pm (UTC)(link)
а при чем тут константы времени компиляции ? гуглить ключевое слово reflection например

[identity profile] max_posedon (from livejournal.com) 2012-08-28 06:39 pm (UTC)(link)
Фрагмент моей любимой библиотеки для логирования.

#define sd_journal_print(priority, ...) sd_journal_print_with_location(priority, "CODE_FILE=" __FILE__, "CODE_LINE=" _sd_STRINGIFY(__LINE__), __func__, __VA_ARGS__)

А ещё она сама добавляет: PID, UID, GID, CMDLINE, REALTIME_TIMESTAMP, MONOTONIC_TIMESTAMP, HOSTNAME и некоторые другие, менее важные параметры.

[identity profile] migmit.livejournal.com 2012-08-29 07:51 am (UTC)(link)
Не очень понял, какая поддержка требуется.

[identity profile] slonopotamus.livejournal.com 2012-08-29 04:05 pm (UTC)(link)
Да даже банальная подсветка синтаксиса накроется если среда не в курсе макросов.

[identity profile] adontz.livejournal.com 2012-08-30 12:34 am (UTC)(link)
Ну а IReadOnlyCollection только в 4.5 не ту же реакцию вызывает?

[identity profile] zamotivator.livejournal.com 2012-08-30 08:30 am (UTC)(link)
Берите emacs, легко дописать такую поддержку.