
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.217.4] |
![]() |
|
Страницы: (31) « Первая ... 9 10 [11] 12 13 ... 30 31 ( Перейти к последнему сообщению ) |
Сообщ.
#151
,
|
|
|
![]() ![]() это, мой друг, философия и не в весе дело ![]() Цитата Принцип инкапсуляции нужен для того, чтобы было удобнее писать программы, а не чтобы запрещать программисту или пользователю делать то, что он хочет. ![]() как раз не для удобства, писать с ним тяжелее, а для защиты от ошибок на этапе программирования Цитата В С++, как мне показали в начале настоящей дискуссии, есть некоторые средства к расширению языка, макросы при умении позволяют составить практически любой синтаксис Цитата Форт - это и язык программирования, и бесконечная расширяемость языка, и язык проектирования, и в некоторых реализациях операционная система и виртуальная машина. А перечисленные здесь языки - в лучшем случае два из этих пунктов все пункты, кроме может ОС,просто они реализовани другими концепциями PS Броуди я читал, очень походит на Лисп, кстати PSS а насчет мой аргументов, твои то же смешные с точки зрения др языков, не надо смотреть только со своей точки зрения. Возьми и другую хотя бы почитай про макросы, прежде чем говорить, что синтаксис С/С++ статичен, если уж тыкать друг другу насчет литературы А если все сишники будут обращатся только к Страуструпу и цитировать его ???? Добавлено Цитата Цитата (AndNot @ 26.09.06, 23:44) А ты на С++ ООП можешь, по ходу выполнения программы, потомку поменять родителя? Или добавить/удалить/изменить методы? на самом деле с помощью указателей на функции, я могу творить с методами все что угодно, это есть даже в древнем Си(правда там нет понятий класса и наследования) -Added это тоже самое как задача о том, кто быстрее двигается черепаха или Ахиллес Добавлено ///----------------------------------------------------------------------- ///------------------------------------------------------------------------- ///-------------------------------------------------------------------------- Кстати мы пытаемся найти идеальный язык, рассматривая ВСЕ языки, и выражение "с точки зрения форт программиста" также бессмыслено, как и с любого другого либо мы говорим о программировании и проектировании в общем, либо называем эту тему "Форт - самый идеальный язык программирования" Мне лично надоело спорить, о том чье болото лучше я попытался выложить концепции многих языков C\C++, Паскаль\Дельфи, Java, Visual Basic ... но мне постояннол тыкают "с точки зрения Форт-программиста это смешно" "а ты можешь реализовать на С\С++ то-то, то-то как Форте" я лично могу написать интерпретатор или компилятор (в псевдо-код) Форта на С++, а вы можете написать то же на Форте, но для С++ ???? а битовые поля ??? объединения ???? Вообще полность идеального языка нет и не будет, так же как нет идеального человека можно лишь создать нечто конгениальное и все |
Сообщ.
#152
,
|
|
|
Цитата impik777 @ макросы при умении позволяют составить практически любой синтаксис ![]() |
Сообщ.
#153
,
|
|
|
Цитата mo3r @ Цитата impik777 @ макросы при умении позволяют составить практически любой синтаксис ![]() да про лямбда-функции я как-то не подумал спасибо, что поправил ................ но все-таки они реализованы, хоть и с помощью шаблонов Добавлено это к слову о других концепциях реализации |
Сообщ.
#154
,
|
|
|
Цитата impik777 @ как раз не для удобства, писать с ним тяжелее, а для защиты от ошибок на этапе программирования Значит ты принцип инкапсуляции не до конца понял. Писать с ним легче. Цитата impik777 @ макросы при умении позволяют составить практически любой синтаксис Макросы макросам рознь. Понятие макроса можно реализовать очень по-разному. То, что есть, скажем, в макроассемблере, насколько я понимаю, обладает весьма скромными возможностями. Также меня всегда интересовал такой вопрос: можно ли внутри макроса использовать макрос? Цитата impik777 @ PS Броуди я читал, очень походит на Лисп, кстати Если и читал, то, видимо, не понял. Цитата impik777 @ Возьми и другую хотя бы почитай про макросы, прежде чем говорить, что синтаксис С/С++ статичен, если уж тыкать друг другу насчет литературы Если ты читал дискуссию, то мог обратить внимание на то, что я обещал прочитать про С++. Насколько я понял, шаблоны круче макросов в смысле расширения синтаксиса. Правда, как я открыл имеющуюся у меня книжку, так сразу желание пропало - настолько там всё сложно. ![]() Цитата impik777 @ А если все сишники будут обращатся только к Страуструпу и цитировать его ???? Это, кстати, очень распространённая практика. К Броуди я отсылаю только потому, что я не знаю книжки, где объяснялось бы лучше, да и сам, к сожалению, страдаю косноязычием. Цитата impik777 @ Кстати мы пытаемся найти идеальный язык, рассматривая ВСЕ языки, и выражение "с точки зрения форт программиста" также бессмыслено, как и с любого другого либо мы говорим о программировании и проектировании в общем, либо называем эту тему "Форт - самый идеальный язык программирования" Мы пытаемся найти идеальный язык, рассматривая все языки по возможности беспристрастно, а не безосновательно поливая грязью "неугодный" язык, будь то Форт или С++. Если я говорю, что Форт обладает таким-то преимуществом перед другими языками, будь добр, приведи доказательства наличия такой возможности в С++, но не надо, когда тебе говорят, что в Форте есть то-то и то-то, делать удивлённую физиономию и говорить, что такого в Форте отродясь не было, а когда тебе это повторяют несколько человек, говорить, что это никому не надо. Цитата impik777 @ Мне лично надоело спорить, о том чье болото лучше Ты сам начал. Я ещё в начале дискуссии неоднократно повторял, что не имею целью утверждать превосходство Форта и навязывать кому-либо своё мнение. Просто когда человек начинает критиковать что-то, в чём явно не разбирается, у собеседников возникает естественное желание его просветить, а если он при этом не слушает аргументов, то возникает не менее естественное негативное отношение к человеку. Если ты действительно устал тупо защищать С++ и опускать Форт, буду рад продолжить дискуссию с тобой в нормальном ключе, тем более, что в С++ ты вроде разбираешься. В начале обсуждения, когда я выдвинул тезисы о том, что любая программа на Форте будет выглядеть короче и что С++ не имеет средств к расширению, Flex Ferrum и LuckLess цивилизованно и без наездов привели доказательства обратного, и я с ними согласился. Советую поучиться у них искусству ведения научной дискуссии. Цитата impik777 @ я лично могу написать интерпретатор или компилятор (в псевдо-код) Форта на С++, а вы можете написать то же на Форте, но для С++ ???? Это возможно, но геморроидально, поскольку С++ - неоправданно сложный язык. В этом меня ещё никто не разубедил. Вот ты можешь с нуля за три месяца написать С++-подобный язык, а затем писать на нём программу для моделирования чего_ты_там_моделируешь, и за ещё три месяца, особо не напрягаясь, довести её производительность до аналогичных программ? Я со своим Фортом смог, учитывая тот факт, что доселе я не написал на Форте ни строчки. Цитата mo3r @ они в Boost сделаны с помощью шаблонов А что такое Boost? |
Сообщ.
#155
,
|
|
|
Цитата wormball @ Также меня всегда интересовал такой вопрос: можно ли внутри макроса использовать макрос? Можно. Цитата wormball @ Насколько я понял, шаблоны круче макросов в смысле расширения синтаксиса. Не совсем. Шаблоны — они задумывались для другого (для параметризованных типов). Но потом оказалось, что с ними можно делать очень много всего (фактически, шаблоны представляют собой программы на языке программирования, эквивалентном частично-рекурсивным функциям, выполняемые во время компиляции програм). С ними можно делать много, но это не всегда удобно. Цитата wormball @ В отличие от Форта, где всё предельно просто, хотя возможности по меньшей мере такие же, а то и больше. Да, с этим у C++ так — многие правила языка очень сложные (в частности, правила поиска имен и разрешения перегрузок функций). Цитата wormball @ Это возможно, но геморроидально, поскольку С++ - неоправданно сложный язык. Существует только один компилятор C++, практически полностью соответствующий стандарту (Comeau C++; остальные компиляторы поддерживают практически всё, за исключением экспорта шаблонов). Создание компилятора C++ — сложная задача (сложные правила языка; отчасти противоречивые цели создания языка — он одновременно может быть и высокоуровневым, и низкоуровневым). Цитата wormball @ А что такое Boost? http://www.boost.org . Библиотека, в которой содержится много всего полезного. |
Сообщ.
#156
,
|
|
|
Цитата wormball @ Цитата impik777 @ как раз не для удобства, писать с ним тяжелее, а для защиты от ошибок на этапе программирования Значит ты принцип инкапсуляции не до конца понял. Писать с ним легче. пример сложности в написание(более громоздко), но защищает от непредвиденных ошибок логических Цитата class SPainterColorType { MODE_TYPE red; MODE_TYPE green; MODE_TYPE blue; public: MODE_TYPE GetRed()const {return red;} MODE_TYPE GetGreen()const {return green;} MODE_TYPE GetBlue()const {return blue;} SPainterColorType():red(0),green(0),blue(0){} static const MODE_TYPE MaxColorValue = 255; void operator=(const SPainterColorType& color) { red = color.red; green = color.green; blue = color.blue; } void SetColor(MODE_TYPE r,MODE_TYPE g,MODE_TYPE b) { red = r; green = g; blue = b; } void Invert() { red = MaxColorValue - red; green = MaxColorValue - green; blue = MaxColorValue - blue; } void ColorShift (SHIFT_VALUE dr,SHIFT_VALUE dg,SHIFT_VALUE db) { red += dr; blue += db; green += dg; } }; Sys_Color GetColor(RGB_Color& color) { static const PARAM_VALUE bit_shift = 8; Sys_Color res = color.GetBlue(); res <<= bit_shift; res += color.GetGreen(); res <<= bit_shift; res += color.GetRed(); return res; } здесь данные цветовой точки (тут описывается именно это) закрыты от пользователя класса и он в принципе понятия о них не имеет ему дается набор функций - интерфейс для пользования с одной стороны ему нельзя напрямую обратится к данным ![]() ![]() SPainterColorType color; color.red = 10; это защищает от неправильного изменения данных, т.к. писать ![]() ![]() color.GetRed() = 10; бессмысленно, данные все равно не изменятся, а компилер будет матерится , но писать вызов функции, согласись, более громоздко, это правда обошли в Builder'e, создав понятие свойства как расширение языка, но его можно реализовать и стандартными средствами вот следующий код четко гарантирут, что данные в классе будут хранится корректные ![]() ![]() // Types of directions enum VECTOR_DIR {DIR_NORTH = 0, DIR_EAST = 1, DIR_SOUTH =2, DIR_WEST = 3}; /*********************************************************************************/ // vector support class GVector_map { VECTOR_DIR direction; public: class VectorInitError{}; GVector_map(VECTOR_DIR dir = DIR_NORTH) { if(dir>DIR_WEST)throw VectorInitError(); direction = dir; } GVector_map(const GVector_map& vec):direction(vec.direction){} void operator= (VECTOR_DIR dir) { if(dir>DIR_WEST)throw VectorInitError(); direction = dir; } void operator= (const GVector_map& vec) { direction = vec.direction; } VECTOR_DIR GetDir()const {return direction;} void Right() { direction = (direction==DIR_WEST)?DIR_NORTH:VECTOR_DIR(direction+1); } void Left() { direction = (direction==DIR_NORTH)?DIR_WEST:VECTOR_DIR(direction-1); } void Around() { direction = (direction>DIR_EAST)?VECTOR_DIR(direction-2):VECTOR_DIR(direction+2); } }; если надо, могут дать более подробные комментарии -Added Цитата mo3r @ Цитата wormball @ Это возможно, но геморроидально, поскольку С++ - неоправданно сложный язык. 1. это объясняется вопросами переносимости более старых программ 2. Достоинство и ,одновременно, недостаток С++, то что он разрешает нагромождать практически любые синтаксические конструкции, перекладывая ответственность на программиста Наиболее распостранненый пример - возвращение указателя или ссылки на закрытые данные класса, такое хакерское обхождение синтаксической защиты, кстати в форт есть указатели или че-то подобное ??? Добавлено достоинство шаблона - написание алгоритма для типа который мы заранее не знаем например контейнер типа списка, который должен хранить произвольное кол-во элементов произвольного типа, могу выложить пример примитивного списка(конечно в STL круче намного,но смысл тот же) Добавлено также С++ в начале непонят многим новичкам ввиду наличия огромной кучи синтаксического "сахара" как пример ![]() ![]() int a; a++; /*равносильно*/ a+=1; /*равносильно*/ a=a+1; а,например в бейсике возможен только третий вариант так же с "сахару" относится возможность переопределения операторов для конкретного класса ![]() ![]() class SGPoint { PARAM_VALUE cX; PARAM_VALUE cY; public: PARAM_VALUE GetX()const {return cX;} PARAM_VALUE GetY()const {return cY;} SGPoint(PARAM_VALUE iX = 0,PARAM_VALUE iY = 0):cX(iX),cY(iY){} SGPoint(const SGPoint& pnt):cX(pnt.cX),cY(pnt.cY){} void operator= (const SGPoint& pnt) { cX = pnt.cX; cY = pnt.cY; } /**********************************************/ }; bool operator== (const SGPoint& p1,const SGPoint& p2) { return (p1.GetX() == p1.GetX())&&(p1.GetY() == p1.GetY()); } bool operator!= (const SGPoint& p1,const SGPoint& p2) { return (p1.GetX() != p1.GetX())&&(p1.GetY() != p1.GetY()); } /******************************************************/ SGPoint p1(0,0),p2(0,3); if(p1==p2) { /** что-то сделать **/ } |
Сообщ.
#157
,
|
|
|
Чтобы меня не считали ярым сторонником Форта, скажу, что есть одно преимущество "обычных" языков перед Фортом, выясненное в настоящей дискуссии - возможность перегружать функции для разных типов аргументов.
Цитата mo3r @ Не совсем. Шаблоны — они задумывались для другого Можно поподробнее? Цитата mo3r @ эквивалентном частично-рекурсивным функциям А это что такое? Что такое рекурсивные функции знаю, что такое частично-рекурсивные - не знаю. Не подскажете, что можно почитать про шаблоны? Желательно поменьше технических деталей, побольше теоретических основ. Можно Страуструпа в электронном виде, а то его у меня нет. ![]() Цитата mo3r @ Да, с этим у C++ так — многие правила языка очень сложные (в частности, правила поиска имен и разрешения перегрузок функций). Откуда такая осведомлённость? Ты свой С++-компилятор разрабатывал? Если не секрет, поделись опытом. Цитата mo3r @ http://www.boost.org . Библиотека, в которой содержится много всего полезного. Видимо, я не так поставил вопрос. Мне хотелось бы узнать, что такое лямбда-функции. Цитата impik777 @ пример сложности в написание(более громоздко), но защищает от непредвиденных ошибок логических Тебе в любом случае придётся уяснить, что цвет должен быть заключён в диапазоне 0..255. Какая разница, если ты это узнаешь по сообщению об ошибке или по неправильной работе программы? Если у тебя поле данных будет открыто, у тебя будет выбор, пользоваться функциями или обращаться к данным напрямую, например, с целью увеличения скорости. Инкапсуляция применяется тогда, когда структура объекта и правила его изменения настолько сложны, что каждый раз писать заново всю процедуру изменения было бы слишком накладно. В этом случае использование инкапсуляции упрощает программирование, а в твоём примере только усложняет. Хотя в нём есть полезные функции - SetColor. Invert и т. п. Кстати, насколько я понял, приведённый тобой код не проверяет на правильность присваивания. |
Сообщ.
#158
,
|
|
|
Цитата wormball @ Хотя в нём есть полезные функции - SetColor. Invert и т. п. Кстати, насколько я понял, приведённый тобой код не проверяет на правильность присваивания. в данном случае диапазон проверять не надо, т.к ![]() ![]() typedef unsigned char MODE_TYPE; диапазон как раз 0-255 Добавлено Цитата wormball @ Если у тебя поле данных будет открыто, у тебя будет выбор, пользоваться функциями или обращаться к данным напрямую, например, с целью увеличения скорости. скорость одинаковая, так как все функции определенные в классе по умолчанию inline т.е встроенные Добавлено более понятны мои доводы на классе GVector_map Добавлено Цитата wormball @ Цитата (mo3r @ Сегодня, 19:58) Не совсем. Шаблоны — они задумывались для другого Можно поподробнее? обещанный пример ![]() ![]() #if !defined(LIST_DEFINED) #define LIST_DEFINED template<class T> class BasicList { template<class D> struct Item { D data; Item<D>* next; // указатель на следующий элемент Item<D>* back; // указатель на предыдущий элемент }; Item<T>* first; // первый элемент Item<T>* last; // последний элемент Item<T>* curr; // текущий public: BasicList() { first = new Item<T>; first->back = 0; first->next = 0; last = first; curr = first; } ~BasicList() { for(curr = last;!curr;curr = curr->back) delete curr->next; } T* Get() { return &curr->data; } void Begin() { curr = first; } void End() { curr = last; } bool Next() { if(curr->next) { curr = curr->next; return true; } return false; } bool Back() { if(curr->back) { curr = curr->back; return true; } return false; } void operator++() { last->next = new Item<T>; last->next->back = last; last->next->next = 0; last = last->next; } void operator--() { if(!curr->back) { curr = curr->next; curr->back = 0; delete first; first = curr; } else if(!curr->next) { curr = curr->back; curr->next = 0; delete last; last = curr; } else { Item<T>* buff = curr; curr->back->next = curr->next; curr->next->back = curr->back; curr = curr->back; delete buff; } } }; #endif Добавлено очень примитивный вид списка Добавлено Цитата wormball @ Цитата (mo3r @ Сегодня, 19:58) Да, с этим у C++ так — многие правила языка очень сложные (в частности, правила поиска имен и разрешения перегрузок функций). Откуда такая осведомлённость? Ты свой С++-компилятор разрабатывал? Если не секрет, поделись опытом. имя функции на С++ состоит из: 1. собственного имени 2. типа возвр значения 3. списка аргументов 4. пространства имен или имени класса (они могут быть или не быть, они могут быть вложенными) Добавлено Цитата wormball @ Какая разница, если ты это узнаешь по сообщению об ошибке или по неправильной работе программы? ![]() ![]() if(dir>DIR_WEST)throw VectorInitError(); эта строчка в случае ошибки передаст управление вверх если написано что-то вроде ![]() ![]() try { GVector_map v(2);v = 125;/*****/ } catch(VectorInitError) {/*мы попадем сюда*/} catch(...) {/*****/} если исключение не перехватится(в данном случае любое перехватится catch(...)),вызовется terminate функция по умолчанию это abort(), но ее можно изменить |
Сообщ.
#159
,
|
|
|
Цитата impik777 @ 2. Достоинство и ,одновременно, недостаток С++, то что он разрешает нагромождать практически любые синтаксические конструкции, перекладывая ответственность на программиста Форт разрешает значительно больше. Он вообще не имеет средств контроля типов. Однако, как показывает практика, это не сильно мешает программированию. В основном этому способствует другая идеология тестирования: ты можешь протестировать каждую функцию, просто вызвав её в командной строке с какими угодно параметрами. Как сказал тот же Броуди, не надо пытаться сделать компилятор умнее программиста. Цитата impik777 @ Наиболее распостранненый пример - возвращение указателя или ссылки на закрытые данные класса, такое хакерское обхождение синтаксической защиты, А в Форте не надо ничего обходить - всё и так разрешено. Цитата impik777 @ кстати в форт есть указатели или че-то подобное ??? Есть, это одна из основ Форта. Точнее, типа "указатель" как такового нет (равно как и других типов), просто любое целое число может трактоваться как адрес, в частности, по нему можно записать или считать информацию. Цитата impik777 @ достоинство шаблона - написание алгоритма для типа который мы заранее не знаем например контейнер типа списка, который должен хранить произвольное кол-во элементов произвольного типа, могу выложить пример примитивного списка Выкладывай! (желательно с пояснениями) Цитата mo3r @ отчасти противоречивые цели создания языка — он одновременно может быть и высокоуровневым, и низкоуровневым Ну, Форт одновременно низкоуровневый и высокоуровневый, однако образует целостную, непротиворечивую и, что немаловажно, простую концепцию. |
Сообщ.
#160
,
|
|
|
Цитата wormball @ В этом случае использование инкапсуляции упрощает программирование, а в твоём примере только усложняет. данный класс реализует только те возможности, под которые он создавался(он в общем плане не полный), и скрывает свою реализацию, давая только интерфейс - принцип абстракции данных кстати, было очень бы хорошо, что бы идеальный язык поддерживал идеологию MVC(Model-View-Controller) хорошая книжечка по теории проектирования "Приемы объектно-ориентированного проектирования. Паттерны проектирования" Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес |
Сообщ.
#161
,
|
|
|
Цитата wormball @ Можно поподробнее? Они предназначались для создания параметризованых типов и функций. Что-то вроде: ![]() ![]() vector<int> integers; vector<string> strings; Т.е., есть некий «шаблон» типа или функции, у которого есть один или несколько параметров, куда можно подставлять типы (или скалярные значения), и в соответствии с параметрами создается тип или функция. Цитата wormball @ А это что такое? Что такое рекурсивные функции знаю, что такое частично-рекурсивные - не знаю. Рекурсивные функции бывают примитивными (строятся на основе двух элементарных функций (константа 0, прибавление единицы) с помощью операции рекурсии), которые определены всюду; бывают частично рекурсивными (включают в себя примитивно рекурсивные, а также функции, получаемые из примитивно рекурсивных с помощью операции минимизации, т.е. нахождения минимального решения уравнения f(x_1,x_2,..,x_(n-1),y)=x_n относительно y), и определены они не всюду. Цитата wormball @ Не подскажете, что можно почитать про шаблоны? Желательно поменьше технических деталей, побольше теоретических основ. Можно Страуструпа в электронном виде, а то его у меня нет. ![]() Про шаблоны где почитать не знаю. Страуструп есть здесь. В лисп, по-моему, неплохое введение «Practical Common Lisp» (сам я по нему изучаю). Цитата wormball @ Откуда такая осведомлённость? Ты свой С++-компилятор разрабатывал? Если не секрет, поделись опытом. Нет, не разрабатывал. Но примерно представляю те трудности, с которыми можно столкнуться, а также читал некоторые отзывы тех, кто писал. Цитата wormball @ Мне хотелось бы узнать, что такое лямбда-функции. Это безымянные функции, которые передаются по значению. Лямба-функции — это основа лямбда-исчисления Чёрча. Вот пример из яваскрипта (где такие функции присутствуют): ![]() ![]() function greet(greetings_function,name) { alert(greetings_function(name)); } greet( function(name) {return 'Hi, '+name+'!';}, 'mo3r'); greet( function(name) {return 'Hello, '+name+'!';}, 'mo3r'); Аналогичный пример на C++: ![]() ![]() template<typename GreetT, typename T> void greet(const GreetT& g, const T& t) { std::cout << g(t) << std::endl; } using boost::lambda; greet(constant("Hi, ") + _1 + "!", std::string("mo3r")); greet(constant("Hello, ") + _1 + "!", std::string("mo3r")); Использование лямбд сильно упрощает многие вещи (например, передачу некоторого поведения, либо делегирование функций), позволяют более просто создавать обобщенные алгоритмы. Также см. http://www.joelonsoftware.com/items/2006/08/01.html — вольное описание лямбд. Цитата wormball @ Какая разница, если ты это узнаешь по сообщению об ошибке или по неправильной работе программы? Разница большая — значительно сокращается время тестирования, ведь компилятор будет ловить больше ошибок. Цитата wormball @ Если у тебя поле данных будет открыто, у тебя будет выбор, пользоваться функциями или обращаться к данным напрямую, например, с целью увеличения скорости. Не обязательно. Хорошие компиляторы оптимизируют код (в частности, многие C++ компиляторы хорошо оптимизируют подобное использование инкапсуляции, так как подобные вещи встречают повсеместно в стандартной библиотеке). |
Сообщ.
#162
,
|
|
|
в Форте вообще есть различия между одно-байтным целым, двух-байтным и т.д. ???
т.к во многих языках это имеет важное значение насчет контроля типов в С++, то он в большинстве случает лишь предупреждает о возможных накладках |
Сообщ.
#163
,
|
|
|
Цитата wormball @ Однако, как показывает практика, это не сильно мешает программированию. В основном этому способствует другая идеология тестирования: ты можешь протестировать каждую функцию, просто вызвав её в командной строке с какими угодно параметрами. Как сказал тот же Броуди, не надо пытаться сделать компилятор умнее программиста. Я считаю так, что та парадигма программирования, на которую расситан Форт, а также функциональные языки, позволяет делать такое. С C++ ситуация несколько иная: C++ поддерживает несколько парадигм. Цитата wormball @ Ну, Форт одновременно низкоуровневый и высокоуровневый, однако образует целостную, непротиворечивую и, что немаловажно, простую концепцию. C++ также имеет целостную систему, но отличную от Форта и от других языков. |
Сообщ.
#164
,
|
|
|
Цитата impik777 @ в данном случае диапазон проверять не надо, т.к typedef unsigned char MODE_TYPE; Это так теперь байт зовётся? ![]() Цитата impik777 @ скорость одинаковая, так как все функции определенные в классе по умолчанию inline т.е встроенные Я тоже думал, что лишние вызовы функций - это зло. В Форте тоже можно определять функции, аналогичные inline, так вот, когда я на радостях поинлайнил кучу широко используемых функций, а потом сравнил скорость с неинлайненным вариантом, оказалось, что так во многих случаях значительно медленнее(!). Видимо, прикол в кэше: если большая функция будет inline, то код, многократно её использующий, не будет помещаться в кэш-память и, как следствие, каждый раз при исполнении его надо будет загружать из памяти. Мораль сей басни такова: не надо инлайнить большие функции. (Правда, в Visual C++ вызов функции почему-то происходит раз в 10 медленнее, чем должен.) Но это так, к слову. Цитата impik777 @ обещанный пример Буду признателен, если ты мне его объяснишь. |
Сообщ.
#165
,
|
|
|
Цитата impik777 @ в Форте вообще есть различия между одно-байтным целым, двух-байтным и т.д. ??? Замечу, что в C++ нету такоих понятий, как однобайтное целое, двухбайтное целое (так как это вредит переносимости); вместо этого есть типы, зависящие от архитектуры (char, short, int, long), и (вроде бы, это есть в C99, а может в C++ — точно не помню) типы, для которых гарантирована некоторая емкрость (uint8_t, uint16_t). |