LINUX.ORG.RU

Язык для обучения программированию


1

7

Понятно, что Java - наверное самый мэйнстрим на текущий момент, ну с C#(Mono)(я не рассматриваю здесь пыхпых, джаваскрипт и прочий веб), но мне известна(как и большинству местных) статья, что изучение с Явы вредно для мозгов.
И вот, столкнувшись с тем, что отданные под моё руководство студенты 3го курса не сильно способны заниматься программированием на С++, задумался, как решить эту проблему, избегая 2х тупиков - делать всё за них, и выгнать их.
Допуская, что производительность языка не нужна(хотя, ввиду того, что делаем мы в основном числодробилки, это очень сильно допущение) и вообще у нас под рукой кластер, какой язык посоветует ЛОР, помогающий развить мозг молодых учёных до уровня С/С++? Да и вообще, список годных для обучения, и негодных соответственно. Думал было python, но тем не в нём производительность недостаточная, а самому реализовывать затратные вещи на С пока не хочется.
Update: vb и delphi не Ъ ввиду того, что я то под линуксом сижу. Update 2: всё, наработанное за время использование предложенного языка, не хочется терять, поэтому хорошо бы, если б можно было соединять уже готовые вещи с C/C++. Насчёт pascal я просто никогда такого не желал, там такое есть?

★★★★

Последнее исправление: aptyp (всего исправлений: 2)
Ответ на: комментарий от anonymous

Программа без скобочек это невалидное понятие.

почему невалидное, потому что лично тебя коробят формулировки, или по какому то другом критерию?

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

вот тебе функция:

(defun triple (X)
  (* 3 X))  

останется ли она валидной программой на языке lisp, если её переписать вот так:

defun triple X
  * 3 X  

?

shty ★★★★★
()
Ответ на: комментарий от quasimoto

setjmp/longjmp это не вычисляемое goto. Это не оператор вообще, это функция ОС, которая меняет контекст треда. Вычисляемое goto это просто goto которое вычисляется.

И уж не NLX тем более, потому что никакого unwinding не происходит.

«VM games»? Шта?
Есть в си? Да ты ебнулся.

anonymous
()
Ответ на: комментарий от anonymous

И потом пишем нормальную ОС без нужного исключительно только для Си говна типа виртуальной памяти и разделения кернелспейса и остального.

Которую поломает и получит на ней рута первый попавшийся кулхацкер, эксплойтом, написанным в машинных кодах )

Harald ★★★★★
()
Ответ на: комментарий от shty

вот тебе функция:

Это не функция. Это блок текста. Нельзя говорить «в лиспе это...». В лиспе нет «этого». Потому что это не язык, а машина.

останется ли она валидной программой на языке lisp, если её переписать вот так:

Программа на лиспе это не текст. Это даже не cons'ы. Программы это функции.

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

anonymous
()
Ответ на: комментарий от Harald

А с какого лешего у нас там исполняются машинные коды то? У нас низший уровень - код к-либо языка, или байткод, принимаемый верифицирующим компилятором.

anonymous
()

предлагаю обучать с обратной стороны, с основ - как работают транзисторы, как из транзисторов и диодов делают всякие И, ИЛИ, НЕ-элементы, триггеры, основы цифровой схемотехники, в частности рассказать про всякие шины, прерывания, устройство и принципы работы оперативной памяти и т.д. и т.п.

Потом изучить несколько процессорных архитектур (AVR, ARM, x86), заставить пописать программы на ассемблере, напр. работу с большими числами (желательно на 8-битном AVR :P), загрузчик ОС, освоить защищенный режим x86

После этого пусть какой язык хотят, такой и изучают, главное, чтоб было понимание, как работают компьютеры )

Harald ★★★★★
()
Ответ на: комментарий от anonymous

ну пока что процессоры исполняют машинный код, скобочки лиспа аппаратно обрабатывать не умеют )

Harald ★★★★★
()
Ответ на: комментарий от quasimoto

> лисп - это ЯП, почитай иди чем отличатся ВМ от ЯП...

Он имеет ввиду, что лисп, CL например, это такой язык (в случае CL _такой_ означает наличия compile, eval, macros и т.п. в стандарте), что для его реализации зачастую нужна ВМ с особыми свойствами, допуская вольность, такую ВМ можно обозвать «лиспом».

