태그 보관물: programming-languages

programming-languages

직관적 인 동시 프로그래밍 추상화 기능이있는 최신 프로그래밍 언어 언어에 집중하고 싶습니다. IMHO 내 생산성이 떨어지고 프로그래밍

시스템 프로그래밍이 아닌 응용 프로그램 / 사용자 수준에 중점을 둔 동시 프로그래밍 학습에 관심이 있습니다. 동시 응용 프로그램 작성을위한 직관적 인 추상화를 제공하는 현대적인 고급 프로그래밍 언어를 찾고 있습니다. 생산성을 높이고 동시 프로그래밍의 복잡성을 숨기는 언어에 집중하고 싶습니다.

IMHO 내 생산성이 떨어지고 프로그래밍 모델이 직관적이지 않기 때문에 C, C ++ 또는 Java로 멀티 스레드 코드를 작성하는 좋은 옵션은 고려하지 않습니다. 반면, 생산성을 높이고 Python 및 멀티 프로세싱 모듈, Erlang, Clojure, Scala 등과 같은보다 직관적 인 추상화를 제공하는 언어는 좋은 옵션입니다.

경험을 바탕으로 무엇을 추천 하시겠습니까?

편집 : 당신의 흥미로운 답변을 주셔서 감사합니다. Erlang, Clojure, Scala, Groovy 및 Haskell과 같은 많은 좋은 후보자가 있기 때문에 실제로 시도하지 않고 결론을 내리는 것은 어렵습니다. 나는 가장 설득력있는 주장으로 답에 투표했지만, 어느 쪽을 고를 지 결정하기 전에 모든 좋은 후보자를 시험해 보겠다. 🙂



답변

클로저 는 거의 확실하게 봐야합니다 . 제 생각에는 멀티 코어 프로그래밍을위한 가장 현대적인 언어이며 매우 생산적입니다.

주요 속성 :

  • 그것은 기능적 언어 이며, 동시성 및 더 높은 수준의 추상화를 사용하여 개발할 수있는 능력에 도움이됩니다. 그것은 완전히 불변의 영구 데이터 구조와 게으른 시퀀스를 특징으로하며 Haskell과 같은 기능적 언어에 경험이있는 모든 사람에게 친숙합니다.
  • 가변 상태에 대한 잠금없는 동시 액세스를위한 매우 새로운 소프트웨어 트랜잭션 메모리 시스템 이 특징 입니다. 코드 동시성 안전을 만드는 것은 종종 (dosync ….) 블록으로 코드를 감싸는 것만 큼 간단합니다.
  • 그것은이다 리스프 매크로 기반의 메타 프로그래밍 및 코드 생성은 매우 강력합니다 -. 이는 상당한 생산성 이점을 가져올 수 있습니다 (Paul Graham의 에세이- “Beating The Averages”)
  • 그것은의 JVM 언어 – 그래서뿐만 아니라 당신이 자바 생태계의 라이브러리와 도구의 거대한 배열에 대한 액세스 권한을 얻을 수 있습니까, 당신은 또한 JVM 동시 서버 측 응용 프로그램을위한 효과적인 플랫폼을 만들기로 간 거대한 엔지니어링 노력 혜택을 누릴 수 있습니다. 실용적인 목적으로, 이러한 기초가없는 언어에 비해 큰 이점이 있습니다.
  • 그것은의 동적 – 아주 간결한 코드의 결과와 생산성의 많은. 그러나 필요한 경우 성능을 위해 선택적 정적 유형 힌트를 사용할 수 있습니다.
  • 이 언어는 설명하기 어려운 추상화중심 으로 설계 되었지만 실제 효과는 문제를 해결하기 위해 결합 할 수있는 상대적으로 직교하는 기능 세트를 얻는 것입니다. 예를 들어, 시퀀스 추상화는 모든 “순차적”유형의 객체 (목록, 문자열, Java 배열, 무한 지연 시퀀스, 파일에서 읽은 행 등)를 처리하는 코드를 작성할 수있게합니다.
  • 도움이되고 통찰력이 있지만 가장 실용적으로 는 훌륭한 커뮤니티 가 있습니다 . Clojure의 초점은 일반적으로 “일을하는 것”에 있습니다.

