Автор Тема: Простая библиотека-парсер C/C++  (Прочитано 21378 раз)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Простая библиотека-парсер C/C++
« Ответ #15 : Май 14, 2013, 10:34:15 pm »
Однако в с++ такая система сборки именно благодаря особенностям идеологии самого с++
Нет. У С++ МНОГО систем сборок. Например та же вижуал штудия, autotools, and, cmake, jam, borland c++ builder, xcode и еще много-много разных. Впрочем почти все они могут собирать что угодно. Или даже не собирать а что-то скриптовать, что-то не связанное со сборкой проектов.

Ну, что С++-специфичного в том что ты увидел? По моему - ничего. Обычная раздельная компиляция :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Простая библиотека-парсер C/C++
« Ответ #16 : Май 14, 2013, 10:34:52 pm »
Да, по топику: советую посмотреть http://www.swig.org/
http://ru.wikipedia.org/wiki/Swig
Y = λf.(λx.f (x x)) (λx.f (x x))

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: Простая библиотека-парсер C/C++
« Ответ #17 : Май 15, 2013, 11:02:05 am »
Возможно специалисты прояснят мне мои смутные сомнения.
Тезис заключается в следующем: ANSI C++ ни разу не кроссплатформенен. Фактически, даже простейшие вещи, вроде соглашения о вызове или экспорта/импорта функций и переменных из динамических модулей нет. Без них нельзя, фактически, ничего. Сюда же отнесём пути в заголовочных файлах (include "путь, специфичный для ОС"), выравнивание данных (как описать универсально структуру с точностью до байта).

А с препроцессором (возможно, внешним) и утилитами для сборки при наличии трансляторов и костылей к ним можно любой язык назвать кроссплатформенным.

По поводу юниковых утилит для сборки. Разве не рудимент, что большинство из них не хочет понимать пути с пробелами/русскими символами? Или это только в окружении Windows такая проблема? У меня отваливаются самые разные программы на С++ при неудобном для них местоположении, даже Notepad++.

В юниксах отказались от реестра, но в результате имеем реестр в виде переменных окружения, необходимость прописываться в них, альтернативные пути папок с бинарниками и заведомую зависимость одной утилиты от прописанных в таком «реестре» десятка других программ. При переносе на Окна приходится каждую прописать в системный PATH, иначе что-то отваливается.

Можно возразить, что альтернативы нет: либо централизованный общий реестр, либо ручное редактирование переменных окружения. Но реестр понадёжнее будет, на мой взгляд. В реестре если ключу "git" соответствует конкретный путь, то повторная установка его попросту перепишет. С переменными окружения хуже. Дубликаты путей к папкам, пути с различным регистром.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Простая библиотека-парсер C/C++
« Ответ #18 : Май 15, 2013, 11:33:36 am »
Да, с PATH вечный гемор.

У меня например установлены и MinGW и cygwin.
Причем последний пришлось в обрезанном виде поставить только ради tecmake.
Соответственно оба прописаны в PATH.
Cmake часть утилит находит в первом и часть во втором. "make" вообще перестала определять... ручно теперь приходится указывать.

