Синтактично насочени ли са някои езици за функционално програмиране за по-добра производителност?

Чувам за многократното увеличение на производителността при използване на определени езици (RoR). Чувал съм също, че някои виртуални машини са по-оптимални от други (GHC?). Други обаче се опитват да оптимизират избрания от тях език чрез подобряване на основната архитектура (Unladen Swallow)

Въпреки това, докато четях статия („SSA е функционално програмиране“), имах въпрос дали определен език, по силата на своя синтаксис, може (някой ден) да бъде езикът с най-добра производителност.

Предполагам, че това, което питам, е, че независимо дали конкретен синтаксис е ТЕОРЕТИЧНО най-добре насоченият за създаване на най-добрия машинен код. Бих бил много заинтересован от основната теория за всякакви мнения - обсъждах това с някои приятели и си чукахме идеи относно информационното съдържание на определен синтаксис.

Моля, имайте предвид, че говоря за езици, които имат поне първокласни функции - без ASM, моля.


person Sandeep    schedule 25.05.2009    source източник


Отговори (4)


Не. Всички функционални езици, които се стремят към производителност, се превеждат на основен език, който прилича на ламбда смятане. Основните езици за различните компилатори си приличат много повече, отколкото на оригиналния синтаксис. И всеки синтаксис ще бъде компилиран в основен език, от който може да продължи към собствен код. Така че в компилатор на естествен код конкретният синтаксис никога няма да повлияе на производителността.

Ако говорите за високоскоростен компилатор на байт код с едно преминаване като компилатора Lua (Lua има пълна поддръжка за Първокласни функции, подобни на схема), тогава отговорът може да е различен, ако компилаторът е проектиран за бързо компилиране, а не за добър код, може да сте в състояние да правите неща с конкретен синтаксис, които подобряват производителността. Един пример може да е наличието на оператор case или switch вместо вложени ifs.

person Norman Ramsey    schedule 26.05.2009

Това е силно субективно

Синтаксисът на езика е просто метод за изразяване на желаната семантика. Семантиката е тази, която управлява производителността. „Последствията за производителността на синтаксиса“ са равни на последиците за производителността на семантиката, като се има предвид, че миналият синтаксисен анализ синтаксисът често е неуместен.

Внушението за производителност на семантиката се свежда до средата, в която се изпълнява тази семантика. Ето защо имаме CPU и GPU, защото всеки от тях може да изпълнява семантиката на даден език от ниско ниво по-бързо.

Всъщност няма отговор на това без изрично посочване на целевата среда. Клъстер от машини ще се справи по-добре с едновременни програми и има синтаксис, който изразява едновременност като Erlang.

Това, върху което може би трябва да се съсредоточите, е как една обобщена виртуална машина или среда може да осигури най-добрата производителност за широк диапазон от семантика. Например, ако сте пренесли синтаксиса на Erlang към JVM, може ли виртуалната машина да разпознае, че езикът е с едно присвояване и едновременно без изискване за заключвания? Може ли да се оптимизира за това? Виртуалните машини без подреждане са добър пример за опити да се направи ефективна обобщена среда, зависима от необходимата семантика.

Всъщност въпросът е: може ли средата да бъде оптимизирана за клас или ограничен набор от семантика, когато средата по дефиниция е обща?

Бих препоръчал да научите малко за компилаторите (и къде синтаксисът спира да има значение) и след това да погледнете нещо като LLVM, след което да си зададете отново въпроса. Дали функционалните езици са по-подходящи за производителност зависи от средата, в която се изпълнява превод (многоядрено, разпределено, малко вградено устройство).

