LINUX.ORG.RU

Создатель Python разочарован в Scala

 , ,


2

0

Гвидо ван Россум, создатель Python, в своем блоге делится впечатлениями от изучения языка Scala: "К сожалению, я полностью разочарован в этом языке". Причиной является слишком сложная система типов Scala: "Если такая система необходима для корректной обработки разных типов данных во время компиляции, я однозначно предпочту динамическую типизацию".

>>> пост

anonymous

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

> А вот запихнуть все в единую иерархию классов это дебилизм полный, так что закапываем java, .net и прочую хню.

Кажется, у Эккерля в первом томе "Философия С++" объясняется какая задача решается, когда все классы наследуются от едиственного. В C++ эта задача решается множественным наследованием, ибо Столман очень не хотел навязывать единственно правильное решение.

Типа вот вам удочка - рыбу ловите сами.

Кому нравиться решение свыше - пользуется java и .net, кто сам предпочитает принимать решения - C++.

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

> Как тут принято говорить: "Слив засчитан." ;) У вас-то трясти нечем...

ну че, доставайте свой eval, я тут тестик состряпал по-быдлокодерски :)

ЗЫ: слабонервным и беременным не смотреть

#include <stdlib.h>
#include <stdio.h>
#include <process.h>
#include <conio.h>

char *cl_env[] =     
{
   "INCLUDE=c:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\INCLUDE;C:\\Program Files\\Microsoft SDKs\\Windows\\v6.0A\\include",
   "LIB=c:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\LIB;C:\\Program Files\\Microsoft SDKs\\Windows\\v6.0A\\lib",
   "Path=c:\\Program Files\\Microsoft Visual Studio 9.0\\Common7\\IDE;c:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\BIN;C:\\WINDOWS\\system32;C:\\WINDOWS;",
   "TMP=C:\\DOCUME~1\\ЯЯЯ\\LOCALS~1\\Temp",
   NULL
};

#define CL_PATH "c:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\bin\\cl.exe"
#define CL_PATH_ "\"c:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\bin\\cl.exe\""

int main()
{
	_spawnle(_P_WAIT, CL_PATH, CL_PATH_, "hello_world.c", NULL, cl_env);
	_spawnl(_P_WAIT, "hello_world.exe", "hello_world.exe", NULL);

	return 0;
}

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

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

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

>извиняюсь за форматирование

за вантуз лучше извиняйся

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

советую подучить язык, прежде чем примеры давать

anonymous
()

К стати у этого поста Гвидо был и позитивный момент для Скала коммьюнити. Мартин расшевелился и начали актвивно обсуждать разный набор наболевших вопросов которе будут изменены в скале 2.8 и из фазы вялого гыканья на очередного недоумевающего раз в месяц перешли к фазе составления туду листов чего добавить и чего выбросить в следующей скале. Нафигачили по теме 150 постов за три дня.

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

Пусть Гвидо тогда ещё насрёт в какой-нибудь коммон-лисповский лист...

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

> Давайте я вам теперь задачку дам: программа в рантайме считывает из 
файла в строку программу и выполняет её, изменяя окружение.

Я не тот анонимус, и против Lisp-а я не возражаю (в конце концов, 
выбор языка отчасти дело вкуса), но задача меня заинтересовала, т.к. я 
сейчас слегка изучаю C, поэтому я попробовал выполнить ее 
самостоятельно, набросав библиотеку libexec и программу execsample, 
которая ее использует. Конечно, я понимаю, что, вероятно, использовал 
не самый оптимальный вариант (так, gcc - вероятно - код можно передать 
напрямую, и - не менее вероятно - получить откомпилированный вариант 
через stdin, после чего залить его в память, выделенную mmap с флагом 
PROT_EXEC), но - .

Файл, из которого производится считывание - sample.c:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
        printf("Done! ;)\n");
        int x;
        scanf("%d",&x);
        printf("%d * %d = '%ld'\n", x, x, x*x);
        putenv("LIBEXECSTATE=DONE");
}

