сестра таланта
Mar. 20th, 2013 01:31 amНаткнулся на этот исторический документ, интерпретатор игрушечного фрагмента языка J, написанный в 89-м году создателем родственного языка K.
Если вы не знаете J/APL (как и я; давно хочу изучить, да все как-то...), то предлагаю вам задачу, которую я поставил перед собой из чистоголюбопытства мазохизма упрямства: прочитайте и поймите эту программу (включая понимание того, как устроен язык, который она интерпретирует) только с листа, не перенося ее в компьютер, не запуская, не переписывая исходники более понятным образом итп.
typedef char C;typedef long I;
typedef struct a{I t,r,d[3],p[2];}*A;
#define P printf
#define R return
#define V1(f) A f(w)A w;
#define V2(f) A f(a,w)A a,w;
#define DO(n,x) {I i=0,_n=(n);for(;i<_n;++i){x;}}
I *ma(n){R(I*)malloc(n*4);}mv(d,s,n)I *d,*s;{DO(n,d[i]=s[i]);}
tr(r,d)I *d;{I z=1;DO(r,z=z*d[i]);R z;}
A ga(t,r,d)I *d;{A z=(A)ma(5+tr(r,d));z->t=t,z->r=r,mv(z->d,d,r);R z;}
V1(iota){I n=*w->p;A z=ga(0,1,&n);DO(n,z->p[i]=i);R z;}
V2(plus){I r=w->r,*d=w->d,n=tr(r,d);A z=ga(0,r,d);
DO(n,z->p[i]=a->p[i]+w->p[i]);R z;}
V2(from){I r=w->r-1,*d=w->d+1,n=tr(r,d);
A z=ga(w->t,r,d);mv(z->p,w->p+(n**a->p),n);R z;}
V1(box){A z=ga(1,0,0);*z->p=(I)w;R z;}
V2(cat){I an=tr(a->r,a->d),wn=tr(w->r,w->d),n=an+wn;
A z=ga(w->t,1,&n);mv(z->p,a->p,an);mv(z->p+an,w->p,wn);R z;}
V2(find){}
V2(rsh){I r=a->r?*a->d:1,n=tr(r,a->p),wn=tr(w->r,w->d);
A z=ga(w->t,r,a->p);mv(z->p,w->p,wn=n>wn?wn:n);
if(n-=wn)mv(z->p+wn,z->p,n);R z;}
V1(sha){A z=ga(0,1,&w->r);mv(z->p,w->d,w->r);R z;}
V1(id){R w;}V1(size){A z=ga(0,0,0);*z->p=w->r?*w->d:1;R z;}
pi(i){P("%d ",i);}nl(){P("\n");}
pr(w)A w;{I r=w->r,*d=w->d,n=tr(r,d);DO(r,pi(d[i]));nl();
if(w->t)DO(n,P("< ");pr(w->p[i]))else DO(n,pi(w->p[i]));nl();}
C vt[]="+{~<#,";
A(*vd[])()={0,plus,from,find,0,rsh,cat},
(*vm[])()={0,id,size,iota,box,sha,0};
I st[26]; qp(a){R a>='a'&&a<='z';}qv(a){R a<'a';}
A ex(e)I *e;{I a=*e;
if(qp(a)){if(e[1]=='=')R st[a-'a']=ex(e+2);a= st[ a-'a'];}
R qv(a)?(*vm[a])(ex(e+1)):e[1]?(*vd[e[1]])(a,ex(e+2)):(A)a;}
noun(c){A z;if(c<'0'||c>'9')R 0;z=ga(0,0,0);*z->p=c-'0';R z;}
verb(c){I i=0;for(;vt[i];)if(vt[i++]==c)R i;R 0;}
I *wd(s)C *s;{I a,n=strlen(s),*e=ma(n+1);C c;
DO(n,e[i]=(a=noun(c=s[i]))?a:(a=verb(c))?a:c);e[n]=0;R e;}
main(){C s[99];while(gets(s))pr(ex(wd(s)));}
Я потратил на это немало времени сегодня вечером, но, кажется, добился.
Но черт побери. Черт побери! (подавляет в себе сложные эмоции и уходит, качая головой)
Если вы не знаете J/APL (как и я; давно хочу изучить, да все как-то...), то предлагаю вам задачу, которую я поставил перед собой из чистого
typedef char C;typedef long I;
typedef struct a{I t,r,d[3],p[2];}*A;
#define P printf
#define R return
#define V1(f) A f(w)A w;
#define V2(f) A f(a,w)A a,w;
#define DO(n,x) {I i=0,_n=(n);for(;i<_n;++i){x;}}
I *ma(n){R(I*)malloc(n*4);}mv(d,s,n)I *d,*s;{DO(n,d[i]=s[i]);}
tr(r,d)I *d;{I z=1;DO(r,z=z*d[i]);R z;}
A ga(t,r,d)I *d;{A z=(A)ma(5+tr(r,d));z->t=t,z->r=r,mv(z->d,d,r);R z;}
V1(iota){I n=*w->p;A z=ga(0,1,&n);DO(n,z->p[i]=i);R z;}
V2(plus){I r=w->r,*d=w->d,n=tr(r,d);A z=ga(0,r,d);
DO(n,z->p[i]=a->p[i]+w->p[i]);R z;}
V2(from){I r=w->r-1,*d=w->d+1,n=tr(r,d);
A z=ga(w->t,r,d);mv(z->p,w->p+(n**a->p),n);R z;}
V1(box){A z=ga(1,0,0);*z->p=(I)w;R z;}
V2(cat){I an=tr(a->r,a->d),wn=tr(w->r,w->d),n=an+wn;
A z=ga(w->t,1,&n);mv(z->p,a->p,an);mv(z->p+an,w->p,wn);R z;}
V2(find){}
V2(rsh){I r=a->r?*a->d:1,n=tr(r,a->p),wn=tr(w->r,w->d);
A z=ga(w->t,r,a->p);mv(z->p,w->p,wn=n>wn?wn:n);
if(n-=wn)mv(z->p+wn,z->p,n);R z;}
V1(sha){A z=ga(0,1,&w->r);mv(z->p,w->d,w->r);R z;}
V1(id){R w;}V1(size){A z=ga(0,0,0);*z->p=w->r?*w->d:1;R z;}
pi(i){P("%d ",i);}nl(){P("\n");}
pr(w)A w;{I r=w->r,*d=w->d,n=tr(r,d);DO(r,pi(d[i]));nl();
if(w->t)DO(n,P("< ");pr(w->p[i]))else DO(n,pi(w->p[i]));nl();}
C vt[]="+{~<#,";
A(*vd[])()={0,plus,from,find,0,rsh,cat},
(*vm[])()={0,id,size,iota,box,sha,0};
I st[26]; qp(a){R a>='a'&&a<='z';}qv(a){R a<'a';}
A ex(e)I *e;{I a=*e;
if(qp(a)){if(e[1]=='=')R st[a-'a']=ex(e+2);a= st[ a-'a'];}
R qv(a)?(*vm[a])(ex(e+1)):e[1]?(*vd[e[1]])(a,ex(e+2)):(A)a;}
noun(c){A z;if(c<'0'||c>'9')R 0;z=ga(0,0,0);*z->p=c-'0';R z;}
verb(c){I i=0;for(;vt[i];)if(vt[i++]==c)R i;R 0;}
I *wd(s)C *s;{I a,n=strlen(s),*e=ma(n+1);C c;
DO(n,e[i]=(a=noun(c=s[i]))?a:(a=verb(c))?a:c);e[n]=0;R e;}
main(){C s[99];while(gets(s))pr(ex(wd(s)));}
Я потратил на это немало времени сегодня вечером, но, кажется, добился.
Но черт побери. Черт побери! (подавляет в себе сложные эмоции и уходит, качая головой)
Re: A вы знаете язык лучше R справляющийся с задачами ана
Date: 2013-03-20 09:48 am (UTC)Потому что обычно все что я вижу, гораздо легче и понятнее выражается там (и мне и насколько я понимаю аналитикам), а фишек которые дейтсвительно нужны от мейнстримных языков программирования (типа возможности обработки больших объемов данных) в R все равно нет.
Re: A вы знаете язык лучше R справляющийся с задачами ана
Date: 2013-03-23 11:45 am (UTC)а при чем тут ваши трудности в портировании на питон к матлабу и математике? матлаб и математика на питон легче портируются? :)
что касается больших данных --- все для их обработки в R есть, уже даже в роликах ютюба для ленивых выкладывают.
Re: A вы знаете язык лучше R справляющийся с задачами ана
Date: 2013-03-23 12:02 pm (UTC)> же даже в роликах ютюба для ленивых выкладывают.
> матлаб и математика на питон легче портируются? :)
Да, аналитики не считают себя программистами и пишут, то что надо сделать, а не то как по их мнению это надо сделать.
Re: A вы знаете язык лучше R справляющийся с задачами ана
Date: 2013-03-23 12:22 pm (UTC)> же даже в роликах ютюба для ленивых выкладывают.
> матлаб и математика на питон легче портируются? :)
Да, аналитики не считают себя программистами и пишут, то что надо сделать, а не то как по их мнению это надо сделать.
---------------
Думаю что некая "ненависть" к R действительно обоснована. Язык действительно высоуровневый настолько что позволяет писать крайне компактные и легко развиваемые программы человеку для которого программирование является всего лишь инструментом, а не основной специальностью. Таким образом R сокращает рынок написания программного обеспечения "для ученых". Все сводится фактически к релизам прототипов написанных на нем. Естественно с использованием чего либо индустриального из языков программирования.
Что касается размещения объектов в памяти. Одинаковый массив занимает в памяти ровно столько же сколько и в матлабе и в математике. Да и динамически подгружать данные с диска возможно, и распределено хранить - обрабатывать сверхбольшие объемы возможно. Помимо свободных реализаций для сверх больших данных есть несколько проприетарных реализаций для R.
Оба этих изложенных момента упираются в квалификацию пользователя. Увы компания что ученому надо лишь "уметь тыкать мышкой" в офисных продуктах микрософт и различных родственных этим продуктам "ориджинах" сделала свое черное дело.... всем этим "ельфам" теперь нужны "морлоки" для отправления "естественных обязанностей". надеюсь они эльфов съедят в конце концов :)
Re: A вы знаете язык лучше R справляющийся с задачами ана
Date: 2013-03-23 01:10 pm (UTC)А можно узнать в каких это областях ? Потому что например в кв. химии и других вещах на кластерах и CUDA х до сих пор рулит С, и Fortran изредка с питоновскими API.
У биологов вроде тот же python и изредка, в последнее время, прости господи, Ruby. NLP - это Java и Python точнее NLTK.
Computer vision - С++ и матлаб почему то.
Зоопарк у "ученых" еще тот, и лично у меня лозунги типа "высокоуровневый язык для ученых" доверия не вызывают с тех пор как я прочитал про историю создания Фортрана. И с R то столкнулся впервые когда "ушел из науки", и "R сокращает рынок", это как то вообще громкое заявление.
Re: A вы знаете язык лучше R справляющийся с задачами ана
Date: 2013-03-23 02:14 pm (UTC)Электофизиологи какой то то хренью пользуются записывая свои сигналы... я бы сказал там даже секта целая :)
Биоинформатика явно "деградирует" :) раньше помню был perl во все поля :) так что руби вполне логичен.
В отличии от фортрана в основе появления R лежит свежепройденный курс по сицип от Засмана и Абельсона. Обычно люди кидаются свою систему типов писать, а тут взяли и клонировали S. Получилась "еще одна схема" которая по "заветам Столмана" служит высокоуровневым клеем для кода на си и фортране. Сейчас сишный код можно прямо мешать прямо в репле с R кодом.
Например R дает среду в которой сразу пишешь статью (литературное программирование), код практически декларативно описывает что надо делать и рисовать, синтаксис языка носителя нигде не загромождает смысл программы.
Если просто посмотреть, то все происходит в репле. Это делает незаметными расходы на вычисления (в 90% случаев). Возможность, не зарабатывать грыжу пиша полноценные программы, а просто модифицировать минимальными усилиями созданные объекты данных и кода.
За последний год R реализовал функционала больше чем SAS за все время существования :) R включен как составная часть во все крупные проприетарные системы анализа данных.
PS Машинное зрение это OpenCV + pcl + ROS, и писать там можно хоть на лиспе :)
Re: A вы знаете язык лучше R справляющийся с задачами ана
Date: 2013-03-23 04:21 pm (UTC)> R лежит свежепройденный курс по сицип от Засмана и Абельсона.
SICP я конечно смотрел и читал, но видимо я мало общался с R, да и то что я видел напоминало PHP style,
да и ... тоже сильно подкосило
неподготовленную к такой жести психику.
Код который я портировал чаще всего писался в спешке и т.д. Надо будет посмотреть повнимательнее. Спасибо.
Re: A вы знаете язык лучше R справляющийся с задачами ана
Date: 2013-03-23 04:40 pm (UTC)хотя итераторы написали давно, и в принципе должно хватать и так возможностей писать именно циклы.
Re: A вы знаете язык лучше R справляющийся с задачами ана
Date: 2013-03-24 07:29 pm (UTC)Re: A вы знаете язык лучше R справляющийся с задачами ана
Date: 2013-03-24 07:35 pm (UTC)Re: A вы знаете язык лучше R справляющийся с задачами ана
Date: 2013-04-04 01:15 am (UTC)легко развиваемые === одноразовые
Вы знаете, зачем вообще портируют Р код на Питон и проч? Для ПРИЛОЖЕНИЙ.
для ученых Р - рай. Использовал пакетик по специальности - хорошо (трибализм). Код нечитаемый - хорошо (элитизм).
Заявим, что все воспроизводимо, т.к. маркдаун/книтор/проч.дерьмо (карго культ).
Плюс пишут этот код далеко не всегда эти ученые.
Re: A вы знаете язык лучше R справляющийся с задачами ана
Date: 2013-04-04 07:01 am (UTC)никакой "нечитаемости" в нем нет.
большинство "пакетиков" посвящено именно заведению еще одного фрагмента "пазла". и этот фрагмент очень хорошо и удобно вписывается в уже имеющуюся систему и удачно её дополняет.
"легко развиваемые" и "нечитаемые" явно противоположные понятия. все рассуждения притянутые из программинга в случае R "мимо кассы". Язык используется в режиме интерактивной обработки данных. "программа" на нем обрабатывает в 99% процентах случаев конкретную выборку данных (и да, она не обязана быть корректной на другой выборке :) )
что касается "дерьма". побольше бы такого "дерьма" которое повышает производительность труда (конкретно написание статей и презентаций) на _два_ порядка.
PS ...а ученые и диссертации свои не всегда сами пишут :)
Re: A вы знаете язык лучше R справляющийся с задачами ана
Date: 2013-04-04 08:21 am (UTC)Золотые слова. Я выше это уже написал. Р - замечательный калькулятор, экономит кучу времени как учьоным, так и учёным. И нормальным людям тоже. Но это ужасный язык программирования, который поощряет нечитаемый одноразовый код. Нечитаемый. Одноразовый. 😝
Re: A вы знаете язык лучше R справляющийся с задачами ана
Date: 2013-04-04 09:36 am (UTC)Только надо помнить что: писать придется "как на схеме", с использованием объектной системы "как в лиспе", осознанно выбрав стиль кодирования в котором будет решена задача. При чем сам язык не накладывает _никаких_ ограничений.
Оба режима одинаково важны и нужны. Умение вовремя "переключиться" от одного подхода к другому и составляет "опытность" пользователя R.
2) Не читаемый и одноразовый код люди пишут на любом языке программирования :)
Код R вставленный (в 90% случаев 1-2 строчками) в текст статьи заменяет целые предложения (а то и страницы :) ) невразумительных объяснений "что авторы имели в виду". Если это "нечитаемость", то я за неё. :)
Re: A вы знаете язык лучше R справляющийся с задачами ана
Date: 2013-03-23 12:10 pm (UTC)