реально помогите, хочу изучать программирование, а не знаю с какого языка начинать. не понимаю какая разница между ними, как для новичка объясните, плиз………
реально помогите, хочу изучать программирование, а не знаю с какого языка начинать. не понимаю какая разница между ними, как для новичка объясните, плиз………
Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.
14 октября 2009 в 11:05
C# учи, он счас у буржуев очень востребован.
это касается и web и desktop
14 октября 2009 в 11:00
Кстати, можно еще заявить, что-де после изучения квантовой физики можно писать на любом языке программирования, т.к. любая программа в итоге все равно превращается в квантовые эффекты в транзисторах. Александр, чем это заявление по силе аргументации отличается от твоего заявления о машинных кодах?
14 октября 2009 в 9:01
Александр, во что примерно скомпилируется вот этот код на хаскелле?
qsort [] = []
qsort (x:xs) = qsort (filter (<x) xs)++[x]++qsort (filter (>x) xs)
(прошу не воспринимать как пример "настоящего" кода – это учебный пример, на самом деле конечно никто так сортировку на хаскелле не пишет)
Кроме того, готов поспорить, что я могу написать программу на Haskell примерно такого же размера (2 строчки без трюков с упихиванием как можно большего количества кода в одну), скомпилировать ее даже без оптимизации, и ты не сможешь по ассемблерному листингу отгадать, что эта программа должна была делать.
В общем я это к тому, что понимание процесса компиляции языка в фоннеймановскую архитектуру требуется только в том случае, если ты не способен понять сам язык непосредственно, не транслируя его мысленно в ассемблер. Нетрудно догадаться, что продуктивность разработки и понимания при таком подходе исчезающе низкая, поскольку:
- ты добавляешь к процессу понимания программы две лишних стадии – мысленную компиляцию и понимание скомпилированного результата
- ты прибавляешь к сложности понимания программы сложность мысленной ее компиляции, которая в случае языка такого уровня как Haskell может оказаться просто невообразимой для человеческого мозга
- ты автоматически увеличиваешь сложность понимания программы до сложности понимания ее скомпилированной версии, которая, опять же, в случае Haskell несопоставимо огромна по сравнению с исходной
Мораль: программирование – это не искусство мышления в терминах ассемблера x86. Это искусство мышления о вычислительных задачах как таковых, независимо от способа их задания.
14 октября 2009 в 9:00
>> Ведь в итоге всё равно окажуться в машинных кодах!
угу. все дружно вспоминаем квантовые компьютеры.
14 октября 2009 в 3:00
"ЗЫ. можно еще на асемблере начинать. если усвоишь – любой другой язык будешь изучать по мануалу за сутки "
Подтверждаю личным примером, чистейшая правда. После изучения ассемблера для CPUz80, дольше всего пришлось втыкать только при смене парадигмы на функциональную. И то это было скорее непривычно, чем сложно. Просто после изучения асма ты втыкаешь как на самом деле функционируют все программы, на каком бы языке они не были написаны. Ведь в итоге всё равно окажуться в машинных кодах!
14 октября 2009 в 0:05
Для инженеров без особых навыков программирования я бы предложил среду разработки CoDeSys – там есть:
FB – построение программ в виде графических функциональных блоков;
SFC – в виде блок схем (похожие на то что в школах рисуют);
LD – в виде ассемблерного кода;
ST – похожий на С;
еще язык в виде релейных схем;
и ещё какаято хрень…
Среда рассчитана на программирование контроллеров и поддерживает много ПЛК производителей – будет полезно прикупить какойнить из них)))
Я как Сишник конечно фигачу всю программу для своего контроллера на ST, но видел реализации и на графических языках … Достаточно любопытное зрелище)))
А если серьёзно, то полюбому(если хочешь стать программистом) нужно начинать с С – так как Open Source в основном на этом языке распространяется и с изучением чужих исходников, и доработкой полезных прог проблем не будет…
13 октября 2009 в 19:03
Начинал с Turbo Pascal, но потом было очень сложно перейти на С++.
Рекомендую начинать с С, самый оптимальный вариант.
ЗЫ. можно еще на асемблере начинать. если усвоишь – любой другой язык будешь изучать по мануалу за сутки
10 октября 2009 в 0:03
>> О_о неужели язык с названием personal home page tools или, что еще круче, hypertext preprocessor изначалььно не был приспособлен для веб? О_о
неудачно выразился. скорее даже некорректно. в общем, интерпретатор был всяко раньше модуля для апача.
9 октября 2009 в 16:01
[ответил]
9 октября 2009 в 16:00
[Жека, создал тему в твоей группе //vkontakte.ru/topic-312608_21900011 - продублировал последний вопрос... лучше отвечай там, а то здесь оффтоп уже]
9 октября 2009 в 16:00
#85 Соглашусь =)
9 октября 2009 в 15:05
Жека, почитав про Хаскелевские массивы, вопрос снят – как я понял, сложностей с массивами нет относительно императивных языков.
Впрочем, остались вопросы -
1) как реализуются двумерные, например, массивы (хотя примерно представляю) и
2) что означает "небезопасные" функции компилятора (т.е. чем они не безопасны? про механизм реализации функций-массивов вроде усёк… но непонял, что ты имеешь под "небезопасностью"?)
3) оператор свёртки fold можно применить для реализации одно- и двумерной свёртки дискретных функций (математической свёртки, функции заданы массивами)? Если несложно – с примером Хаскель кода =)))
9 октября 2009 в 15:04
Ага, моё мнение – на этапе "до указателей" сложности языков равны (разве что за исключением prinf). На этапе после – Паскаль проигрывает, т.е. в нём указатели менее наглядны.
P.S. Плюс мой поинт, повторю – Си потом пригодится много где, а Паскаль – нет.
9 октября 2009 в 14:05
#76
Ну если что – я после изучения Паскаля предложил изучать Си в том же #57. Более того, я отлично отношусь к Си, как к TheBestOfTheBest.
И Си я вообще не отвергал. Это не мои слова, не знаю где вы их увидели.
Я сказал, что для начинающего проще Паскаль.
Ваше мнение другое именно по этому вопросу?
9 октября 2009 в 14:04
Да, понятно, спасибо.
9 октября 2009 в 14:03
>функциональных языках массивы тоже есть
Кстати, сорьте за оффтоп, а вообще массивы как-нибудь выражаются средствами функционального языка? Просто со списками боле-менее понятно, в том же хаскеле если бы списков не было их можно было бы сделать, а с массивами как?
9 октября 2009 в 14:03
Массивы в хаскелле реализованы через встроенные "небезопасные" функции компилятора для работы с массивами и указателями – т.е. дополнительного синтаксиса для них не вводится, но и эффективно реализовать их средствами голого хаскелла нельзя.
9 октября 2009 в 14:02
> И риторический вопрос
по-моему это не риторический, а некорректный вопрос))
и вообще спискомассивы – рулят)
9 октября 2009 в 14:02
> Схема, позволяя писать более простой код, обладает и более простым синтаксисом?
Да.
> что проще
1) Во всех функциональных языках массивы тоже есть
2) Какие операции ты имеешь в виду?
9 октября 2009 в 14:01
Евгений, если честно – не понравилось, что ты затронул только императивную парадигму, и то, что начал с Паскаля – это могло говорить только о незнании более продвинутых технологий. Отвергая язык Си, ты игнорируешь его активное использование почти во всех проектах и сложность, не намного выше Паскалевской. А также отвергаешь необходимость разбираться в архитектуре ПК (на Паскале указатели – неестественная вещь). Вообщем, пост #57 говорит о твоей низкой компетенции в вопросе (что подтверждается перечислением ЯП). Ничего личного, лишь ответил на твой вопрос.
Свят, другое дело =) Молоток =)
9 октября 2009 в 14:01
(Жека – "Евгений", это не ты, если что =)
9 октября 2009 в 14:01
Жека, то есть Схема, позволяя писать более простой код, обладает и более простым синтаксисом?
И риторический вопрос – что проще: работа со списком в стиле ФЯ или работа с линейным индексируемым массивом (рассматривая только применимые к массиву операции)?
9 октября 2009 в 14:00
> с функциональной парадигмой и прочими незнаком.
Рекомендую познакомиться; рассуждения о языках, ограниченные императивщиной, выглядят со стороны просто смешно.
9 октября 2009 в 13:04
язык Си гибок, удобен,легок в освоении – для начала самое то, плюс можно в некоторой степени освоить архитектуру ЭВМ.Хорошая структурированность.Концепция построения языка провоцирует начинающего программиста следить за тем, что пишешь и не надеятся на то, что и так все прокатит.
начинать программировать с ООП не считаю разумным по причинамслишком высокой абстрактности, что может,как минимум,напугать начинающего.
с функциональной парадигмой и прочими незнаком.
Константин, сойдет за аргумент ?
9 октября 2009 в 13:01
Что именно не понравилось в #57 ?
Надо начинать с Явы? Или выбор пал на Qbasic?
9 октября 2009 в 12:04
По посту #57 уже принято решение в посте #67 =) Рассуждения по посту 71 мне не совсем понятны – к чему ты это?…
9 октября 2009 в 12:02
#68 -> #70
#67 С Леонидом я и не спорил и признал, что я не знал про существование интерпретатора.
За что мне два я так и не понял.
Оператор for, затем нач состояние, потом условие продолжения, и в большинстве случаев инкрементирование нач. переменной. В паскале цикл for это цикл со счётчиком, а в Си это вообще цикл с предусловием. То что в паскале не реализовано в for можно сделать в while, правда менее удобно, чем в Си.
По посту #57 есть ещё вопросы? Я не прав?
Про пхп не считается. Я действительно не знал. Сейчас погуглил, нашёл. Cкачал Delphi for php, пытаюсь понять зачем это нужно…
9 октября 2009 в 11:03
> начать следует с того, что интерпретатор php появился до того, как php был приспособлен для web
О_о неужели язык с названием personal home page tools или, что еще круче, hypertext preprocessor изначалььно не был приспособлен для веб? О_о
9 октября 2009 в 10:04
Ты сначала подумай зачем тебе это, в какую среду ты направишь свои знания и что хочешь получить в итоге. Только потом есть смысл выбирать ЧТО учить, а не с чего начинать… знать все, конечно, хорошо, но ИМХО начать нужно с того, что больше пригодиться в жизни!
9 октября 2009 в 8:05
>> В Си же просто передаются параметры процедуре for.
какие параметры? какой процедуре? о_О
а семиколоны что там делают?
>> Про нормальный интерпретатор для пхп не слышал, я его в связке LAMP изучал, даже не искал. Просто как бы пхп рассчитывался для вебя и зачем он нужен для десктопного программирования я не пойму.
начать следует с того, что интерпретатор php появился до того, как php был приспособлен для web. на счет того, зачем он нужен для десктопного программирования – затем же, зачем для веб-программирования. это просто язык программирования, удобный для написания небольших скриптов.
>> предлагают чуть ли не перл
не перл. у вас, похоже, не хватает воображения представить, насколько все может быть просто. попробуйте посмотреть на правильно написанный код на scheme.
9 октября 2009 в 8:02
Евгений, даже если интерпретатора и нет, пост про необходимость самому настраивать Апачи всё равно ложен. Так что непонятно, о чём ты споришь с Леонидом?
Про "параметры процедуры фор" – ты глубоко ошибаешься, два тебе по знанию Си. В паскале, к тому же, есть странное ограничение на цикл for, что явно усложняет язык – с точки зрения, предложенной Жекой.
P.S. Вообщем, высокопоставленная комиссия в моём лице пришла к выводу считать твоё мнение по рассматриваемой теме ничтожным =) И понимание "азов" в твоём виде – также =))
9 октября 2009 в 5:03
#61
Скорее менее нагляден. С логикой у Си действительно проблем нет, но эту логику нужно понимать. А в Паскале всё более-менее читаемо. То есть зная английский можно в принципе понять кто, что делает. Даже обычный заголовок цикла for в паскале легко читается как "Для I равного от 1 до N, делай". В Си же просто передаются параметры процедуре for.
#63 Про нормальный интерпретатор для пхп не слышал, я его в связке LAMP изучал, даже не искал. Просто как бы пхп рассчитывался для вебя и зачем он нужен для десктопного программирования я не пойму.
p.s Заходя в эту тему ожидал увидеть тут холивар на тему Qbasic или Pascal, а тут парню, которому 17 вроде лет(То есть либо 11 класс, либо 1 курс) предлагают чуть ли не перл (я его правда в глаза не видел, но код на нём меня достаточно поразил). Моё мнение – Вначале нужны азы. А потом уже браться за серьёзные языки.
p.p.s В школах изучают Паскаль
9 октября 2009 в 5:02
Свят – кажется, пора начать банить за "кажется"… Голословно!
9 октября 2009 в 5:02
Офтоп: Леонид, это типа как "каждый мужчина должен написать свою операционную систему" =))) Оттуда ветер дует…
8 октября 2009 в 23:01
>> чтобы учиться на нём [php], нужно самому настроить Apache. И надо ещё знать хтмл. Хотя бы немного. Зачем это для простого ученика – ума не приложу.
ложь!
есть нормальный standalone php-интерпретатор.
не нужен для php никакой апач, и никакого хтмл знать не требуется.
ЗЫ: но это не означает, что следует бросаться изучать php. просто некоторые пишут тут всякую ерунду.
8 октября 2009 в 22:03
почему-то мне кажется, что нужно начинать именно с процедурного программирования, с тех же самых Паскалей и Си, после чего осваивать C++(C#(Java))
8 октября 2009 в 18:02
Сосновкий, по нику, к сожалению, не могу – здесь как-никак Жека уже есть =) А по номеру поста – это ненадёжно всё… Так что сорри =))) Давай, буду тебя "Евгений" называть? =))) Да, и мне можно на "ты".
Хм, а по Си – можешь сказать, чем он так "менее логичен" и т.п. Паскаля? Конкретнее?
8 октября 2009 в 18:00
5 лет. 2 года на паскале, потом пхп(моя ошибка, наступил на грабли).
Сейчас – Си + делфи. Си – для души, а делфи в универе заставляют.
Ну и яву с пхп погонял.
p.s Либо по нику обращайтесь, либо по номеру поста. А то как на уроке…)
8 октября 2009 в 16:02
Я считаю си сложнее схемы потому, что программы на си получаются (из-за бедности средств си) сложнее, чем программы на схеме.
8 октября 2009 в 13:04
Сосновский, можно поинтересоваться твоим опытом в области программирования?… Так, для статистики =)))
8 октября 2009 в 13:01
Блин, че за бред. Какой Си? Учиться надо на Паскале, он самый логичный, понятный и безопасный. Научиться массивы переварачивать, там сортировать как-нить через зад, кароче порешать школьно-университетские задачки, с максимальной оптимизацией. Реально хорошо развивает мозг. На Паскале хорошо видно, что ты делаешь. Главное понятно.
После азов Паскаля браться за С.
Не за пхп!
За Си! Причём не мышкотыкательный, а обычный. Там поиграться, те же задачки паскалевские перерешать, и переходить на С++.
Это оптимальная схема. Бейсик и Пхп будут рождать нубов. Банально потому, что там даже переменные можно не объявлять. Пхп создан для программирования в веб элементах, и чтобы учиться на нём, нужно самому настроить Apache. И надо ещё знать хтмл. Хотя бы немного. Зачем это для простого ученика – ума не приложу.
После того, как освоишь С, можно поиграться с ассемблером. Ну это если ты понимаешь, что мозг выдержит.
з.ы Сейчас дофига много кулмегапроггеров, которые пишут программы для работы с базами данных, и в то же время не могут повернуть матрицу на 90 градусов без использования вспомогательной матрицы. И как потом эти люди будут оптимизировать код?!!
з.з.ы Java это конечно круто, но лучше её осваивать после С. Во-первых они родственники, а во вторых код на Java сложнее для восприятия, чем Сишный код.
8 октября 2009 в 0:01
не писал на си уже лет пять
задачки, задаваемые в группе, не в счет. да и их я пишу без компилятора.
7 октября 2009 в 23:02
Ладно-ладно, не прибедняйся насчёт Си =)
про begin end согласен, но есть люди, с пеной у рта доказывающие неудобство чтения кода с {} и без def(begin)/end (я одного такого Руби-программиста знаю)
7 октября 2009 в 23:00
ну… тут такое дело: в то время, когда у меня была возможность изучать паскаль, я очень медленно печатал. соответственно, наличие необходимости печатать begin/end меня и отпугнуло.
потом уже, зная си, я кому-то писал на паскале с использованием указателей. с тех пор зарекся.
впрочем, за си я тоже давно не брался
у меня даже компилятора сейчас нет )
7 октября 2009 в 0:02
Леонид, боюсь, требуется подтверждение. Иначе получается, что лишние конструкции не добавляют сложности языку О_о
Так как же?
Плюс чем именно сложность Паскаля выше Си? Чувствуется, кто-тодавненько не брался за Паскаль (за Си вроде брался, я сам свидетель =))))
6 октября 2009 в 21:04
>> Паскаль (полагаю, его-то сложность эквивалентна Схеме? =)
сложность у паскаля такая же, как у си, если не больше. сложность заключается не в наличии/отсутствии указателей, а в перегруженности языка вторичными наворотами вроде циклов, массивов и т.д.
6 октября 2009 в 18:05
"и так понятно интуитивно" – передай многим, что они заблуждаются =) Просто позабыли уже… Так что возражение не принимается – я говорил совсем о другом (повторюсь): что императивное программирование так и так придётся "учить", и (если) Си проще Схемы – то и начинать следует с Си.
А так, учитывая сказанное тобой – что Схема проще Си – думаю, это скорее является "возражением сразу по нескольким пунктам" =) В таком случае, я согласен с началом обучения по Схеме – но всё равно не с Хаскеля =)
5) Раз со схемой и ты согласен, предлагаю в данной теме удалить все "левые" сообщения и оставить единственный паттерн обучения – параллельное освоение… Причём, с учётом, что начинающие обычно знают Паскаль (полагаю, его-то сложность эквивалентна Схеме? =) можно сразу начинать "ломать мозг" Схемой (как только тут быть с императивными штуками – программа должна как можно сильнее дистанциироваться от них), а потом "ломать" обратно (вспоминать Паскаль) с помощью Си (ключевым будет объяснение низкого уровня – массивы, указатели). Следующий уровень – объектно-ориентированные (или типо ориентированные – тебе виднее, как правильно языки Java (даётся на основе Си) и OCaml (ну тут всё понятно – только скобок меньше (много ли их в Схеме? ). А Хаскель и С++ всё-таки оставить на продвинутый уровень.
P.S. Вообще, сомнения по поводу простоты Схемы относительно Си меня взяли из соображения, что Схема вроде как содержит императивную часть. Если не секрет, почему ты считаешь Си сложнее Схемы? Не из-за отсутствия указателей же? Если из-за них, то как по сравнению с Паскалем (с учётом отказа от использования указателей =))))?
6 октября 2009 в 8:04
> не путаешь ли ты причину со следствием
Безусловно, связь в обе стороны. Но я утверждаю, что присутствует она и в указанную мною.
> За какой, по-твоему, срок можно освоить Хаскель до тонкостей?
Где-то люди пишут, что под руководством опытного программиста человек начинает поддерживать готовый хаскельный код через пару недель; писать свой – еще через некоторое время. Можно предположить, что в учебной обстановке при наличии хорошего преподавателя это растянется где-то на год
Товарищ из крупной эрланговской конторы говорит, что программисты при обучении с нуля пишут через 2 недели продакшн-код на эрланге.
Но в любом случае, я вынужден повторить еще раз: учиться программировать надо не на том, что "и так понятно и интуитивно" (по мнению многих, якобы императивщина), а на том, что лучше всего учит программированию.
Это возражение сразу к нескольким пунктам твоего ответа.
Scheme намного проще си.
5) Предложенная тобою схема мне нравится
5 октября 2009 в 23:02
1) Жека, а не путаешь ли ты причину со следствием? Не является ли высокая обучаемость Хаскель-программистов не следствием изучения Хаскеля, а причиной. По которой, в том числе, человек начал и _смог_ изучть Хаскель? За какой, по-твоему, срок можно освоить Хаскель до тонкостей? Ведь именно такой уровень требуется для промышленного программирования, я не ошибаюсь?
2) По поводу продолжительности курсов – освоить Си в промышленном масштабе вполне можно за семестр. Ещё семестр на изучение основных паттернов. А если учесть, что в школах частенько преподают Паскаль… OCaml, Java такжене требуют многих лет (хотя, там на практике всё упрётся в знание библиотек). А вот монстры типа С++/Хаскель – это да, без нескольких лет не обойтись только на познание языка…
По поводу сравнения времени обучения С++/Haskell – я и не сравнивал, я говорил о Java/Haskell, например =) Таки будешь и здесь утверждать, что Хаскель быстрее изучить? По поводу С++/Haskell я с тобой согласен – как минимум, время будет близкО.
3) По поводу "моей позиции махрового импеативщика" . Я не считаю императивное ООП более правильным, чем функциональное ООП =)) А если серьёзно, то согласен с тобой о выразительности ФП и бОльших возможностях. Однако, даже твой курс подразумевает освоение императивных способов. Кроме того, исторически сложилось преимущественно императивное программирование, программист в любом случае столкнётся с ним (даже в хаскеле когда речь пойдёт об управлении последовательностью выполнения).
То есть я не настаиваю, что императивный язык выучить проще (естественно, при одинаковом уровне языков). Я настаиваю, что знание императивного языка необходимо, в том числе для освоения ФП (ведь в большинстве таких языков есть императивщина). Также я утверждаю, что предлагаемый тобой Хаскель имеет повышенную сложность относительно Явы или Схемы/Окамла, которые, в свою очередь имеют повышенную сложность относительно Си (за Схему не ручаюсь, но, наверное, это так?)
Отсюда я и составляю программу – по принципу "от простогок сложному"… Си ведь проще Хаскеля… и аже Явы =) Или как (особенно твоё мнение по Схеме интересует)?
4) спасибоза ответ по Scheme =) Но таки сложнее она языка Си или нет?
Upd:
5) И вообще, не будет ли правильнее изучать ФП и императивное отдельно независимо? Например, по схеме Си/Схема -> Ява/ОКамл -> C++(С#)/Haskell(F#)? Это позволило бы в рамках курса(ов) также показать различия и общие места паттернов.
(правда, я не знаком со Схемой (Лисп немного знаю =) и F# – но, видится, такое сопоставление уместно)
5 октября 2009 в 20:04
Что будет завтра знает только всевышний архитектор ))) Может так оказаться, что завтра востребовано будет добывать огонь с помощью палки и булыжника. Айда учиться…
5 октября 2009 в 17:02
Ага!)))
5 октября 2009 в 17:01
2Саша <__cynical_cat__> Глова:
Делается всё очень просто!!!
//www.tiobe.com/index.php/content/paperinfo/tpc...
Тут смотришь рейтинг языков программирования, и изучай то, что востребованно, и усё!))
5 октября 2009 в 17:01
Ага, а остальные будут в это время изучать то, что будет востребовано *завтра*
5 октября 2009 в 17:00
2Жека jkff Кирпичев & Константин Смотритель:
-Да просто читать лень, может и чё хорошего написал, но не смог это кратко изложить, ты философ а не прогер! %)
Чё паритесь, устройте голосование, тогда каждый выскажется!))
З.Ы. ни кого не хотел обидеть!)
5 октября 2009 в 17:00
Сергей, я прогер, и в общем-то не х*йней на работе занимаюсь – можешь посмотреть в мою анкету.
Мне нашлось что сказать по заданному Констатином вопросу; оказалось, что то, что я хочу сказать – длинно. Можешь считать, что длиной сообщения я отсеял тех, кому недостаточно интересен предмет обсуждения – например, тебя
Голосование это неинтересно – ценность полученной голосованием информации в данном вопросе равна нулю, т.к. имеют одинаковый вес и голос человека, который знает о чем говорит, и голос того, кто голосует от балды или вообще не сечет в теме.
5 октября 2009 в 16:05
Те, кто учится программировать с целью как можно быстрее найти работу – пусть учат PHP и HTML и говнокодят интернет-магазины. Они не наша целевая аудитория, тксзть.
Специалиста по Haskell с руками оторвут где угодно, т.к. он обладает на порядки бОльшей обучаемостью, чем 95% джавистов. Булат Зиганьшин говорил, что его звали на удаленную (!) работу по C# (!) только потому, что он упоминал, что знает haskell.
Курс молодого бойца? Извиняюсь, где ты видел семестровый курс, пригодный чтобы подготовить программиста с нуля? Ясен пень, курс будет растянут на несколько лет! А разве сейчас эти курсы не растянуты на несколько лет?
Я *буду* спорить, что обучение более выразительному языку больше по времени. Во-первых, более выразительный язык (как Haskell), скорее всего, более компактен и понятен, чем язык с богатым синтаксисом и богатым набором базовых понятий (как С++). Он как раз-таки снимает сложность с языка и позволяет сконцентрироваться на сложностях предметной области.
Во-вторых, обучение более выразительному языку включает в себя бОльшее развитие собственной обучаемости и мышления, что ускоряет изучение всего остального.
Ты судишь с позиции, что это *ФП* сложная вещь, а не ООП и императивщина. С какой стати? ФП сложно только тем, кто отвык учиться, т.к. ничего толком не изучил с тех пор как выучил императивные языки (а как сложно было изучать их – он уже забыл).
Постарайся встать на нейтральную позицию и рассудить независимо об обоих.
Изучение Scheme – да, подразумевается, что императивное программирование будет изучено в рамках Scheme.
Не OCaml чтобы отставить типизацию на потом (зато уж потом изучить ее как следует на хаскелле), и не париться с синтаксисом.
5 октября 2009 в 16:04
Я понимаю, что ты хотел бы сразу привить студенту любовь и уважение к ФП, а императивщину оставить как факультатив. Но с практической точки зрения – правильно ли это? Не проще ли будет найти работу специалисту по Java, чем специалисту по Haskell?
К тому же, не будет ли, в твоём случае, курс растянут на многие годы? Я так понимаю, что должен быть курс молодого бойца – что-то, что можно изучить за семестр-два. Ведь, не будешь и ты спорить, что обучение более ёмкому языку дольше по времени? Плюс желательно изучать не Паскаль (который хорошо бы уже знать =), а что-то более практически полезное. Ведь с полезностью Си не будешь спорить…
Так что говоря о курсе молодого бойца о сложных вещах лучше забыть – пока человек не освоил ассемблер, браться за ФП ему рано =)))) А если серьёзно – высокая эффективность кода в любом случае недостижима без большого опыта.
Плюс я бы посчитал два последних курса лишними – может, бойцу никогда и не придётся сталкиваться с такими вещами… Особенно бойцу ФП =)
Изучение Scheme у тебя подразумевает изучение его императивных возможностей (вроде имеются у него)?
А ещё вопрос – почему Scheme (Lisp), а не OCaml?
5 октября 2009 в 16:03
2Георгий shaxirrim Алоян: +1
А я чёт постиснялся сказать… А то тут одни сионисты!))
2Жека jkff Кирпичев: -1
Учись лучше оптимизировать и минимизировать!)
5 октября 2009 в 16:03
Во избежания превращения этой темы в такую же помойку, как ее предыдущий аналог, я буду удалять здесь дальнейшие неаргументированные заявления и заявления, не отвечающие на основной вопрос темы – "с какого языка программирования *лучше* начать изучение". Это значит, что ответы "По-моему, с си" или "Я начинал с APL" или "+100" будут удалены. Прежде чем говорить, убедитесь, что вам есть что сказать по существу.
2Сергей: аргументируй свою позицию Если ты не осилил текст – это одно дело. Если ты его осилил и не согласен – другое. Если ты осилил его часть и решил, что дальше читать бесполезно – третье.
5 октября 2009 в 15:02
начинать можно сразу с питона, если получится!
5 октября 2009 в 15:02
Я не считаю, что яву и си не стоит изучать. Я считаю, что не стоит *основывать* изучение программирования на них.
На мой взгляд, программирование – прежде всего искусство описания (формулировки) вычислительных процессов.
Чем искуснее ты способен описывать вычислительные процессы, тем лучше ты как программист: тем более широкий класс вычислительных процессов ты способен описать или понять; тем более понятные, эффективные, краткие описания ты способен создавать.
Поэтому обучаться необходимо на тех языках, которые позволяют глубже всего изучить искусство описания вычислительных процессов. Это – те языки, что обладают наибольшим арсеналом приемов и подходов к их описанию. Самые важные и фундаментальные из таких приемов, на мой взгляд:
- Абстракция – способность языка интерпретировать составное как атомарное, давать составному имя.
- Квантификация – способность языка выражать общность и зависимость одного относительно другого.
- Композиция – способность языка выражать отношения между целым и частью и конструировать целое из частей.
- Типизация – способность языка классифицировать частные и описывать допустимые соотношения между ними.
Во всех этих отношениях функциональные языки богаче и "общее" процедурных и объектно-ориентированных.
- Абстракция:
Процедурные и ОО-языки предоставляют нам возможность интерпретации составного вычислительного процесса как целого (процедуры); интерпретации составной структуры данных как целого (структуры); интерпретации комбинации из данных и связанных с ними вычислительных процессов как целого (классы).
Функциональные языки, помимо процедур, структур и классов (их можно реализовать при помощи средств любого из современных функциональных языков, даже не имеющих встроенной поддержки), позволяют также интерпретировать как целое, например: бесконечные и недоопределенные объекты и процессы (ленивые вычисления), способы последовательной композиции взаимозависимых вычислительных процессов (монады), семейства вариантов строения структуры данных (алгебраические типы), композицию вычислительного процесса со свободными переменными и значений свободных переменных (замыкания).
- Квантификация:
Процедурные и ОО-языки позволяют квантифицировать вычислительные процессы по атомарным и составным значениям, по объектам (процедуры); многие языки позволяют квантифицировать строение структуры данных по типу ее элементов, или же процедуру – по типу ее параметра (generics). Функциональные языки позволяют все это, а также полноценную квантификацию одних вычислительных процессов по другим (функции высшего порядка).
- Композиция:
Процедурные и ОО-языки позволяют собирать тела процедур из вызовов других процедур; позволяют собирать одни структуры данных и объекты из других. Функциональные языки позволяют все это, а также позволяют собирать вычислительные процессы и структуры данных из друг друга. (те же функции высшего порядка и комбинаторы; возможность класть функции в структуры данных; классы типов и семейства типов, и т.п.). Лисп позволяет собирать описания вычислительных процессов из структур данных (макросы, eval). В Хаскелле различие между вычислительным процессом и структурой данных благодаря ленивым вычислениям размыто.
- Типизация:
Процедурные и ОО-языки позволяют оперировать атомарными типами, а также их Декартовыми произведениями (структурами) или – небезопасно и грязно – неразмеченными объединениями (union в Си). Некоторые языки позволяют манипулировать ячейками памяти (указатели). ООП и LSP позволяют оперировать семействами типов, удовлетворяющих определенной сигнатуре (наследование). Некоторые языки позволяют оперировать типами, квантифицированными по другим типам; оперировать абстрактными тИповыми переменными (теми, по которым производится квантификация) в определенных пределах (generics). C++ позволяет оперировать фактически термами над типами (templates, specialization), но без какой-либо стройной математической подоплеки.
5 октября 2009 в 15:02
Функциональные языки позволяют свободно оперировать типами вычислительных процессов – функциональными типами (типами "функция из A в B"), а также имеют огромное количество других возможностей, которые прочим языкам и не снились; даже перечислять не буду.
При этом я не предлагаю отказаться от привычных понятий, таких как переменная, цикл, массив, процедура, класс, виртуальный метод, наследование и т.п. Я предлагаю изучать понятия, **лежащие в их основе**, а сами эти понятия воспринимать как примеры их практического приложения.
Также я не предлагаю забыть о том, что машины у нас пока фоннеймановской архитектуры. Я предлагаю не возводить это в абсолют и вспоминать об этом лишь когда требуется высокая эффективность *кода*, а не просто эффективный алгоритм.
План обучения я вижу так.
- Курс "Программирование". На нем изучают искусство описания вычислительных процессов. Теория – лямбда-исчисление и машина Тьюринга, вычислимость и т.п. Базовые языки – Scheme, затем Haskell, затем Smalltalk какой-нибудь или Java.
- Курс "Алгоритмы и структуры данных". На нем изучают понятно что. Изучают как императивные, так и функциональные алгоритмы; рассматривают области их применимости и способы анализа сложности.
- Курс "Архитектура компьютера". На нем изучают архитектуры процессоров и машин, в т.ч. фоннеймановскую архитектуру, ассемблер, возможно немного схемотехнику.
- Курс "Компиляция". На нем изучают способы трансляции между различными представлениями вычислительных процессов – например, разбирают устройство компилятора Scheme – в общем, 5 глава SICP.
- Курс "Реализация языков программирования на фоннеймановской архитектуре". На нем изучают вопросы управления памятью, способы передачи параметров и вызова процедур и т.п., язык Си.
5 октября 2009 в 14:04
С Бейзика тоже не плохо начинать,
прост и понятен, но всё ещё зависит от самого человека что ему будет понятней ))
5 октября 2009 в 14:02
Тем более тогда – ты считаешь, что Яву не стоит изучать даже не смотря, что к ней приложили руку такие люди? Всё-таки машины у нас пока императивные, да и кода накоплено немало… Я свой "план" выстроил так, чтобы человек и в библиотеках мог покопаться (Си), и работу найти (Ява) и в будущем не потеряться (OCaml). Ну а более сложные вещи типа Хаскеля и С++ можно на потом оставить – это уже сам определиться… А начинает пусть как раз с Си, всё равно пригодится.
А каким ты видишь план обучения? То есть, почему необходимо вообще знать Лисп, и начинать с него (или с Окамл)? Чем так плохо начинать с Си (знание которого поможет освоить Окамл)?
5 октября 2009 в 13:05
Кстати, генерики в Java разработал Philip Wadler – титан науки, один из известнейших ученых в мире функционального программирования, один из идеологов языка Haskell, приспособивший к программированию монады, придумавший бесплатные теоремы,typeclasses, views, и многое другое.
5 октября 2009 в 10:04
Незнай-незнай, мне кажется, что начало уже положено Но и с тобой согласен – в том виде, как это технически реализовано сейчас настоящие "С++ темплейты" просто развитием не реализовать – может, и не стремяться к этому. Ну а по поводу сложности – это уже совсем другой вопрос – мы, С++ники, вроде не жалуемся ))
5 октября 2009 в 10:02
На С# уходит в раза два, а то и больше времени, чем на Java.
5 октября 2009 в 10:02
В яве не появились темплейты.
В яве имеет место ограниченный параметрический (bounded parametric) полиморфизм.
В С++ имеет место специальный (ad-hoc) полиморфизм.
Это совершенно разные вещи; сходство их только в том, что и то, и другое более или менее пригодно для реализации неограниченного параметрического (unbounded parametric) полиморфизма.
Джавские генерики никогда не приобретут черт специального полиморфизма – это я тебе гарантирую. Это бы означало, как минимум, сделать их сложность совершенно невообразимой для программистов (она и так уже немаленькая) и неподъемной для компиляторов и IDE (до сих пор нахожу баги в IDEA иногда).
5 октября 2009 в 10:01
ИМХО На данный момент времени языки программирования достигли совершенно иных концепций, далеко ушедших от Паскаля и даже С. Я начинал с данных языков, сейчас работаю с Java уже 6 лет, преподаю в универе C#. Начинать стоит именно с подобных языков, ничего страшного в этом нет, просто не стоит лезть сразу в дебри. На моем опыте, люди не знакомые с программирование изучили успешно C#. Кто с чего начинал 5-10 лет назад сейчас не пример. Задачи рынка в те времена и сейчас различаются, как и технологии проектирования/создания ПО. Фанаты могут изучать и асму в досе, но зачем?!
5 октября 2009 в 10:01
Частенько даже в веб-программировании возникает задача покапаться в С коде. Так что С рулит… да и освоение С (типы данных, управляющие конструкции, структуры данных) органично вписывается в последующее изучение Явы или OCaml.
А по опыту, сколько времени уходит на изучение С# вплоть до тонкостей использования рефлексии, например? неужто столько же, сколько на Яву? ))
5 октября 2009 в 10:00
Вообще же, я имел в виду, прежде всего, важные для т.с. отличия – изучить С++ гораздо сложнее, чем Яву. По причине большей намудрённости библиотек С++ и возможности использования низкоуровневых механизмов напрямую (что вреднО). Причём приведённое тобой "автоматическое управление памятью" есть и в С++, так что с этой точки зрения я бы не стал различать языки =) Соль в том, что использование этого средства в С++ требует дополнительных усилий (например, использовать умные указатели boost и забыть про delete), в отличие от Явы (никаких усилий не требуется) – и именно это я имел в виду под отличиями… Под твоё определение фундаментальных отличий, кстати, тоже подходит. А, главное, определяет и срок обучения С++ – который будет на порядок длиннее Явашного =( Есть что добавить?
P.S. Ещё из важных отличий С/С++ – более строгая типизация в С++ (из-за этого некоторые С программы нельзя скомпилить в С++ компиляторе без переделки).
P.P.S недавно в Яве (java 5) появились темплейты… Кстати, механизм темплейтов настолько силён, что С++ жив только благодаря ему – и, опять же, благодаря ему можно использовать функциональную парадигму надеюсь, Ява своими темплейтами достигнет мощи С++ – пока до этого далековато =(
//ru.wikipedia.org/wiki/Java#.D0.A8.D0.B0.D0.B1...
Я бы сказал, что в С++ имеется паттерн-матчинг =) Пусть и своеобразный…
5 октября 2009 в 9:04
Разница есть, но не такая уж и большая. Действительно фундаментальных отличий между C и C++ – не так уж много: темплейты, ООП. Между С++ и Java фундаментальных отличий и того меньше: пожалуй, только автоматическое управление памятью (ну и отсутствие темплейтов в java).
Между лиспом/хаскеллом и любым из этих языков фундаментальных отличий гораздо больше.
Под фундаментальным отличием я имею в виду отличие, резко меняющее выразительную силу языка или стиль программирования на нем.
5 октября 2009 в 9:03
Я, прежде всего как программист С++, тем не менее солидарен с Жекой и Николаем. С++ и C# слишком сложны (С#, правда, имеет низкий порог вхождения).
Java ещё туда-сюда, но не С++ О_о тут я с Жекой, правда, не согласен, что "разницы нет" – как раз есть, и немалая =)
Вообще, я за С, Java и OCaml (первый только на уровне азов и указателей, а последние два лучше осваивать параллельно =).
5 октября 2009 в 9:02
Господи, каждый раз одно и то же. Ну ладно, на этот раз тему не буду стирать; посмотрим
Разумеется, +100 к Николаю Митропольскому.
Всем участникам темы, пишущим про языки типа C, C++, C#, Java и т.п. (можно подумать, между ними есть большая разница) – прочитайте второй номер //fprog.ru/2009/issue2/и подумайте еще раз
5 октября 2009 в 8:03
Есть мнение что нужно начинатьс Lisp-а ) Правда я по своей нелюбви к динамическим языкам порекомендую OCaml ) Он проще чем тот же С++ и обладает гораздоболее широкими возможностями. А начинать с процедурных языков типа Си, паскаля я считаю несовременно.
4 октября 2009 в 23:05
Начни с С, потом перейди на С++, потом на C# и .NET. Параллельно учи ассемеблер. Pascal лучше не трогай
4 октября 2009 в 23:04
Action Script 3.0 – тут тебе и Ява, тут и Си Шарп и С с плюсами. А также сразу живенько можно увидеть результат. И вообще – новейший из серьезных языков, многие проблемки прошлых учтены И литературы дофига уже…
4 октября 2009 в 23:03
ООП не предлполагает структурированный код ? Оо
4 октября 2009 в 23:00
Начинать стоит со структурного программирования, потом переходить на объектно-ориентированный. Я начинал с С. Но не стоит останавливаться на С/С++. Еще при переходе со структурного на об объектно-ориентированный подход, может появиться вопрос какую среду разработки использовать Borland C++ Builder или Microsoft Visual Studio. Стоит почитать про обе среды и определиться что подходит вам больше, лучше знать и то и то. Я начинал так С->Pascal->C++(BCB)->C++(MSV)…
Так же в объектно-ориентированном подходе и появляются множества библиотек, таких как MFC STL и так далее в отличии от структурного где в основном только стандартная библиотека.
4 октября 2009 в 22:05
Евгений, у ТС проблем с грамотностью не наблюдается. разве что связность немного страдает, но так это проходит.
4 октября 2009 в 22:05
Ну это так, на всякий случай )
4 октября 2009 в 22:03
Самое верное решение – со своего родного. Русского/Украинского/etc.
4 октября 2009 в 22:01
Начинай с php, т.к. он схож с си.
Паскаль – не вариант, т.к. потом отвыкать от бегиненда будешь и прочей херни.
Единственное, что херово в пхп – нет строгой типизации, но с переходом на си например я думаю это уйдет.
4 октября 2009 в 22:00
Сеня, про зайцев это не актуально…
Открою вам страшную тайну, эт тему замусолили до дыр:
//vkontakte.ru/topic-912_1121736
Хорош разводить очередной базар…
4 октября 2009 в 22:00
С "машины Тьюринга", вот где чувствуется оптимизация!)))
4 октября 2009 в 21:05
начать с псевдокода надо))) а то много знаю товарищей.. знают синтасис 2х языков, а тоолку… ничего написать не могут…)
4 октября 2009 в 21:04
У нас в вузе на первом курсе учат С. Хотя я училась по старой программе, первый семестр мы учили Паскаль, сами основы, а потом С/С++. Не скажу, что были большие сложности с переходом С паскаля на "нормальные языки". А нсчет ассемблера.. нам сначала объясняли более простую модель, как это все происходит, как работает АЛУ, флаги и тп. Для этого надо для начала хорошо изучить внутреннее устройство и принцип работы..
4 октября 2009 в 21:04
согласен с Денис GooDWiN Гублин, лучше начать с Си
4 октября 2009 в 21:03
С++
4 октября 2009 в 21:03
ну наверное с паскаля… там все таки систематизация и все понятно, что откуда..
4 октября 2009 в 21:03
с си++ будет сложно начинать имхо
4 октября 2009 в 21:03
хм…паскаль я бы не рекомендовал. с него сложно переходить на нормальные языки.
может лучше начать с С?
4 октября 2009 в 21:03
Если склад ума математический, то и с ассемблера начать можно. Но все же лучше с какого нибудь си шарпа (c#), или PHP… Это попроще, да и актуально до сих пор.
4 октября 2009 в 21:03
С, в среде Borland Turbo C 3.0
4 октября 2009 в 21:03
Влад COOLer Одинцов
ну не скажите ) если идти от простых консолек, постепенно вникая в суть программы и алгоритмов, а потом на другие виды проектов переходить – то всё очнь неплохо должно быть )
хотя, я начинал с QBasic'а в школе и VisualBasic'а на первом курсе инста… ничего не помню из бейсика ))
4 октября 2009 в 21:03
Артём DeathKnight Малаховский, согласен сам сейчас мучаюсь.
в паскале все четко разложено, а в си прямо мусорка какая-то))