문제

Microsoft가 VM 실행 시간 또는 컴파일 시간에 F# 프로그램을 만들 수있을 수 있습니까?

지금은 단일 스레드 프로그램으로 구축 된 프로그램을 자동으로 구축하려는 프로그램을 시도하고 실행하려는 노력이 없다고 생각합니다.

즉, 개발자는 단일 스레드 프로그램을 코딩 할 것입니다. 그리고 컴파일러는 뮤 테스와 동기화로 완성 된 다중 스레드 프로그램을 필요로하는 컴파일 된 프로그램을 뱉어냅니다.

프로세스 스레드 수의 작업 관리자에서 이러한 최적화가 표시됩니까, 아니면 그보다 낮은 수준일까요?

도움이 되었습니까?

해결책

나는 이것이 가까운 미래에 거의 없을 것이라고 생각합니다. 그리고 그것이 발생한다면, 나는 언어 수준 (예 : f#/compiler에 특정한 것)이 아닌 IL 레벨 (어셈블리 재 작성)에서 더 가능성이 높다고 생각합니다. 그것은 흥미로운 질문이며, 나는 약간의 훌륭한 마음이 이것을보고 있었고 한동안 이것을 계속 살펴볼 것으로 기대하지만, 단기적으로는 인간이 더 쉽게 지시하는 데 초점을 맞출 것이라고 생각합니다. 프로그램의 스레딩/병렬화는 마치 마술처럼 모든 것을 일어나지 않고

(언어 기능과 같은 언어 기능 F# 비동기 워크 플로우, 그리고와 같은 라이브러리 태스크-평행 라이브러리 및 기타, 여기서 단기적 진보의 좋은 예입니다. 그들은 특히 당신의 프로그램이 필수보다 선언적 일 때 대부분의 무거운 리프팅을 할 수 있지만, 프로그래머가 여전히 옵트 인을 요구하고, 정확성/의미를 위해 분석하고, 아마도 코드 구조를 약간 변경해야합니다. 모든 것이 작동합니다.)

어쨌든, 그것은 모두 추측입니다. 미래가 무엇을 가져올 지 누가 말할 수 있습니까? 나는 알아 내기를 기대합니다 (그리고 희망적으로 그 중 일부가 일어날 수 있기를 바랍니다). :)

다른 팁

F#이 OCAML 및 OCAML 컴파일러에서 파생되면 다른 컴파일러보다 프로그램을 훨씬 더 잘 최적화 할 수 있습니다.

나는 일반적으로 사용 가능한 방식으로 코드를 자동화하는 것이 불가능하다고 생각하지 않으며 F#의 기능적 프로그래밍 측면은 본질적으로 이러한 맥락에서 관련이 없다고 생각합니다.

가장 어려운 문제는 서브 컴퓨팅을 병렬로 수행 할 수있을 때 감지하는 것이 아닙니다. 성능 저하가 발생하지 않을시기, 즉 하위 작업이 병렬 스폰의 성능 히트를 취할 가치가 있음을 계산하는 데 충분히 오래 걸리는 경우를 결정합니다.

우리는 과학 컴퓨팅의 맥락에서 이것을 자세히 연구했으며 Numerics 라이브러리를위한 F#에서 하이브리드 접근법을 채택했습니다. Microsoft의 작업 병렬 라이브러리를 기반으로 구축 된 병렬 알고리즘에는 하위 작업의 추정 계산 복잡성을 제공하는 기능인 추가 매개 변수가 필요합니다. 이를 통해 구현은 과도한 세분화를 피하고 최적의 성능을 보장 할 수 있습니다. 또한이 솔루션은 복잡성을 설명하는 기능 매개 변수가 일반적으로 익명의 일류 함수이기 때문에 F# 프로그래밍 언어에 이상적입니다.

건배, Jon Harrop.

이 질문은 .NET 아키텍처 (F#, C# 및 VB 등)의 요점을 놓치고 있다고 생각합니다. 모두 IL로 컴파일 된 다음 JIT 컴파일러를 통해 기계 코드로 컴파일됩니다. 프로그램이 기능 언어로 작성되었다는 사실은 관련이 없다. IL에서 JIT 컴파일러가 제공하는 최적화 (꼬리 재귀 등)가있는 경우 컴파일러는이를 활용해야한다.

당연히 이것은 기능 코드 작성이 관련이 없다는 것을 의미하지는 않습니다.

따라서 잠재적 병렬성을 조사하기 위해 F#에서 나오는 것으로 IL을 플래그 할 필요가 없으며 그러한 일이 바람직하지 않습니다.

다양한 언어에 대한자가 당분자화 및 자동 벡터화에 대한 적극적인 연구가 있습니다. 그리고 (F#를 정말로 좋아하기 때문에) "순수한"부작용 자유 서브 세트가 사용되었는지 여부를 확인한 다음이를 병렬화하기를 희망 할 수 있습니다. 또한 Simon Peyton-Jones 이후 Haskell의 아버지는 Microsoft에서 일하고 있습니다. 나는 환상적인 물건을 낳는 것이 어려운 시간을 보내지 않습니다.

가능하지만 가능성은 거의 없습니다. Microsoft는 대부분의 고객이 요청한 기능을 지원하고 구현하는 데 대부분의 시간을 소비합니다. 이는 일반적으로 c#, vb.net 및 c ++를 의미합니다 (반드시 그 순서대로 필요하지 않음). F#은 우선 순위 목록에서 높은 것처럼 보이지 않습니다.

Microsoft는 현재 코드의 병렬화를위한 2 개의 수단을 개발하고 있습니다 : PLINQ (Pararllel LINQ, 기능 언어에 많은 빚을지고 있음) 및 원래 Robotics Studio의 일부인 Task Parallel Library (TPL). PLINQ 베타 베타를 사용할 수 있습니다 여기.

나는 .NET 코드의 자동 평면화의 표준이 된 Plinq에 돈을 넣을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top