----------------------------------------

libexec.h + libexec.c

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>

#define ESCAPE_SIZE 4
char escape[ESCAPE_SIZE] = { '$', '\'', '"', '\\' };

int CExec(char *code, char *cflags);
void cleanCode(char *dest, char *src);

int CExec(char *code, char *cflags)
{
    char *ccode = (char*) malloc(strlen(code)*2+1);
    cleanCode(ccode, code);
    
    char *request = (char*) malloc(strlen(ccode)+strlen(cflags)+
	42+1); //Allocating memory for our request
    sprintf(request,
	     "echo \"%s\" | gcc -shared -fPIC %s -x c -o out -",
	     ccode, cflags);
    free(ccode);
    
    int ret;
    
    if( (ret=system(request)) )
    {
	free(request);
	printf("Compilation failed...\n");
	return -1;
    }
    
    free(request);    
    dlerror(); //Avoiding existing dlerrors
    
    void *h = dlopen("./out", RTLD_NOW); //Openning our file
    int (*doe)(int, char**); //Our function pointer
    doe = dlsym(h, "main"); //Searching for required symbol
    
    char *error;
    if( (error=dlerror()) ) //Checking for errors
    {
	printf("Error occured: %s\n",error);
	return -1;
    }
    
    ret = doe(0, NULL); //At last, starting!
    
    dlclose(h); //Freeing now unnecessary library
    
    return ret;
}

void cleanCode(char *dest, char *src)
{
    int i;
    while(*src!='\0')
    {
	for(i=0;i<ESCAPE_SIZE && *src!=escape[i];i++);
	if(i!=ESCAPE_SIZE)
	    *dest++ = '\\';
	*dest++=*src++;
    }
    *dest = '\0';
}

----------------------------------------

execsample.h + execsample.c

#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

#include "execsample.h"

#define READ_SIZE 1024

extern int CExec(char *code, char *cflags);

int main()
{
    int fd = open("sample.c", O_RDONLY);
    
    char *buffer = (char*) malloc(READ_SIZE);
    size_t sz=0, readb=0;
    
    while( (readb = read(fd, buffer+sz, READ_SIZE)) )
    {
	sz+=readb;
	buffer = (char*) realloc(buffer, sz+READ_SIZE);
    }
    
    close(fd);
    
    sz+=readb;
    buffer = (char*) realloc(buffer, sz);
    buffer[sz-1] = '\0';
    
    CExec(buffer, "");
    
    free(buffer);
    
    return 0;
}

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

> Это только маленькая часть встречающихся вопросов. Они (как и многие инвестбанки) любят просить решать простенькие дифуры, доказывать теоремы из матстата, решать в уме (без бумажки и без компьютера) комбинаторные задачи, и много чего ещё.

Причина проста: это только ты думаешь, что чем краснее у тебя диплом и чем больше ты знаешь - тем ты круче. Для работодателя - чем краснее диплом, тем меньше можно платить. Ибо он показывает твое упорство в высиживании решений для тупых рутинных задач. А только такие в вузе и бывают.

Потому и дают на собеседовании задачи по нахождению детерминанта тезнора и другой интегральной ерунды, чтобы проветить, насколько стойко ты будешь переносить трудности наемной работы по разгребанию рутины. И тебе будут на уши вешать лапшу, что раз ты так много знаешь - значит ты крутой. И будешь ты этим гордиться. А девочка в отделе продаж проявив упорство в освоении тонкостей товаров всех двух десятков позиций в прескуранте и умение общаться через пол года выйдет на такой уровень дохода, который тебе не дадут 5 лет в универе +3 в аспирантуре + много в энтерпрайзе. И если работотадель решит, что он ей много платит, она не запариваясь пойдет в другую контору.

Но ты очень умный, наверное. Поэтому, будешь слушать сказки про высшую математику... Про ее нужность тебе уже сказали люди по собственному опыту.