Долго тупил почему у меня MinGW стал как-то странно работать. Потом дошло, что cygwin в PATH стоит раньше MinGW...

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Простая библиотека-парсер C/C++
« Ответ #19 : Май 15, 2013, 12:11:59 pm »
Возможно специалисты прояснят мне мои смутные сомнения.
Тезис заключается в следующем: ANSI C++ ни разу не кроссплатформенен. Фактически, даже простейшие вещи, вроде соглашения о вызове или экспорта/импорта функций и переменных из динамических модулей нет. Без них нельзя, фактически, ничего. Сюда же отнесём пути в заголовочных файлах (include "путь, специфичный для ОС"), выравнивание данных (как описать универсально структуру с точностью до байта).
  • Соглашения о вызовах: да, в C++ не прописаны соглашения о вызовах. То есть конкретно вот как параметры передавать - через регистры? стек? в каком порядке? Более того, в кроссплатформенном языке невозможно прописать соглашение о вызовах, просто потому, что некоторые платформы могут тебе просто не позволить соблюсти это соглашение (то есть оно там будет либо не реализуемо вообще (скажем нет регистров общего назначения), либо крайне не эффективно). Собственно даже в том же компонентном паскале соглашения о вызовах не прописаны.
  • dll/so: эта штука суть внешняя относительно языка (и вообще говоря, от языка не зависит). Странно было бы пихать описание so'шек в сам язык. dll/so - сущность уровня операционной системы а не языка. Очевидно, что не во всех случаях целесообразно, да и вообще возможно, иметь so'шку.
  • Пути в #include: там действительно можно прописывать даже абсолютный путь специфичный для данной OS. Но зачем? По факту #include <blablabla> мало отличается от какого-нибудь IMPORT blablabla. Плюс по инклюду сразу видно - это подключается хедер внутри проекта, или же системный хедер (для системных #include <blablabla>, для проектный хедеров #include "blablabl"). Естественно по хорошему эти инклюды нужно хорошенько причесать, чтобы он стал таки уже не директивой препроцессора, и границы между модулями были в явном виде, но это уже совсем другие проблемы.

А с препроцессором (возможно, внешним) и утилитами для сборки при наличии трансляторов и костылей к ним можно любой язык назвать кроссплатформенным.
Препроцессор это часть языка С++, а не что-то сбоку прикрученное. Это часть стандарта. #include - это именно директива препроцессора. А система сборки нужна любому языку, если на нем предполагается писать что-то круче чем hello world. А если предполагается собирать в разных окружениях, то система сборки еще должна быть и достаточно умной, чтобы оценить возможности данной платформы и правильно собрать.

Нет, можно конечно и без системы сборки. Просто тогда все это придется каждый раз делать руками (с большой вероятностью ошибиться). Ну, то ilovb на самом деле мог не пользоваться системой сборки, а руками компилировать, каждую единицу компиляции, руками запускать компоновщик и так далее. Только вот это будет долго, нудно, и велик шанс ошибиться. Система сборки - это автоматизция рутины, и ничего больше.

По поводу юниковых утилит для сборки. Разве не рудимент, что большинство из них не хочет понимать пути с пробелами/русскими символами? Или это только в окружении Windows такая проблема? У меня отваливаются самые разные программы на С++ при неудобном для них местоположении, даже Notepad++.
Никогда с этим не сталкивался на *nix'ах. Полагаю это рудимент винды :-) В винде же до сих пор есть проблемы с русификацией (скажем берем произвольного буржуя, с его англоязычной виндой и пытаемся ему показать кириллицу - скорее всего будет фейл, а *nix'ах такой проблемы нет, там давно везде utf8, то есть ставим какой-нибудь debian, не ставим там поддержку русского, и, однако с кириллицей все хорошо. Единственное что нужно добавить для "кириллизации" - русскую раскладку клавы, чтобы печатать). В винде же до сих пор местами cp1251 (aka OEM), местами UCS-2, а местами UTF-16 (самое неудобное представление юникода из возможных).

В юниксах отказались от реестра, но в результате имеем реестр в виде переменных окружения, необходимость прописываться в них, альтернативные пути папок с бинарниками и заведомую зависимость одной утилиты от прописанных в таком «реестре» десятка других программ. При переносе на Окна приходится каждую прописать в системный PATH, иначе что-то отваливается.
Стоп. Как можно было отказаться от того, чего нет? :-) 1969 год. В какой OS был реестр, чтобы от него отказываться? :-)

В *nix'ах для конфигов, очевидно, есть файлы конфигурации. Обычно глобальное находится в /etc, а настройки характерные для данного юзера хранятся в /home/username/.programName . Приложения же (исполняемые файлы) обычно складываются в /usr/bin (а если что-то самосборное, то в /usr/local/bin). И никакого бардака, никаких 100500 записей в PATH.

Переменные окружения - это то, что может быть свое для КАЖДОГО запущенного приложения (уже в рамках какого-то конкретного пользователя). Таким образом мы можем настроить нечто общесистемное, нечто специфичное для пользователя и нечто специфичное для данного дерева процессов (в простейшем случае - конкретного приложения). По моему, очень удобно.

