Автор Тема: Oberon-07M - Нужен ли препроцессор?  (Прочитано 6554 раз)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Oberon-07M - Нужен ли препроцессор?
« : Март 26, 2011, 09:06:01 pm »
Цитировать
Хорошо, для констант это можно обойти, но в h файлах очень много разных #ifdef не только для констант, но и для структур и функций, например:
#if(WINVER >= 0x0400)
typedef struct tagMENUITEMINFOA
{
UINT cbSize;
UINT fMask;
UINT fType; // used if MIIM_TYPE (4.0) or MIIM_FTYPE (>4.0)
UINT fState; // used if MIIM_STATE
UINT wID; // used if MIIM_ID
HMENU hSubMenu; // used if MIIM_SUBMENU
HBITMAP hbmpChecked; // used if MIIM_CHECKMARKS
HBITMAP hbmpUnchecked; // used if MIIM_CHECKMARKS
ULONG_PTR dwItemData; // used if MIIM_DATA
LPSTR dwTypeData; // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
UINT cch; // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
#if(WINVER >= 0x0500)
HBITMAP hbmpItem; // used if MIIM_BITMAP
#endif /* WINVER >= 0x0500 */
} MENUITEMINFOA, FAR *LPMENUITEMINFOA;

Здесь в зависимости от версии Windows запись содержит или не содержит одно поле.
Кроме того, некоторые функции объявлены только для новых версий Windows, и может получиться так, что программист будет расчитывать, что данная функция есть, раз она описана, а при запуске программы на более старой Windows, программа не найдет данную функцию.
Нужна условная компиляция, либо нужно создавать несколько вариантов модулей-держателей констант, для каждой из платформы по отдельности (ведь это мы влезаем в прямое произведение всех констант, то есть в клинических случаях таких модулей может быть МНОГО), либо генерить такие модули-держатели констант отдельной тулзой. В любом случае вводить ради всего лишь этого в язык препроцессор ни в коем разе не нужно.

Как делается условная компиляция культурно, без препроцессора, можно посмотреть в языке D и в Модуле-2.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M - Нужен ли препроцессор?
« Ответ #1 : Март 26, 2011, 09:11:12 pm »
Собственно, как сделано в Модуле можно посмотреть тут:
http://liveweb.waybackmachine.org/http://modula2.net/resources/M2R10.pdf
http://modula2.net/resources/M2R10.pdf

раздел 11.1.1

Как сделано в D можно посмотреть тут: http://www.digitalmars.com/d/2.0/version.html
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M - Нужен ли препроцессор?
« Ответ #2 : Март 26, 2011, 09:12:09 pm »
Но вообще, лично я, за внешнюю тулзу которая сгенерит модули с нужными константами проанализировав текущее окружение и параметры.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re:Oberon-07M - Нужен ли препроцессор?
« Ответ #3 : Март 26, 2011, 09:26:49 pm »
Вот никогда не понимал, зачем нужен этот учёт разных версий винда при компиляции программы. Ведь если программу скомпилированную под WINVER >= 0x0500 запустить под WINVER < 0x0500 -- проблемы какие-то будут.
Значит программа должна при старте (а не компилятор при компиляции) выяснять версию окружения и загружать соответствующие модули.
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M - Нужен ли препроцессор?
« Ответ #4 : Март 26, 2011, 09:32:38 pm »
Вот никогда не понимал, зачем нужен этот учёт разных версий винда при компиляции программы. Ведь если программу скомпилированную под WINVER >= 0x0500 запустить под WINVER < 0x0500 -- проблемы какие-то будут.
Значит программа должна при старте (а не компилятор при компиляции) выяснять версию окружения и загружать соответствующие модули.
Вай! Какая такая динамическая подгрузка модулей при статической компоновке программы?
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re:Oberon-07M - Нужен ли препроцессор?
« Ответ #5 : Март 26, 2011, 09:41:15 pm »
Вай! Какая такая динамическая подгрузка модулей при статической компоновке программы?
А чёй-то вдруг она статическая?
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M - Нужен ли препроцессор?
« Ответ #6 : Март 26, 2011, 09:45:43 pm »
Вай! Какая такая динамическая подгрузка модулей при статической компоновке программы?
А чёй-то вдруг она статическая?
А где ты увидел в Oberon-07M динамическую компоновку? Алсо она очень часто не нужна. А иногда и не возможна.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

AlexIljin

  • Newbie
  • *
  • Сообщений: 25
    • Просмотр профиля
Re:Oberon-07M - Нужен ли препроцессор?
« Ответ #7 : Март 26, 2011, 10:04:16 pm »
Вот никогда не понимал, зачем нужен этот учёт разных версий винда при компиляции программы. Ведь если программу скомпилированную под WINVER >= 0x0500 запустить под WINVER < 0x0500 -- проблемы какие-то будут.
Значит программа должна при старте (а не компилятор при компиляции) выяснять версию окружения и загружать соответствующие модули.
ВОТ! Совершенно верно. Именно поэтому мы либо должны рассчитывать на маленькую версию винды, либо требовать большую при запуске, либо решать в процессе работы, какие фичи нам можно использовать, а какие - нет. Ни одна из этих задач не решается препроцессором. Он просто не нужен. Дополняет документацию, да, но не более того.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M - Нужен ли препроцессор?
« Ответ #8 : Март 26, 2011, 10:46:30 pm »
ВОТ! Совершенно верно. Именно поэтому мы либо должны рассчитывать на маленькую версию винды, либо требовать большую при запуске, либо решать в процессе работы, какие фичи нам можно использовать, а какие - нет. Ни одна из этих задач не решается препроцессором. Он просто не нужен. Дополняет документацию, да, но не более того.
Просто маленькой версией не обойдешься, ибо обратная совместимость часто ломается (я не обязательно винду имею ввиду, винда так, частный не интересный случай). Алсо динамической компоновки вообще говоря может не быть. Но и препроцессор в ЯЗЫКЕ не нужен. Ни в коем ни в разе. Прагмы я тоже не люблю, хотя это конечно уже лучше.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Rifat

  • Jr. Member
  • **
  • Сообщений: 62
    • Просмотр профиля
