Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.04.14;
Скачать: [xml.tar.bz2];

Вниз

Разница между компиляторами   Найти похожие ветки 

 
Антон   (2003-03-24 14:33) [0]

Никак не могу понять, почему равноценные проекты компилятор Delphi компилирует раз в 10 как минимум быстрее, чем C++ Builder.
Может кто-нибудь объяснит, с чем связана такая разница.


 
Fiend   (2003-03-24 14:37) [1]

с принципом работы компилятора


 
Digitman   (2003-03-24 14:37) [2]

Как минимум потому, что Паскаль-компилятор в составе Делфи - однопроходный, компилятор C++ в составе Билдера - многопроходный


 
Ihor Osov'yak   (2003-03-24 15:43) [3]

в дополнение Digitman © (24.03.03 14:37)

я, во всяком случае не видел многопроходных паскалевских компиляторов ..

имхо, паскаль изначально проектировался на возможность компиляции за один проход.

зы - особенно умиляет то, как сишный компилятор один и тот же хидер несколько десятков раз перечитывает..


 
Игорь Шевченко   (2003-03-24 15:45) [4]

Антон (24.03.03 14:33)


> Может кто-нибудь объяснит, с чем связана такая разница.


А не ковырять Гондурас не помогает ? :-)


 
vuk   (2003-03-24 16:11) [5]

Ну нет в С/C++ модульности, вот компилятор и напрягается.


 
uw   (2003-03-24 16:59) [6]

Вирт спроектировал Pascal в соответствии с теорией построения компиляторов. На каждом шаге разбора достаточно иметь текущий токен и уметь заглядывать на один символ вперед, дошел до разделителя - никуда больше смотреть не надо. Все дальнейшие модификации Pascal"а непременно следовали этому принципу.

Не то в Си. В рекламе на него говорится, что Cи сочиняли практики, которые делали язык для практиков. О теории не очень-то думали, если вообще. Вот и получилось. Но цели своей достигли, однако.


 
Anatoly Podgoretsky   (2003-03-24 17:05) [7]

А по словам разработчиков Си изобрели для обеспечения больших зарплат


 
uw   (2003-03-24 17:14) [8]

Нет, это С++ был изобретен для этой цели - факт!


 
DiamondShark   (2003-03-24 17:17) [9]


> что Cи сочиняли практики, которые делали язык для практиков


Конечности надо обрубать за такую практику.


 
Игорь Шевченко   (2003-03-24 17:18) [10]

DiamondShark © (24.03.03 17:17)

Руки коротки :-)


 
Danilcha   (2003-03-24 17:21) [11]

Вы бы не с Билдером, а с каким-нибудь VC, gcc или Intel C++ попробовали...


 
uw   (2003-03-24 17:40) [12]

>Danilcha © (24.03.03 17:21)
>Вы бы не с Билдером, а с каким-нибудь VC, gcc или Intel C++ попробовали...

Пробовали. Самое сильное впечатление на меня произвел тот факт, что из конструктора нельзя вызвать виртуальный метод. Т.е. вызвать-то можно, только он в конструкторе как бы и не виртуальный. А вот гиганты из Борланда сумели преодолеть эту неприятность; я в свое время до их способа не додумался.


 
wicked   (2003-03-24 17:43) [13]


> Самое сильное впечатление на меня произвел тот факт, что
> из конструктора нельзя вызвать виртуальный метод

дааа?.... а где можно об этом поподробней почитать?....


 
uw   (2003-03-24 17:47) [14]

А что читать? Просто пишешь и наблюдаешь, как выполняется.


 
wicked   (2003-03-24 17:49) [15]

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


 
uw   (2003-03-24 18:27) [16]

В деструкторе-то все работает. Приведи коротко пример с определением родительского и наследуемого классов, скажи, какой у тебя компилятор, если речь идет о С++, конечно.


 
jack128   (2003-03-24 19:52) [17]

wicked © (24.03.03 17:43)
набери в поиске в форуме "c/c++" rsdn.ru "виртуальные методы в конструкторе" или что нибудь подобное - там несколько раз эта тема подымалась и подробно обсасывалась "почему и зачем именно так, а не иначе"


 
DiamondShark   (2003-03-24 21:34) [18]


