고급 언어로 프로토 타입을 만드는 것이 일반적입니까? [닫은]


18

나는 현재 (C)에서 실제 경험이 거의없는 언어로 현재 프로그래밍 능력을 훨씬 능가하는 프로젝트에 착수한다는 아이디어로 놀리고 있습니다. Perl / Python / Ruby / C #과 같이 친숙한 고급 언어로 프로토 타입을 제작하여 전체적인 디자인을 구현하는 것이 가치가 있습니까?

궁극적으로 최종 제품은 성능에 민감하므로 데이터베이스 엔진이므로 C를 선택하지만 C를 잘 모르면 나무의 숲을 잃게됩니다.

비슷한 질문을 검색하는 동안 프로그래머가 프롤로그에서 프로토 타입을 만들고 어셈블러에서 크랭크를 사용했다고 언급 한 한 동료가 있음을 알게되었습니다.


4
C에서 원하는 것을 먼저 코딩 한 다음 분해하고 결과 어셈블리를 수동 조정하여 어셈블러를 작성하는 사람들에 대해 들었습니다.
user16764

9
알고리즘 선택 및 구현, 난해한 병렬 문제에 대한 병렬 코드 작성 및 우수한 데이터 표현으로 성능이 더 자주 저하되는 것을 잊지 마십시오. 디자인이 올바르게 될 때까지 C에 대해 걱정하지 마십시오.
피터 스미스

1
@ user16764 : 실제로 그렇게했습니다. 언어는 포트란이었습니다. 그러나 우리는 당신이 묘사 한대로 정확하게 컴파일러 출력을 조정했습니다.
S.Lott

C가 반드시 빠를 필요는 없습니다. 특히 성능이 IO 바운드 인 경우. CPU 바인딩 성능의 경우에도 C 전문가가 아닌 경우 최적화 된 VM이 아마도 내가 작성한 것보다 성능이 뛰어납니다.
jiggy

나는 종종이 프로토 타이핑 기술을 사용하고있다 : 문제는 가장 자연스러운 언어로 표현되어 결국 DSL로 구현된다. 그런 다음 프로토 타입이 완료되면 DSL 부분을 낮은 수준의 언어로 다시 코딩하는 대신 성능이 수용 가능할 때까지이 DSL 컴파일러의 구현을 향상시킵니다.
SK- 로직

답변:


27

C를 사용해도 응용 프로그램이 자동으로 빨라지는 않습니다. 귀하의 플랫폼에 대해 다른 프로그래밍 언어를 선택할 수있는 것이 좋습니다.

빌 할란는 말했다 :

최적화 된 코드를 수정하는 것보다 올바른 코드를 최적화하는 것이 더 쉽습니다 . 조기 최적화는 실제로 장기적으로 최적화를 방해합니다. 불필요한 최적화는 설계를 왜곡하고 모듈성 및 정보 숨기기를 파괴하며 코드를 수정하기가 훨씬 어렵습니다. 잠복 버그를 찾는 데 시간이 더 걸립니다. 우리는 종종 프로파일 링이나 기계 또는 컴파일러 변경을 통해 코드의 계산 노력을 잘못 판단했음을 발견합니다. 뭔지 맞춰봐? 이제 최적화는 이전보다 훨씬 어렵습니다.

실제로 성능 문제를 예측할 수 있으면 C ++ 사용을 고려하십시오. cprogramming.com은 아주 멋지게 말합니다 .

그러나 C ++의 재사용 성을 포기하여 C의 성능을 약간 향상시킬 가치가 있는지, 특히 필요한 경우 C ++를 C 프로그래밍 스타일로 작성할 수있는 경우에는 의문의 여지가 있습니다 .


실제 질문에 더 잘 대답하려면 프로토 타입뿐만 아니라 고급 언어로 코드를 작성하고 성능 문제가 발생하면 하위 언어로만 최적화하십시오.


25
+1 : 또한 Perl, Python 및 Ruby는 C 함수를 호출 할 수 있으므로 필요한 경우 성능에 민감한 부분을 C로 작성할 수 있습니다.
Larry Coleman