동시성 경사가있는 일부 미니 코드 샘플 :

;; define and launch a future to execute do-something in another thread
(def a (future (do-something)))

;; wait for the future to finish and print its return value
(println @a)

;; call two functions protected in a single STM transaction
(dosync
  (function-one)
  (function-two))

특히 다음 동영상 중 하나 이상을 시청할 가치가 있습니다.


답변

당신은 D를 시도 할 수 있습니다. 그것은 세 가지 모델을 제공합니다. 나는 첫 번째 또는 두 번째를 권장합니다.

  1. std.concurrency . 모든 동시성 요구에이 모듈을 사용하는 경우 언어와 표준 라이브러리의 조합으로 스레드 간 격리가 시행됩니다. 스레드는 주로 메시지 전달을 통해 통신하며, “안전 우선”을 선호하고 낮은 수준의 데이터 레이스를 허용하지 않는 방식으로 공유 메모리에 대한 제한적인 지원을 제공합니다. 불행하게도 std.concurrency의 문서는 개선이 필요하지만, 모델은 Andrei Alexandrescu의 저서 “The D Programming Language”의 무료 장에 문서화되어 있습니다.

  2. 표준 병렬화 . 이 모듈은 일반적인 동시성이 아닌 멀티 코어 병렬 처리를 위해 특별히 설계되었습니다. ( 동시성 병렬 처리를 구현하기 위해 필요하지만 동시성과 병렬 처리는 같은 것이 아니다. ) 병렬 처리의 요점 성능이기 때문에 그들이 어려운 효율적인 병렬 코드를 작성하기 때문에, std.parallelism 어떤 분리 보증을하지 않습니다. 그러나 오류가 발생하기 쉬운 낮은 수준의 세부 정보를 많이 추상화하므로 수동으로 확인한 작업을 서로 독립적으로 수행하는 작업을 병렬화하는 경우 문제를 해결하기가 매우 어렵습니다.

  3. core.thread 는 OS 별 스레딩 API에 대한 저수준 래퍼입니다. std.concurrency와 std.parallelism 모두 후드에서 사용하지만, 자신의 동시성 라이브러리를 작성하거나 std.parallelism 또는 std에서 잘 수행 할 수없는 어리석은 코너 케이스를 찾는 경우에만 사용하는 것이 좋습니다. 동시성 어느 누구도 일상 업무에이 저수준의 것을 사용해서는 안됩니다.


답변

Erlang은 확실히 훌륭한 옵션이지만 조금 더 실용적인 것은 Google의 새로운 언어 인 Go 입니다.

다른 일반적인 언어와는 거리가 멀기 때문에 이미 다른 ‘쉬운’언어를 알고 있다면 쉽게 얻을 수 있습니다. 많은 사람들이 프로그래밍하기에 ‘편안한’면에서 파이썬이나 루아와 비교합니다.


답변

Microsoft의 .net 용 병렬 프로그래밍을 살펴보십시오 . 매우 직관적입니다.

많은 개인용 컴퓨터와 워크 스테이션에는 여러 스레드를 동시에 실행할 수있는 2 개 또는 4 개의 코어 (CPU)가 있습니다. 가까운 장래의 컴퓨터에는 훨씬 더 많은 코어가있을 것으로 예상됩니다. 현재와 ​​미래의 하드웨어를 활용하기 위해 코드를 병렬화하여 여러 프로세서에 작업을 분산시킬 수 있습니다. 과거에는 병렬화를 위해 스레드 및 잠금에 대한 저수준 조작이 필요했습니다. Visual Studio 2010 및 .NET Framework 4는 새로운 런타임, 새로운 클래스 라이브러리 유형 및 새로운 진단 도구를 제공하여 병렬 프로그래밍에 대한 지원을 향상시킵니다. 이러한 기능은 병렬 개발을 단순화하여 스레드 또는 스레드 풀과 직접 작업하지 않고도 자연 관용구에서 효율적이고 세분화되고 확장 가능한 병렬 코드를 작성할 수 있습니다.
http://i.msdn.microsoft.com/dynimg/IC292903.png