> wicked © (24.03.03 17:49)
> ну дык у меня виртуальные функции вызываются и из конструктора,
> и из деструктора....
> вот и думаю, как бы не вышло чего.... но пока всё работает
> как надо..... :)


Вызываться-то они будут, вот только вызовы будут не полиморфными.


 
neuro   (2003-03-25 02:23) [19]

2DiamondShark: интересно, как может быть ВЫЗОВ полиморфным? Я всегда думал, что это особенность классов..


 
DiamondShark   (2003-03-25 10:28) [20]


> neuro © (25.03.03 02:23)


А эта "особенность классов" чем, по-вашему, обеспечивается? Святым духом?


 
uw   (2003-03-25 10:33) [21]

>neuro © (25.03.03 02:23)
>DiamondShark © (25.03.03 10:28)

Да, вот религии сюда не надо!




 
Style   (2003-03-25 12:27) [22]

Не надо на CPP наезжать! :)
Все потому что он каждый Header перебилдивает!
#include <windows.h>

зато в C можно такой маленький EXEшник сделать!





 
DiamondShark   (2003-03-25 13:04) [23]


> Style (25.03.03 12:27)


Ура! Наконец-то мы узнали, для чего был создан Ц.


 
Anatoly Podgoretsky   (2003-03-25 13:09) [24]

http://podgoretsky.com/ftp/Docs/C/Straustroop/Interview.html


 
Style   (2003-03-25 13:26) [25]

DiamondShark >> Ж:)

У Си очень много достоинств.

Ну а Delphi он же на много проще в основном синтаксис!


 
Ihor Osov'yak   (2003-03-25 13:30) [26]

2 Style (25.03.03 12:27)

не сильно меньше и не сильно больше, чем в делфи, при использовании аналогичных подходов


 
DiamondShark   (2003-03-25 14:03) [27]


> Style (25.03.03 13:26)
> У Си очень много достоинств.


И дальше следует длинный список достоинств...


 
Style   (2003-03-25 14:15) [28]

Ihor Osov"yak>>
Да вообще само ООП ничем неотличается во многих языках!

DiamondShark>> Вот только не надо меня допытывать :)

Что лично мне нравиться
1. Работа с Pointerами
2. Замудренный, но красивый синтаксис
3. Даже то что переменную можно объявить где-угодно.
4. Возможность изменения самого языка
хотим паскаль пожалуйса
#Define begin {
#Define end }
и вместо блоков пишем begin
end :)
5. То что недавно обсуждалось в форуме: case можно применять и
для значений String и других объектов!

Конечно это все может и удобства может и неудобства которые могут вызывать путаницу у программера :)
Но все же CPP никто не отменял и пишут на нем довольно серьезные вещи.
Я например переходил с C++ на Delphi. Паскаль не знал вообще!
Довольно легко воспринял этот переход. А вот с Delphi переползти
на C по моему сложнее!


 
DiamondShark   (2003-03-25 14:32) [29]


> Style (25.03.03 14:15)


Да ладно! Я не придираюсь...


 
vuk   (2003-03-25 14:39) [30]

to Style:

>Работа с Pointerами
Из-за которых, в общем-то, большинство багов и существует. В том числе и в операционных системах.

>Замудренный, но красивый синтаксис
Ну, замудрёный - это да. Насчет красивости совсем не уверен. Кто-то из сишников, помнится, сам говорил, что этот язык Write Only.

>Даже то что переменную можно объявить где-угодно
Не совсем понятно, почему это плюс. Хотя это дело привычки...

>и вместо блоков пишем begin end
А через пол-года долго вспоминаем, а нафига, собственно?

>case можно применять и для значений String и других объектов
Ну да, самое главное в языке это case :o) Тогда уж на VB пишите.




 
Игорь Шевченко   (2003-03-25 14:54) [31]

vuk © (25.03.03 14:39)

На любом языке можно написать write-only программу.


 
vuk   (2003-03-25 14:56) [32]

