LINUX.ORG.RU

Избранные сообщения unsigned

Какой язык функционального программирования выбрать?

Форум — Development

Хочу инвестировать в свои знания, сейчас мне требуется выбрать язык функционального программирования.

Выбираю из:

  • Erlang
  • Haskell
  • OCaml
  • CL


Основные требования к языку/платформе(по степени важности):

  • востребованность в промышленности
  • живое сообщество + наличие современной литературы
  • простота кода
  • скорость выполнения кода


Пока, самостоятельно попытался сделать небольшое исследование:
Erlang показался наиболее востребован,
Haskell+Erlang - нашел кое-какую литературу.

Если у вас есть опыт в функциональных языках, буду рад советам.

Donnie_Darko
()

Функциональное программирование - с чего начать?

Форум — Development

Захотелось изучить эту штуку... Читал статейку на википедию, и ещё несколько статеек, но как-то не особенно понял, и не особо проникся.

С чего вообще начать, если полный 0 в этом? Какой язык выбрать? И какую книжку почитать? Желательно на русском языке.

До этого немного соображал в структурном программировании, и ООП почуть совсем.

BattleCoder
()

Применимы ли паттерны GoF для LISP?

Форум — Development

Меня удивляет, сколько у местных лисперов враждебности в адрес GoF и паттернов проектирования, что «GoF это такой мемуар про то как перцы писали текстовый редактор, там больше пиара». Ну предположим в некоторых паттернах действительно нет нужды... например Visitor не нужен потому ччто есть multiple dispatch. Некоторые паттерны сильно завязаны на ООП, которое я так понимаю в Лиспе не приветствуется. Но подавляющее большинство паттернов не только успешно решает поставленные задачи, но ещё и реализуются красивее, чем в той же Java, за счёт развитой макросистемы и ФПП. То есть задача и способ решения есть, но западло назвать это «паттерном»? Откуда такая боязнь называть вещи своими именами. А то получается как в анекдоте: ж**а есть, а слова нету.

Также хочется услышать опытных лисперов, какой подход к проектированию своего ПО вы практикуете, желательно с пояснениями и обоснованиями. На всякий случай, проектирование - это то, что следует после постановки ТЗ, но предшествует непосредственно кодированию. Спасибо.

Ignatik
()

[C++] Насоветуйте проектов с качественным кодом.

Форум — Talks

День добрый.
Посоветуйте каких-то проектов в качестве хорошего кода на C++, а то я что не ткну все на С. Хочется в них найти ответы на вопросы в духе «так правильно обрабатывать ошибки используя исключения», «так правильно вести логи», и т. д.
Желательно проекты без гуя, не большие по размеру.

Пока смотрю newsbeuter, ncmpcpp. Что еще есть?

 

urxvt
()

Путь от быдлокодера до программиста.

Форум — Development

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

Кормен Т. & Co Алгоритмы. Построение и анализ.

SICP

Посоветуйте, что прочитать сначала.

>>>

anonymous
()

Google разрабатывает язык Noop для замены Java

Новости — Open Source
Группа Open Source

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

Noop говорит ДА:

  • Внедрению зависимостей в языке
  • Тестируем ост
  • Неизменяемости
  • Синтаксису направленному на улучшение читабельности кода
  • Никогда не устаревающей документации
  • Свойствам, сильной типизации и разумной современной библиотеке

Noop говорит НЕТ:

  • Любой статике
  • Наследованию (subclassing)
  • Примитивам
  • Ненужным шаблонам

Исходные коды доступны под Apache Licence 2.0

>>> Google urges developers to get in loop with Noop

 ,

grim
()

на чём реализовать DSL?

Форум — Development

Имеется DSL, простой императивный язык с LL(1) грамматикой. Задача: реализовать его на практике.

Я читал что-то про lex+yacc, CL/Scheme/Clojure, MPS, ANTLDR, LLVM, xText и Meta Platform им. Луговского. Но никакого опыта с созданием DSL не имел.

Кроме собственно компилятора/интерпретатора, хочется получить:

  1. Что-то похожее на отладчик. Не грамматики, а собственно языка. Пройти программу по шагам, посмотреть переменные, всё такое.
  2. Динамичность для пользователя. Чтобы он мог, например, добавить в язык новое ключевое слово, или переопределить существующее, и одной кнопкой перегенерировать все инструменты.