머신 비전 코드를 Java로 프로토 타입했습니다. 그것은 실제로 충분히 빠르다는 것이 밝혀졌습니다. C 로의 코딩은 매우 쉬웠을 것입니다. (C와 같이 작성; 기본 고정 반 패턴을 사용하여)
Tim Williscroft

Java로 실시간 코드를 작성했습니다. 이 특정 프로젝트에서 파일 액세스는 C ++로 수행되었으며 실시간 코드는 Java로 진행되었습니다. 그러나 실시간 코드는 엄청나게 빨랐습니다. 매우 복잡하지는 않았지만 엄청난 양의 데이터를 즉시 처리했습니다. 따라서 성능에 민감한 응용 프로그램에 고급 언어를 확실히 사용할 수 있다고 말하고 싶습니다.
구성자

@Tim Williscroft : Google에서 "원시 고정 반 패턴"을 검색 할 때이 페이지 만 표시하는 것 같습니다. 그게 뭐야?
SingleNegationElimination 2

@TokenMacGuy : 원시적 강박 관념은 더 많은 히트를 가짐 (동일한 안티 패턴)
Tim Williscroft

7

a) C로 직접 번역되는 언어의 일부는 더 간단하지 않을 것입니다. 처음에 C로 작성했다면.


+1-특히 언어에 익숙하지 않으면 OO 코드를 C로 옮기기가 어렵거나 절차 적 방식으로 작성하면 고급 언어를 사용하기가 더 어려워집니다.
Jetti

예, 정확히 마법이나 설탕을 너무 많이 사용하는 것처럼 C로 쉽게 변환되지 않는 더 높은 개념을 여전히 생각하고 있을지 걱정입니다.
Mark Canlas 2016 년

4

이것은 범주적인 예 또는 대답이없는 질문이 아닙니다. 일화로 무게를 Allow 수 있습니다.

실시 예 1

Java로 작성된 게임을 Flash, AS3으로 이식하는 작업을 맡았습니다. 표면적으로는 상대적으로 부드럽게 진행될 가능성이 있습니다. 결국, 소스 게임 형태로 완전히 내장 된 기능 사양을 이미 가지고 있기 때문에 그러한 작업이 일반 클라이언트 작업보다 더 명확하다고 생각할 수 있습니다. Java 및 AS 3은 모두 고급 언어이며, AS3은 패키지 구조, 단일 상속 / 다중 인터페이스, (옵트 인) 강력한 타이핑 및 공용 / 보호 / 개인 변수 개념과 같이 Java와 공통된 많은 특성을 공유합니다. 함수 선언. 당시 나는 여전히 Java에서 매우 녹색이었고 원래 소스 코드베이스에 완전히 익숙했습니다. 그래서 나는 그것이 쉽고 빠르기를 바랄 수있는 것을보기 위해 뛰어 들었습니다.

결과적으로 코드 작성자는 Java에서 다른 정의되지 않은 다른 환경으로 이식 할 수있는 추상 엔진을 만들려고 시도했습니다. 이것은 항구로가는 것이 간단 할 것이라는 희망을주었습니다. 불행히도 내가 대신 발견 한 것은 Threads의 이점없이 Flash 자체에서 Flash 자체를 다시 발명 할 가능성을 찾고 있다는 것입니다. 문자 그대로 포트는 성능 악몽 같은 나쁜 생각이었을 것입니다. 그 외에도 게임은 자체 소스 스크립트 파일을 구현 했으므로 원래 원본 데이터 파일을 모두 사용하고 싶다면 해당 언어에 대한 파서와 어휘 분석기를 작성해야합니다.

결국, 시간과 예산 제약으로 인해 원본 소스 코드는 그다지 도움이되지 못했습니다. 게임 로직의 제어 흐름을 정확하게 모방하는 방법을 알고 있다는 점에서 가장 유용한 부분은 ...하지만 실제로 원본 소스가 필요 했습니까? 아마 아닙니다.