Пардон, если кого задел. Ничего личного.

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

Здравствуйте, мои красноглазые пупсики, я вернулся.

>Хочу видеть реализацию на С без всяких дслэй вот такого DSL "SELECT * FROM mytable WHERE...". Вот вам и DSL и практика.


Пожалуйста: http://www.postgresql.org

А теперь не могли бы Вы в ответ привести пример такого же уровня, но написанный на Лисп? Позволю себе ответить за Вас: "нет, не могли бы", потому что на Лисп почему-то до сих пор не написано СУБД, по своим качествам приближающихся к PostgreSQL.

А теперь попробуйте догадаться почему.

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

>> Писать надо не только DSL и его транслятор, но и рантайм, и дебаггер, и профайлер

>Вообще-то всё перечисленное - это сам Лисп. Писать надо только транслятор DSL в Лисп, а остальное уже есть.


Вышесказанное выдаёт в Вас воинствующего дилетанта. Вы собираетесь отлаживать/профилировать исполнение DSL, отлаживая исполнение соответствующих Лисп-стейтментов? Вы даже не сможете понять, в какой строке на DSL возникло исключение. Вы просто будете отлаживать раздутый сгенерированный Лисп-код.

Точно так же можно заявлять, что source-level debugger для С не нужен, и отлаживать получившийся ассемблерный код. Впрочем, я не удивлюсь, если для Вас это нормальная практика - замечено, что лисперы склонны специально создавать себе проблемы, чтобы потом решать их. Это подтверждается следующей Вашей посылкой:

>REPL - самая полноценная IDE по определению


Не всем знакома эта аббревиатура, потому что она родом из каменного века программирования, а население ЛОРа в основном состоит из современных homo sapiens. Поясняю. REPL - "read-eval-print loop", проще говоря, примитивная консоль-интерпретатор (а-ля python без параметров). К примеру, консоль SBCL не поддерживает вызова предыдущей команды по клавише "вверх" и даже элементарного tab-комплишена. То, что Вы называете это "самой полноценной IDE", выдаёт в Вас либо тролля, либо сумасшедшего. По крайней мере

>Ну да тебе этого не понять, ты явно ограниченный.

и
>Дурак.


говорят о Вашей неуравновешенности, и, само собой, о невоспитанности.

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

Вдобавок,

>возможности рефакторинга Лиспа _в рантайме_


говорит о том, что Вы совершенно не представляете себе, что такое "рефакторинг". Продолжать дискуссию с Вами считаю невозможным в силу полного невладения Вами предметом дискуссии, а так же в силу Вашего общего культурного и интеллектуального уровня.

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

> Да какое ты практик, если задачки у тебя из разряда школьных курсовых?

Вы невнимательно читали комментарии к задаче. Это - сильно упрощённый вариант реальной практической задачи, призванный продемонстрировать несостоятельность Лисп (и он с этим справился). Реальная задача отличается от поставленной техническими деталями - способом получения и декодирования данных, объёмами данных, бОльшим разнообразием вычисляемых статистик, наличием специализированного GUI и работой с СУБД. (Замечу, что все эти детали ещё сильнее уменьшают шансы Лисп как инструмента для этой задачи.) Если отбросить технические мелочи - то да, представьте себе, реальная задача с производства - это обыкновенная школьная задачка! Но Лисп не справился и с ней.

Кстати, что такое "школьная курсовая"? В какой школе Вы учились?

>В реальных практических задачах разница в потреблении памяти в два-три раза и в скорости в два-три раза никого не колышет.


Вы неправы. Для систем масштаба большого предприятия, решающих задачи в реальном времени, это будет означать удорожание оборудования в несколько раз. Заказчик вполне может пойти на это, но только при наличии компенсирующих выгод. Но их нет. Допустим, лисп-программист решает задачу в три раза быстрее, чем сишник, и стОит в пять раз больше. Совокупное (время*цена) получается больше, чем для сишника. Чистая экономика. Получается, что Лисп-решение стОит дороже (как оборудование, так и разработка) и работает медленнее.

