2016-06-24 1 views
4

QR 코드 읽기 라이브러리를 작성한다고 가정 해 보겠습니다. 다음과 같은 단일 함수입니다.휴대용 알고리즘을 작성하기 위해 고안된 언어가 있습니까?

function Decode(pixels: []byte, int width, int height) -> []byte 

그것은 이미지를 취하고 많은 내부 작업을 수행하며 QR 코드의 내용을 생성합니다.

이 어떤 있습니까 웹 (JS), 안드로이드 (자바), 아이폰 OS (스위프트), 윈도우 등 (C++/C#을) -

나는이 알고리즘은 서로 다른 플랫폼의 많은에 기본적으로 쉽게 사용할 수 있도록하려면 이 작업에 특히 적합한 언어를 사용하고 작은 언어로 많은 출력물을 생성하는 코드를 쉽게 편집 할 수 있습니까?

내가 생각할 수있는 단 하나는 Haxe이지만, 고정 된 크기의 정수는없고 doesn't seem very suitable입니다. 나는 (가능한 경우) 깨끗한 코드를 생성하는보다 제한적인 언어를 찾고있다.

+2

중요한 요구 사항을 과소 평가하면 안됩니다. 데이터 구조도 필요합니다. 이러한 구조의 이식성은 달성하기가 더 어려울 수 있습니다. 내가 아는 한 자동 코드 생성기는 "작은 깨끗한 출력"을 거의 생성하지 않습니다. –

+0

아무 것도 아니고, 다른 누군가의 사전 제작 된 라이브러리를 사용하십시오. – YOU

+0

데이터 구조에 대한 좋은 지적이지만, 간단한리스트가 대부분의 언어 (JS에서는'Array', C++에서는'vector <>'등)로 쉽게 변환 될 수 있다고 생각합니다. 지도/사전과 동일합니다. 바둑은 그걸로 도착합니다. – Timmmm

답변

4

최고의 성능을 얻으려면 C로 코드를 작성하면됩니다. 그런 다음 SWIG를 사용하여 라이브러리를 다른 언어로 기본적으로 바인딩하거나 대상 플랫폼 (예 : asm.js)에서 크로스 컴파일하여 javascript 코드를 얻습니다. 매우 복잡한 데이터 구조가 없기 때문에 앞뒤로 전달되거나 OS 기능을 호출해야하기 때문에 쉬운 사례입니다. 또한 휴대 성을 위해 ISO 표준을 최대한 준수하십시오.

다른 언어로 같은 트릭을 할 수 있지만, 내가 아는 한 C가 통합하기 가장 쉬운 방법입니다 (즉, C에서 Java 함수를 호출하려는 경우 전체 VM을 시작해야 함) . 그들은 정수 형식의 크기를

은 상당히 잘 C.

서로 다른 환경에서 원활하게 작동에는 바이너리 형식이 없습니다

설립된다.

+0

저는 C와 FFI를 사용하는 번거 로움을 피하고 싶습니다.내가 깔끔하게 여러 대상 언어로 컴파일 제한 알고리즘 DSL 싶습니다. – Timmmm

+0

@Timmmm SWIG를 확인하십시오! 간단한 인터페이스의 경우에는 대부분의 경우 상자에서 작동하므로 낮은 수준의 언어 관련 API 및 기타 사항을 처리해야합니다. 런타임시 바이너리 라이브러리를로드 할 수있는 모든 언어에서 작동합니다 (javascript 제외). – Sorin

+0

마치 FFI 번거 로움을 줄여주는 것처럼 보입니다. 나는 transpiling하여 그것을 완전히 제거하고 싶다. – Timmmm

0
  1. 많은 요즘 (거대한) 응용 프로그램은 DLL/OBJs를 사용합니다.

    이것은 이상적입니다 (이 접근법이 싫지만). 다중 실행 그룹 협력에 이상적인 기본 실행 파일을 다시 컴파일하지 않고도 모듈 버전을 변경할 수 있습니다. 그러나 또한 예를 들어

    내가 컨설팅이었다 한 번 ... 등의 미스 매칭 버전 호환성 문제, 큰 로딩 시간 같은 오래된 거대한 프로젝트도 함부로/미친 거대한 DLL/lib 디렉토리 중첩 많은 다른 문제를 불러옵니다 프린터 펌웨어 문제 (10 년 전) 및 펌웨어가 300+ MByte !!! C++/Asm 코드는 주로 미친 것으로 인해 지난 몇 년 동안 중첩 및 매우 가난한 관리를 포함합니다. 컴파일 시간은

  2. 는 JAVA와 같은 "크로스 플랫폼"언어 거기

    하지만 경우가 있습니다 ... 하나의 ARM의 MCU플래시 주변에 15~30분했다 ... 응용 프로그램이 제대로 작성되지 않으면 제대로 작동하지 않습니다. JAVA 기반 게임을 다른 플랫폼 (또는 다른 종류의 휴대폰)에서 전화로 실행하려고 시도 했습니까? 대부분의 경우 속도는 잊어 버릴 수 있습니다 ...

  3. C++

    나는 C++뿐만 아니라 때문에 속도 갈 것이며, 더 후 10 년 내 기본 프로그래밍 언어이지만 모든 플랫폼 때문에 내가의 컴파일러 또는 크로스 컴파일러가 알고

    그것을 위해.

    또 다른 플랫폼간에 사용할 수 있도록 코드를 올바르게 작성해야합니다. 재미있는 것을 사용하거나 정의되지 않은 동작을 이용하지 마십시오.

    개별 애플리케이션 층으로 :

    • 로직 (모든 플랫폼 같은)
    • OSIO 관련된 물건 (플랫폼에서 다르다)
    • GFX (달라질 수 플랫폼별로 다르지만 대부분 지원되는 OpenGL을 사용할 수 있습니다.

    그리고 플랫폼에 대한종속 물건을 사용하는 문은 같은 :

    #define _target_windows 
    
    #ifdef _target_windows 
    //... do your stuff ... 
    #endif 
    
    #ifdef _target_linux 
    //... do your stuff ... 
    #endif 
    
    #ifdef _target_ios 
    //... do your stuff ... 
    #endif 
    

    은 동일한 소스 코드를 다른 플랫폼에서 컴파일을 관리 할 수 ​​있습니다. 당신이 그 (것)들에게

0

이러한 다중 백엔드 언어가 존재 자기를 정의 할 필요가 없습니다 C++ 컴파일러는 일반적으로 ... 실제 플랫폼 OS 및 컴파일러도 버전을 특정 토큰을 정의합니다. 처음으로 내 마음을 넘어 한 노력은 Fantom입니다. JVM, CLR 및 JS 백엔드가 있습니다. 다음은 list with some other candidates입니다.

나는 심각한 프로젝트를 위해이 언어들을 고려하지 않을 것이다.

한 가지 가능한 해결책은 JS (또는 TypeScript 또는 PureScript와 같은 JS로 컴파일되는 언어 중 하나)를 사용하는 것입니다. JS는 JVM 및 .NET을 포함한 대부분의 플랫폼에서 사용할 수 있습니다. 성능 및 생산성 측면에서 비용이 발생할 수 있습니다.

+0

좋은 목록! 나는 그것이 내가 찾고있는 것이라고 생각하지 않는다. 좀 더 깨끗한 코드를 생성하는보다 제한적인 DSL을 원한다. – Timmmm

+0

흠, 나는 네가 DSL에 더 많은 것을 깨닫지 못했다. –

0

Cryptol은 암호화 알고리즘을 지정하는 DSL입니다. 물론 더 일반적인 알고리즘을 지정할 수도 있습니다 (예 : 포함 된 스도쿠 솔버).

좀 더 일반적인 목적의 언어를 언급 한 나의 이전 대답보다 당신이 찾고있는 것에 더 가깝게 보인다. 그러나 Cryptol을 좋아한다면, 당신이 찾고있는 백엔드를 구현하기 위해 슬리브를 롤업해야 할 것입니다.

관련 문제