그러나 그 예는 상황과 반대이기 때문에 관련성이 없을 수도 있습니다. 필자는 필자가 작성하지 않은 코드베이스를 사용하려고했지만 당시에는 익숙하지 않은 환경에서 개발 속도를 높일 수있는 언어를 알지 못했습니다. 여기 다른 예가 있습니다

실시 예 2

Java 개발자가 이식 가능한 코드베이스를 만들려고했던 것에 주목하면서 Flash 작업에서 비슷한 작업을 수행했습니다. 예를 들어 flash.display. * 클래스를 확장하는 데 크게 의존하지 않는 코드 작성 컴포지션을 사용하여보기 만들기 flash.event. *에 크게 의존하지 않고 특히 언어 나 플랫폼과 관련이없는 가벼운 메시지 전달 시스템을 작성하는 것입니다. 나는 최근에 해당 프레임 워크를 사용하여 게임을 끝내고 Unity 3D 프로젝트처럼 C # (Java 및 AS3와 비슷한 언어)으로 이식하기 쉬운 지 확인하고 싶었습니다. 결과적으로 이것은 훨씬 더 성공적이었습니다! C3보다 AS3에서 더 유창하게 생각하기 때문에 이미 작성된 알고리즘을 사용하면 많은 시간이 절약됩니다. 내가해야 할 일은 단순히 구문을 변경하는 것입니다.

따라서 내 개인적인 경험으로는 대답이 항상 예 또는 아니오라고 말할 수는 없습니다. 당신이 선택한 특정 언어 관용구가 당신이 선택한 고급 언어에 얼마나 의존하고 있는지, 그리고 그것을 C에서 쉽게 만들거나 어려울 것인지를 고려해야합니다.


두 번째 이야기는 내가 어떻게 느끼는지 보여줍니다. 나는 모든 아이디어가 C로 번역 될 수 있도록 프로토 타입 구현을 일반적이고 마술 / 속임수를 자유롭게 유지하려고 노력할 것이다. 분명히 악마는 세부 사항에 있습니다.
Mark Canlas

@Mark Canlas "악마는 세부 사항에 있습니다." 물론. 언어 나 환경간에 코드를 이식 한 적이 없다면 잠재적 인 문제가 발생할 때까지 모든 잠재적 인 문제를 예측하기가 어렵 기 때문에 첫 번째 시도에서 문제가 발생할 수 있습니다.
scriptocalypse

2

나는 의사 코드로 시작하는 것이 가치가 있다고 생각합니다. 다른 언어로 프로토 타입을 작성하는 것은 시간이 낭비되는 것처럼 보입니다. 고급 언어는 의사 코드만큼이나 'C'로 번역되지 않을 것입니다.

또한 의사 코드를 사용하면 시스템이 실제로 어떻게 작동하는지 더 잘 이해할 수 있습니다.

의사 코드를 작업하는 동일한 기간 동안 C를 공부해야합니다. 그런 다음 계획을 완료 할 때 실제로 구현할 준비가 될 수 있습니다.

다른 언어로 작성하는 제안 된 이유는 디자인을 시작하는 데 도움이 되었기 때문에 대신 UML 다이어그램이나 그와 유사한 특성을 사용하여 시작할 수 있습니다.


2

확실히 "매우 높은 수준의"언어 (예 : Matlab, Ruby)를 사용하여 알고리즘을 프로토 타입 할 수 있습니다. 이 알고리즘을 사용하여 알고리즘이 작동하고 올바르게 작동하는지 확인한 다음 "낮은 수준의"언어로 처음부터 구현하십시오.

가독성 향상이 중요하지 않고 "번역"이 여전히 매우 고통스럽고 버그가 많기 때문에 C ++ 또는 Java 또는 C #을 "높은 수준"으로, C를 "낮은 수준"으로 선택하면 많은 것을 얻지 못합니다. 경향이 있습니다. 아이디어는 본질이며, 높은 수준의 구현에서 프로젝트 엔진은 한 화면 이상을 차지해서는 안되며 파악하기 쉽고 읽기 쉽고 모든주의 사항은 분명히 고통 스럽습니다. 기본적으로 작동하고 실행 가능한 블록 도표.


2