Итог: Лисп невыгоден как инструмент для промышленной разработки.

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

>Пожалуйста: http://www.postgresql.org

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

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

>>возможности рефакторинга Лиспа _в рантайме_
>говорит о том, что Вы совершенно не представляете себе, что такое "рефакторинг".



Охохо. Первые рефакторинг бровзеры появились в смоллтолке. И именно в рантайме - там вообещ вся среда разработки - это рантайм.

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

>В реальных практических задачах лиспер ВСЕГДА уделывает сишника, обратного за всю историю человечества не наблюдалось ни разу.

Вы знаете, и "прямого" тоже как-то не наблюдалось.

На все отчаянные вопросы "да покажите, покажите уже наконец реальную большую систему, написанную на Лисп!" - отбрёхиваются стандартной Maxim'ой да невнятным Емаксом.

Где операционные системы, написанные на Лисп? Пылящийся в музее Symbolics? Пускай тогда он был "на голову выше всех остальных". Но где он сейчас? Точно так же можно утверждать, что в своё время паровая машина была "на голову выше, экологичнее и совершеннее двигателей внутреннего сгорания", но сегодня ей место в музее. Домашнее задание - объяснить, почему это так.

Где компиляторы распространённых языков, написанные на Лисп? Где реализации виртуальных машин класса JVM? На Лиспе обычно бывает написан только сам компилятор Лиспа (это хорошая практика self-hosted compiler), всё остальное - миф и фикция.

Где СУБД, написанные на Лисп? Сервера приложений? Системы документооборота?

Козырным аргументом адвокатов Лиспа обычно является следующее, дословно. "Большие системы на Лисп есть, но вам, быдлу, их никто не покажет, вам, быдлу, это недоступно в силу своей ограниченности".
Ну, что же. Это классическая конспирационная теория ("а власти скрывают"), и ценность такого утверждения ничуть не больше, чем у утверждений, что "летающие тарелки работают на элементе 105", "Путин на самом деле краб" или "кризис устроила мировая жидомасонская закулиса".

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

>Сервера приложений? Системы документооборота?

Лисп был вытеснен совсем не С. Недостатка лиспа 2: он сильно опередил свое время - появился тогда когда люди байты и биты считали, и второй S-expressions. В них есть преймущества - но "обычного яппи-программиста" - того который остваивает визуаль бейсик это напрягает.

Это однако не отменяет объективных достоинств языка.

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

Камрад r неусыпно бдит над оружием, что достойно всяческих похвал. :)

>Хочу видеть как вы без DSL, который по вашему мнению бесполезнае говно, будете решать эту задачу.


К сожалению, Вы неверно меня поняли. DSL - прекрасный подход, но он не является "серебряной пулей" - этот путь очень и очень нелёгок, так как требует либо создания дополнительных средств разработки (специализированного отладчика и т.п., что само по себе нетривиальная задача), либо слепого блуждания в потёмках в виде работы с "голым" DSL.

Кстати, *QL, пожалуй, не лучший пример. Вспомним Hibernate, где HQL-запрос можно сформировать путём разбора HQL-выражения, а можно и путём конструирования при помощи так называемого Criteria API.

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

>Это однако не отменяет объективных достоинств языка.

С этим никто не спорит, камрад. (Кстати, буду благодарен, если Вы их вкратце перечислите.) Но не стоит возводить Лисп в культ - он отнюдь не всемогущ, область применения его узка, и в некоторых областях он спотыкается даже на примитивных задачах.

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

>и в некоторых областях он спотыкается даже на примитивных задачах.

На самом деле в данном случае задача решалась просто в лоб. В случае индустриального подхода надо было бы просто применять memory mapped file, и не напрягать ни коллектор ни машину ни париться о пямяти - все было бы байт в байт. А уж логику писать на лиспе было бы куда как удобнее и быстрее чем на С.

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