А те проблемы которые ты описываешь - это таки скорее проблема винды, которая тащит древние досовые традиции в современный мир. То есть описанная тобой проблема - это проблема доса и досовых утилит (когда еще и винды то не было, проблема уже была). MS когда создавала ДОС особо не вникая скопировала из *nix'ов переменные окружения, но остальное скопировать то ли не осилила, то ли не поняла зачем оно там такое есть. В результате имеем отсутствие четкого разделения что где лежит, имеем приложения ровным слоем разбросаннные по файловой системе как, как левая пятка юзера пожелает, и необходимость регулярно бегать и менять PATH, чтобы это все как-то шевелилось. Также они не додумались скопировать идею централизованного места хранения конфигов. Разграничение доступа.. Да много чего не было сделано.

Затем начали лепить винду, и поверх всего вот этого ужаса, они влепили еще реестр (часть конфигов хранится там, но не все! и без комментов), теперь ставится все по умолчанию в Program Files и Program Files(x86), появилось какое-то подобие /home/user директории, и так далее.

В результате имеем дикую смесь бульдога с носорогом и такие вот вопросы :-)

Можно возразить, что альтернативы нет: либо централизованный общий реестр, либо ручное редактирование переменных окружения. Но реестр понадёжнее будет, на мой взгляд. В реестре если ключу "git" соответствует конкретный путь, то повторная установка его попросту перепишет. С переменными окружения хуже. Дубликаты путей к папкам, пути с различным регистром.
Альтернатива безусловно есть - так как сделано в *nix'ах. И оно действительно хороша и проверена временем :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Простая библиотека-парсер C/C++
« Ответ #20 : Май 15, 2013, 12:45:28 pm »
Альтернатива безусловно есть - так как сделано в *nix'ах. И оно действительно хороша и проверена временем :-)

И все равно лукавишь. С PATH в юниксах гемор не меньший чем в виндах. Все пытаются туда прописаться. Начиная от питонов и заканчивая какими-нибудь тулзами для xcod'а. Я как-то решил разобраться почему у меня терминал тупит на взлете (тупо висел несколько секунд). Дотрэйсил в итоге до какой-то херни в /etc, которая делала какие-то манипуляции с PATH (парсила/дописывала) - в итоге этот PATH получался сколько-то мегабайт (сплошные дупликаты) и все тормозило. С "одинаковыми везде путями" тоже не все шоколадно - всякие sbin/opt/local не помню еще чего со своими usr/bin.

P.S. Да, и не надо говорить, что OSX - не юникс ;)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Простая библиотека-парсер C/C++
« Ответ #21 : Май 15, 2013, 01:00:34 pm »
Альтернатива безусловно есть - так как сделано в *nix'ах. И оно действительно хороша и проверена временем :-)

И все равно лукавишь. С PATH в юниксах гемор не меньший чем в виндах. Все пытаются туда прописаться. Начиная от питонов и заканчивая какими-нибудь тулзами для xcod'а. Я как-то решил разобраться почему у меня терминал тупит на взлете (тупо висел несколько секунд). Дотрэйсил в итоге до какой-то херни в /etc, которая делала какие-то манипуляции с PATH (парсила/дописывала) - в итоге этот PATH получался сколько-то мегабайт (сплошные дупликаты) и все тормозило. С "одинаковыми везде путями" тоже не все шоколадно - всякие sbin/opt/local не помню еще чего со своими usr/bin.

P.S. Да, и не надо говорить, что OSX - не юникс ;)
Стоп! У тебя в /etc было что-то исполняемое?! o_O

OS X безусловно Unix, но то что с ней делает apple... Там же приложения ставятся не как у нормальных юниксов, в /usr/bin, а в отдельные бандлы-каталоги, с идеей "все свое ношу с собой". Ну, то есть оно так даже удобно, если приложение не других никак не завязано и не должно вызываться кем-то еще, но вот как только в такой вот бандл пихают какой-нибудь питон, или там компилятор плюсов, или иную консольную утилиту, то все. Туши свет, кидай гранату. Ибо идет смешение двух концепций.

