LINUX.ORG.RU

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


1

7

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

★★★★

Последнее исправление: aptyp (всего исправлений: 2)

Ответ на: комментарий от vasily_pupkin

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

Обведи красным где я сказал что «две очень разные вещи».

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

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

Раньше не видел. Сейчас взглянул в википедии.

Грамматика, построенная на определённых предложениях (сокр. DC-грамматика, DCG; от англ. Definite clause grammar) — это способ построения грамматики в логических языках программирования, например, Пролог. DC-грамматика обычно ассоциируется с Прологом, но и другие языки, например, Mercury, также могут использовать DC-грамматику.

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

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

Но каким-то образом узнать о них можно? А то ведь и не погуглишь эти варианты-то.

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

Цитирую:

Чувак. Думать алгоритмами ты и так умеешь, А вот думать компьютерными алгоритмами надо учиться.

Капитан занудство рассуждает: если алгоритмы == компьютерные алгоритмы заявление смысла не имеет, следовательно Jetty утверждает обратное. Вопрос, что же имеет в виду Jetty?

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

Вот мне сейчас нечем.

Терминосрач... интересно же! :)

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

почему в полевом транзисторе сток можно поменять местом с истоком?

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

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

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

А в лиспе прям принципиально невозможно обратиться куда угодно? Или даже если в лисповой программе невозможно, то на чем написан компилятор для этой программы, или интерпретатор? Не на С или ассемблере? И в нем никогда не бывает багов?

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

При использовании FFI легко схватить сегфолт. В остальном - если есть кодовая база №1 и кодовая база №2 , где №1 << №2, где вероятность словить ошибку будет меньше?

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

Векторные инструкции, допустим, добавили в виде расширения. Вычисляемые goto, думаю, тоже можно запилить вне стандарта, если уж очень хочется. В остальных аспектах С намного ближе к железу, чем Lisp и, соответственно, пока будет остро стоять вопрос производительности ОС на существующих распространенных архитектурах, он будет актуален. С граблями-костылями, расширениями, библиотеками - как угодно.

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

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

hsakell с интегралами или что? Напрямую: haskell - неплохой dsl для записи математических формулировок.

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

При использовании FFI легко схватить сегфолт.

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

В остальном - если есть кодовая база №1 и кодовая база №2 , где №1 << №2, где вероятность словить ошибку будет меньше?

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

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

Принципиально невозможно, да. Если мы не дергаем неуправляемый код через FFI.

Компиляторы пишутся на самих лиспах. Например, SBCL, один из самых продвинутых компиляторов CL - написан на самом CL.
Рантайм там на Си, но его можно переписать на CL тоже, и по-хорошему, это надо сделать, но всем лень.

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

на дельпхи, за которое shty кого-то там убивать собрался

не за саму дельфи, и даже не за использование ея, а за преподавание с использованием оной

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

Если в бинарном, то что мешает злоумышленнику внедрить ко

Верифицирующий компилятор, верифицирующий загрузчик. Короче, смотри на .NET например.

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

Пока никто такие грамматику и семантику составить не осилил. А причина в том, что их нет.

ну почему ты такой клован? :)

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

Соответственно, численные схемы на фортране, значительно короче чем на c++ (меньше кода), и реализуются значительно быстрее.

Весьма спорное утверждение. Я знаю как мин пять задач, где это не так. Более того, скажем один товарищ тут пилит на фортране PIC код... и мне его откровенно жаль, потому как на С++ это куда короче и естественней получается.

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

тот же SBCL позволяет вырубать GC на время, или вообще писать на своем ассемблере.

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

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

нуу, виртуальная память защищает и от случайных, и от целенаправленных )

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

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

  .-'---`-.