>Давайте я вам теперь задачку дам: программа в рантайме считывает из файла в строку программу и выполняет её, изменяя окружение.

Если Вы просите решить эту задачу на Си, то Вы - провокатор. Ибо есть вещи, для которых языки не предназначены, и Вам это известно. Требовать возможностей метапрограммирования от Си - всё равно что требовать поддержки GOTO от Пролога или Эрланга.

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

>В случае индустриального подхода надо было бы просто применять memory mapped file

Вы снова проявляете невнимательность, в самом начале было сказано, что данные берутся из non-seekable потока. Кстати, настала пора вернуться к этой задачке, вопрос так и остаётся открытым. Об этом - далее.

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

> Вы снова проявляете невнимательность, в самом начале было сказано, что данные берутся из non-seekable потока.

Ну значит мемору маппед буффер. В любом случает обеспечить бай-в-байт соответствие - не проблема.

r ★★★★★
()

Возвращаясь к задаче на подсчёт отклонений.
К сожалению, в формулировку и решение была внесена некоторая путаница (в силу, в частности, дилетантизма имплементоров). В следующем посте приводится референсный листинг на Си, работающий для простоты со stdin/stdout.

Призываю в очередной раз воздержаться от:
1) предложений по оптимизации;
2) претензий к стилю программирования;
3) претензий по поводу недостаточной обработки исключительных ситуаций;
4) подозрений в некорректности знаковой/беззнаковой арифметики;
4) поисков физического смысла программы.

Предназначение программы одно-единственное - примитивный бенчмаркинг Си и Лиспа на предмет расхода памяти и общей производительности кода. Тем не менее, эта задача является в своём роде проекцией огромного класса производственных задач, отсюда её показательность.

Сравнение будет производиться на P4 2.0 GHz, GCC 4.3.2 и SBCL 1.0.22.

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

#include <stdint.h> 
#include <stdio.h> 
#include <stdlib.h> 

#define SIZE (20*1048576) 
#define BLK 1024 

void die(int code, char *msg) { perror(msg); exit(code); };

main() {
    unsigned char *buf;
    uint64_t m = 0;
    size_t i;

    if (!(buf = (unsigned char *)malloc(SIZE))) die(1, "malloc");
    if (fread(buf, BLK, SIZE/BLK, stdin) != SIZE/BLK) die(2, "fread");
    for (i = 0; i < SIZE; m += buf[i++]);
    m /= SIZE;
    for (i = 0; i < SIZE; buf[i++] -= (unsigned char)m);
    if (fwrite(buf, BLK, SIZE/BLK, stdout) != SIZE/BLK) die(3, "fwrite");
    fflush(stdout);
    free(buf);
}

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

>работающий для простоты со stdin/stdout.

Лучше на файлах для чистоты эксперимента. В различных средах что такое stdin/stdout и чем они врапнуты могут быть весьма разные понятия.

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

> задачу то прочитай да

прочитал естественно

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

> Поздравляю! Вы доказали, что достойны быть принятым в элитарный клуб задротов-лисперов, идущих строем лесом на север! Для получения официального сертификата задрота, пожалуйста, перечислите $99 по указанному ниже адресу, а также вышлите свои паспортные данные и адрес вашего места проживания обратным письмом (это нужно курьерской службе для доставки бандероли с сертификатом задрота, а также другими призами).

Спасибо! я так счастлив :) eval-то так и не достали, маленький наверно, стыдно показывать. Что ещё раз доказывает что лисперы они только воздух сотрясать горазды

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

> Я не тот анонимус, и против Lisp-а я не возражаю

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

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

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


Та не делайте мне смешно, я вас умоляю! С чего вы решили что то - лисперы? :-) То - супер_крутые_лисперы_лора! Да ... вот только самого лиспа они в глаза не видели :)

