
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.217.4] |
![]() |
|
Страницы: (31) « Первая ... 11 12 [13] 14 15 ... 30 31 ( Перейти к последнему сообщению ) |
Сообщ.
#181
,
|
|
|
таких манипуляций нет, потому что в них нет необходимости на С++ //----------------------------------------------------------------------------------------------- ладно, мы опять отвлекаемся от темы ![]() предлагаю каждому участнику составить список пунктов, без которых идеальный язык не сможет быть идельаным, по его мнению, и начнем обсуждать их, в конце составим общий список, а то так и будем болтать не по теме PS свой список я опубликую чуть позже, свободного времени мало |
Сообщ.
#182
,
|
|
|
В споре и появляются новые идейки. А насчет списка, в принципе можно. Только попозже. Надо обдумать
![]() Только вот наврятли получится составить общий список. |
Сообщ.
#183
,
|
|
|
Цитата impik777 @ кстати, было очень бы хорошо, что бы идеальный язык поддерживал идеологию MVC(Model-View-Controller) А это что такое? Цитата impik777 @ хорошая книжечка по теории проектирования "Приемы объектно-ориентированного проектирования. Паттерны проектирования" Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес А её нет в электронном виде? Цитата mo3r @ Про шаблоны где почитать не знаю. Страуструп есть здесь. В лисп, по-моему, неплохое введение «Practical Common Lisp» (сам я по нему изучаю). А на русском языке есть? Всё-таки моё знание английского недостаточно для чтения мегабайтов информации. То есть в общем я понимаю, о чём идёт речь, но происходит это в несколько раз медленнее, чем на русском. Придётся, видимо, отовариваться. ![]() Цитата mo3r @ Рекурсивные функции бывают примитивными (строятся на основе двух элементарных функций (константа 0, прибавление единицы) с помощью операции рекурсии), которые определены всюду; бывают частично рекурсивными (включают в себя примитивно рекурсивные, а также функции, получаемые из примитивно рекурсивных с помощью операции минимизации, т.е. нахождения минимального решения уравнения f(x_1,x_2,..,x_(n-1),y)=x_n относительно y), и определены они не всюду. Ничего не понял. Цитата mo3r @ Это безымянные функции, которые передаются по значению. Лямба-функции — это основа лямбда-исчисления Чёрча. Вот пример из яваскрипта (где такие функции присутствуют): function greet(greetings_function,name) { alert(greetings_function(name)); } greet( function(name) {return 'Hi, '+name+'!';}, 'mo3r'); greet( function(name) {return 'Hello, '+name+'!';}, 'mo3r'); Таки асилил предлагаемую статью, несмотря на английский язык. На моём Форте это выглядело бы приблизительно так: ![]() ![]() : greet ( name function -- ) call alert ; " mo3r" :: s" Hi, " 2swap str+ " !" str+ ; greet " mo3r" :: s" Hello, " 2swap str+ " !" str+ ; greet Я не понял только одного: зачем использовать безымянные функции, когда можно использовать именованные функции? ![]() ![]() : greet ( name function -- ) call alert ; : hi s" Hi, " 2swap str+ " !" str+ ; : hello s" Hello, " 2swap str+ " !" str+ ; " mo3r" ' hi greet " mo3r" ' hello greet А вообще мне идея понравилась, особенно про вынос цикла for в отдельную функцию. Что это такое? Цитата mo3r @ Разница большая — значительно сокращается время тестирования, ведь компилятор будет ловить больше ошибок. Не знаю как насчёт С++, но по сравнению с паскалём у меня время тестирования сильно уменьшилось именно за счёт того, что я могу во время выполнения ввести какое угодно выражение на Форте и посмотреть, что оно выдаёт. Цитата impik777 @ в Форте вообще есть различия между одно-байтным целым, двух-байтным и т.д. ??? т.к во многих языках это имеет важное значение Конечно! В стеке все числа одного размера (для 32-битных систем - dword), а в памяти ты можешь их записывать и читать как двухбайтные и однобайтные. Цитата impik777 @ Ну, Форт одновременно низкоуровневый и высокоуровневый, однако образует целостную, непротиворечивую и, что немаловажно, простую концепцию. С++ она то же очень проста, просто надо её понять, Я меряю сложность концепции количеством информации, которое нужно рассказать, чтобы её объяснить, и количеством кода, необходимым, чтобы её реализовать. С этой точки зрения Форт проще минимум раз в 10. На фасме у меня написано ассемблерное ядро форт-системы (единственный файл из ретрофорта, который я не переделал так, что родная мама не узнает, изменил там процентов 30). Видел там макросы, особо не вникал, но сомневаюсь, что они могут сравниться с Фортом. Цитата AndNot @ Ну а после DOES> можешь вставить что угодно, у того же Броуди есть пример, где при обращении к массиву по индексу проверяется его диапозон, или например работа с частями массивов при нехватке памяти. А можешь и без DOES> обойтись. У меня create есть, does - нет. У меня другой прикол: когда я, скажем, задаю тип массива, у меня задаётся не одно слово, а несколько с различными функциями, например: mas - адрес массива mas[] - индексация массива mas+, mas- - переход к следующему или предыдущему элементу mascell - размер элемента и т. п. does> в такую концепцию не укладывается. Цитата impik777 @ особенно, если учесть, что числа с плавающей занятой считаются в несколько раз медленней, чем целые (именно это учли производители первого Doom, не используя дробные числа) Числа с плавающей запятой хранятся в отдельном стеке (по крайней мере, у меня так). Что такое список, я знаю. Понятно, а где здесь язык программирования, исполняемый во время компиляции? Цитата impik777 @ я выбираю нужную прогу или либу по документации, но никогда не изменяю ее сам, на крайний случаю я пишу свою библиотеку Это потому что у тебя нет такой возможности: исходники или закрыты, или в них чёрт ногу сломит. Цитата AndNot @ а если бы это было написано на Форте, но сорци, все равно неизвестны - это тебе бы помогло Ты немного невнимателен В Форте конечный пользователь программы получает в свои руки те же инструменты, с помощью которых и была создана программа. Соответственно он ее может и модифицировать. Правильно. Только в стандартном Форте, насколько я знаю, есть такое средство, как целевая компиляция, которая действует приблизительно так же, как в С++, то есть исходники становятся недоступны. Так что если производитель программы хочет скрыть исходники, он это сделает. Другой вопрос, если исходники всё-таки открыты, насколько сложно в них разбираться. Поскольку Форт благоприятствует хорошему стилю программирования, программы на нём, как правило, значительно меньше весят и лучше понимаются, плюс для изменения исполняемого кода отпадает необходимость в наличии компилятора - сам исполняемый файл программы является компилятором. Цитата AndNot @ Сколько бы она не занимала, Форт предоставляет удобные средства проверки. Ты можешь проверить на вшивость только что определенное слово. И без напрягов. Просто сразу проверяешь то что написал, по ходу составления программы. Потому в нем хоть и отсутствует какой либо контроль за программистом (а кому как не ему знать что он творит?), ошибок в программах на порядок меньше, чем уменя к примеру было в Паскале и С и Асме (Бейсик 8-ми разрядных машин не считаю). Просто сам убедился в этом. ![]() ![]() ![]() ![]() ![]() ![]() ![]() А почему не на Форте? Интересно получается: говоришь, что Форт может полностью заменить ассемблер, а сам пользуешься ассемблером? Вот я, например, с тех пор, как сделал свой Форт, пишу только на нём. Цитата impik777 @ 30000 - 50000 строк это довольно средненький проект, без графики и анимации, интернет связи и т.д. Слушай, поделись секретом, что такого можно на 50 килострок расписать? У меня полноценный язык программирования влез где-то в 2000 строк, из которых чуть больше 1000 - файлы на ассемблере и паскале с довольно малой идеологической плотностью. Это что за зверь? Цитата AndNot @ 30000 - 50000 строк это довольно средненький проект, без графики и анимации, интернет связи и т.д. Для Форта это уже солидный проект, в который можно встроить и графику и анимацию и управление летающей тарелкой За счет хорошей разбивки программы на небольшие слова. ![]() ![]() Цитата impik777 @ таких манипуляций нет, потому что в них нет необходимости на С++ Никогда не говори никогда! ![]() Цитата impik777 @ предлагаю каждому участнику составить список пунктов, без которых идеальный язык не сможет быть идельаным, по его мнению, и начнем обсуждать их, в конце составим общий список, а то так и будем болтать не по теме ![]() |
Сообщ.
#184
,
|
|
|
Цитата wormball @ Ничего не понял. Возьмем, например, функцию целочисленного деления: div(x,y) --- это такое z, что z*y=x. Т.е., z является решением уравнения y*z=x. Эта функция получается с помощью операции минимизации функции умножения mul(x,y) относительно y. Цитата wormball @ Я не понял только одного: зачем использовать безымянные функции, когда можно использовать именованные функции? Чтобы можно было их генерировать по ходу действия программы. Цитата wormball @ Что это такое? Передача информации о том, что нужно сделать. Так как функции можно передавать по значению, то, например, управление удаленной системой можно максимально упростить: по сети передается функция, которую вычисляет удаленная система. Или другой пример: в программах, которые используют GUI, было бы гораздо проще присваивать кнопкам и другим объектам те функции, которые они выполняют. Обработка событий с применением лямбд гораздо упрощается. Цитата wormball @ Понятно, а где здесь язык программирования, исполняемый во время компиляции? В приведенном примере вычисляемая функция --- константа (правда, нечисловая). Вот другой пример: ![]() ![]() template<int a, int b> struct a_pow_b { enum { value = a_pow_b<a,b-1>::value*a }; }; template<int a> struct a_pow_b<a,0> { enum { value = 1 }; }; int m = a_pow_b<3,4>::value;//m = 81 Этот шаблон позволяет вычислить значение a^b во время компиляции. С помощью подобной техники можно делать более сложные вещи. |
Сообщ.
#185
,
|
|
|
Цитата wormball @ Видел там макросы, особо не вникал, но сомневаюсь, что они могут сравниться с Фортом. А я разве утверждал это? Он мощнейший среди асмов. К примеру позволяет узнать какой опкод будет скомпилирован для какой-либо команды и, если надо, заменить его. Вообще он сам по себе напоминает ЯВУ. К слову, все высокоуровневые определения FASMа (if,while,proc,segment и тд.) - это именно макросы. Можно даже команды процессора заменить. Недавно видел такой пример: ![]() ![]() mov ah,09 mov dx,"this string is test!",13,10,"$" int 21h Согласись, что красиво. Цитата wormball @ У меня create есть, does - нет. У меня другой прикол: когда я, скажем, задаю тип массива, у меня задаётся не одно слово, а несколько с различными функциями mas - адрес массива mas[] - индексация массива mas+, mas- - переход к следующему или предыдущему элементу mascell - размер элемента и т. п. does> в такую концепцию не укладывается. Охренеть. А как это реализовано? Ну нет сейчас времени разбираться с твоим языком. Можешь в двух словах? А как насчет избыточности кода решил? Может все-таки проще завести отдельный словарь с подобными методами, которые и юзают массивы.? Или я не въехал в прикол? Цитата wormball @ Числа с плавающей запятой хранятся в отдельном стеке (по крайней мере, у меня так) А чем ариф. стек не устраивает. Какие выгоды от отдельного стека? Или по аналогии с вещественными числами? Цитата wormball @ А почему не на Форте? Интересно получается: говоришь, что Форт может полностью заменить ассемблер, а сам пользуешься ассемблером? Вот я, например, с тех пор, как сделал свой Форт, пишу только на нём. По работе приходится использовать асм. Причем в основном для DOS Prot Mode 32bit. А вот нормальный Форт для этого еще не встретил, самому писать некогда. Хотя, если время появится, напишу. Тогда и пересяду окончательно ![]() Цитата wormball @ нормальной поддержки строк (если кто знает нормальную библиотеку работы со строками, просьба поделиться) Могу поделиться, правда на асме, и только С-аналоги, но как образец для встроенного асма сойдет. Или посмотри SPF4, там много интересного, как на асме, так и на Форте. Цитата wormball @ Насчёт контроля типов - я думаю, он всё же будет не к месту Это было бы ограниченяе программера, что в корне не соответствуе основному приципу Форта. Да и практика показывает, что и без него можно обойтись. Росли бы руки в правильном месте ![]() Цитата wormball @ и поддержки многозадачности Практически в любом более-менее нормальном Форте она встроена. Цитата mo3r @ Чтобы можно было их генерировать по ходу действия программы. Если я правильно понял, то это все равно что на Форте определяешь слово(через CREATE) с помощью которого в дальнейшем и создаешь уже именованные слова. Ничего нового. Я уже приводил пример для массивов. Цитата mo3r @ Или другой пример: в программах, которые используют GUI, было бы гораздо проще присваивать кнопкам и другим объектам те функции, которые они выполняют. Обработка событий с применением лямбд гораздо упрощается. Старые песни о главном. Только обозвали по новому ![]() Цитата mo3r @ Этот шаблон позволяет вычислить значение a^b во время компиляции. С помощью подобной техники можно делать более сложные вещи. А в качестве A и B какие данные могут использоваться. Только константы? |
Сообщ.
#186
,
|
|
|
Цитата AndNot @ Старые песни о главном. Только обозвали по новому ![]() ![]() Цитата AndNot @ Если я правильно понял, то это все равно что на Форте определяешь слово(через CREATE) с помощью которого в дальнейшем и создаешь уже именованные слова. Ничего нового. Я уже приводил пример для массивов. Практически, да, ничего нового. Только не надо определять слов — функции можно просто лепить на лету. Цитата AndNot @ А в качестве A и B какие данные могут использоваться. Только константы? Все, что вычислимо на момент компиляции. Вообще, обычно используются функции не на целых числах, а на типах — это позволяет делать многие полезные штуки. |
Сообщ.
#187
,
|
|
|
Цитата mo3r @ Возьмем, например, функцию целочисленного деления: div(x,y) --- это такое z, что z*y=x. Т.е., z является решением уравнения y*z=x. Эта функция получается с помощью операции минимизации функции умножения mul(x,y) относительно y. Снова ничего не понял. Результат указанной операции, насколько меня всегда учили, должен быть равен минус бесконечности (или плюс бесконечности с отрицательным х). И каким боком это относится к рекурсивным функциям? Цитата mo3r @ Я не понял только одного: зачем использовать безымянные функции, когда можно использовать именованные функции? Чтобы можно было их генерировать по ходу действия программы. Ну, в Форте и так все функции генерируются по ходу выполнения программы. Кстати, для того, чтобы генерировать функцию по ходу выполнения, надо, чтобы в программу был включён компилятор? Или иты имеешь в виду что-то другое? Цитата AndNot @ Недавно видел такой пример: mov ah,09 mov dx,"this string is test!",13,10,"$" int 21h Согласись, что красиво. ![]() Цитата AndNot @ Охренеть. А как это реализовано? Ну нет сейчас времени разбираться с твоим языком. Можешь в двух словах? А как насчет избыточности кода решил? Может все-таки проще завести отдельный словарь с подобными методами, которые и юзают массивы.? Или я не въехал в прикол? Реализовано просто: есть слово, которое должно обозначать будущий массив, к нему прибавляются различные окончания и образованные таким макаром слова записываются в словарь, и каждому слову сопоставляется соответствующее действие. Получилось очень забавно: мне пришлось писать слова, которые будут по параметрам компилировать компилирующие слова. Зверская гимнастика для мозгов и, кстати, очень хороший пример мощности Форта. Приведу полный текст реализации массивов (не чтобы ты в нём разбирался, а просто чтобы ты и другие заценили количество кода, которое для этого потребовалось): ![]() ![]() | n-dimensional arrays loc: forth : literal,, ( l -- ) literal, c: literal ; | 2nd generation literal!! : addstring ( ad nd as ns -- a n' ) >r >r >pad 2dup + r> r@ rot swap move r> + ; : forthentry ( a n -- ) entry as .forth ; : macroentry ( a n -- ) entry as .macro ; : constentry ( c a n a n -- ) addstring entry as .data last @ cell+ ! ; : addentry ( ad nd as ns -- ) addstring macroentry ; : add[] ( a n -- ) s" []" addentry ; : add+ ( a n -- ) s" +" addentry ; : add- ( a n -- ) s" -" addentry ; : compilecell ( cell a n -- a n ) s" cell" constentry ; : compilesize ( size a n -- a n ) s" size" constentry ; : compile+ ( size a n -- ) add+ literal,, mc: + m: ;; fast ; : compile- ( size a n -- ) add- literal,, mc: - m: ;; fast ; : compile[] ( nk . . n0 k a n -- memsize ; ; ik-1 . . i0 a -- a ) add[] for dup mc: swap literal,, mc: * mc: + * next m: ;; fast ; : compilearray ( size a n -- ; -- a ) forthentry literal, c: getmem m: ;; ; : 3dup >r 2dup r@ -rot r> ; : arraytype ( nk .. .. n1 n0 k ) over wsparse 3dup 3dup 3dup compile+ compile- compilecell rot drop 2dup >r >r compile[] r> r> 3dup compilearray compilesize ; ' arraytype ;loc alias arraytype Можно задавать многомерные массивы. В предыдущем посте я немного ошибся: название типа массива выполняет функцию создания нового массива. На самом деле я это реализовывал до того, как начал пользоваться Фортом, и впоследствии оказалось, что функциональность этого кода несколько не такая, которая мне нужна, в частности, хорошо бы было иметь именованные поля данных внутри элементов массива и функцию, описанную в статье про лямбды - перебор всех элементов массива. Видимо, в скором времени я это дело перепишу, правда, тогда придётся переписать добрую половину моей молекулярной динамики, зато после этого она похудеет раза в полтора-два (хотя и так весит совсем немного). Цитата AndNot @ А чем ариф. стек не устраивает. Какие выгоды от отдельного стека? Или по аналогии с вещественными числами? Я всё время думал, что вещественные числа и числа с плавающей точкой - одно и то же. Цитата AndNot @ По работе приходится использовать асм. Причем в основном для DOS Prot Mode 32bit. А вот нормальный Форт для этого еще не встретил, самому писать некогда. Хотя, если время появится, напишу. Тогда и пересяду окончательно А что, до сих пор остались области, где нужен дос? Под дос вроде есть фасм - портируй мой форт под дос и программируй на нём! Правда, там нет встроенного ассемблера, я смотрю все интересующие меня опкоды в фасме и дизассемблере. Цитата AndNot @ и поддержки многозадачности Практически в любом более-менее нормальном Форте она встроена. А как она реализована, не подкинешь статью? На самом деле, поскольку я пишу под windows, многозадачность (точнее, многопоточность) я возьму готовую из виндовса. Проблемы начинаются тогда, когда у функции слишком много промежуточных переменных и приходится создавать "локальные" переменные. Поскольку я ещё не придумал, как делать локальные переменные в стеке, я их создаю там же, где обычные переменные. А теперь, если два потока одновременно вызовут одну и ту же функцию, их промежуточные значения смешаются, и, понятное дело, их результат будет далёк от истины. Одним словом, надо придумать, как хранить именованные переменные в стеке. |
Сообщ.
#188
,
|
|
|
Цитата wormball @ Реализовано просто: есть слово, которое должно обозначать будущий массив, к нему прибавляются различные окончания и образованные таким макаром слова записываются в словарь, и каждому слову сопоставляется соответствующее действие. Т.е. насколько разобрался получается, что на каждый массив добавляются слова: name[],name+,name-,namesize, etc. Но ведь получается избыточность. Зачем определять новые слова делающие одну работу, но вся разница которых только в адресе массива. Делай проще. Словарь со словами реализующими любые нужные тебе операции с массивами. Далее для каких либо действий с массивом передаешь этим словам адрес любого блока памяти и все. Получится покомпактнее ![]() ![]() Цитата wormball @ Зверская гимнастика для мозгов ![]() ![]() ![]() Цитата wormball @ Я всё время думал, что вещественные числа и числа с плавающей точкой - одно и то же. Сорри, почему то засели в мозгах fixed числа, и плавающую прочитал как фиксированную ![]() ![]() Цитата wormball @ А что, до сих пор остались области, где нужен дос? Ну загнул конечно насчет в основном. Но приходится. DOS понятие растяжимое. Особенно если кодишь аппаратуру. Или какое нибудь старье ![]() И кстати полазай по инету и поймешь, что ДОС жил,жив,и будет жить, назло всем виндам ![]() Цитата wormball @ Под дос вроде есть фасм - портируй мой форт под дос и программируй на нём! Гляну. Цитата wormball @ Правда, там нет встроенного ассемблера Он обычно пишется на Форте, поэтому его портировать нетрудно. Цитата wormball @ А как она реализована, не подкинешь статью? Могу только кинуть GP Forth или Astro Forth в которых это все реализовано, там и доки есть. Правда под ДОС и 16 бит, но главное концепция. Особо не вникал, но вроде как c каждой задачей связываются свои локальные области для стека данных и стека возвратов. И вроде как вводится понятие USER областей. Текущее состояние задачи определяется значением указателя интерпретации и указателями вершин локальных стеков. Каждой задаче выделяется квант времени, но она может досрочно передать управление. В Astro Forth кстати при запуске выполняется три процесса - MAIN(собственно Форт), CLOCK(выводит часики) и PRINT(печать). А под винду видел опять же в SPF. |
Сообщ.
#189
,
|
|
|
Цитата AndNot @ Т.е. насколько разобрался получается, что на каждый массив добавляются слова: name[],name+,name-,namesize, etc. Но ведь получается избыточность. Зачем определять новые слова делающие одну работу, но вся разница которых только в адресе массива. Делай проще. Словарь со словами реализующими любые нужные тебе операции с массивами. Далее для каких либо действий с массивом передаешь этим словам адрес любого блока памяти и все. Получится покомпактнее Там прикол, во-первых, в быстродействии, а во-вторых в компактности записи. У массива, помимо имени, есть ещё куча параметров: размер элемента, количество измерений, размер по каждому измерению. Если это всё передавать во время исполнения, получится медленно. А места в словаре мне не жалко - всё равно данных будет больше. Хотя.... я подумаю. Цитата AndNot @ Да и мозги не расплавятся Вряд ли это будет сильно проще - всё равно для быстродействия гадо будет функции инлайнить. К тому же все необходимые слова у меня уже есть. Цитата AndNot @ Гляну. Если соберёшься портировать - пиши мне на мыло, чем смогу, помогу. Хотя бы документацию напишу. ![]() |
Сообщ.
#190
,
|
|
|
Цитата wormball @ помимо имени, есть ещё куча параметров: размер элемента, количество измерений, размер по каждому измерению. Если это всё передавать во время исполнения, получится медленно Не надо этого передавать. В явном виде. Смотри: ![]() ![]() : MAS ( кол_измерений размер_1измерения [размер_2измерения] -- ) CREATE (дальше выделяешь память и перво-наперво прописываешь параметры массива) DOES> (здесь можешь вставить проверку на выход за пределы массива) ; Далее определяешь слова для работы с массивами. ![]() ![]() : MAS[] ( индекс [индекс] -- ) (здесь вычисляешь адрес элемента, согласно данным сохраненным при создании массива) ; etc. Т.е. этим словам в качестве параметра будет передаваться только адрес массива, ну и специфические типа индекса, присваемого значения и т.д. Зависит от назначения слова. По быстродействию ненамного будет отличаться от твоей версии. Цитата wormball @ Вряд ли это будет сильно проще - всё равно для быстродействия гадо будет функции инлайнить. Лично для меня это будет проще ![]() Цитата wormball @ К тому же все необходимые слова у меня уже есть. Да их переделать будет не трудно. Цитата wormball @ Если соберёшься портировать - пиши мне на мыло, чем смогу, помогу. Хотя бы документацию напишу. Дока в любом случае не помешает. А вообще еще не просмотрел добром ![]() ![]() ![]() ЗЫ: На увеличение скорости очень сильно влияет выравнивание данных и оптимизация условных переходов! Не проще ли это реализовать? И ты сам убедился, что и малый размер кода тоже ![]() |
Сообщ.
#191
,
|
|
|
Сообщ.
#192
,
|
|
|
Я конечно Форт не знаю, но читая тему на предмет комментариев о красотах C++. Так же и аргументы в защиту Форта. Решил найти краткое описание Форта, но об этом немного позже.
В принципе и C++ особо не знаю. Для повседневной работы на протяжении нескольких лет, мне оказалось достаточно мало мальки понять, что красота и понятность кода это очень важно. Выполняя реальные задачи, приходится копаться в коде других людей. И благо, C++ поражает своей ясностью. И почему то все независимые программеры пытаются писать более или менее в одном стиле. Может философия языка такая, может людей так или иначе тянет к гармоничному. А конструкции на C++ можно строить самые умопомрачительные. За 6 лет знакомства с C++, до сих пор для меня некоторое не читаемо. Так как я сторонник промышленного программирования, просто не представляю пока более идеального языка чем C++. На практике оказывается, для реальных задач, просто не возможно жить; без типов определенных пользователем языка, операторов определяемых пользователем; иерархии классов; шаблонов; встроенных возможностей обработки исключений программы; проверки соответствия типов; использование одного имени для операций с различными типами. Но и это еще не все, есть еще и философия языка о которой пишет создатель C++ Цитата Язык программирования служит двум взаимосвязанным целям: он предоставляет программисту инструмент для описания подлежащих выполнению действий и набор концепций, которыми оперирует программист, обдумывая, что можно сделать. То есть, изучая тот или иной язык, я формирую свое сознание соответствующим образом, буду знать что смогу сделать средствами языка. Более того, при богатом наборе концепций, я смогу рассматривать большее количество возможных путей для решения задачи. На начальном этапе решения задачи, я смогу оперировать только лишь одними концепциями, реализацию же, оставить на потом или доверить другим людям. Смогу средствами C++ вести чисто архитектурные описания будущих конструкций. То есть смогу в масштабе организации распределить иерархию ответственности, на программистов разрабатывающих типы и методы, формирующих взаимодействие и связи между объектами. И на программистов занимающихся реализацией отдельных методов. Одним словом C++ довольно хорош своей философией для того что бы считаться близким к идеальному. По крайней мере в моем понимании. Из этого делаю вывод: - идеальность языка заключена больше всего в наборах концепций которыми может оперировать человек использующий язык, и чем больше эти концепции отражают реалии наших задач, принципы реального мира, тем более идеальный язык программирования. |
Сообщ.
#193
,
|
|
|
Цитата Maksim @ И благо, C++ поражает своей ясностью. Это С был понятен даже тем, кто его не знал. А вот С++ , по моему, этим уже не блещет. Слишком много наворотов, причем не всегда ясных. Например: ![]() ![]() std::cout << g(t) << std::endl; Что такое '<<'? Ведь логически это обозначает только сдвиг. И человеку не знакомому с С++ не понять, что это всего лишь вывод (на экран, файл или куда угодно). Выбивается эта конструкция из ряда логичных. И подобного хватает. Цитата Maksim @ А конструкции на C++ можно строить самые умопомрачительные Точнее не скажешь ![]() Цитата Maksim @ без типов определенных пользователем языка, операторов определяемых пользователем; иерархии классов; шаблонов; встроенных возможностей обработки исключений программы; проверки соответствия типов Идеология С++ - как ни крути а сводится к удобной работе с указателями. А если есть указатели, то возможны очень мистические глюки. И проверка типов здесь отдыхает. Угадай почему? Цитата Maksim @ Из этого делаю вывод: - идеальность языка заключена больше всего в наборах концепций которыми может оперировать человек использующий язык, и чем больше эти концепции отражают реалии наших задач, принципы реального мира, тем более идеальный язык программирования. А вот одна из концепций С заключается в том, что дуракоустойчивость программы должен обеспечивать сам программист. И в результате сегодня мы имеем проблему переполнения буферов. Ну нет удобных средств для контроля. Кто там приводил козырь, мол сейчас почти весь софт пишется на С++, но забыл упомянуть, что сейчас уже никого не удивляет, если после выхода программы следом выходит патч, привыкли. А когда то это было дикостью. Цитата Maksim @ То есть, изучая тот или иной язык, я формирую свое сознание соответствующим образом Именно! А подавляющее количество программеров начав изучение С++ привыкают писать на авось. Мол нахрена мне проверять длину буфера перед передачей scanf, авось никто его не переполнит. Да и геморойно повсюду такие проверки писать. А если уж не отвлекаться от темы, то в С++ действительно много хорошего. Те же макросы (как их не хватало в паскале!). Неплохое ООП. И удобная работа с указателями. Но сегодня слишком много разноплановых задач. И под каждую лучше подбирать свой язык. Цитата impik777 @ предлагаю каждому участнику составить список пунктов, без которых идеальный язык не сможет быть идельаным 1. Малый размер компилятора (чтоб свой проект всюду таскать с собой на дискетке). 2. Компактный синтаксис. Т.е. что бы на экране увидеть как можно больше, а не убивать жизнь, листаю сорсы вверх-вниз. 3. Расширяемость синтаксиса. Должна быть возможность создавать свой, для каждой конкретной задачи, и убирать ненужный. 4. Средства для тестирования, как на уровне модулей, так и отдельных подпрограмм (для этого лучше интерпритатора еще ничего не придумали). 5. Удобные средства обработки ошибок времени исполнения программы (которыми можно удобно управлять, изменять, добавлять, убирать). 6. Возможность использовать наработки с других языков. 7. Хорошая документация, с примерами ![]() Жалобы, предложения, пожелания? |
Сообщ.
#194
,
|
|
|
AndNot
Твои познания о С++ устарели лет на 10 как минимум: как о языке, так и способах проектирования/программирования на нем. Какие ещё scanf и сплошные указатели? |
Сообщ.
#195
,
|
|
|
Цитата Hryak @ сплошные указатели? А ты хочешь сказать что в С++ нет указателей???? Да вся работа с объектами ведется через указатели. И явно и косвенно. |