охотно допускаю, и с этим не спорю (опуская неточность некоторых формулировок), но, простите, это и в питоне тоже есть :) допуская такую вольность практический любой язык, для которого есть vm с поддержкой соответствующей функциональности, можно назвать лиспом, не будет ли это через чур?

кроме того, весь смех в том, что я понимаю что пытается лавсанчик сказать, но раз уж он встаёт на категорические позиции - пусть отвечает по полной программе

ещё одна проблема в том, что лавсанчик не может свою мысль выразить внятно, без метафизических категорий

shty ★★★★★
()
Ответ на: комментарий от vasily_pupkin

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

Jetty ★★★★★
()
Ответ на: комментарий от anonymous

Программа на лиспе это не текст. Это даже не cons'ы. Программы это функции.

а функции это что тогда? :)

// если ты под сильнодействующими веществами предупреждать надо заранее :)

shty ★★★★★
()
Ответ на: комментарий от anonymous

Программа на лиспе это не текст

Опа, а что же это? Я открываю .el файлы и вижу текст. Глаза меня обманывают?

Потому что это не язык, а машина.

А Ленин — гриб, да.

stack_protector
()
Ответ на: комментарий от shty

если ты под сильнодействующими веществами

...и в текущий момент находишься унутре лисп-машины...

предупреждать надо заранее :)

OldFatMan
()
Ответ на: комментарий от anonymous

Практике Си не обучить и за пять лет.
Таким образом, изучить его студенты могут и самостоятельно, если им надо.

С таким подходом «изучить сам» можно и в университеты не поступать - книг полно, учи да пиши. Но тогда придется закрывать все «программистские» специальности. Путь ли это? Или лучше, чтоб институт стал местом обучения работать в коллективе над *реально* полезными проектами, чтобы по окончанию такого заведения не попасть в рекурсивную петлю «нужен джуниор с опытом работы». А пять лет, о которых ты говоришь, помог бы профорсировать нормальный препод с опытом работы «в свое время» (но не очень давно) над крупными программными проектами в реальной индустрии.

Лисп-машины не нужны, современные архитектуры процессоров(типа x64) для лиспов подходят достаточно хорошо.

Какие именно x64-архитектуры «достаточно хорошо подходят для лиспов» и для которых С таааак убог? Это был основной вопрос моего камента.

alienclaster ★★★
()
Ответ на: комментарий от stack_protector

Мы тут про CL больше.

На CL программа это последовательность вызовов функций. Что само по себе функция, например REPL, который сам функция вида
[code](lambda () (loop (print (eval (read)))))[/code]

А Ленин — гриб, да.

Я вощем-то, от любого, оспаривающего вышеописанное мной утверждение о CL, требую записать его синтаксис в (e)BNF/PEG, и соответственно, операционную семантику, то есть, формализацию интерпретации AST, которое получается после парсинга текста с помощью составленной грамматики.

Грамматика и семантика, соответственно, должны быть такие, чтобы они принимали только валидные программы, и при этом, все программы на CL, не принимаемые такими грамматикой и семантикой, были бы невалидны.

Пока никто такие грамматику и семантику составить не осилил.
А причина в том, что их нет. Поэтому CL не является формальным языком.

anonymous
()
Ответ на: комментарий от shty

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

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

anonymous
()
Ответ на: комментарий от Harald

предлагаю обучать с обратной стороны, с основ - как работают транзисторы, как из транзисторов и диодов делают всякие И, ИЛИ, НЕ-элементы, триггеры, основы цифровой схемотехники, в частности рассказать про всякие шины, прерывания, устройство и принципы работы оперативной памяти и т.д. и т.п.

Потом изучить несколько процессорных архитектур (AVR, ARM, x86), заставить пописать программы на ассемблере, напр. работу с большими числами (желательно на 8-битном AVR :P), загрузчик ОС, освоить защищенный режим x86

После этого, если не помрут от старости, пусть какой язык хотят, такой и изучают, главное, чтоб было понимание, как работают компьютеры )

//fixed

dikiy ★★☆☆☆
()
Ответ на: комментарий от alienclaster

Обычный x86-64, с векторными инструкциями(которых в Си нет, если не считать хаки отдельных конпиляторов) и вычисляемыми goto(которых нет в си тоже), и прочим.

