Code-Server x Dart avec ffi x Go x Clang

Ceci est un article du Dart Advent Calendar 2019.

Ceci est un article sur l'interface native de Dart. Apprenez à utiliser les fonctionnalités de langage Go et C avec Dart. Nous avons également préparé une image Docker afin que vous puissiez essayer l'interface native tout de suite.

Interface native: une fonctionnalité qui vous permet d'utiliser les bibliothèques de langage C

https://dart.dev/guides/libraries/c-interop

C'est une fonction qui vous permet d'utiliser une bibliothèque de langage C. Cependant, le langage C n'est pas fermé à la bibliothèque en langage C.

Les langages système tels que Go et Rust peuvent créer une bibliothèque partagée.

Vous pouvez également utiliser des fonctionnalités telles que Go et Rust dans Dart via cette bibliothèque partagée.

Très pratique: utilisation complète des fonctions du système d'exploitation

Dart est toujours à court de bibliothèques. Par conséquent, il est nécessaire d'utiliser une bibliothèque développée en langage C ou une bibliothèque développée en Go. L'interface native rend Dart plus pratique.

Environnement de développement: Nous avons préparé un environnement Docker.

Nous avons inclus un éditeur appelé Code-Server qui exécute VSCode en ligne. Par conséquent, vous pouvez démarrer le développement immédiatement en démarrant Docker.

https://github.com/kyorohiro/my-code-server/tree/master/w/dart_and_go_and_c/

https://github.com/kyorohiro/advent-2019-code-server/tree/master/extra/dart_ffi_and_go_and_c

FROM ubuntu:20.04

WORKDIR /works
# install dart
RUN apt-get update
RUN apt-get install -y wget gnupg1
RUN apt-get install apt-transport-https
RUN sh -c 'wget -qO- https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -'
RUN sh -c 'wget -qO- https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > /etc/apt/sources.list.d/dart_stable.list'
RUN apt-get update
RUN apt-get -y install dart

# install go
RUN apt-get install software-properties-common -y
#RUN add-apt-repository ppa:longsleep/golang-backports
RUN apt-get update
RUN apt-get install golang-go -y
RUN apt-get install git -y
RUN go get github.com/ramya-rao-a/go-outline
RUN go get github.com/mdempsky/gocode
RUN go get github.com/uudashr/gopkgs/cmd/gopkgs
RUN go get github.com/sqs/goreturns
RUN go get github.com/rogpeppe/godef

# install c
RUN apt-get install musl-dev -y

# code-server
RUN wget https://github.com/cdr/code-server/releases/download/2.1692-vsc1.39.2/code-server2.1692-vsc1.39.2-linux-x86_64.tar.gz
RUN tar -xzf code-server2.1692-vsc1.39.2-linux-x86_64.tar.gz -C ./ --strip-components 1


RUN /works/code-server --install-extension Dart-Code.dart-code
RUN /works/code-server --install-extension ms-vscode.go
RUN /works/code-server --install-extension ms-vscode.cpptools

WORKDIR /app
ENV PATH=${PATH}:/lib/dart/bin
ENV PATH="${PATH}:/root/.pub-cache/bin"
RUN pub global activate webdev
RUN pub global activate stagehand

CMD ["/works/code-server", "--auth","none", "--host","0.0.0.0","--port","8443", "/app"]

docker-compose.yml


version: '3'
services: 
  app:
    build: ./app
    ports:
     - "8080:8080"
     - "8443:8443"
    volumes: 
      - ./app:/app
    # - /var/run/docker.sock:/var/run/docker.sock
    command: /works/code-server --auth none --host 0.0.0.0 --port 8443 /app 

Plus précisément, consultez github.

Démarrez l'environnement de développement.

$ git clone https://github.com/kyorohiro/advent-2019-code-server.git
$ cd advent-2019-code-server/extra/dart_fmi_and_go_and_c
$ docker-compose build
$ docker-compose up -d

Ouvrez http: //127.0.0.1: 8443 / dans votre navigateur

Screen Shot 2019-12-22 at 20.31.13.png

Créez une bibliothèque partagée dans Go.

Allez dans VSCode-> Fichier (Menu) -> / app / wgo.

hello.go


package main

import "C"
import "fmt"

//export PrintHello
func PrintHello() {
	fmt.Print("Hello,World")
}

func main() {}

La fonction PrintHello de Go sera appelée par Dart.

$ go build -o libhello.so  -buildmode=c-shared  hello.go

Cela créera les fichiers libhello.h et libhello.so. Chargez-le à partir du langage C avant de le charger avec Dart.

main_hello.c


#include <stdio.h>
#include "libhello.h"


int main(int argc, char const *argv[])
{
  PrintHello();
  return 0;
}

Terminal



$ gcc -Wall -o main_hello.exe main_hello.c -L. -lhello
$ LD_LIBRARY_PATH=. ./main_hello.exe -L. -lhello
Hello,World

Oups !! Cela a bien fonctionné.

Essayez de lire sur Dart.

Allez dans VSCode-> Fichier (Menu) -> / app / wdart.

bin/main.dart


import 'dart:ffi' as ffi;

typedef PrintHello_func = ffi.Void Function();
typedef PrintHello = void Function();

void main(List<String> arguments) {
  var path = "/app/wgo/libhello.so";
  ffi.DynamicLibrary dylib = ffi.DynamicLibrary.open(path);
  final PrintHello hello = dylib
      .lookup<ffi.NativeFunction<PrintHello_func>>('PrintHello')
      .asFunction();
  hello();
}


Terminal


$ dart ./bin/main.dart
Hello,World

PS

Nous avons également préparé un environnement en langage C. Vous pouvez le voir à partir du référentiel github plus tôt.


Vous pouvez profiter pleinement des fonctionnalités développées dans le langage Go avec Dart. Donc, de Dart, je peux presque tout faire. Avec le support de FMI, je pense qu'il est plus facile d'écrire des interfaces natives.


Si c'est pour le côté serveur, je pense que Docker Image etc. est pratique pour le développement.

À propos du serveur de code utilisé cette fois, dans l'Avent suivant L'explication est divisée en plus de 20 fois, donc si vous êtes intéressé, veuillez vous y référer.

https://qiita.com/advent-calendar/2019/code-server

Code

https://github.com/kyorohiro/my-code-server/tree/master/w/dart_and_go_and_c/

https://github.com/kyorohiro/advent-2019-code-server/tree/master/extra/dart_fmi_and_go_and_c

Recommended Posts

Code-Server x Dart avec ffi x Go x Clang
Python avec Go
GRPC commençant par le serveur Go et le client Dart
Appelez la fonction C avec dart: ffi et rappelez la fonction Dart