데이터베이스 엔진은 주로 저수준 I / O를 최적의 방식으로 처리하고 b- 트리 및 링크 된 목록과 같은 복잡한 구조를 효율적으로 처리하는 것입니다.

거기에는 꽤 좋은 Java 구현이 있지만 분명히 C / C ++ 문제입니다.

더 높은 수준의 언어에서는 성능이 우수한 올바른 알고리즘을 개발하는 것이 훨씬 쉽습니다. 일반적으로 여러 변형을 시도하고 결과를 비교하는 경우입니다. 그런 다음 "승리"알고리즘을 C로 변환 할 수 있습니다.

타협 솔루션은 더 높은 수준의 JVM 언어 중 하나 (Jython, Groovy가 떠오를 것)로 초기 구현을 작성한 다음 구현이 안정화되면 클래스별로 Java로 이동하는 것일 수 있습니다.


2

나는 그 공통점을 생각하지 않지만 완료됩니다. 내가 함께 일한 가장 날카로운 건축가 중 한 명이 Python에서 모델링을 한 다음 C ++로 해당 코드를 구현했습니다.

일반적으로이 가치를 높이기 위해서는 대상 언어로 쉽게 표현할 수없는 복잡하고 최적화 가능한 알고리즘을 실제로 수행해야한다고 생각합니다. 대부분의 "실제 / 비즈니스"상황에서는 대상 언어와 동일한 언어로 높은 수준의 의도를 표현하기가 상대적으로 쉽고, 해당 언어로 구현하면 성능 요구 사항을 충족하므로 더 높은 수준으로 모델링 할 필요가 없습니다. 레벨 언어.

당신이 더 높은 수준의 언어에 대해 더 잘 알고있는 상황에서, 나는이 방법론이 단기적으로 잘 작동하는 것을 볼 수있었습니다. 추적 할 수있는 로드맵을 제공 할뿐만 아니라 궁금한 점이 있으면 더 정확하게 질문 할 수 있습니다.


1

현재 저는 C "성능 때문에"(원래 동기였습니다)로 작성된 프로젝트를 진행하고 있지만 실제로 프로파일 링하면 다른 시스템 (DB, 다른 앱을 작성하는 데 많은 시간을 소비한다는 것을 알 수 있습니다) Java, 소켓의 "이벤트").

잘못된 알고리즘을 사용하면 C에서도 성능이 저하됩니다 (예 : 키에 대한 선형 검색을 수행하는 경우 "C는 테이블을 해시하지 않고 다른 라이브러리를 사용하지 않기 때문에"). 해시 테이블이 있거나 C ++, Java, C #, Python 등과 같은 유사한 언어로 수행하십시오).

어떤 이유로 든 C에서 강제로 수행 해야하는 경우 다른 언어로 프로토 타이핑하는 것은 실제 C 구현을 수행하는 "문제"를 아는 경우에만 나쁘지 않은 생각입니다. C에 대해 확신이 없다. (예를 들어 C / C std 라이브러리에는 컨테이너가없고 "일반"배열 만 있고 std가 아닌 라이브러리가 필요하다는 것을 곧 알게 될 것이다). 또한 C는 OO가 아니므로 OO 방식으로 프로토 타이핑하는 경우 더 어려워집니다.

요약하면, 가장 좋은 방법은 "프로토 타이핑"언어로 실제 구현을 수행 한 다음 실제로 필요한 경우 C로 CPU 집약적 인 함수를 작성하는 것이지만 C 만 허용되는 경우 다른 프로토 타입을 수행하기 전에 더 잘 배우십시오. 언어와 물론 구현하기 전에.


1

고급 언어로 작성된 많은 성능이 중요한 응용 프로그램이 있습니다.

나는 과거에 어셈블러와 C에서 프로그래밍했으며, 금속에 가까운 멋진 느낌이지만 오늘날에는 그 사용이 매우 제한적입니다.

성능을 방해하는 요소가 너무 많아서 언어 자체가 제한 요소 인 부분에 도달하지 못할 것입니다. 이것은 C 대 C #이라고 생각합니다.