anonymous
()
Ответ на: комментарий от anonymous

Я вощем-то, от любого, оспаривающего вышеописанное мной утверждение о CL, требую записать его синтаксис в (e)BNF/PEG

BNF — штука весьма убогая.

и соответственно, операционную семантику, то есть, формализацию интерпретации AST

Ой, а что, хоть у одного языка программирования появилась формальная операционная семантика?

Поэтому CL не является формальным языком.

Естественно, он является языком программирования.

Miguel ★★★★★
()
Ответ на: комментарий от invy

Оно студентом надо? Судя по положению дел им бы хоть что-то осилить...

java и С++ в полном объеме предлагаемых ими костылей осилить сложнее, чем python или scheme.

А так конечно, можно OCaml или Haskell, но тогда точно все забьют.

Да почему haskell-то? Факультативно можно, а так - зачем? Если хочется интегралов порешать автоматически или там посмотреть на карринг вне бумажки...

у нас и OCaml был, и пришлось учить, хотя забить хотелось

Может быть и к лучшему. Оставить в голове нужно всего-то пару концепций да написать пяток лаб.

если студенты забьют то ТСу придётся самому за них всё делать

Ну вот чтоб не забили и осилили я и предложил CL или C. К тому же они достаточно шустро работают (я так понимаю, основная задача ТС не обучить студентов, а подпрячь сделать что-то для поиграться с кластером).

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

То есть вы за время обучения изучали С с жабским синтаксисом.

alienclaster ★★★
()
Ответ на: комментарий от anonymous

ну и каким образом будет лисп-код непринужденно преобразовываться в «Обычный x86-64, с векторными инструкциями» ?

ИМХО, всякие MMX, SSE и прочие расширения проблематично заюзать из языков высокого уровня, их лучше вручную использовать,

Harald ★★★★★
()
Ответ на: комментарий от alienclaster

Да почему haskell-то? ... Если хочется интегралов порешать автоматически

Как одно с другим-то связано?

Miguel ★★★★★
()
Ответ на: комментарий от Harald

ну я все вышеперечисленное как бы знаю, 23 года, тролль, лжец и девственник )

ну тогда расскажи мне как работает транзистор.

dikiy ★★☆☆☆
()
Ответ на: комментарий от anonymous

Охуенно аргументированное утверждение.

Ну, если ты разрабатываешь и на лиспе и на си, то должно быть понятно что я имею ввиду под «тупо тормозит». Это даже теоретически обосновано - в unrestricted языке у тебя созданный объект (в чистом лямбда исчислении единственный сложный объект - функция) может быть возвращён из функции (если возвращаем функцию, то тут у нас ФВП и, возможно, замыкание) и доступен далее где угодно, это заставляет ввести такую сущность как GC, которая тоже тратит память и процессорное время. В линейном языке линейный объект может использоваться только локально (на него только одна ссылка), поэтому вместо динамического управления памятью с помощью GC можно статически вывести регионы и расставить аллокации/деаллокации, тем избавиться от лишнего расходования памяти и времени.

Можно считать си линейным аналогом лиспа, или, наоборот, лисп считать неотлинеаризированным си :)