답변

Erlang과 Scala는 모두 배우 기반의 동시성 을 가지고있어 매우 직관적이고 배우기 쉽습니다.

컴퓨터 과학의 액터 모델은 “액터”를 동시 디지털 계산의 보편적 기본 요소로 취급하는 수학적 동시 계산의 수학적 모델입니다. 수신 한 메시지에 대한 응답으로, 액터는 로컬 결정을 내리고 더 많은 액터를 생성하며 더 많은 메시지를 보낼 수 있습니다. 수신 된 다음 메시지에 응답하는 방법을 결정합니다. 이는 계산에 대한 이론적 이해를위한 프레임 워크와 동시 시스템의 여러 실제 구현 을 위한 이론적 기초로 사용되었습니다 .


답변

나는 지금 Haskell에 대해 배우고 있으며, 이 논문 을 읽음으로써 Haskell이 동시 프로그래밍을위한 좋은 옵션임을 확신하게되었습니다. 순전히 기능적 (유형 시스템은 함수가 전역 상태의 입력, 출력 또는 읽기 / 수정을 수행하는지 여부를 알고 있음)이기 때문에 트랜잭션과 유사하게 작동하는 소프트웨어 트랜잭션 메모리 (위의 논문에서 매우 훌륭하게 요약 됨)와 같은 작업을 수행 할 수 있습니다 데이터베이스에서-당신은 약간의 여분의 설탕만으로 원자 성과 같은 멋진 것들을 많이 얻습니다. AFAIK, Haskell 스레드는 매우 가볍습니다. 이러한 것 외에도 Haskell이 완전히 작동한다는 사실만으로도 간단한 작업을 단일 키워드 (par) 이상으로 병렬로 실행할 수 있습니다. 출처


답변

Google의 GO 언어에는 동시성을위한 몇 가지 흥미로운 도구가 있습니다. 참조 : http://golang.org/doc/effective_go.html#concurrency을 하고 예제를 조금 아래로 읽습니다.

동시 프로그래밍은 큰 주제이며 여기에는 일부 Go 관련 하이라이트에만 필요한 공간이 있습니다.

많은 환경에서 동시 프로그래밍은 공유 변수에 대한 올바른 액세스를 구현하는 데 필요한 미묘함으로 인해 어렵습니다. Go는 공유 값이 채널에서 전달되고 실제로는 별도의 실행 스레드에서 적극적으로 공유하지 않는 다른 접근 방식을 권장합니다. 한 번에 하나의 고 루틴 만 값에 액세스 할 수 있습니다. 의도적으로 데이터 경쟁이 발생할 수 없습니다. 이러한 사고 방식을 장려하기 위해 슬로건으로 줄였습니다.

메모리를 공유하여 통신하지 마십시오. 대신, 통신하여 메모리를 공유하십시오.

이 접근법은 너무 멀리 갈 수 있습니다. 참조 카운트는 예를 들어 정수 변수 주위에 뮤텍스를 두는 것이 가장 좋습니다. 그러나 고급 접근 방식으로 채널을 사용하여 액세스를 제어하면 명확하고 정확한 프로그램을보다 쉽게 ​​작성할 수 있습니다.

이 모델을 생각하는 한 가지 방법은 하나의 CPU에서 실행되는 일반적인 단일 스레드 프로그램을 고려하는 것입니다. 동기화 프리미티브가 필요하지 않습니다. 이제 다른 인스턴스를 실행하십시오. 또한 동기화가 필요하지 않습니다. 이제 그 두 사람이 의사 소통을하도록하십시오. 통신이 동기화 프로그램 인 경우에는 여전히 다른 동기화가 필요하지 않습니다. 예를 들어 유닉스 파이프 라인은이 모델에 완벽하게 맞습니다. Goare의 동시성 접근 방식은 Hoare의 CSP (Communicating Sequential Processes)에서 비롯되었지만 유닉스 파이프의 형식 안전 일반화로도 볼 수 있습니다 …