Swiftがセミコロンを必要としないのはなぜですか?[閉まっている]


20

私は通常c#またはObjective-Cのいずれかでコーディングし、最近Appleの新しいプログラミング言語であるSwiftを習得しました。

私が最初に気づいたのは、Swiftで行を終了するためにセミコロンを追加する必要がないことですが、少なくともテストしたことからすれば、コンパイラに干渉しません。

私が書くとき:

int someNumber = 0;

Objective-Cでは、セミコロンはプログラムに、行が終わって次の行に落ちないことを伝えます。

Swiftでは、変数を宣言できます

var someNumber:Int = 5

セミコロンを追加しないと、システムはこれが行の終わりであることを認識します。

一部の言語でこれを行うことができ、他の言語ではできないことは何ですか?最後にセミコロンを追加する均一なシステムを維持してみませんか?


誰もが他の言語から来ているわけではないので、彼らは彼らが均一ではないことをどのように知るでしょうか?Appleは、多くの人が嫌いなObjective-Cパーツを取り除くことで、Swiftで新しいプログラマーを引き付けませんか?
ジェフ

2
多くのObj-C獣医はSwiftに不満を抱いており、Obj-Cを好みます。これはAppleフォーラムで見ることができます。Swiftは2014年にリリースされたばかりで、数か月ごとに言語のバグと変更がすべて行われ、この秋にSwift2.0がリリースされます。SwiftはObj-Cに基づいていますが、より平易な英語でコーディングを学習しやすくすることを目的としています。
Memj

古いコンパイラの実装者は怠け者であり、および/またはより単純な解析でより効率的でなければなりませんでした。これはもう必要ありません。ローカル型の推論と同じです。コンパイラの作成者が怠け者であり、開発者の経験を気にしない場合にのみ、それはありません。
Ebuall

回答:


18

一部の言語でこれを行うことができ、他の言語ではできないことは何ですか?最後にセミコロンを追加する均一なシステムを維持してみませんか?

ロバートはスウィフトに関して良い答えを与えました、私は一般的な解析とセミコロンを使用するかしない理由についてもう少し追加しようとします。

プログラムをコンパイルすると、ソースファイルが実行可能コードに変換されるまでのいくつかの手順があります。最初の1つは読み取りと解析です。解析中、コードは文字のシーケンスから言語の文法に従って構造化された表現に変換されます。そのためには、コードを構成する要素(変数、定数、宣言など)を何らかの方法で識別して分離する必要があります。次のような宣言を行う場合:

int someNumber = 0;

それは何とかコンセプトがたに有効にする必要があり、文字だけの列だ「と呼ばれる『もの』を作成someNumberタイプのintと割り当てを0そこに」

これには、ステートメントの開始位置と終了位置を正確に識別する必要があります。あなたがこれを持っていたと想像してください:

int someNumber = 0;
int otherNumber = 1;

これらは2つの異なる宣言であることを知っておく必要があります。;Cのような言語では、そのために使用され、そのパーサは、それが1つを見つけるまで、文字を読み、そしてただ一つの文として読まれたかを理解しようとする試みています。これにより、ロバートが言ったように、同じ行に次のような複数のステートメントを含めることができます。

int someNumber = 0; int otherNumber = 1;

2行で記述するのとまったく同じ効果があります。

Pythonのような他の言語では、各ステートメントを異なる行に入れることが期待されています。

x = 3
if x < 10:
   print 'x smaller than 10'
else:
   print 'x is bigger than 10 or equal'

その;ため、言語自体が同じ行にステートメントを追加できないため、を追加する必要はありません!

さらに、LISPSchemeのような他の言語では、ステートメントをグループ化する方法が非常に異なります(まあ、実際にはステートメントではありませんが、今のところは無視しましょう)。だから、あなたはすべてのためにちょうど括弧を持っています:

(define (do-stuff x)
  (begin
    (display (format "value: ~a" x))
    x))

ここでも、あなたが必要としない;あなたは同じ記号(使用という理由だけで)(他の言語であることをもののために){}:など、唯一のLispの構文を知っている誰かがあなたを頼むかもしれない:なぜ必要なのですか;、あなたの文の終わりに?

見知らぬ人の例を追加するために:OCamlにはステートメントの最後にセミコロンがあるだけでなく、2つあります!

let rec fact x =
    if x <= 1 then 1 else x * fact (x - 1);;

どうして?知りません。:)

異なる言語は、異なる目的と異なる哲学で設計されています。すべての言語が同じ構文と規則を共有している場合、おそらく同じ方法で同じことを行うことしかできません。


4
良い終結文。
トーマスエディング

良い例ですが、あなたは質問に答えませんでした。
ロボロボック

追加のデータポイント:一部の言語は、Cスタイルファミリーに逆のアプローチを取ります。たとえば、HyperTalkは行のハードエンドとして(セミコロンではなく)改行を使用し、ステートメントを続行する場合は改行をエスケープする必要があります数行にわたって。面白いことに、C独自のプリプロセッサもそのように機能します。
ウリウィットネス

11

ステートメントの終わりを区切るために、セミコロンの代わりに改行が使用されます。

では言語ガイド:基本それは言います:

他の多くの言語とは異なり、Swiftでは、コード内の各ステートメントの後にセミコロン(;)を記述する必要はありませんが、必要に応じて行うことができます。ただし、1行に複数の別個のステートメントを記述する場合は、セミコロンが必要です。

どうして?それは言語デザイナーがそれをしたかったからです。

上記の2番目の文は、セミコロンが不要な理由を示しています。ほとんどのステートメントは単一行です。 このバブルソートの例をご覧ください。単一行ステートメントとセミコロンなしの組み合わせにより、VBに似た非常に簡潔な構文が作成されますが、冗長ではありません。

func bubbleSort<T:Comparable>(inout list:[T]) {
    var done = false
    while !done {
        done = true
        for i in 1..<list.count {
            if list[i - 1] > list[i] {
                (list[i], list[i - 1]) = (list[i - 1], list[i])
                done = false
            }
        }
    }
}

Swiftのステートメントは通常改行で終了するため、セミコロンでステートメントの終わりを示す必要性が減ります。セミコロンを使用する他の言語は、この方法では機能しません。複数行のステートメントを自由に記述できますが、コンパイラーがステートメントの終了を認識する唯一の方法は、セミコロンをステートメントの最後に配置することです。

ステートメントが改行で終了しない場合、Swiftコンパイラが前の行の継続として認識できる場所に改行を配置する必要があります。

let s2 = str
        .lowercaseString
        .replace("hello", withString: "goodbye")

2
最後のステートメントは偽です。改行を配置する特定の場所はありません。読みやすくするために、コードの行をインデントして揃えておくと便利です。
エネコアロンソ

楽しい事実:これはエラー報告にノックオン効果をもたらします。多くのCコンパイラ(clangは特に優れています)は、セミコロンを使用して構文エラーのあるステートメントの終わりを見つけ、その情報を使用して、実際に不足している閉じ括弧を報告します。セミコロンがなく、Swiftでエラーが発生すると、多くの場合、次の行がエラーを含む先行に縮小され、本当に奇妙なエラーメッセージが表示されます。
ウリウィットネス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.