В такого рода разработках мы получаем вменяемый рантайм лиспа на самом низком уровне, и не получаем оверхеда от его реализации на триста уровней выше(как это с SBCL

Не вполне понимаю. SBCL это, во-первых, регистровая машина, и, во-вторых, он откусывает себе кусок памяти и использует в нём свой аллокатор и свой GC. Т.е. все его проблемы не имеют отношения к ОС. Что *конкретно* можно было бы изменить при реализации лиспа на голом железе?

рантайм Си..., который полагается на сишный интерфейс ОС

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

К реализации malloc/free и виртуальной памяти могут быть претензии, но это не касается си.

интерфейс ОС, который полагается еще на триста уровней внутри ядра ОС

Опять же, то как работает ядро и как оно реализует системные вызовы - при чём тут си?

С сишкой это достигается войдпойнтерами направо и налево.

И что «динамичного» в войд поинтере? С точки зрения компилятора обычный поинтер это пара из адреса (машинное слово) и размера объекта по адресу (тоже машинное слово), а войд поинтер это просто адрес - мы можем его использовать, опуская размер объекта, некоторое время, но потом всё равно должны привести к типу, т.е. добавить размер объекта. Вполне себе обычная вещь которую можно выразить в простой системе типов.

В си просто скрыта эта машинерия с адресами и размерами объектов. Точно также в си можно легко добавить лямбду и ФВП - полноценная (в терминах лямбда исчисления) функция это пара из указателя на обычную сишную функцию и указателя на её окружение, частичное применение это помещение значения в скоп (в хорошей реализации - несколько инструкций), а полное применение - применение функции по указателю (тоже почти никакой оверхед). Машинерию с определением «полных» и анонимных функций тоже может скрыть компилятор. Проблема не во всех этих фичах, а в том позволять нелинейные объекты или нет.

С хаскелями и прочей статикой это не достигается никак.

http://www.cis.upenn.edu/~bcpierce/papers/dynamic.ps. Я хочу сказать, динамика вторична, в ней нет никакой магии, чтобы тащить её в ядро, например.

без сишного говна описанного выше(виртуальная память etc).

Вот, кстати, второй раз уже это слышу (первый раз - в блоге Vladimir Sedach). В чём именно проблемы виртульной памяти и в чём проблемы си (у меня есть зуб на некоторые вещи в си, но всяко не на отсутствие динамики)? Где можно почитать конструктивную критику?

quasimoto ★★★★
()
Ответ на: Есть вариант! от livi

fuzziCLIPS

Как эзотерично :) Одно время мода была. Мой дипломный руками водитель тоже любил очень всякие НЕХ made in NASA. Только месяц до дедлайна думал, что ж мне на нем писать - то ли модуль для CAD/CAM/CAE(а для какого?), то ли составление расписаний, то ли сферические в вакууме «генетические алгоритмы»... (Я этот месяц соответственно читал единственную доступную доку на английском и учил ядро на правилах (под линуксом - благо CLIPS кроссплатформенный)просто выдать осмысленный результат. Тему произволом утопающего определил себе сам - поддержка принятия решения при... Покупке компа :) Среднепотолочная конфигурация на набитой вручную базе комплектующих, через фаззи-логику, ага, с фронтендом на дельпхи, за которое shty кого-то там убивать собрался - а не было в те времена другого варианта быстро морду с графиками и кнопачками на чем рисовать. 6-й VB только ;) К моменту сдачи диплома при словосочетании «генетические алгоритмы» или «умный дом» в отрыве от конкретной задачи на месте госкомиссии хватался бы за валидол^Wпистолет. Но у них было другое buzzword - отака кло(у)нов с дипломами-близнецами про «внедреж ISO 9000 на мухосранском комбинате резинотехнических изделий „номер 2“.) Вощем, диплом в карман - дипломную на полку. А про clips с тех пор ничего не слыхал.

slackwarrior ★★★★★
()
Ответ на: комментарий от dikiy

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

вообще транзистор даже в школьном курсе физики упоминается

Harald ★★★★★
()
Ответ на: комментарий от Harald

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

Это тебе любой электрик расскажет.

А за подробностями - марш читать учебники, неосилятор )))

ты говоришь, что знаешь как он работает. Я тебя спросил. А ты вилять начинаешь. Что за ерунда?

dikiy ★★☆☆☆
()
Ответ на: комментарий от anonymous

требую записать его синтаксис в (e)BNF/PEG, и соответственно, операционную семантику

И если я не смогу, то что, из этого будет следовать, что Лисп — не язык программирования?

stack_protector
()
Ответ на: комментарий от slackwarrior

Тему произволом утопающего определил себе сам - поддержка принятия решения при... Покупке компа :) Среднепотолочная конфигурация на набитой вручную базе комплектующих, через фаззи-логику, ага, с фронтендом на дельпхи,

И какие оно результаты выдавало, вменяемые? ) Что посоветовало купить на защите?

Harald ★★★★★
()
Ответ на: комментарий от Miguel

Ну, например, мне иногда проще понять некоторые нюансы, глядя на BNF-запись, чем читать описание.

А кроме того, обычно утверждение типа:

BNF — штука весьма убогая.

предполагает, что имеются альтернативные варианты.

OldFatMan
()

Тред не читай @ сразу отвечай

Бери схему и прорабатывай SICP. А вообще подозреваю, что на 4 страницах уже успели развести лиспосрач :3