to Игорь Шевченко:
>На любом языке можно написать write-only программу
Эт точно. :o)


 
Style   (2003-03-25 14:57) [33]

vuk >>
Ну вот ко всем пунктам нашлись отрицания.
Ну а мне все-равно нравится этот язык.
Я вырасил свое отношение к нему. Хотя уже на C года 4 не пишу. Пока нет такой необходимости!


 
vuk   (2003-03-25 15:02) [34]

to Style
>Ну вот ко всем пунктам нашлись отрицания.
Не отрицания это, а просто мнение (скромное достаточно) у меня такое. :o)



 
Style   (2003-03-25 15:08) [35]

vuk>>
И разошлись они мирно! Каждый со своим мнением :)


 
uw   (2003-03-25 15:36) [36]

На самом деле, С - нормальный язык, выразительный и понятный. Я на нем контроллеры пишу и не испытываю никакого непрятия. А то, что компилируется медленно, так Паскаля приличного там и вовсе нет.


 
SoftOne   (2003-03-26 03:25) [37]

2 uw © (25.03.03 15:36)
Согласен, Паскаля там нет. Не только приличного, но и хотя бы нормального. А вот о "медленности", то все предыдущие высказывания о скорости и одно(много)проходности компиляторов, все таки относились к компиляторам С и Паскаля для PC, а не для микропроцессоров. Имхо, если я правильно Вас понял.


 
DiamondShark   (2003-03-26 10:31) [38]


> SoftOne © (26.03.03 03:25)


А разницы никакой, что для ПиСи, что для микроконтроллеров. Разве что во втором случае программы короче -- не так заметно.

ЗЫ
Вообще-то, для некоторых МК были компиляторы Модулы-2.


 
[NIKEL]   (2003-03-26 16:17) [39]

Anatoly Podgoretsky © (24.03.03 17:05)
А по словам разработчиков Си изобрели для обеспечения больших зарплат
uw © (24.03.03 17:14)
Нет, это С++ был изобретен для этой цели - факт!


Нет, для больших зарплат изобрели новые технологии (в том числе и за обучение этим технологиям и сопровождение) :)

зы - особенно умиляет то, как сишный компилятор один и тот же хидер несколько десятков раз перечитывает..

вообще для этого придумано директивы препроцессора и кэшируемые хидеры...
да...

Никак не могу понять, почему равноценные проекты компилятор Delphi компилирует раз в 10 как минимум быстрее, чем C++ Builder.
Может кто-нибудь объяснит, с чем связана такая разница.

Я тебе(и всем кто интересуется) объясню основные принципы:

Что делается при компиляции (С++)
1 - препроцессор, в исходный код вставляется макросы и заголовочные файлы
2 - проверка меток и синтаксический разбор, анализируется выходной код препроцессора, проверка меток и тд. при этом создается синтаксическая иеархическая структура для генерации кода
3 - собственно,генерация кода, для каждой команды генерируется собственные машинные команды данного PC, это все оптимизируется с помощью спаривания инструкций и других операций(все это зависит конечно от типа процессора), полученный маш.код записывается на диск - это и есть объектный файл(*.obj), при ниобходимости в конец файла записывается отладочная инфа.
4 - компановка, считываются все определения сегментов объектного файла и создается глобальная таблица символов(которые необходимы для генерации конечного файла). Затем компоновщик комбинирует откомпилированный код из заданных модулей, ресурсы(файлы форм) со статическими библиотеками и тд.

В Buildere, компилятор использует так называемую рекурсивную нисходящую модель с неограниченным предварительным просмотром... :) если говорить по русски то это значит, что предварительная обработка, проверка меток, синтаксический анализ и генерация кода выполняется одновременно и рекурсивно во время компиляции, а не за счет нескольких проходов, как в некоторых других компиляторах...