Технологических ограничений нет, кроме того, что нужна кроссплатформенность (Windows+Linux).

Какое средство наиболее подходит? Будет интересно узнать, кто чем пользовался при создании DSL. Спасибо.

ringill
()

Пример разработки простого многопоточного сетевого сервера

Новости — Документация
Группа Документация

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

>>> Подробности

 ,

IBM_dW
()

Как выделяется память в линуксе?

Форум — Development

Помогите, пожалуйста, разобраться. Есть 2 программки, одна просто выделяет себе всю доступную память, другая пытается при этом сразу эту память использовать. malloctest.c

#define SIZE 4096
int main(){
    int i, oldi;
    void* ma[SIZE];
    for(i=0; i<SIZE; i++){
        ma[i]=malloc(1024*1024);
        if(ma[i]==NULL)
            break;
    }
    oldi=i;
    printf("allocated %i times 1M = %i\n", i, i*1024*1024);
    for(; i<SIZE; i++){
        ma[i]=malloc(1024);
        if(ma[i]==NULL)
            break;
    }
    printf("allocated %i times 1k = %i\n", i-oldi, (i-oldi)*1024);
    printf("total allocated %i\n", (oldi*1024*1024) + (i-oldi)*1024);
    for(; i!=0; i--)
        free(ma[i]);
}
и malloctest_w_use.c
#define SIZE 4096
int main(){
    int i, oldi;
    void* ma[SIZE];
    for(i=0; i<SIZE; i++){
        ma[i]=malloc(1024*1024);
        memset(ma[i], 0, 1024*1024);
        if(ma[i]==NULL)
            break;
        printf("%i ok\n ", i);
    }
    oldi=i;
    printf("allocated %i times 1M = %i\n", i, i*1024*1024);
    for(; i<SIZE; i++){
        ma[i]=malloc(1024);
        memset(ma[i], 0, 1024);
        if(ma[i]==NULL)
            break;
    }
    printf("allocated %i times 1k = %i\n", i-oldi, (i-oldi)*1024);
    printf("allocated totally %i\n", (oldi*1024*1024) + (i-oldi)*1024);
    for(; i!=0; i--)
        free(ma[i]);
}
имеем
$ cat /proc/sys/vm/overcommit_memory 
2
$ cat /proc/sys/vm/overcommit_ratio 
85
$ free
             total       used       free     shared    buffers     cached
Mem:       2072164    1085868     986296          0      32640     222244
-/+ buffers/cache:     830984    1241180
Swap:            0          0          0
$ grep Commit /proc/meminfo
CommitLimit:     1761336 kB
Committed_AS:     911168 kB
Т.е. overcommit отключен. полностью свободной памяти > 960Mb, но можно ещё освободить.
$ ./malloctest
allocated 744 times 1M = 780140544
allocated 506 times 1k = 518144
total allocated 780658688
$ ./malloctest_w_use
0 ok
...
652 ok
653 ok
Segmentation fault

Во-первых, почему не выделяется вся доступная память? Её остаётся ~200 Мб свободной. Во-вторых, (хотя причина наверняка та же) почему программка сегфолтится?

И общие наблюдения следущие: когда загрузка памяти подходит к ~1Гб без буферов и кешей, программы начинают ругаться «failed to allocate...» или падать в сегфолт. Почему такое может быть? Ядро самосборное, включена поддержка памяти до 4Гб.

Ткните меня в мануал, где бы об этом писалось. Статьи Дреппера до конца не дочитал, но быстро просмотрев, не нашёл там возможных причин.

byteworm
()

Книготред

Форум — Talks

Просьба посоветовать книжки и хорошие статьи, блоги на тему:
Haskell, его концепции, применение на практике
Erlang, его концепции, применение на практике
Теория и практика построения компиляторов и виртуальных машин (типа Java VM, Python VM, а не VMware). Если доходчиво освещаются новые веяния, это вообще хорошо.

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

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

Очень нежелательно: книжки, пропитанные американским юмором про пиццу, бейсбол и прочее г. Всякие «для полных идиотов» этим страдают.

Если книги еще и можна скачать бесплатно, без регистрации и СМС, в форматах EPUB и/или MOBI, это вообще шикарно.