mix_mix ★★★★★
()
Ответ на: комментарий от OldFatMan

предполагает, что имеются альтернативные варианты.

Нет. Это такой же приём демагогии как «сперва добейся» и «сделай лучше».

stack_protector
()
Ответ на: комментарий от Harald

предлагаешь писать простыню про электроны и дырки, полупроводники p и n-типа ? Западло )

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

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

А вообще во теме - учить всю эту херню совершенно не обязательно. Есть куча других более важных вещей.

dikiy ★★☆☆☆
()
Ответ на: комментарий от Harald

Сверхуныло забиваться на «унылой и ненужной голимотье» (как это кажется младшекурам), когда можно нафигарить работающих прог на дельфи и получать профит. Обучение должно происходить наоборот, т.н. сверху вниз: «здравствуйте дети, сейчас мы нарисуем пару окошек в дельфи, нарисовали - молодцы. А знаете как оно работает? Ну вот слушайте...»

alienclaster ★★★
()
Ответ на: комментарий от anonymous

Вычисляемое goto это просто goto которое вычисляется.

Вычисляется во что? В какой адрес?

«VM games»? Шта?

Ну вот, то «лисп это машина», то «шта»? Определись уже :)

Есть в си?

Ну да, возьми какой-нибудь ECL, или сделай #include ../genesis/.. в SBCL, - до тех пор пока мы работаем с сишными структурами, которыми представляются лисповые объекты, (там ничего сверхъестественного, но все лисповые объекты так определяются) и сишными функциями, которые ими оперируются (тоже довольно просто и, тем не менее, любые ФВП могут быть такими сишными функциями) это всё обычный си, с тем же успехом можно было сделать сишную библиотеку (вон, в glib уже замыкания утащили), а VM games это всё остальное - GC, eval, макросы и т.п.

quasimoto ★★★★
()
Ответ на: комментарий от stack_protector

Ах, вот оно что. :) Подозревал, но надеялся на лучшее. Всё-таки иногда и на ЛОРе встречаются достаточно убедительные обоснования.

OldFatMan
()
Ответ на: комментарий от OldFatMan

предполагает, что имеются альтернативные варианты.

Ну, во-первых, имеются. DCG, например — которая, в отличие от eBNF, умеет и контекстно-зависимые грамматики выражать.

А во-вторых, есть и такие варианты, о которых статьи не написаны, и которые существуют только в виде конкретных реализаций. Увы.

Miguel ★★★★★
()
Ответ на: комментарий от quasimoto

И что «динамичного» в войд поинтере?

А то что его можно интерпретировать вообще как угодно. И не как условный VARIANT, а вообще как угодно в зависимости от контекста системы.

Не вполне понимаю. SBCL это, во-первых, регистровая машина, и, во-вторых, он откусывает себе кусок памяти и использует в нём свой аллокатор и свой GC

Регистровую машину в пределах лиспа SBCL реализует замечательно, я не спорю.
Но, GC полагается на сишный рантайм. И вообще, куча вещей полагается на сишный рантайм. С GC например приходится делать кучу финтов ушами чтобы избежать конфликтов с сишечкой. Со стеком то же самое - то есть так как у нас control stack шарится с сишкой, мы должны ебать мозг опять же тем чтобы сосуществовать с ней.

Щас лень все писать, будет не лень - в ЖЖ как-нибудь напишу.

В чём именно проблемы виртульной памяти и в чём проблемы си

Виртуальная память, а конкретнее, разделение уровней привилегий(необходимое для Си, потому что в Си мы можем куда угодно в памяти обратиться) как минимум ТОРМОЗИТ.

Опять же, полнее напишу как-нибудь в ЖЖ как будет не лень.

anonymous
()
Ответ на: комментарий от Jetty

На википедии ссылка на Алгоритм. Там, если что, словосочетание компьютерный алгоритм — отсутствует. Также ты сказал, что алгоритм и компьютерный алгоритм - две очень разные вещи. Мне интересно понять, что ты хотел этим сказать

vasily_pupkin ★★★★★
()

Ruby - Да,да,да,да! он самый для начинаний программированию самое оно!

Еще как вариант Jython. Довольно шустрый, умеет юзать джава библиотеки. Синтаксис можно юзать питоновский. =)

ymr1
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.