А те кто его пользуют в работе уж знают чем утереть нос сишникам и знают чем сишники утрут нос им :) Как тут неоднократно писали последние из вменяемых на лоре - по задаче и инструмент!

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

> А теперь попробуйте догадаться почему.

Потому что на лиспе писать ещё одну обычную РСУБД - кощунство. Вот persistent objects - это совсем другое дело. В гугле искать AllegroCache.

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

Это всё хорошо, но вы меняете не свой environment :) Возможно, для сишников стоило бы сначала объяснить, что в лиспе environment - это видимые symbols: переменные, функции. Таким образом, изменить environment в лиспе - это в самом лёгком случае будет изменение переменной (в си через extern очень приближённо можно сделать), а в более сложном - определение нового symbol.

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

> Где компиляторы распространённых языков, написанные на Лисп?

В музее Symbolics, где ж ещё. В соответствии с доктриной лиспа, другие языки не нужны.

> Где реализации виртуальных машин класса JVM? На Лиспе обычно бывает написан только сам компилятор Лиспа (это хорошая практика self-hosted compiler), всё остальное - миф и фикция.

Хе-хе, вы опять не владеете темой :) Любая имплементация лиспа, имеющая интерпретатор и соответствующая спецификации common lisp (даже драфта уровня cltl), содержит vm, которая уж точно не хуже jvm. Почему? Вот вам пример: лисповая реализация аспектов, AspectL, - это ещё одна библиотека, а вот в jvm пришлось вносить изменения, чтобы такую возможность реализовать. Это, конечно, делает из jvm Ъ энтерпрайз, но лисп это из коробки умел.

> Где СУБД, написанные на Лисп?

Из заметного - AllegroCache (оракель/pg :), Elephant (mysql :), Prevalence (sqlite :)

> Сервера приложений?

Лисп?

> Системы документооборота?

Вы много систем документооборота видели, написанних на *Си*?

> Ну, что же. Это классическая конспирационная теория ("а власти скрывают"), и ценность такого утверждения ничуть не больше, чем у утверждений, что "летающие тарелки работают на элементе 105", "Путин на самом деле краб" или "кризис устроила мировая жидомасонская закулиса".

Иди, eval на сях реализуй для начала. Хотя я понимаю, что языком пи...ть - не мешки таскать.

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

> Но не стоит возводить Лисп в культ - он отнюдь не всемогущ, область применения его узка, и в некоторых областях он спотыкается даже на примитивных задачах.

Иди, eval на сях напиши :) Потом о примитивных задачах поговорим. Кстати, примитивную задачу, на котором лисп споткнулся, можете в пример привести?

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

> Если Вы просите решить эту задачу на Си, то Вы - провокатор. Ибо есть вещи, для которых языки не предназначены, и Вам это известно. Требовать возможностей метапрограммирования от Си - всё равно что требовать поддержки GOTO от Пролога или Эрланга.

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

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

> Возвращаясь к задаче на подсчёт отклонений.

Можете не возвращаться. Всем уже давно ясно, что вы ничего сложнее в своей жизни не писали.

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

> Потому что на лиспе писать ещё одну обычную РСУБД - кощунство.

Напиши необычную, а? Третий Манифест, все дела.

> Вот persistent objects - это совсем другое дело.

Объектные БД умерли маленькими.

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

> Иди, eval на сях реализуй для начала.

> Иди, eval на сях напиши :)

каждый день пользуешься eval-ом при программировании ?

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

>Писать надо не только DSL и его транслятор, но и рантайм, и дебаггер, и профайлер.

Не совсем правильное утверждение. DSL, он по-определению ориентирован на конкретную предметную область. И "мыслепреступление" совершить, тебе не хватит выразительности, только если предметная область будет _очень_ сложной.

DSL выступает обычно в двух ролях:

1. Генератор машинного/байт-/исходного кода.
2. Язык системной интеграции.

