Android OS에서 Haskell 프로그램 실행
주의사항:/r/haskell에서 시작된 스레드의 확장입니다.
사실부터 시작해 보겠습니다.
- Android는 하나의 멋진 운영 체제입니다.
- 해스켈은 지구상에서 최고의 프로그래밍 언어입니다.
따라서, 분명히, 그것들을 결합하는 것은 안드로이드 개발을 훨씬 더 좋게 만들 것입니다.그래서 기본적으로 안드로이드 OS용으로 해스켈 프로그램을 작성하는 방법을 알고 싶습니다.제 질문은:
안드로이드 OS에서 해스켈 프로그램을 실행/실행하려면 어떻게 해야 합니까?
당신이 그것을 하는 방법은 먼저 ARM 아키텍처를 위한 GCC 포트와 함께 제공되는 안드로이드 NDK로 C를 타겟으로 할 수 있는 Haskell 컴파일러를 얻는 것입니다.JHC는 플랫폼(단어 크기, c-compiler 등)을 설명하는 매우 작은 inf 스타일 파일로 이것을 사소한 것으로 할 수 있습니다. 저는 Wii 홈브루 개발 키트로 이것을 해봤는데 꽤 쉬웠습니다.하지만 jhc는 여전히 IO가 있는 monad transformer stack을 사용하는 등 복잡한 코드와 관련하여 안정성 문제가 있지만 지난 6개월 동안 jhc는 많이 개선되었습니다.JHC에서 일하는 사람은 단 한 명뿐입니다. 더 많은 사람들이 그를 도울 수 있기를 바랄 뿐입니다.
다른 옵션은 ndkgcc를 대상으로 하는 GHC의 "미등록" 포트를 구축하는 것입니다. 현재 GHC는 진정한 크로스 컴파일러가 아니며 빌드 시스템에서 어떤 부분을 변경해야 하는지 이해해야 하기 때문에 훨씬 더 복잡한 프로세스입니다.또 다른 옵션은 C와 교차 컴파일할 수 있는 NHC입니다. C 컴파일러를 대상으로 NHC를 구축하는 데 필요한 GHC처럼 NHC에는 GHC와 같은 해스켈 확장자가 많지 않습니다.
NDK GCC를 대상으로 하는 해스켈 컴파일러를 사용하면 안드로이드 NDK JNI 글루 코드 프레임워크(안드로이드 2.3 이후 추가됨)에 바인딩을 작성하거나 Java-C-Haskell 간에 JNI 글루 코드를 작성해야 합니다. 전자 옵션이 더 쉬운 솔루션이며 제가 기억하기에 정확하게 이전 버전의 An과 역호환할 수 있습니다.2.3 이하의 드로이드.
일단 이것을 가지고 있다면, 당신은 NDK 자바 글루 코드(그 자체가 공유 라이브러리)에 연결되는 공유 라이브러리 또는 정적 라이브러리로 Haskell 코드를 빌드해야 합니다.안드로이드에서 기본 실행 파일을 공식적으로 실행할 수 없는 것으로 알고 있습니다.당신은 아마도 루티드 폰으로 그것을 할 수 있을 것이다, 그래서 나는 이것이 NDK gcc 포트가 네이티브 실행 파일을 생성할 수 있더라도 앱 스토어에서 네이티브 실행 파일을 배포할 수 없다는 것을 의미한다고 생각합니다.NDK JNI를 LLVM과 함께 사용할 수 없는 경우 LLVM을 사용하는 옵션이 사라집니다.
가장 큰 장애물은 안드로이드용 하스켈 컴파일러를 얻는 것이 아니라 (아직도 큰 장애물인) 가장 큰 문제는 누군가 NDK 라이브러리를 위한 바인딩 API를 작성해야 한다는 것입니다. 이 작업은 엄청난 작업이며 안드로이드 SDK의 이 부분에 대한 NDK API가 없기 때문에 안드로이드 UI 코드를 작성해야 하는 경우 상황이 더 심각합니다.만약 당신이 하스켈에서 안드로이드 UI 코드를 하고 싶다면 누군가가 JNI/C를 통해 자바에 하스켈 바인딩을 작성해야 할 것입니다.바인딩 라이브러리를 작성하는 데 있어 더 자동화된 프로세스가 없는 한(일부는 알고 있지만 저에게는 충분히 자동화되지 않았습니다) 누군가가 이 프로세스를 수행할 가능성은 매우 낮습니다.
L01man: 이것을 하는 방법에 대한 튜토리얼이 있나요?우선 JHC를 다운받아야 하는 것으로 알고 있습니다.inf 파일에 무엇을 적어야 하며 어떻게 사용해야 합니까?
제가 이 질문에 대답하기 전에 저는 원래 이것을 쓴 이후로 꽤 오랫동안 jhc를 사용하지 않았고 그 이후로 새로운 버전이 출시되었기 때문에 더 복잡한 Haskell 프로그램의 코드 생성과 관련하여 현재 jhc가 얼마나 안정적인지 모르겠습니다.이것은 JHC로 대규모 해스켈 프로그램을 만드는 것을 고려하기 전에 누군가에게 경고하는 것입니다. 당신은 완전하게 하기 전에 몇 가지 작은 테스트를 해야 합니다.
jhc에는 매뉴얼 http://repetae.net/computer/jhc/manual.html 과 교차 컴파일 및 .ini 파일 설정 섹션이 있으며 옵션은 http://repetae.net/computer/jhc/manual.html#crosscompilation 입니다.
L01man: 두 번째 부분은 첫 번째 부분에 대한 대안입니다.당신이 세 번째에서 말한 것을 어떻게 해야 할지 모르겠습니다.
시작하기 전에 C에 대해 어느 정도 알고 Haskell FFI(Foreign Function Interface)와 hs2c와 같은 도구를 사용하는 데 익숙해야 합니다.또한 Android NDK를 사용하고 공유 라이브러리로 .apk를 구축하는 데 익숙해야 합니다.C-Haskell, Java/C-Haskell 간의 인터페이스를 제공하고 시장에서 공식적으로 배포/판매할 수 있는 Android용 Haskell 프로그램을 개발하려면 이러한 사항을 숙지해야 합니다.
L01man: 안드로이드 API를 위한 바인딩을 만드는 것이 목표라는 것을 알고 있습니다.그렇지만.....4번째 부분은 우리가 Haskell로 .apk를 만들 수 없다고 합니까?
.apk는 앱 패키지 파일 형식일 뿐이며 Android SDK(NDK가 아님)와 함께 제공되는 도구로 빌드되므로 바이너리 자체를 빌드하는 것과는 거의 관련이 없습니다.Android 패키지에는 기본 공유 라이브러리가 포함될 수 있으며, 이는 Haskell 프로그램이 될 것이며 Android NDK를 통해 기본 공유/정적 라이브러리가 생성됩니다.
최근에 제가 주목한 언어는 에타입니다.
Eta의 컴파일러는 JVM 백엔드를 가진 GHC 7.10의 포크입니다.생성된 JAR 파일을 사용하여 Android 앱을 작성하고 외부 함수 인터페이스를 사용하여 기본 Android Java 라이브러리를 호출할 수도 있습니다.
Brian McKenna는 Eta 라이브러리를 사용하도록 Android Studio 프로젝트를 구성하는 방법에 대한 블로그 게시물을 작성했습니다.
https://github.com/neurocyte/android-haskell-activity 에서 다음을 시연하고 있습니다.Haskell
코드 실행 중
한 번은 같은 레딧 스레드를 우연히 발견했지만, 오래되어 댓글이 닫혔습니다.OP에게 메시지를 보냈지만, 수신자에게 전달되었는지 확실하지 않습니다.여기서 제 제안은 (원어민 활동이 불가능했던 오래된 Android에서 효과가 있을 수 있습니다.)
저는 (얼마 전 Haskell에서 개발되었으나 현재 Smalltalk로 전환됨) 현재 Squak VM에서 Android로 포트를 개발하고 있습니다.제가 이 작업을 수행하는 방법은 Haskell-on-Android 프로젝트에서 처리할 수 있는 것과 유사합니다. 애플리케이션의 Java 부분에서 호출해야 하는 C 코드 덩어리(기본적으로 안드로이드에서 수행할 수 있는 모든 것은 다양한 이벤트를 처리하는 것입니다. 애플리케이션은 이벤트 자체에 대해 폴링할 수 없으며 이벤트 루프가 없습니다.저의 경우 스퀵 VM 빌드 도구에 의해 코드가 생성되고, 안드로이드에서 하스켈의 경우 JHC의 GHC 또는 사용된 프론트 엔드에서 이 코드가 출력됩니다.이 보고서는 다음과 같이 살펴볼 가치가 있습니다.
http://gitorious.org/ ~golubovsky/golubovsky/dmg-message/master/master/message/project
"src" 아래에는 사용자 이벤트 가로채기 및 네이티브 코드로 전송을 제공하는 Java 코드가 있습니다(CogView 클래스 참조).VM 자체의 C 코드가 완전히 존재하는 것은 아니지만(자세한 내용은 Cog 분기인 squeakvm.org 참조) 아이디어를 얻을 수도 있습니다.또한 http://gitorious.org/ ~golubovsky/golubovsky/dmg-messages/master/master/messages/messages/messages/vm 아래에서 인터프리터의 C 프런트엔드를 확인할 수 있습니다(사용자 이벤트 처리, 일부 시간 기록 등 포함).
이게 도움이 되길 바랍니다.
드미트리
HUGS Hasskell에서 Android로 통역하는 포트인 https://github.com/conscell/hugs-android 이 있습니다.
특수하게 컴파일된 공유 객체를 로드하는 것이 약간 둔감한 것처럼 보이기 때문에 일반적인 답변은 source->source 변환에서 나와야 한다고 생각합니다(위 답변에서 ghc->c 및 c->java 단계 포함).따라서 이 질문은 (자바 중간 표현으로서 한 단계로) 시도되고 자세히 논의된 JVM의 Haskell 제목에 해당합니다.당신이 필요로 하는 라이브러리들이 그곳에서 컴파일된다면 당신은 frege를 사용할 수 있습니다.남은 유일한 단계는 IO() 작업으로 변환된 Android 프레임워크 API의 시작이며 매니페스트 xml 및 pk를 구축하기 위한 래퍼일 수 있습니다.
언급URL : https://stackoverflow.com/questions/5151858/running-a-haskell-program-on-the-android-os
'programing' 카테고리의 다른 글
빠른 확장 예제 (0) | 2023.08.22 |
---|---|
필드가 uft8mb4_general_ci로 설정된 경우 "Source character set not supported by client" 오류가 발생함 (0) | 2023.08.22 |
AES_ENCRIPT를 사용하는 mariadbddl을 jooq로 변환하려면 어떻게 해야 합니까? (0) | 2023.08.22 |
대형 HTML 표 인쇄 시 페이지 구분 처리 방법 (0) | 2023.08.22 |
MySQL LIMIT는 ORDER BY 이전 또는 이후에 적용됩니까? (0) | 2023.08.22 |