Поэтому консольное всякое лучше таки ставить через какой-нибудь brew или там macports наконец. Оно поставит это дело как надо, как принято в юниксах - в /usr/bin или /usr/local/bin .

А про XCode не надо.. оно вкорячивается в систему там как-то совсем перректально. Особенно начиная с версии 4.
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Простая библиотека-парсер C/C++
« Ответ #22 : Май 15, 2013, 01:41:41 pm »
Стоп! У тебя в /etc было что-то исполняемое?! o_O

Даже если оно было в /bin - это не важно. Важно само наличие некой херни, которая шаманит с PATH в системе, в которой PATH "почти не нужен".

Поэтому консольное всякое лучше таки ставить через какой-нибудь brew или там macports наконец. Оно поставит это дело как надо, как принято в юниксах - в /usr/bin или /usr/local/bin .

Как раз macports и ставит куда-то в opt/local. И поганит bashprofile на предмет этого самого PATH.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Простая библиотека-парсер C/C++
« Ответ #23 : Май 15, 2013, 01:49:52 pm »
Стоп! У тебя в /etc было что-то исполняемое?! o_O

Даже если оно было в /bin - это не важно. Важно само наличие некой херни, которая шаманит с PATH в системе, в которой PATH "почти не нужен".
Если оно портит глобальный PATH... Это уже за гранью добра и зла. Откровенно говоря, в линуксах с подобным не сталкивался. Да и на маке тоже (хотя на маке я под мак и не пишу, пишу под iOS).

Ну, то есть понятно, что при должной рукожопости можно поставить раком любую систему. Кстати, ничто не помешало бы этой кривой штуке и в винде многомегабайтный PATH соорудить. А еще можно в винде же раздуть реестр до невероятных размеров (а он таки в ОЗУ загружен), и тогда колом встанет уже вся система, а не один терминал.

Как раз macports и ставит куда-то в opt/local. И поганит bashprofile на предмет этого самого PATH.
Поэтому и появился homebrew :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Простая библиотека-парсер C/C++
« Ответ #24 : Май 15, 2013, 04:39:59 pm »
У меня например установлены и MinGW и cygwin.
Причем последний пришлось в обрезанном виде поставить только ради tecmake.
Соответственно оба прописаны в PATH.
Cmake часть утилит находит в первом и часть во втором. "make" вообще перестала определять... ручно теперь приходится указывать
Если компиляция запускалась из баша, то рекомендую выбрать один из следующих пунктов:
1. Удалить оба пути из PATH, но сделать на рабочем столе два ярлыка. Один будет запускать сигвиновский баш, а второй - баш из мингв. В bashrc для каждой из этих сред добавить строчку.
export PATH=${PATH}:/usr/binТаким образом, у каждой из сред будут свои не пересекающиеся наборы файлов (настройки, библиотеки и исполнимые файлы).
2. [после размышлений решил, что второй способ не нужен, потому что действия почти как в первом, но более сложные].

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

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Простая библиотека-парсер C/C++
« Ответ #25 : Май 15, 2013, 06:00:07 pm »
Похоже я недооценил pure Lua: http://repl.it/FFp/1

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Простая библиотека-парсер C/C++
« Ответ #26 : Май 15, 2013, 06:03:15 pm »
Ну и наконец, последний вариант - удалить нафиг мингв и доустановить его в сигвин (через стандартный инсталлятор).
Вот я все больше к этому последнему склоняюсь.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Простая библиотека-парсер C/C++
« Ответ #27 : Май 15, 2013, 06:11:32 pm »
Похоже я недооценил pure Lua: http://repl.it/FFp/1
Это ты еще до регулярок не добрался :-) На самом деле, это ж от языка опять же не зависит. Просто либа.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Простая библиотека-парсер C/C++
« Ответ #28 : Май 15, 2013, 06:42:06 pm »
1. Это по сути регулярки и есть
2. Либа эта стандартная и "вшита" в язык.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Простая библиотека-парсер C/C++
« Ответ #29 : Май 15, 2013, 07:22:46 pm »
Прототип конвертера: http://repl.it/Ixw
 :)
« Последнее редактирование: Май 15, 2013, 07:24:25 pm от ilovb »