shimon
()

Посоветуйте видеолекций по матану

Форум — Talks

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

Темы:
1. Пределы, дифференциалы, производные и т.д.
2. Анализ функций одной и нескольких переменных
3. Неопределенные, определенные, кратные, криволинейные, поверхностные интегралы
4. Ряды
5. Введение в диффуры

ViTeX
()

[scheme][haskell][oop][fp] Мысли вслух

Форум — Development

Была на ЛОРе такая тема — [Haskell] простой вопрос. Хотелось бы немножко её развить и высказаться на тему предпочтения того или иного языка при изучении ФП (графомания mode on :)).

У Scheme есть довольно давняя история использования в качестве подопытного языка в курсах изучения ФП. Я не знаю чем это вызвано, но факт остаётся фактом — есть известный курс у MIT (или был?) и разные полезные книжки — SICP, HTDP, PLAI, OOPLAI, которые обычно и советуют читать если нужно ознакомиться с ФП.

Касательно SICP — одним из сторонников использования ML для целей изучения ФП была написана статья (http://www.cs.kent.ac.uk/people/staff/dat/miranda/wadler87.pdf) в которой достаточно хорошо освещены некоторые недостатки Scheme. Если говорить про Haskell, то тут всё так же. Далее, по пунктам (опуская кое-что из того что уже было в той статье).

Более явный синтаксис

Вместо

(define (foo x y z)
  (if (> (+ x (* y z) 1) 7) (print (+ x y)) (print (- x y))))

будет

foo x y z = if x + y * z + 1 > 7 then print $ x + y else print $ x - y

при этом по-прежнему можно написать выражение в префиксной форме:

(if' ((>) ((+) x ((*) y z) 1) 7) (print ((+) x y)) (print ((-) x y)))

почти как в Scheme. То есть, кроме префикса также есть (расширяемый пользователем) инфикс (в том числе функции вроде ($) и (.) позволяющие в некоторых случаях опускать лишние аргументы у функций и некоторые скобки в выражениях) и разные специальные формы (вроде if, let, лямбды и т.п.). Во всём что не касается макросов это более удобно. S-выражения обретают свой особый смысл только когда доходит до их цитирования:

'(if (> (+ x (* y z) 1) 7) (print (+ x y)) (print (- x y)))

и разбора с целью написания макросов. Тем не менее, для изучения именно ФП эта возможность незначительна (ФП не про макросы, в SICP и HTDP не ни слова про макросы, в PLAI есть только немного, в OOPLAI — побольше). Про то как правильно (ну, _правильно_, то есть без использования s-выражений) организовывать символьные вычисления (вроде дифференцирования из SICP) также расказывается в упомянутой статье.

Каррированные функции

Такое определение, например:

(define add
  (lambda (n)
    (lambda (m)
      (+ m n))))

заменяется простым

add = (+)

так как все функции уже каррированные (позволяют частичное применение). Фактически, в хаскеле функция с n аргументами сразу задаёт n разных функций (выбор конкретной функции осуществляется во время компиляции и не имеет эффекта во время выполнения). Некаррированные функции это функции от кортежей (те и другие переводятся друг в друга с помощью ФВП carry/uncarry).

Частичное применение, секции, pointfree запись

add2 = (+ 2)

add2 5
7

вместо

(define add2 (add 2))

(add2 5)
7

Мутабельные замыкания

Это единственная вещь которая есть в Scheme и которую можно не увидеть сразу в хаскеле (и про неё нет в той статье). Тот тред был как раз про них. Чтобы прояснить этот момент, ниже приводятся некоторые примеры из OOPLAI и их аналоги на хаскеле.

Простейший вариант:

(define counter
  (let ((count 0))
    (lambda ()
      (begin
        (set! count (add1 count))
        count))))

(counter)
1
(counter)
2

аналог:

counter = (=~ (+ 1)) <$> new 0

тут (=~ (+ 1)) играет роль мутирующего «метода», а (new 0) — мутируемого «объекта», (<$>) — применение «диспетчера» (тут — просто единичный анонимный «метод»). Вся конструкция функториальная (не монадическая). Использование:

ctr <- counter      -- Инстанцирование класса counter объектом ctr.
ctr                 -- Применение единственного метода ((=~ (+ 1)) который).
1                   -- Результат.
ctr                 -- Снова.
2                   -- Другой результат.

Чуть более сложный пример:

(define counter-
  (let ((count 0))
    (lambda (cmd)
      (case cmd
        ((dec) (begin
                 (set! count (sub1 count))
                 count))
        ((inc) (begin
                 (set! count (add1 count))
                 count))))))

(counter- 'inc)
1
(counter- 'dec)
0

Для начала определим имена методов dec и inc:

data CounterMethod = Dec | Inc

это не символы и не строки (так что код не будет ill-typed как в примере на Scheme, иначе говоря, применение несуществующего метода не пройдёт компиляции). И теперь функцию:

counter' = dispatch <$> new 0
  where dispatch obj Dec = obj =~ flip (-) 1
        dispatch obj Inc = obj =~ (+ 1)

тут dispatch играет роль диспетчеризирующей функции которая получает объект (obj) и имя метода, а затем изменяет объект (как того требует метод). (new 0) — начальный объект.

Пример:

ctr <- counter'     -- Инстанцирование класса counter' объектом ctr.
ctr Inc             -- Применение метода Inc на объекте ctr.
1
ctr Inc
2
ctr Inc
3
ctr Dec             -- Тут уже метод Dec.
2
ctr Dec
1
ctr Dec
0

Тут применение (ctr Inc) весьма похоже на каноничное, через точку, obj.method и является, по сути, посылкой сообщения объекту.

Третий пример:

(define stack
  (let ((vals '()))
    (define (pop)
      (if (empty? vals)
          (error "cannot pop from an empty stack")
        (let ((val (car vals)))
          (set! vals (cdr vals))
          val)))
    (define (push val)
      (set! vals (cons val vals)))
    (define (peek)
      (if (empty? vals)
          (error "cannot peek from an empty stack")
        (car vals)))
    (lambda (cmd . args)
       (case cmd
         ((pop) (pop))
         ((push) (push (car args)))
         ((peek) (peek))
         (else (error "invalid command")))))) 

(stack 'push 1)
(stack 'push 2)
(stack 'pop)
2
(stack 'peek)
1
(stack 'pop)
1
(stack 'pop)
; cannot pop from an empty stack

аналогично:

data StackMethod = Pop | Push | Peek

stack = dispatch <$> new []
  where
    dispatch x Pop _  = get x >>= (x =~ tail >>) . return . head
    dispatch x Push y = x =~ (y :) >> return y
    dispatch x Peek _ = head <$> get x

и пример:

stk <- stack :: IO (StackMethod -> Int -> IO Int)
                    -- stack это параметрически-полиморфный класс, в данном
                    -- случае берётся его спецификация когда элементы стека
                    -- имеют тип Int (можно взять что-то более общее).
                    -- Этот специфичный класс инстанцируется объектом stk.
mapM_ (stk Push) [1, 2, 3]
                    -- (stk Push) это применение метода Push на объекте stk,
                    -- с помощью ФВП mapM_ оно производится для всех элементов
                    -- списка.
repeat 4 $ stk Pop __ >>= print
                    -- 4 раза вызывается метод Pop, элементы печатаются.
                    -- Последний раз вызывается исключение (так как стек пуст).
3
2
1
*** Exception: Prelude.head: empty list

тут точно так же — в StackMethod перечислены нужные методы для стека, функция stack определяет класс, то есть объединение данных и функций с нужным поведением, она имеет тип IO (StackMethod -> a -> IO a), то есть принимает метод, элемент стека и возвращает элемент стека (в IO, мутабельно), сама функция в IO (вся структура данных ведёт себя мутабельно).

Дальше в OOPLAI начинают использовать макросы для придания более удобоваримого вида этим конструкциям. В настоящем (ну, _настоящем_ :)) ФП этого не нужно — примитивные ООП конструкции объединяющие данные и функции выглядят естественно и так, и являются частным случаем использования ФВП, IO и ADT с паттерн-матчингом (последние два — для удобства). Использование макро-системы может иметь смысл разве что если действительно нужно реализовать сложную ООП систему (например, со множественным наследованием и изменяемой иерархией классов, впрочем, обойтись одними функциями тут тоже можно, просто придётся делать больше механических действий).

Ещё пример:

-- | Данные — конструктор и аккессоры.
data Point = Point
  { x :: Double
  , y :: Double
  } deriving ( Show, Eq ) -- ad-hoc перегруженные функции.

-- | Методы привязываемые к данным (это уже _не_ ad-hoc перегруженные функции).
data PointMethod = Pos | Mov

-- | Класс (= функция), объединяющий данные и методы.
pointClass :: Double -> Double -> IO (PointMethod -> Double -> Double -> IO Point)
pointClass initX initY = dispatch <$> new (Point initX initY)
  where
    -- | (Динамический) диспетчер по методам. Он принимает объект (Var Point),
    -- имя метода (PointMethod, т.е. статическое, в данном случае, сообщение)
    -- и два опционных аргумента для методов (Double -> Double). Эту функцию
    -- можно помещать непосредственно в Point.
    dispatch :: Var Point -> PointMethod -> Double -> Double -> IO Point
    dispatch obj Pos _ _ = get obj
    dispatch obj Mov x y = obj =: Point x y
pnt <- pointClass 2 4         -- Инстанцирование класса pointClass объектом pnt
                              -- с начальными значениями полей 2 и 4.
:t pnt
pnt :: PointMethod -> Double -> Double -> IO Point
pnt Pos __ __                 -- Вызов метода Pos на объекте pnt.
Point {x = 2.0, y = 4.0}
pnt Mov 3 5                   -- Вызов метода Mov.
Point {x = 3.0, y = 5.0}
pnt Pos __ __                 -- Положение изменилось:
{x = 3.0, y = 5.0}

Нужно заметить, что это всё довольно примитивные конструкции (простые функции и IO). В случае использования ADT для имён методов получится динамическая диспетчеризация с фиксированным набором методов (well-typed), если же переписать функцию dispatch с завязкой на хэш-табличку (которая должна быть переменной в данных класса), то будет динамическая диспетчеризация с пополняемым набором методов и перегруженными методами (одни и те же сообщения можно посылать разным инстанцированным объектам, их dispatch будет их искать в хэш-таблице и обрабатывать, это уже ill-typed, то есть с исключениями вида «нет такого метода»). Разные прочие вещи вроде наследования и self точно также можно изобразить (аггрегация данных, представление иерархии классов в данных (в переменной или нет, в зависимости от возможности менять иерархию) и более сложная функция dispatch), но как-то не интересно.

P.S.

Код на хаскеле использует такие упрощения:

import Prelude hiding ( repeat )
import Data.IORef
import Control.Applicative
import Control.Monad

type Var a = IORef a

new :: a -> IO (IORef a)
new = newIORef

get :: IORef a -> IO a
get = readIORef

(=~) :: IORef a -> (a -> a) -> IO a
x =~ f = modifyIORef x f >> get x

(=:) :: IORef a -> a -> IO a
x =: x' = x =~ const x'

repeat :: Monad m => Int -> m a -> m ()
repeat = replicateM_

__ :: a
__ = undefined

P.P.S.

OOP / ООП в контексте данного поста — объектно-ориентированное программирование в духе объединения данных и процедур, то есть в духе C++, Java, Python и т.п. _Не_ ООП в духе классы = структуры, методы = перегруженные функции, наследование = схемы агрегаций и распространения методов (как это в CLOS и классах типов Haskell).

 , ,

quasimoto
()

Международный чемпионат по искусственному интеллекту

Новости — Игры
Группа Игры

Опубликованы результаты международного чемпионата в области AI, организованного в университете Ватерлоо (Канада), при спонсорской поддержке Google. Приятно было увидеть в числе финалистов несколько представителей из России. Удивительным оказался тот факт, что среди победителей, попавших в top10, все 100% использовали язык C++.

>>> Подробности

 ,

Sun-ch
()

[philosophy] В чем заключается революционность перехода от функциональщины к ООП?

Форум — Development

Так уж повелось, что первый язык, который я изучал, был делфи. Потом всякие сишарпики, С++, лисп, и т.п. В итоге, как мне кажется, у меня ООП головного мозга. Когда возникала задача писать на С, я начал реализовавывать обьектную модель в этом языке.

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

Почему появились языки, которые взяли ООП за главенствующую идею (java, c#, етц)?

Неужели те преимущества, которые предлагает ООП (полиморфизм, инкапсуляция, наследование), дают прирост в эффективности, скорости написания программ, понимания их работы и поддержке? Здесь было бы интересно сравнить одну и ту же программу, написанную на С и на С++, чтобы узреть принципиальные архитектурные различия (может такие уже есть?).

Сухой остаток. ООП представляет из себя еще один уровень абстракции, который позволяет оперировать про проектировании не функциями, а обьектами. А неужели это так меняет дело и делает разработку более удобной?

Было бы интересно без срачей услышать компетентное мнение.

bk_
()

Одновременная запись в несколько сокетов

Форум — Development

Суть задачи: RedHat Linux MRG Realtime Есть структура, содержащая (условно) список сокетов, в которые надо писать одинаковые данные (мультиплексирование). Сокетов достаточно много - сотни и единицы тысяч.

Операции записи должны быть асинхронными, при этом потокобезопасными. Высокие требования к латентности (распространение рыночных данных).

На какие низкоуровневые средства предложите посмотреть и какие высокоуровневые реализации посоветуете посмотреть?

Спасибо заранее.

westtrd
()

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

Форум — Development

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

aptyp
()

DSL набигают! :)

Форум — Development

Всем кто сомневался в эффективности DSL посвящается :)

http://www.pcweek.ru/idea/blog/idea/470.php http://www.pcweek.ru/idea/blog/idea/477.php http://www.pcweek.ru/idea/blog/idea/2776.php

 

psv1967
()

Литература по ФП и годные языки

Форум — Development

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

 ,

aptyp
()

Принципиальный вопрос о многопоточности, кешах ЦП.

Форум — Development

1. Что конкретно имеют ввиду под высокими накладными расходами при переключении потоков? Мне кажется, 250 раз в секунду перезаписывать содержимое всех регистров - это фигня полная при современных частотах в район 2-3 Ггц. Вероятно имеется ввиду удар по кешам? Только кеши «привыкли» к текущему потоку, как надо всё забывать и переориентироваться на другой. Это главный враг?

2. Правильно я понимаю, что при наличии 4 физических ядер и 4 (или менее) активных потоках (остальные спят - редко получают управление) современный планировщик linux/windows/другое постарается оставить каждый тред на своём ядре?

3. Верно ли, что установленные 250 Гц в конфиге ядра - это можно понимать как «как минимум 250 шансов переключения контекста в секунду»? Шансов - ибо если пришло очередное прерывание таймера и пора переключаться, шедулер не будет переключать контекст если в этот момент все остальные процессы/потоки спят (ждут i/o, таймеров...). То есть один что-то активно вычисляющий поток будет получать подряд много квантов?

4. Я тут выше за кеши переживал... Но ведь когда много раз в секунду шедулер получает управление из обработчика прерывания таймера, это ведь тоже переключение контекста (из текущей задачи в код обработчика таймера). Это ведь наверное тоже бьёт кешам по мозгам или как?

Все эти вопросы связаны вот с чем.

У меня есть 50 очередей из 100млн заданий и 4 ядра. Я могу запустить 50 потоков на каждую очередь, либо запустить 4 потока и давать им пачки заданий. Второй случай выглядит (интуитивно) лучше - меньше переключений между тяжёлыми потоками, каждый работает на своём ядре, кеш и конвееры не сбиваются. При 50 потоках, будет больше смен контекста в смысле смен состояний кеша и конвееров и прочих подобных вещей (извините, слабо понимаю все тонкости пока).

kiverattes
()

C vs. JVM's benchmark

Новости — Java
Группа Java

Стэфан Краузе в своём блоге
http://www.stefankrause.net/
опубликовал новые тесты производительности кода, написанного на C и на Java.

В тесте используются компилятор GCC 4.2.3 и различные версии JVM (Sun JDK 6, IBM JDK 6, Excelsior JET, Apache Harmony, BEA JRockit).

Тесты проводились на ноутбуке Dell Insprion 9400 с 2GB RAM и процессором Intel Core 2 2GHz под Ubuntu 8.04 (x86). Исходные коды прилагаются.

>>> Подробности

 , ,

iZEN
()