Так что с рантаймом, дебаггером и профайлером ты немножко погорячился. Хотя для особых задач есть тот же LLVM.

>Отладка DSL "per se" невозможна.


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

Намного интересней получение дампа работы некоего участка прграммы и его последующего, возможно автоматизированного, анализа. С этим DSL справляется лучше некуда.

При тестирование я вообще молчу.

>транслятор


Написание парсера, особенно для языка, который отличается простотой синтаксиса и универсальностью выражений - дело не сложное. А уж на языках, которые используют S-выражения, так и вообще не нужно: практически сразу тебе готовое дерево разбора.

>Лисп отсутствуют полноценные IDE и возможности рефакторинга.


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

Кроме того, наверняка проприетарные IDE есть. У ведущих производителей. Только стоит это - да.

ЗЫ: Чтобы не было поспешных суждений: я ни разу не лиспер.

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

> Если под отладкой ты подразумеваешь ползанье графическим дебаггером по исходному коду. То я тебя разочарую: это атрибут т.н. быдлокодеров.

Если ты считаешь графический дебаггер инструментом быдлокодера, то я тебя разочарую: это атрибут т.н. дураков.

>>Лисп отсутствуют полноценные IDE и возможности рефакторинга.

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

Вот убей, не понимаю, с каких пор Лисп - декларативный язык.

> Чтобы не было поспешных суждений: я ни разу не лиспер.

Это заметно.

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

> Объектные БД умерли маленькими.

В корне неверно. В CAD/CAM/CAE софтине Unigraphics NX используется объектная БД. Нагрузки на неё очень серьёзные, требования к производительности и надёжности такие же. История у UG 30 летняя, так что ОБД существуют, просто у них другая специфика и область применения.

Это с чем я работал. А сколько ещё софта, про который мы ничего не знаем? :)

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

> каждый день пользуешься eval-ом при программировании ?

Каждый день суммируете байты из /dev/urandom?

mv ★★★★★
()

"Создатель"... Такие поделия студенты "создают" на лабораторках, за 10 минут до сдачи! Тоже мне, разочарованный Пьеро!
Мож скала и имеет другие принципы, но вряд ли хуже этого Путхона.

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

> Каждый день суммируете байты из /dev/urandom?

:) нет, конечно. Что за привычка отвечать вопросом на вопрос.

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

>> Объектные БД умерли маленькими.

>В корне неверно. В CAD/CAM/CAE софтине Unigraphics NX используется объектная БД.

Это не БД (точнее, не СУБД), это persistence backend или как-то так. А объектные СУБД общего назначения умерли маленькими (ИМХО, это и правильно - их время только наступает с приходом managed-платформ).

> История у UG 30 летняя

Тогда там точно не СУБД внутри :) Или это более позднее добавление.

> А сколько ещё софта, про который мы ничего не знаем? :)

Вряд ли много. Как пример - чуть ли не все коммерческие Юниксы были модификациями кодовой базы System V, BSD или Mach. Вполне возможно, что в Unigraphics тоже взял чьи-то наработки и приспособил их под себя (и у него внутри какой-нибудь Poet).

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

> "Создатель"... Такие поделия студенты "создают" на лабораторках, за 10 минут до сдачи!

Ахтунг, суперпрограммисты в топике!!!1111

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

> Ахтунг, суперпрограммисты в топике!!!1111

Скоро сессия, ожидаем взрывной рост количества питонов %)

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

> Это не БД (точнее, не СУБД), это persistence backend или как-то так. А объектные СУБД общего назначения умерли маленькими (ИМХО, это и правильно - их время только наступает с приходом managed-платформ).

Окей, я в бд весьма слаб, но если верить wiki, то в UG таки объектно-ориентированная бд:

http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE...

> Тогда там точно не СУБД внутри :) Или это более позднее добавление.

Может быть. Но там много всего напихано. Блекджек со шлюхами точно есть ;)

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