,'          `.
|             \
|              \
\           _  \
,\  _    ,'-,/-)\
( * \ \,' ,' ,'-)
 `._,)     -',-')
   \/         ''/
    )        / /
   /       ,'-'

ты вообще упоролся

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

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

Приведи мне пример куска кода на лиспе, который, например, пишет байт по физическому адресу 0x0B8000 чтобы вывести символ на экран в режиме текстовой консоли, на стандартном PC. Или настраивает контроллер прерываний. Или переключает x86 процессор в защищенный режим, а из него в 64-битный long-mode

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

Что, созрел родить хоть грамматику то?

бля, ну ты и удод

на, держи (копирайты оставил):

/*
* lisp-grammar.y - Lisp Grammar
*
* Copyright (C) 2007 Ragner Magalhaes 
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License only.
*/


%{
#define YYSTYPE double
%}


%token NUMBER SYMBOL STRING SHARP_QUOTE
%start input

%%

input : /* empty */
| input line
;

line : '\n' 
| s_exp '\n' { printf( "%g\n", $1 ); }
;

s_exp : atom
| list
;

atom : NUMBER
| SYMBOL
| STRING
;

list : '(' ')'
| '(' s_exp_list ')'
| '(' s_exp_list '.' s_exp ')'
| '\'' s_exp
| SHARP_QUOTE s_exp
;

s_exp_list : s_exp
| s_exp_list s_exp
;

%%

#include 
#include 

main()
{
yyparse();
}

yyerror( char * str )
{
printf( "lisp: PUUUUUU %s\n", str );
}

int yylex( void )
{
int ic;

while (ic = getchar(), ic == ' ' || ic == '\t') { ; }
if (ic == EOF)
return 0;
else if (isalpha(ic))
return STRING;
else if ( isdigit( ic ) )
return NUMBER;
else if ( ic == '\'')
return SHARP_QUOTE;
else switch (ic) {
case '+':
case '-':
case '*':
case '/':
return SYMBOL;
}
return ic;
}
shty ★★★★★
()
Ответ на: комментарий от anonymous

Компиляторы пишутся на самих лиспах. Например, SBCL, один из самых продвинутых компиляторов CL - написан на самом CL.

Рантайм там на Си, но его можно переписать на CL тоже, и по-хорошему, это надо сделать, но всем лень.

А на чем пишется компилятор лиспа компилятора лиспа? :) Напоминаю, процессоры лисп нативно не умеют

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

Погоду на Марсе :) База у меня была невменяемая - прайсы из магазина в свой формат переливать руками затрахаешься, сайтов с wsdl-камиц и автовыдачей в xml/csv (ага, тогда sgml-то не все знали что такое) или хотя бы дискеток с эксельками в помине не было (то есть, у коммерсов были большие глаза и готовый отлуп «Для себя у нас есть, а вам зачем? Вон напечатанные лежат»). Эт потом они на флешку сливать начали и сайтами озаботились. На защите нужно было бодро языком чесать (о чем на предварительном прослушивании предупредили) и презенташку в паверпойнте показывать (обязательно!) с эконом-обоснованием и хитрыми коэффициентами. Так что чтоб демку экспонировать с какими-то аппроксимациями и выхлопом в виде таблички с ценами - всего ничего. (Суть в ядре - а кто «лиспообразные» скрипты читать будет - дураков нет :)) Уложился в отведенное время - жюри не уснуло - молодец. Появились набросы^Wвопросы - сложнее. Совсем кисло - когда твой диплом вызывает у председателя стойкое дежавю. А рядом сдавали сплошную залепуху про «ISO 9000», от которого комиссия уже опухла и председатель их дипрукам сказал, что на следующий год такое не проканает.

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

Мне лень. Но это принципиально можно сделать, в отличие от семантики CL, например.

Принципиально — и CL можно. В конце концов, CL можно откомпилить в ассемблер, а ассемблер в питон (да, это будет тормозить немыслимо), после чего воспользоваться семантикой питона.

Практически же написать сколько-нибудь юзабельную операционную семантику что для питона, что для CL, что для асма, что для C — один фиг невозможно.

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

Но каким-то образом узнать о них можно?

Изучая исходники компилятора. Общаясь с разработчиками.

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

hsakell с интегралами или что?

Именно. Какая связь-то?

haskell - неплохой dsl для записи математических формулировок.

Кхм. Сомнительное утверждение, как минимум. Я вот смотрю, например, на «лемму о змее» и в упор не представляю, как её хотя бы начать записывать на хаскеле.

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

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

Смотри сорцы SBCL, вобщем:
https://github.com/sbcl/sbcl

В частности, вот тебе примеры ассемблера:
https://github.com/sbcl/sbcl/blob/master/src/compiler/x86/system.lisp

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

С, haskell и lisp-подобные не поймут же, даже на C++ мозгов не хватает.

а ocaml динамический или как? PhD как для хаскелла при его изучении требуется?

какая разница вообще? они досидят до диплома, и прогать на C++ будут только самые заботаные ботаны, задроченые задроты, которые уже сейчас все умеют. остальные или в банке уже админом оракла на полставки место греют или к армии phpшников примкнут

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

это и в питоне тоже есть :)

Я просто не всё перечислил - лиспу нужны, как минимум, символы, анонимные функции, неограниченные ФВП и их применения (эти три - то что составляет лямбда исчисление), замыкания, мутабельное окружение, точечные пары, представление исходного кода в точечных парах (точнее - read из текстового представления в точечные пары), quote, REPL (возможно, завязанный на хэш character <-> кастомный ридер) и поддержка «метавычислительного цикла» (как в SICP это обзывается) - eval завязанный на хеш символ <-> функция и macro-expand завязанный на хеш символ <-> макрос (= функция). eval и macro-expand циклически завязаны друг на друга определённым образом. Ну и ещё определения функций и макросов помещающие функции в соответсвующие хэши. «Функции» могут быть чем угодно - интерпретируемым кодом, байткодом некой VM или машкодом.

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

Изучая исходники компилятора. Общаясь с разработчиками.

Но где же?!! Где?!!

«Имя, сестра, имя!!!» (с)

Интересуюсь конкретными вариантами, альтернативными BNF/eBNF. Хотя бы один пример можно?

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

Интересуюсь конкретными вариантами, альтернативными BNF/eBNF. Хотя бы один пример можно?

Тебе ссылку на исходники SBCL дать?

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

Штя, ты дебил, это ТЫ нихуя не понимаешь ни в том, ни в другом, ни вообще в чем-либо.
Ты даже троллить на ЛОРе то не умеешь.

Еблан ты, штя.

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

Для CL нельзя, если мы говорим о том, что принимает EVAL/COMPILE.

Потому что макросы с неограниченными сайд-эффектами, как минимум. Как максимум, еще и макроподобные расширения компилятора, такие же(как в SBCL например всякие define-source-transform etc.)

Соответственно, AST не фиксировано вообще никак, и не может однозначно интерпретироваться.

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

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

Монадические парсеры умеют контекстно-зависимые грамматики :3 Аппликативные - только контекстно-свободные, при этом аппликативные определяются в терминах монадических, но не наоборот. Учитывая происхождение слов «монадический» и «аппликативный», думаю, сюда можно и формальную теорию подвести.

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

Весьма спорное утверждение. Я знаю как мин пять задач, где это не так.

Да, есть сотни задач, где это не так. Но в сотнях других задач это так. Я говорю, потому что есть опыт использования и c++ и фортрана для численных моделей в газодинамике.

Когда был студентом, преподы тоже говорили, выучи c++ и херач вычматы на c++. Я так и делал. Потом, когда стал работать с людьми, которые реально занимаются моделированием, внезапно выяснилось, что вычматы на c++ херачат только избранные мазохисты. Мне специалисты посоветовали попробовать сделать на фортране пару алгоритмов, которые раньше сделал на c++. Попробовал. Выяснилось, что на фортране это значительно проще и быстрее. Вот, уже более 10-ти лет возвращаться к c++ нету никакой необходимости. Для вещей, которые нельзя делать на фортране, 10 лет назад был matlab, сейчас есть python.

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

NLX забыл.

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

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

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

Ну и самое главное - полный новичек еще не умеет мыслить циклами, условными операторами, подпрограммами, а очень часто еще и переменными.

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

Это не грамматика CL. У CL ее нет.

ок, давай с этой стороны зайдём :)

если я напишу вот так:

(defun triple (X)
  (* 3 X)

что мне выдаст eval?

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

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

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

Потому что макросы с неограниченными сайд-эффектами, как минимум. Как максимум, еще и макроподобные расширения компилятора, такие же(как в SBCL например всякие define-source-transform etc.)

Макросы — не при делах. Операционная семантика начинает работать ПОСЛЕ того, как они полностью развёрнуты, так что можно считать, что их нет.

То же самое относится, например, к C++ с его шаблонами — просто для преодоления ограниченности языка к нему кривовато приляпали макросистему. Операционная (да и какая угодно) семантика от этого не изменилась.

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

аппликативные определяются в терминах монадических, но не наоборот

Вот это место не вполне понял. Что имеется в виду? Что всякая монада — аппликативный функтор? Или что-то ещё?

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

Соответственно, AST не фиксировано вообще никак, и не может однозначно интерпретироваться.

дурачок, тебе уже не раз говорили - AST нигде не фиксируется, сколько ты будешь тупить, знаток? :)

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

Ок. Я так понимаю, что ты под компьютерными алгоритмами понимаешь программную реализацию. И изначальный твой тезис был - для этого нужно использовать С. Теперь я тебя правильно интерпретирую?

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

ко-ко-ко-ко...

да-да, я вас так понимаю, мне ваши проблемы очень близки :)

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