クロスプラットフォーム…


8

できるだけ多くの異なるプラットフォームで異なる動作を生成するプログラムを作成します。異なるプラットフォームごとに1ポイントが付与されます(最初のプラットフォームを含め、1 *未満のスコアを獲得することはできません)。ターゲット/実行プラットフォームを決定するためのメカニズム(たとえば、.NETのEnvironment.OSVersion.PlatformなどのプラットフォームコンパイルステートメントまたはAPIを介して)は使用しないでください。最も高いスコアの答えが勝ちます(賛成票がタイブレーカーである場合)。

たとえば、Blub言語の次のプログラムについて考えてみますprint (1+2)。このプログラムが3コンパイルされて実行されるすべてのプラットフォームで印刷する場合、そのスコアは1になります。ただし、何らかの理由で4PDP-11sで印刷する場合、そのスコアは2になります。たとえば、Cスニペットは無効なエントリです#ifdef WIN32 ... #endif


定義/詳細:

  • 異なるプラットフォーム: a)ハードウェアアーキテクチャb)OSとそのメジャーバージョン番号の組み合わせ(例1.0.0と1.1.0は同じOSと見なされます)

  • 動作が異なる: 2つの動作は同じですIFF彼らは同様の副作用(例えば、同じ内容で同じファイルを作成する)を生成、または副作用が同じ種類のエラーである場合。たとえば、プログラムが2つの異なるプラットフォームでsegfaultを実行しても、segfaultメッセージがこれらのプラットフォームで異なる場合、これは同じ動作と見なされます。一方、あるプラットフォームでゼロ除算エラーを生成するプログラムと別のプラットフォームでスタックオーバーフロー(そこで何をしたかを参照してください;)エラーが生成されると、異なる動作が生成されます。

  • 未定義の動作はすべて同等と見なされます。

  • プログラムは、すべてのプラットフォームで同等の方法で呼び出す必要があります(ただし、必要に応じてコマンドラインパラメータを渡すことができます)


*さて、プログラムがゼロのプラットフォームで実行された場合、スコアはゼロになると思います。しかし、ええと...ええ、気にしません。


3
プログラムはすべてのプラットフォームで同じプログラミング言語で実行する必要がありますか?たとえば1、Windowsと2OSXで印刷するプログラムを作成し、WindowsでPythonスクリプトとして実行し、OSXでCプログラムとして実行する詳細を指定するとどうなりますか?
Lynn、

1
@Maurisはい、プログラムは同じ言語で実行する必要があります。また、考えてみてください。それらは一般に同じコマンドラインパラメーター(存在する場合)を取る必要があるため、異なるプラットフォームで異なる引数を指定するだけでは不十分です。これまでのすばらしいコーナーケースをありがとう:)
Jwosty

1
異なるブラウザーはJavaScriptの異なるプラットフォームとしてカウントされますか?
ダウンゴート2015

4
「動作の違い」には、より正確な定義が必要な場合があります。たとえば、プログラムが複数のプラットフォームでクラッシュしたが、エラーが異なる場合、その動作は異なりますか?
Reto Koradi

1
@ mbomb007私は、異なるプラットフォームで異なる動作をするようにドキュメント化された100万のAPIがあると確信しています(これは、ほとんどのソリューションが利用することを私が期待しているものです)。バグであるものについては、まあ、私たちはそれに来たときにその橋を燃やすでしょう。
Jwosty、2015

回答:


7

C

私はそれに教科書のような例を突き刺します:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char a[] = {1,2,3,4,5,6,7,8};
    if (sizeof(&a) > sizeof(int)) {
        printf("foo %d %d\n", *(int *)a, *(long *)a);
    } else {
        printf("bar %d %d\n", *(int *)a, *(long *)a);
    }
}

64ビットプラットフォームの出力:foo

32ビットプラットフォームプリント:バー

リトルエンディアンプラットフォーム:67305985

ビッグエンディアンプラットフォーム:16909060

したがって、少なくとも4つの組み合わせがあります。

その上、いくつかの非常に古いプラットフォームはint16ビットとして定義されています。また、一部のプラットフォームはlong64ビットとして定義されています。したがって、結果も異なります。

Cは、十分に掘り下げれば、プラットフォーム固有のものです。数千の組み合わせ(2 ^ 10 +)を考え出すことは難しくありません。


3
* nixとwindowsの\nvsのせいで、この4つではない\n\rですか?
Maltysen、2015

Linuxで出力をファイルに流用し、Windowsでそれを読み取る場合、それは本当だと思います。しかし、私はそれをネイティブに確認するためのWindows Cコンパイラを持っていません。
一部のユーザー

2
printf("\n");\r\nWindowsで出力を行います(Windowsでstdoutをファイルにリダイレクトすると、2バイトのファイルになります)。
es1024 2015

3

16/32/64ビットx86 / x64アセンブリ、16バイト、4つの組み合わせ

バイトコード:

31 C9 41 E2 0A 66 49 41 74 05 0F 00 C0 03 C1 C3

分解(16ビット):

    xor  cx, cx ;cx=0
    inc  cx     ;cx=1
    loop l1     ;fall through
    dec  cx     ;cx=FFFF
    inc  ecx    ;cx=0000
    je   l1     ;branch taken
    ;...
l1: ret

逆アセンブル(32ビット):

    xor  ecx, ecx ;ecx=0
    inc  ecx      ;ecx=1
    loop l1       ;fall through
    dec  cx       ;ecx=0000FFFF
    inc  ecx      ;ecx=00010000
    je   l1       ;branch not taken
    sldt ax       ;detect VMware, VirtualPC, Parallels, etc.
    add  ecx, eax ;conditionally modify ecx
l1: ret

逆アセンブリ(64ビット):

    xor   ecx, ecx ;rcx=0 (implicit 64-bit zero-extension)
    loopq l1       ;rcx becomes FFFFFFFFFFFFFFFF, branch taken
    ...
l1: ret

戻り値:
-CX = 0000(16ビットモード)。
-32ビット非仮想モードではECX = 10000。
-ECX =(ランダム)、32ビット仮想モード。
-64ビットモードのRCX = FFFFFFFFFFFFFFFF。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.