Re:Oberon-07M - Нужен ли препроцессор?
« Ответ #9 : Март 27, 2011, 08:41:32 am »
Изменять язык для препроцессора я не планирую. Я думаю, это это должна быть внешняя утилита, которая сначала обрабатывает файлы препроцессинга (допустим *.pre) и генерит на основе их ob7 файлы.

Кто что думает по поводу книги "Расширяемые программы" Горбунов-Посадов? Можно ли применить оттуда какие-нибудь идеи?

Димыч

  • Newbie
  • *
  • Сообщений: 16
    • Просмотр профиля
Re:Oberon-07M - Нужен ли препроцессор?
« Ответ #10 : Март 29, 2011, 01:17:48 am »
Изменять язык для препроцессора я не планирую. Я думаю, это это должна быть внешняя утилита, которая сначала обрабатывает файлы препроцессинга (допустим *.pre) и генерит на основе их ob7 файлы.

Кто что думает по поводу книги "Расширяемые программы" Горбунов-Посадов? Можно ли применить оттуда какие-нибудь идеи?
http://keldysh.ru/gorbunov/index.htm

У меня эта книжка на полке. Два раза читал, до применения руки не дошли, к сожалению.

Для тех, кто не в теме, попробую вкратце пояснить, в чем суть.
Для безболезненного (т.е. без модификации исходного кода) расширения программы используется механизм т.н. "гнезд", т.е. своеобразных разъемов в коде, в который можно вставлять куски кода. Причем речь идет именно о коде во время компиляции, а не о runtime. Использование гнезд позволяет перейти от переписывания кода к дописыванию того, что вставляется в гнезда и последующей сборке. Программирование становится сборочным.

Гнезда, могут использоваться не только по тексту (скажем, в отдельных процедурах или даже в модулях), но и в повторяющихся конструкциях, например, в циклах или в метках case, для чего в гнездах используется соответствующий синтаксис.

Идея в книге высказывается замечательная. Проблема лишь в том, что код при описываемом подходе становится двумерным. Это заметно усложняет транслятор и
дополнительно меняет подход к созданию программы - приходится думать о компоновке и проектировании раньше, чем что-либо начинать писать (что, впрочем, скорее хорошо, чем плохо).

Идея создания гнезд в коде перекликается с точками расширения в ББ и технологией (паттерном?) inversion of control, но эта лишь малая часть из предложенного в книге. Кроме того, это отчасти похоже на обобщенное программирование, хотя подходы Ada к обобщенному программированию в книге разносятся в пух и прах.

Для меня остался нераскрытым вопрос типизации гнезд, т.е. механизм соотнесения между собой гнезда и его содержимого. Кроме того, не совсем не раскрыт вопрос вложения гнезд (в C++, насколько я знаю, вложение templates может привести к огромным накладным расходам при трансляции, поправьте, если не так).

Идея, конечно, просто просится к реализации.

Rifat

  • Jr. Member
  • **
  • Сообщений: 62
    • Просмотр профиля
Re:Oberon-07M - Нужен ли препроцессор?
« Ответ #11 : Март 29, 2011, 05:35:07 am »
Идея с гнездами конечно интересная, но думаю, что это может усложнить программирование. Допустим, я открываю какой-нибудь исходник и вижу там 10 гнезд, чтобы понять что делает исходник мне надо будет открыть каждое из этих гнезд и возможно просмотреть еще и варианты этих гнезд, чтобы убедиться, что программа будет правильно работать с различными вариантами.

Илья Ермаков

  • Full Member
  • ***
  • Сообщений: 177
    • Просмотр профиля
    • OberonCore
Re:Oberon-07M - Нужен ли препроцессор?
« Ответ #12 : Март 29, 2011, 07:32:39 am »
У Горбунова-Посадова интересная проработка идей гнёзд, красивая, но надо понимать, что он "живёт" в рамках специфических требований, возникающих в очень ресурсоёмких вычислительных задачах.
В обычных случаях лучше решать всё это методами КОП и не откатываться назад к "модульности" на уровне исходного текста.

Димыч

  • Newbie
  • *
  • Сообщений: 16
    • Просмотр профиля
Re:Oberon-07M - Нужен ли препроцессор?
« Ответ #13 : Март 29, 2011, 04:28:08 pm »
Идея с гнездами конечно интересная, но думаю, что это может усложнить программирование. Допустим, я открываю какой-нибудь исходник и вижу там 10 гнезд, чтобы понять что делает исходник мне надо будет открыть каждое из этих гнезд и возможно просмотреть еще и варианты этих гнезд, чтобы убедиться, что программа будет правильно работать с различными вариантами.

Программирование становится сборочным. Важным становится не сам исходник, а "конфигурация", т.е. набор гнезд и их содержимое. На это надо смотреть в первую очередь. Только потом в исходник. Я, впрочем, соглашусь, что это усложняет (ввиду непривычности) создание программ.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M - Нужен ли препроцессор?
« Ответ #14 : Март 29, 2011, 04:58:03 pm »
Задо будет почитать. Но по описанию что тут привели -- подозрительно на шаблоны смахивает :-)
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"