person Aiden Bell    schedule 25.05.2009
comment
Не съм напълно съгласен, но разбирам мнението ви. Например, погледнете този документ (citeseerx.ist. psu.edu/viewdoc/summary?doi=10.1.1.45.4503 ), което ограничава синтаксиса на езика - така че да могат да се прилагат определени оптимизации. Напълно разбирам вашия акцент върху семантиката, но не се притеснявам от прилагането на синтаксис-A на виртуална машина-B. Да кажем, че има една свята VM и имате синтаксис-A, синтаксис-B... синтаксис-N. Кой синтаксис би могъл теоретично да тласне основната виртуална машина до нейния връх? Що се отнася до околната среда - търся едноядрени десктоп приложения. - person Sandeep; 25.05.2009
comment
Мисля, че може да пропускате идеята ми. Представете си за секунда, че CPU (x86) е holy-vm, кой език може да бъде компилиран в най-ефективния машинен код? Сега си представете, че holy-vm е клетъчен процесор, какво сега? Като се има предвид, че тази „свещена виртуална машина“ не съществува и всички среди са създадени да правят определени неща добре, въпросът е спорен. Но съм готов да приема, че самият аз може да пропускам смисъла. - person Aiden Bell; 25.05.2009
comment
Документът, който цитирахте, изглежда е за ефективен превод на синтаксис във форма на SSA. В този случай става въпрос за най-добрия синтаксис за превод в тази форма. Бих могъл да проектирам междинна форма, базирана на машина без стекове, след което да помисля кой синтаксис би подхождал най-добре на това. Синтаксисът и семантиката са свързани с контекста. Няма еднозначен отговор, освен ако не посочите целева архитектура и езикова цел. - person Aiden Bell; 25.05.2009

От запис в блог за c срещу ocaml:

Интерпретаторът на байт код Objective-Caml беше по-бърз от внимателно ръчно оптимизираната C програма! Защо? Тъй като компилаторът на OCaml можеше да разпознае, че масивите са напълно независими - нямаше нужда да се тревожи, че една итерация на цикъла стъпва върху стойностите, използвани от друга. C компилаторът не можа да приложи много полезни оптимизации, защото не можеше да бъде сигурен, че са валидни.

Не става дума обаче толкова за синтаксис.

person miku    schedule 25.05.2009
comment
Много хубав пример. Но спецификацията на C99 добави нова ключова дума, restrict, която би позволила на C компилатор да приеме, че масивите са напълно независими, така че C99 компилаторът да може да генерира код еднакво бързо или по-бързо от OCaml. Чудесно обяснение е тук: cellperformance.beyond3d.com/ статии/2006/05/ - person steveha; 10.11.2009

Е, GHC поне компилира кода на Haskell в C и след това го компилира, така че не може да бъде по-бърз от същия алгоритъм, написан на C, нали? В най-добрия случай може да бъде също толкова ефективен и това е само с добър оптимизиращ компилатор. Кодът, генериран от преобразуването на Haskell->C, е много негъвкав, големи блокове от код се повтарят за всяка инструкция, така че може много да е по-лошо.

Като се има предвид това, мисля, че библиотеките на езика са това, което диктува за какво езикът е най-подходящ повече от самия език (ако приемем, че има приемлива производителност), така че това не е най-добрият въпрос за задаване.

person Blindy    schedule 25.05.2009
comment
GHC компилира само чрез C на архитектури, за които все още не е написан собствен генератор на код или ако използвате флага -fvia-C. haskell.org/ghc/docs/latest/html/ потребителско_ръководство/ - person Nathan Shively-Sanders; 25.05.2009
comment
Оказва се, че сте прав, но взето от същата страница, която сте свързали, -fasm Използвайте собствения генератор на код на GHC, вместо да компилирате чрез C. Това ще компилира по-бързо (до два пъти по-бързо), но може да създаде код, който е малко по-бавен от компилирането чрез C. -fasm е по подразбиране.. Последната част изглежда предполага, че ghc все още е по-бавен, дори когато е компилиран първоначално. Мисля, че първоначалната ми теза остава. - person Blindy; 25.05.2009
comment
Това, че компилаторът компилира към език, не означава, че не може да бъде по-бърз от базовия език. Например по-високият компилатор може да генерира C, който е невъзможен за генериране от всеки човек. Това е с изключение на оптимизациите от по-високо ниво, които просто не се виждат в C. - person MichaelGG; 25.05.2009