언어별로 10 ~ 15 %의 성능 향상이 있다고 가정 해보십시오. 이것은 올바른 알고리즘을 구현하는 데있어 수십 배 증가한 것과 비교할 수 없습니다.

C #으로 프로그래밍 할 때는 알고리즘 / 데이터 구조의 아키텍처 및 구현에 집중할 수있는 시간이 훨씬 많아 져서 더 높은 수준의 최적화가 가능합니다.

실제 세계에서는 항상 시간이 제한되어 있으므로 프로젝트의 올바른 부분에서 시간을 보내십시오.


0

실제로 C로 계획을 세우는 것이 무엇인지 궁금합니다. 프로토 타입을 만들고 C를 배우고 C로 다시 코딩 하시겠습니까? 나에게 이것은 신기술을 배우는 동안 많은 프로그래머들이 붙잡힌다고 생각하는 속담 "눈보다 위보다 더 큰 것"처럼 보인다. 내 말은 결국 작성해야 할 언어의 내용을 알지 않고도 성능에 민감한 무언가를 디자인하려고한다는 것입니다. 기본적으로 C 앱 디자인을 시작하기를 원합니다. C를 배우는 데 시간이 잘 걸리면 C를 알고 원하는 응용 프로그램을 작성하는 방법에 대한 통찰력을 얻을 수 있습니다. 어쩌면 나는 질문을 착각했을 것이고 당신은 이것을 다른 프로그래머에게 넘겨서 C로 프로그램을 만들려고합니다.


때때로 "하지 마십시오." 에 대한 정답 "어떻게 X합니까이?"
Larry Coleman

0

프로토 타이핑은 때때로 해결하려는 문제를 이해하기 위해 수행됩니다. 때로는 기본 기술에 익숙하지 않은 경우 기본 기술에 대해 알아야합니다.

언급 한 경우, 파이썬과 같은 스크립팅 언어로 프로토 타입을 만들고 실제 코드를 C로 만드는 것을 고려하고 있습니다.

몇 가지 가능성 평가 :

1 . 파이썬으로 프로토 타입을 만들고 C로 소프트웨어를 작성합니다.

스크립팅 언어로 프로토 타이핑하면 입력과 비교 하여 출력 을 빠르게 확인하려는 경우 도움이됩니다 . 문제를 해결하기 위해 논리 를 주로 테스트해야하는 경우에 유용합니다 . 또한 다른 사람을 위해 데모 를 빠르게 구성하려는 경우에도 유용합니다 .

파이썬으로 작성한 코드는 최종 소프트웨어에서 사용되지 않습니다. 그러나 파이썬을 읽고 C로 쓸 수있는 사람에게 프로토 타입을 전달하는 경우 도움이 될 수 있습니다. 여기서 프로토 타이핑은 아이디어를 전달하는 데 도움이 됩니다.

이 방법은 솔루션의 논리적 실행 가능성을 테스트하는 데 적합합니다.

2 . C로 프로토 타입을 작성하고 C로 소프트웨어를 작성합니다.

새로운 C 프로토 타입 제작에는 두 가지 장점이 있습니다. 하나는 프로토 타입을 작성하는 동안 언어 , 라이브러리, API, 함정 등 의 관련 부분이해하는 것입니다 . 둘째, 최종 소프트웨어를 빌드하는 동안 프로토 타입 자체 에서 시작하여 시간을 절약하고 코드를 재사용 할 수 있습니다 .

이 방법은 솔루션의 논리적 및 기술적 타당성을 테스트하는 데 적합합니다.

. 당면한 문제에 따라 프로토 타입을 만드는 비 코딩 방법을 고려할 수 있습니다.

논리와 아이디어가 있다면 프로토 타입을 만들고 싶다. 의사 코드 , 플로우 차트블록 다이어그램종이에 도 좋습니다.

UI 프로토 타입 인 경우 UI 모형 도구 또는 종이를 고려하십시오.


0