Кстати, для заметки
Builder работает достаточно быстро, он компилирует код на С++ почти в 2 раза быстрее чем GNU C++ и практически также быстро как Visual C++... но гораздо медленнее чем Delphi, Почему? Да потому что:
- В C++ предусмотренно использование заголовочных файлов а в Pascal - нет. (они также могут быть вложенными)
- В С++ используются макросы а в Pascale - нет
- В С++ применяются шаблоны а в Pascale - нет, шаблоны - это достаточно сложные для анализа структуры
- ну и семантика С++ должна удовлетворять стандарту ANSI.
А вот грамматика С++ много сложнее грамматики Delphi которая основана на Паскале и соотвутствует только стандарту Borland

Ну и в конце можно сказать так

С++ позволяет использовать более гибкие приемы программирования, чем Object Pascal и это факт. Конечно такая гибкость достигается за счет увелечения времени и размера кодирования.
А ускорять компиляцию можно очень многими способами, методов очень много. Так что не надо наезжать на С++.



 
DiamondShark   (2003-03-26 22:24) [40]


> [NIKEL] © (26.03.03 16:17)


> вообще для этого придумано директивы препроцессора и кэшируемые хидеры...


Ох придуманы...
Прекомпилированные включаемые файлы, конечно, могли бы сущетвенно ускорить процесс компиляции, если бы не одно НО. Те самые директивы препроцессора.
Ведь что получаетя? Каждый включаемый файл может компилироваться совершенно по разному в зависимости от внешних по отношению к этому файлу условий. Каждый включающий файл может определить свой набор #define-ов, от которых может зависеть включаемый файл.
И совершенно не важно, использует ли конкретная программа такие заумные приёмы. Главное -- эта избыточность введена в язык, и компилятор должен это учитывать.


> Я тебе(и всем кто интересуется) объясню основные принципы:

Ну попробуй...


> 1 - препроцессор, в исходный код вставляется макросы и заголовочные файлы


Иными словами, любая, сколь угодно сложная программа собирается на уровне исходного кода в монолитную. В принципе, на этом можно было бы и закончить все объяснения.


> 4 - компановка


Комп оновка -- есть пережиток прошлого. Нет никаких объективных оснований к тому, чтобы использовать устаревшие промежуточные форматы.


> В Buildere, компилятор использует так называемую рекурсивную
> нисходящую модель с неограниченным предварительным просмотром


Если говорить по-русски, компилятору требуется многократный просмотр исходного текста. Не мучал вопрос почему? А язык такой.


> В C++ предусмотренно использование заголовочных файлов а
> в Pascal - нет


Не-е, не так. В Паскале есть модульность, а в Си -- нет. Надеюсь, объяснять, что такое модульность (важнейшее понятие структурного программирования) крутому спецу не надо?


> ну и семантика С++ должна удовлетворять стандарту ANSI.


Стандарты -- не скрижали завета. Если стандарты (по причине устаревания, изначальной маразматичности, или мало ли ещё чего) начинают мешать эффективному развитию надо менять стандарты, а не становиться раком.

А вот грамматика Си++ ничуть не сложнее любой другой, она просто по совершенно непонятной прихоти разработчиков вывернута наизнанку, превратившись в ночной кошмар разработчиков компиляторов.


> А ускорять компиляцию можно очень многими способами, методов
> очень много


Из них самый эффективный -- использовать более стройный и выверенный язык.


> Так что не надо наезжать на С++.


Да расслабься! Ведь не до такой же степени ты отождествляешь себя с языком программирования, что простой технический разбор инструмента воспринимаешь как "наезд". Да вдобавок ещё и личный, да?



Страницы: 1 2 вся ветка

Форум: "Потрепаться";
Текущий архив: 2003.04.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.014 c
14-44418
race1
2003-03-27 06:29
2003.04.14
id3tag


1-44125
Tornado
2003-04-03 09:40
2003.04.14
Что означает эта ошибка?


14-44362
Демонов Е.В.
2003-03-31 04:20
2003.04.14
Сигмент : Смещение


1-44234
maxi
2003-04-02 09:45
2003.04.14
Глючит MultiSelect в TListBox. Как исправить ????


14-44383
Johnmen
2003-03-25 12:16
2003.04.14
Какой я плохой/хороший человек





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский