web-dev-qa-db-ja.com

ランタイム/ VMを必要としないクロスプラットフォームプログラムを作成したいとしますが、C / C ++で行き詰まっていますか?

私がクロスプラットフォームプログラミング言語を探している理論的なプログラマーであるとしましょう。この言語は、次の要件のリストを満たす必要があります。

  • ユーザーが追加のプログラムやランタイムをインストールする必要がないようにする必要があります(説明:ライブラリなどをリンクしてもかまわない。アプリケーションと一緒にパッケージ化できる場合。プログラムは、ゲームを実行するためにユーザーが何かをインストールする必要がないようにする必要があります。基本的に、ユーザーがプログラムをダウンロードして、箱から出してすぐに実行できるようにしたいだけです。)

  • Mac、Windows、Linuxで実行

  • 実行可能ファイルにコンパイルするか、ランタイムを実行可能ファイルにパッケージ化する必要があります(たとえば、Love2dでLuaプログラマが実行可能ファイルを実行可能ファイルに埋め込むことで実行可能ファイルを作成できるようにします)。ただし、サイズが大きく速度が遅いことが問題なので、ほとんどの人避けます。

  • 無料(ビールのように)

望ましいが完全に必要というわけではない:

  • 無料(スピーチのように)

  • モバイルアプリ(AndroidおよびiOS)のプログラミングにも使用できます。

  • 速い

  • 小さな実行可能サイズ。

  • 成熟していて安定している(構文とそれを取り巻くツールと同様)

それではどうですか?プログラマーがこれらのパラメーターを満たすプログラムを作成したい場合、CおよびC++が唯一のオプションですか? Javaはこれらの要件をある程度満たしますが、ランタイム環境をインストールする必要があります(そうではありませんか?)。このニッチを満たす言語はありますか?必ずしも同じ成熟度ではありません。 CとC++でも。

*編集:この質問が保留されることに同意しません。次に取り上げる言語を尋ねているわけではありません。これはトピックや主観に反します。私は主観的ではないこれらの要件を満たす言語について具体的に尋ねています。また、私は投票を作成していません。この要件のリストを満たす特定のテクノロジーを求めています。ヘルプセンターは、コメントをここに残して再度開くよう提案しています。この質問を再度開いて議論することは可能ですか?

5
J-'

3つのプラットフォームすべてで利用できるコンパイル済みの実装を備えたいくつかの言語を使用できます。 OcamlまたはCommon LISPまたはHaskellまたはScheme(または多分 GoRustOpaHaxe 、... )CまたはC++コードにコンパイルする実装、特に BiglooHop なども使用できます...(ある時点で Mozart/Oz はそうしていました)

ところで、Cにもいくつかのランタイムコンポーネントがあることに注意してください: C標準ライブラリ (Linuxではlibc.so)。

プログラムにインタープリターを埋め込むこともできます(例: Lua または Guile ...)

静的リンクを使用して、ランタイムを実行可能ファイルに埋め込むことができます。それには欠点があります。

プログラミング言語は仕様(多くの場合、英語のドキュメント)であり、複数の実装(多くの場合、一部は無料)ソフトウェア)。

ユーザーが追加のプログラムやランタイムをインストールする必要がない

この要件はあいまいで、非常にあいまいで、不明確であると感じています。ある意味では、HTML5 + Javascriptで最新のサイトを閲覧しているときに、一部のプログラム(JavaScript)がブラウザー内にインストールされています(ただし、初心者ユーザーはそうしません)に注意してください)。そして、ユーザーにいくつかのファイルを一度ダウンロードさせることを受け入れますか(つまり、自己完結型 [〜#〜] elf [〜#〜] Linux/x86-64のファイル、またはいくつかの.exe Windows用ファイル)プログラムを使用する前に?また、hello-world C++またはCプログラムには、いくつかの「インストール」が必要です(ほとんどのフリーソフトウェアなどのソースコードのコンパイル、またはバイナリのダウンロード 実行可能 ユーザープラットフォームに固有)。 。ところで、CまたはC++でも DLL hells などの dependency hells を使用できます。

補遺

[〜#〜] posix [〜#〜] のようなCまたはC++では、システム(通常はLinux)のようにメタプログラミングを検討できます。Cでプログラムを作成して、いくつかのCコード(一時ファイル内)、およびその新しい一時ファイルをコンパイルするようにCコンパイラに要求します。そうすることで、最初にすでにCコンパイラが必要なので、additionalは何も必要ありません。したがって、実行時にプログラムで/tmp/emittedcode.cを生成すると、コンパイルが実行されます(例: system(3) または popen(3) ...を使用して)コンパイル共有ライブラリを生成するgcc -O -Wall -fPIC -shared /tmp/emittedcode.c -o /tmp/emittedcode.soなどのコマンド 動的にロードdlopen(3) を使用して、その中のシンボルを dlsym(3 ) 。注意してWindowsで同等のAPIを見つけてください(またはそれらをラップするQtやGtkなどのツールキットを使用して、サポートされているすべてのOSで同じになるいくつかの一般的なダイナミックローダーAPIを提供します)。

また、 [〜#〜] gccjit [〜#〜] のようないくつかの JITコンパイル ライブラリの使用を検討してください libLLVMlibjitlightningasmjit 、...これらを使用して独自の言語実装を開発する(または Cへのコンパイル を検討する)または単に実行時に有用なコードを生成します。

11

ブラウザで実行できる場合は、JavaScriptと、Dart、CoffeeScript、ClojureScript、TypeScriptなどのJavaScriptにコンパイルできる言語を使用できます。これらは、モバイルデバイスだけでなく、デスクトップやChromebookで実行する場合の唯一の適切な選択肢です。

コンパイルされたデスクトップアプリには、Goがあります。それほど成熟していない状態では、D、Rust、Nimがいます。

5
Jerry101