다음과 같이 익숙한 언어로 프로토 타입을 작성해야한다고 생각합니다 (Pytho / Ruby / C #).

  1. 언어가 제공하는 시설 / 라이브러리를 최대한 활용하십시오.
  2. 언어 제한 대신 디자인 선택을 결정하는 데 시간을 보냅니다.

나중에 프로파일 링 도구를 사용하여 병목 부분을 찾을 수 있습니다. C / C ++에서 다시 구현 프로토 타입이 '충분히 빠를 것'을 알고있는 사람은 위의 단계를 몇 번 반복하십시오!


0

나는 당신이 묘사 한 접근법으로 아무것도 얻지 못한다고 생각하며, 여러 사람들이 왜 그 이유를 자세하게 설명했습니다.

제가 참여한 프로젝트 중 하나는 Cell / BE 및 Power7 아키텍처를위한 수학 라이브러리 개발과 같은 접근 방식을 사용했습니다. 함수는 Haskell (CoCoNUT 사용)에서 모델링되었으며 출력 함수는 특정 대상 아키텍처에 맞게 최적화 된 어셈블리에있었습니다.

이 경우 목표는 조정 된 조립 지침과 여러 아키텍처를 대상으로하는 기능으로 고성능이었습니다.

그러나 음식은 굶지 않기를 바랍니다. :)


0

고성능 데이터베이스 엔진의 경우 다음이 필요합니다.

  • 멀티 스레딩,
  • 명시 적 메모리 관리
  • 비동기 알림
  • 세마포어 또는 동기화 프리미티브
  • 저수준 파일 시스템 기능에 쉽게 액세스 할 수 있습니다.

선택한 알고리즘은 성능에 중요합니다.

일반적인 조언은 고급 언어로 시작한 다음 최적화가 필요한 비트 만 하위 수준 언어로 마이그레이션하는 것입니다.

그러나 선택한 고급 언어는 작성해야하는 알고리즘을 지원할 수 있어야합니다. 여기에서 효율적인 알고리즘은 스레딩 제어, 효율적인 메모리 사용 및 최고의 저수준 파일 시스템 작업 사용에 의해 결정될 수 있습니다. 유효한. 따라서 최종 목표가 성능 인 경우 사용해야하는 기본 요소를 지원하지 않는 언어로 프로토 타입을 작성할 수 없습니다.

프로토 타입을 테스트해야하거나 다른 사람들이 인터페이스를 기준으로 소프트웨어를 개발해야하는 경우 의도 한 API를 지원하는 언어로 작업해야합니다. 그런 다음 다른 사람들이 코드를 테스트하고 최적화하면서 자신의 회귀 테스트를 수행 할 수 있습니다.

이러한 고려 사항은 아마도이 경우 높은 수준의 프로토 타입을 만들기 위해 많은 언어를 배제했을 것입니다. 물론 모든 언어 (영어 포함)로 의사 코드를 작성할 수 있으며 필요한 경우 원하는 언어로 프로젝트의 일부 (예 : 정렬 기능)를 프로토 타입 할 수 있습니다.

C ++과 C 사이의 밀접한 관계 (및 무시할만한 성능 차이)는 최종 제품에서 C보다 C ++을 선호하지 않는 이유가 거의 없음을 의미합니다.

(특정 목적을 위해 고성능 데이터베이스 엔진이 필요하다는 가정에 대답하고 있습니다. 의도가 더 겸손하다면 기존 엔진을 선반에서 가져 오는 것입니다).


-2

웅장한 제품 Unix가 C로 작성 되었기 때문에 C의 명성은 충분히 가치가 있다고 생각합니다. 그러나 C를 가장 잘 아는 사람들과 비교할 때 C를 사용해야하는 이유에 대해 상당히 회의적입니다. Ken Thompson (집합 언어로 Unix의 첫 번째 버전을 작성한 후)은 Fortran에서 Unix를 작성하기 시작했지만 일주일 또는 한 달 후에 포기하고 그의 동료 Ken Ritchie가 개발 한 C를 사용하기 시작했다고합니다. 동시.

최근 포트란이 C 및 C ++보다 빠르다는 사실에 놀랐습니다.

리차드 뮬린


1
이것은 질문에 어떻게 대답합니까?
gnat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.