Đa nền tảng Bạn muốn


8

Viết chương trình sẽ tạo ra các hành vi khác nhau trên càng nhiều nền tảng khác nhau càng tốt. Mỗi nền tảng khác nhau sẽ thưởng một điểm (bao gồm cả nền tảng ban đầu, nghĩa là bạn không thể ghi ít hơn 1 *). Các cơ chế dành cho việc xác định nền tảng đích / thực thi (ví dụ: thông qua các câu lệnh biên dịch nền tảng hoặc các API như Môi trường .NET.OSVersion.Pl platform) không được sử dụng. Câu trả lời với số điểm cao nhất sẽ giành chiến thắng (trong đó upvotes là tiebreakers).

Ví dụ, hãy xem xét chương trình sau đây bằng ngôn ngữ Blub : print (1+2). Nếu chương trình này được in 3trên mọi nền tảng mà nó được biên dịch và chạy, thì điểm của nó sẽ là 1. Tuy nhiên, nếu vì bất kỳ lý do gì, nó sẽ được in 4trên PDP-11, điểm của nó sẽ là 2. Vv. Ví dụ, đoạn mã C là một mục không hợp lệ : #ifdef WIN32 ... #endif.


Định nghĩa / chi tiết:

  • Nền tảng khác biệt: sự kết hợp của a) kiến ​​trúc phần cứng b) HĐH và số phiên bản MAJOR của nó (ví dụ 1.0.0 và 1.1.0 được coi là cùng một HĐH)

  • Hành vi khác nhau: hai hành vi giống nhau nếu chúng tạo ra các hiệu ứng phụ tương tự nhau (ví dụ: tạo cùng một tệp có cùng nội dung) hoặc nếu hiệu ứng phụ là lỗi cùng loại. Ví dụ: nếu một chương trình segfaults trên hai nền tảng riêng biệt, nhưng thông báo segfault khác nhau trên các nền tảng này, thì đây vẫn được coi là hành vi tương tự; trong khi một chương trình tạo ra lỗi phân chia 0 trên một nền tảng và lỗi tràn ngăn xếp (xem những gì tôi đã làm ở đó ?;) lỗi trên một nền tảng khác đang tạo ra hành vi khác nhau.

  • Tất cả các hành vi không xác định được coi là tương đương.

  • Chương trình phải được gọi theo cách tương đương trên tất cả các nền tảng (tuy nhiên, điều này có nghĩa là bạn có thể truyền tham số dòng lệnh nếu bạn muốn)


* Chà, tôi đoán bạn sẽ đạt điểm 0 nếu chương trình của bạn chạy trên nền tảng 0. Nhưng ừm ... Vâng, đừng bận tâm.


3
Chương trình phải được chạy trong cùng một ngôn ngữ lập trình trên tất cả các nền tảng? ví dụ: nếu tôi viết chương trình in 1trên Windows và 2trên OSX, với chi tiết tôi chạy nó dưới dạng tập lệnh Python trên Windows và chương trình C trên OSX thì sao?
Lynn

1
@Mauris có, chương trình phải được chạy trong cùng một ngôn ngữ. Ngoài ra, khi nghĩ về nó, họ thường nên có cùng tham số dòng lệnh (nếu có), vì vậy bạn không thể chỉ cung cấp các đối số khác nhau trên các nền tảng khác nhau. Cảm ơn các góc-ca vĩ đại cho đến nay chàng trai :)
Jwosty

1
Các trình duyệt khác nhau có được tính là các nền tảng khác nhau cho JavaScript không?
Downgoat

4
"hành vi khác nhau" có thể cần một định nghĩa chính xác hơn. Ví dụ: nếu một chương trình gặp sự cố trên nhiều nền tảng, nhưng với các lỗi khác nhau, đó có phải là hành vi khác nhau không?
Reto Koradi

1
@ mbomb007 Tôi chắc chắn có một triệu API được ghi nhận là hoạt động khác nhau trên các nền tảng khác nhau (đó là điều tôi mong đợi hầu hết các giải pháp sẽ tận dụng), vì vậy câu trả lời không quá khó để xác minh. Đối với những con bọ, tốt, chúng ta sẽ đốt cây cầu đó khi chúng ta đến với nó.
Jwosty 29/07/2015

Câu trả lời:


7

C

Tôi sẽ đâm vào nó với một ví dụ giống như sách giáo khoa:

#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);
    }
}

Nền tảng in 64 bit: foo

Nền tảng in 32 bit: thanh

Nền tảng Little Endian: 67305985

Nền tảng lớn về cuối: 16909060

Vì vậy, có ít nhất 4 kết hợp.

Trên hết, một số nền tảng rất cũ đã intđược định nghĩa là 16 bit. Và một số nền tảng đã longđược định nghĩa là 64 bit. Vì vậy, kết quả sẽ khác nhau là tốt.

C đã được khá nền tảng cụ thể, nếu bạn đào đủ sâu. Không khó để đưa ra hàng ngàn kết hợp (2 ^ 10 +).


3
Đây không phải là bốn vì \nvs vs \n\r* nix và windows?
Maltysen 29/07/2015

Tôi đoán điều đó đúng nếu tôi chuyển hướng đầu ra thành một tệp trên Linux và đọc nó trên Windows. Nhưng tôi không có trình biên dịch Windows C để xác nhận điều đó.
một số người dùng

2
printf("\n");không xuất ra \r\ntrên windows (chuyển hướng stdout sang tệp trên windows dẫn đến tệp 2 byte).
es1024

3

Lắp ráp 16/32 / 64-bit x86 / x64, 16 byte, 4 kết hợp

Mã byte:

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

Tháo gỡ (16-bit):

    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

Tháo gỡ (32-bit):

    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

Tháo gỡ (64-bit):

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

Nó trả về:
- CX = 0000 ở chế độ 16 bit;
- ECX = 10000 ở chế độ không ảo 32 bit;
- ECX = (ngẫu nhiên) ở chế độ ảo 32 bit;
- RCX = FFFFFFFFFFFFFFFF ở chế độ 64 bit.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.