참고 : 이것은 / r / haskell 에서 시작된 스레드의 확장입니다.
사실부터 시작하자 :
- 안드로이드는 하나의 멋진 운영 체제입니다
- 하스켈은 지구상에서 최고의 프로그래밍 언어입니다
따라서 분명히 그것들을 결합하면 안드로이드 개발이 훨씬 나아질 것입니다. 따라서 본질적으로 안드로이드 OS 용 Haskell 프로그램을 작성하는 방법을 알고 싶습니다. 내 질문은 :
Android OS에서 Haskell 프로그램을 실행 / 실행하려면 어떻게해야합니까?
답변
이를 수행하는 방법은 먼저 ARM 아키텍처 용 GCC 포트와 함께 제공되는 Android NDK로 C를 대상으로 할 수있는 Haskell 컴파일러를 얻는 것입니다. JHC는 Wii homebrew dev 키 트로이 작업을 수행 한 플랫폼 (단어 크기, c 컴파일러 등)을 설명하는 매우 작은 inf 스타일 파일로 간단 하게이 작업을 수행 할 수 있으며 매우 쉽습니다. 그러나 jhc는 여전히 IO와 함께 모나드 변압기 스택을 사용하는 것과 같은 복잡한 코드의 안정성 문제가 있지만 지난 6 개월 동안 jhc가 많이 개선되었습니다. JHC에서 일하는 사람은 한 명뿐입니다. 더 많은 사람들이 그를 도울 수 있기를 바랍니다.
다른 옵션은 ndk gcc를 대상으로하는 “등록되지 않은”GHC 포트를 구축하는 것입니다. 이는 GHC가 현재 진정한 크로스 컴파일러가 아니기 때문에 필요한 부분이 무엇인지 빌드 시스템을 이해해야하기 때문에 훨씬 더 복잡한 프로세스입니다. 변화. 또 다른 옵션은 C로 크로스 컴파일 할 수있는 NHC입니다 .GHC와 같이 C 컴파일러를 대상으로 nhc를 빌드해야하며 NHC에는 GHC와 같은 많은 Haskell 확장이 없습니다.
NDK GCC를 대상으로하는 Haskell 컴파일러가 있으면 Android NDK JNI 글루 코드 프레임 워크 (Android 2.3 이후에 추가됨)에 바인딩을 작성하거나 Java-C-Haskell간에 JNI 글루 코드를 작성해야합니다. 이전 옵션이 더 쉽습니다. 솔루션을 기억하고 올바르게 기억한다면 2.3 이전 버전의 Android와 호환됩니다.
일단 이것을 가지고 나면 Haskell 코드를 공유 라이브러리 또는 NDK Java 글루 코드 (그 자체가 공유 라이브러리 임)에 링크되는 정적 라이브러리로 빌드해야합니다. 내가 아는 한 공식적으로 안드로이드에서 네이티브 실행 파일을 실행할 수는 없습니다. 아마도 루팅 된 전화로 할 수 있으므로 NDK gcc 포트가 기본 실행 파일을 올바르게 생성 할 수있는 경우에도 앱 스토어에서 기본 실행 파일을 배포 할 수 없다고 가정합니다. 또한 LLK로 NDK JNI를 사용할 수 없다면 LLVM을 사용하기위한 옵션이 종료 될 수 있습니다.
가장 큰 장애물은 안드로이드를위한 Haskell 컴파일러를 얻는 데 그다지 중요하지 않습니다 (아직 큰 장애물 임) 가장 큰 문제는 누군가가 NDK 라이브러리에 대한 바인딩 API를 작성해야한다는 것입니다. 안드로이드 SDK 의이 부분에 대한 NDK API가 없기 때문에 안드로이드 UI 코드를 작성해야합니다. Haskell에서 안드로이드 UI 코드를 수행하려면 누군가 JNI / C를 통해 Java에 Haskell 바인딩을 작성해야합니다. 바인딩 라이브러리를 작성하는보다 자동화 된 프로세스가 없다면 (일부는 충분하지만 자동화되지는 않습니다) 어떤 사람이 그것을 할 가능성은 매우 낮습니다.
L01man :이 작업을 수행하는 방법에 대한 자습서가 있습니까? 첫 번째 부분에서는 JHC를 다운로드해야한다는 것을 알고 있습니다. inf 파일에 무엇을 작성하고 어떻게 사용합니까?
이 질문에 대답하기 전에 원래 이것을 작성 했으므로 jhc를 꽤 오랫동안 사용하지 않았으며 최신 버전이 릴리스되었으므로 더 복잡한 Haskell 프로그램의 코드 생성과 관련하여 jhc가 현재 얼마나 안정적인지 알 수 없습니다. 이것은 JHC로 대규모 Haskell 프로그램을 만들기 전에 모든 사람에게 경고입니다.
jhc에는 http://repetae.net/computer/jhc/manual.html 매뉴얼 과 옵션이 포함 된 크로스 컴파일 및 .ini 파일 설정 섹션이 있습니다. http://repetae.net/computer/jhc/manual .html 중에서 #의 crosscompilation .
L01man : 두 번째 부분은 첫 번째 부분의 대안입니다. 세 번째로 말한 것을 어떻게해야할지 모르겠습니다.
시작하기 전에 C에 대한 지식이 있어야하며 Haskell 외부 함수 인터페이스 (FFI) 및 hs2c와 같은 도구를 사용하는 데 익숙해야합니다. 또한 Android NDK 사용 및 공유 라이브러리로 .apk 작성에 익숙해야합니다. C-Haskell, Java / C-Haskell간에 인터페이스하고 마켓 스토어에 공식적으로 배포 / 판매 할 수있는 Android 용 Haskell 프로그램을 개발하려면 이러한 정보를 알아야합니다.
L01man : Android API에 대한 바인딩을 만드는 것이 목표라는 것을 알고 있습니다. 하지만 … 4 번째 부분은 Haskell로 .apk를 만들 수 없다고합니까?
.apk는 앱 패키지 파일 형식 일 뿐이며 NDK가 아닌 Android SDK와 함께 제공되는 도구로 만들어 졌으므로 바이너리 자체를 빌드하는 작업은 거의 없습니다. 안드로이드 패키지는 네이티브 공유 라이브러리를 포함 할 수 있으며, 이것은 Haskell 프로그램이 될 것이고 네이티브 공유 / 정적 라이브러리는 안드로이드 NDK를 통해 생성됩니다.
답변
최근에 제가 주목 한 언어는 Eta 입니다.
Eta의 컴파일러는 JVM 백엔드가있는 GHC 7.10의 포크입니다. 생성 된 JAR 파일을 사용하여 Android 앱을 작성하고 외부 함수 인터페이스를 사용하여 기본 Android Java 라이브러리를 호출 할 수도 있습니다.
Brian McKenna는 Eta 라이브러리를 사용하도록 Android Studio 프로젝트를 구성하는 방법에 대한 블로그 게시물을 작성했습니다 .
답변
코드 실행을 보여주는 https://github.com/neurocyte/android-haskell-activity 가 있습니다 Haskell
.
답변
한때 같은 Reddit 스레드를 발견했지만 오래되어 주석이 닫혔습니다. OP에 메시지를 보냈지 만 수신자에게 도달했는지 확실하지 않습니다. 내 제안은 여기에 있습니다 (기본 활동이 불가능한 구형 Android에서는 작동 할 수 있음).
나는 얼마 전에 Haskell에서 개발되었지만 현재 Smalltalk로 전환되어 현재 Squeak VM 포트를 Android로 개발하고 있습니다. 내가하고있는 방법은 haskell-on-android 프로젝트에서 처리 할 수있는 것과 비슷합니다. 응용 프로그램의 Java 부분에서 호출 해야하는 C 코드 덩어리 (기본적으로 Android에서 수행 할 수있는 모든 것은 응용 프로그램은 이벤트 자체를 폴링 할 수 없으며 이벤트 루프가 없습니다. 필자의 경우 코드는 Squeak VM 구축 도구에 의해 생성되며, 안드로이드의 haskell의 경우 JHC의 GHC 또는 프런트 엔드가 사용하는 모든 것이 출력됩니다. 이 저장소는 다음을 살펴볼 가치가 있습니다.
http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/project
“src”에는 사용자 이벤트 차단을 제공하고 원시 코드로 전송하는 Java 코드가 있습니다 (CogView 클래스 참조). VM 자체의 C 코드는 완전히 존재하지는 않지만 (Sogakvm.org, Cog 브랜치 참조) 아이디어를 얻을 수 있습니다. 또한 http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/vm (통역사에 대한 C 프론트 엔드) (사용자 이벤트 처리, 일부 시간 표시 등)을 볼 수도 있습니다. )
도움이 되었기를 바랍니다.
드미트리
답변
이 https://github.com/conscell/hugs-android는 안드로이드에 포옹 하스켈 통역의 포트.
답변
특수하게 컴파일 된 공유 객체를로드하는 것은 약간의 혼란 (위의 답변에 ghc-> c 및 c-> java 단계 포함)이기 때문에 일반적인 대답은 소스-> 소스 변환에서 가져와야한다고 생각합니다. 따라서이 질문은 JVM에서 Haskell이라는 제목에 해당되는데, 이는 Java 중간 표현으로 한 단계로 시도해 왔으며 오랫동안 논의 되었습니다. 컴파일해야 할 라이브러리가 있으면 frege를 사용할 수 있습니다 . 남은 유일한 단계는 IO () 액션으로 변환 된 Android 프레임 워크 API의 시작이며 매니페스트 xml 및 apk를 빌드하기위한 래퍼 일 수 있습니다.