最も直交プログラミング言語は何ですか?[閉まっている]


46

プログラミング自体とはまったく関係のない特別な言語規則(配列からポインターへの減衰など)について新入生に教えなければならないことに、私は何度もイライラしています。だから私は疑問に思いました:

特別な言語ルールの数が最も少ないプログラミング言語とは何ですか?すべてが第一級であり、迷惑な技術的制限なしで構成できますか?そのような言語は完璧な教育言語ではないでしょうか?

モデレーターノート

いくつかの説明とコンテキストを提供する長い回答を探しています。言語をリストするだけでなく、言語が質問に答える理由を説明してください。何も説明していない回答は削除されます。詳細については、良い主観、悪い主観を参照してください。


1
Unlambdaを使用してみてください-可能な限り最小数の言語構成要素があります。もう少し真剣な答え:スキーム(具体的にはR5RS)。
SKロジック

@ SK-logic、Unlambdaは直交ではありませんI=SKK。直交言語の究極は、JotやRSSBなどの単一命令言語です。
ピーターテイラー

11
@ピーター-彼が厳密に最小限を意味するとは思わない。最小限の言語は、ライブラリ内のすべての追加の定義で終わるため、学生はどちらの方法でも学習する必要があります。この質問の読み方は、「どの言語が最も驚きの少ない原則に従うのがベストですか?」です。
Steve314

1
@Peter Taylor:Timtowtdiが直交性と競合する例を提供できますか?
ケプラ

1
ここでは、「直交性」は言葉の選択が不十分だと思います。ピーターとスティーブが確立したように、あなたが本当に意味するのは「驚きの原則」、またはいくつかの密接に関連する品質です。
コンラッドルドルフ

回答:


53

「ごく少数のルール」に関しては、LispまたはSmalltalkが勝つと主張します。ベアシンタックスは1つのビールタブに記述できます。

しかし、私の経験では、LispとSmalltalkの単純さは、それらが理解しやすく、教えやすいことを意味しません。「純粋な」方法ではありませんが、私の経験では、to-do-listスタイルの命令型言語は初心者にとって最も簡単に把握できます。

したがって、Python、Ruby、または同様の抽象化されたものをお勧めします:それらのすべての基本的な概念を(ほぼ)見つけます(OK、ポインターなし)が、何かを機能させるために最初から理解する必要はありません。


33
ビールのタブの単位で構文を測定する印象的な作品。
psr

3
そして、Perlを忘れないでください。ほとんどの人が考えているよりも多くのPerlがあり、ユーザーコミュニティは巨大です。
ランダルシュワルツ

20
... Perlは非常に強力かもしれないが、それプログラミングへの最も簡単なパス見つけた男は自分のシャワーに彼の寝室からメイン廊下などインディ・ジョーンズの寺院トンネルと同等のものを持っている必要があります
Kheldar

9
Perlの構文は、十分なビールを飲めば、ビールタブに収まる可能性があります。
デイブシェロマン

4
@Randal、質問は直交言語を要求します。Perlの哲学は非直交であるということです-「それを行う方法は複数あります」。
ピーターテイラー

41

私は、LISP、またはScheme、またはそのファミリーの言語が最も直交すると言うでしょう。ではletlambdadefineifconslist、と( )あなたはイントロのコースにしたいだろうとほとんど何を教えることができます。また、前処理の指示やint main()、学生が単に含めるだけで理由がわからないようなものは必要ありません。

私のイントロCSコースでは、Schemeで多くの本当にすばらしいことを行いました。チューリングマシンの実装、TC-201コンピューターの実装、コンテキストフリーの文法の記述、再帰の使用、マージと挿入の並べ替えの記述、加算器の実装、他のもの。

私は大学の前にAP comp sciでJavaをやっていましたが、Schemeはすっきりしていて、プログラムの実際の概念に集中することができました。それは素晴らしいクラスでした、そして、あなたがあなたの教育のためにそれを試すことを強くお勧めします。


5
同意する。ラケット(以前のPLTスキーム)は、やや使いやすいスキームバリアントであり、当校が導入クラスで大成功を収めて使用しています。
-NickAldwin

3
Haskellはどうですか?Haskellのことはあまり知りませんが、直交言語であると期待しています。
ジョルジオ

4
@Giorgio:Haskell構文はかなり複雑ですが、サブセットしか公開されていないようです。興味深いプログラムを取得するために最初からIOモナドとやり取りしなければならないという事実は、OPの目的を考えると少し面倒です。
マチューM.

4
「直交」については、Scheme、特にRacketの実装に投票します。ラケットの環境は、生のCommon Lispのようなものよりも学習者の道を容易にするように設計されています。この言語は、ルールがほとんどない、クリーンです。ずっと前に、MITは本、SICPを使用して、フレッシュマンの学生を教えるためにSchemeを使用することを決定しました。生き残った学生は、市場で非常に良い成績を収めているようです。ただし、このアプローチでは、最も一般的に使用される言語で商用グレードのコードを記述する方法を生徒に直接教えません。
ジョントブラー

2
はい!Schemeがほとんどの「実際の」言語と根本的に異なるという事実により、APIではなくプログラミングに集中することができます。学習スキームは、コーディングの「ワックスオン、ワックスオフ」に似ています。これまでよりもコンピュータを深く理解していることに気付くまでは時間の無駄のようです。
ベンザド

17

パスカルは、プログラミングを教えるために特別に設計されました。学ぶのは簡単です(私が学んだ最初のプログラミング言語の1つでした)。


3
また、Pascalを使用してプログラムすることも学びましたが、非常にクリーンな言語であることがわかりました。私が考えることができる唯一の非直交機能は、writeln()およびreadln()プロシージャの構文です。これらのプロシージャは可変数の引数を持ち、フォーマットを指定できます。
ジョルジオ

とてもイライラする言語だと思いました。でも、非常に悪いインストラクターがいたので、投影しているかもしれません。
-greyfade

14

ロゴ:それはまだ生きており、蹴っている

; draws a triangle
FORWARD 100
RIGHT 120
FORWARD 100
RIGHT 120
FORWARD 100
RIGHT 120

それはプログラミング言語というよりもおもちゃのように思えるかもしれませんが、多くの人にとって悪い第一歩ではありません。構文は非常に単純ですが、タートルはほとんどの言語/環境よりも具体的なフィードバック形式を提供します。特定の形状を作成しようとすることは、問題を解決するために先に考えるプロセスを学ぶための素晴らしい方法です。

ただし、カメに嫌悪感を抱いているなら、Schemeが本当に道だと思います。


1
信じられないかもしれませんが、ロゴはSchemeと同様にLispです。ほとんどのユーザーは、これを学習するための単純なループとタートルグラフィック以外に十分なものを取得していません。
ショーンマクサムシング

@SeanMcSomethingこれは興味深いことです。表現の評価ではなく、副作用(カメを動かす)に焦点を当てた場合。
ベンズアド

10

SMLとHaskellの両方を提案します。直交性は、両方の主要な設計ポイントでした。特に、SMLのコア(つまり、モジュール性に関係しない言語の部分)は、ほとんど型付きラムダ計算です。その結果、ほとんどの言語機能はタイプによって駆動され、タイプは値の導入および削除フォームを駆動します。これはかなり理想的です。

両方の言語にはいくつかの非型理論的なイボ(SMLのeqtype、Haskellのseq)がありますが、関連のない言語機能の奇妙な相互作用という点では、他のどんなものよりも優れています。


7

選択肢が何であれ、「本当の」言語を教えることを強くお勧めします。おもちゃの言語を教えることは一部の人にとっては効果的ですが、他の人にとっては、現実世界への接続が切断されているために非常にイライラします。学習の動機として現実世界の関連性を必要とする人もいますが、この学習戦略を判断する場所ではありません(実際、それはよくある誤解です)。

これにより、Logoなどの言語は不適格になりますが、Processingなどのドメイン固有の言語も不適格になります。後者は特定のもの(たとえば、情報グラフィックの作成)に非常に役立ちますが、ほとんどの使用(したがってほとんどのユーザー)には使用が制限されすぎます。これは、役に立たないHaskellサブセットであるGoferも除外します。それ除外パスカル後者はがため実際のプロジェクトで使用されて、それだけで任意のより関連性のものではなく、単に基本的な機能が欠けている(例えば、組み込みの文字列)。

実用的な言語のうち、すでに述べた言語に同意します:現代のLispまたはScheme方言、Haskell、Python、またはRuby。個人的には、おそらくPythonを使用しますが、これらの選択肢にはすべて長所と短所があります。


2
「現実の」言語を教えることが現実世界の関連性を提供する方法であると主張するのは誤りです。「おもちゃ」の言語が実際のスキルにどのように関係するかを示すのは、教師の仕事です。ナイフから始めてジャグリングを学ぶことは、より適切なジャグリングスキルを学んでいるという意味ではありません。
ベンザド

3
@benzadoあなたは私のポイントを誤解しました。あなたはおもちゃの言語を学ぶ場合は、する必要が移転現実世界の問題にそれらを関連させるためにあなたのスキルを。私の全体のポイントは、この転送が追加の間接的なものであり、それが一部の人々の学習を積極的に妨げることでした。人によって学習方法は大きく異なり、一部の人はこの即時性を本当に必要とします。ナイフでジャグリングすることを学ぶことは同じことではありません。実際の類推は、最初のプロジェクトとしてライブミサイル誘導システムを作成してプログラミングを学習することです。
コンラッドルドルフ

3
私はあなたの主張を得る。私たちは同意しません。移籍は重要だと思います。推測戦略に成功している人(たとえば、数字を取り出して章の冒頭の式につなげて単語の問題を「解決」する人)よりも、学生がより深い理解を持っている必要があります)。言い換えれば、彼らが学んだことを転送できない場合、彼らはそもそもそれを学んだことはありません。生徒のやる気を維持するには、適切な問題を選択するだけです。これは、言語、「本物」、「おもちゃ」に関係なく重要です。
ベンザド

@benzado Transfer 重要であり、議論はありません。しかし、教える必要があるのは「他の専門家」であり、一部の学生はそれを所有していません。さらに、「より深い理解」の部分も真実ですが、ポイント以外にも、これはすでに到達する必要がある高度な状態です。学生は「それ」を学んだら、それを転送できます。しかし、最初に彼らは学ぶ必要があります、そしてそれをするために、何人かの学生は関連性を必要とします。転送は後で行われます。
コンラッドルドルフ

数学教育(私はわずかな経験しかありません)では、「理解せずに学習する」ことは大きな問題です。理由なしでそれを行う方法に焦点を当てています。私の主張は、プログラミングの概念を教えれば、おもちゃの言語でうまくいくし、成功すれば「本物の」言語への移行は難しくないということです。(転移が難しい場合は、概念ではなく手順を教えました。)おもちゃの環境は学習を妨げるものではありませんが、魅力的な授業計画が必要です。(私はこのスレッドが好きですが、私たちは議論の領域に渡り、モデレーターは不愉快になると思います。)
ベンザド

6

Tclには、言語全体を管理する12のルールがあります。

[1] Commands. 
[2] Evaluation. 
[3] Words. 
[4] Double quotes. 
[5] Argument expansion. 
[6] Braces. 
[7] Command substitution. 
[8] Variable substitution.
[9] Backslash substitution.
[10] Comments. 
[11] Order of substitution. 
[12] Substitution and word boundaries.

特別な場合や予約語や文字はほとんどありません。


4

特別な言語ルールの数が最も少ないプログラミング言語とは何ですか?すべてが第一級であり、迷惑な技術的制限なしで構成できますか?そのような言語は完璧な教育言語ではないでしょうか?

私のコメントを拡張するために、Jotではすべてが第一級であり(ラムダ計算であるため)、構成することができます。命令は1つだけです。それは絶対にひどい教育言語です。

一般に、チューリングターピットには特別なルールがほとんどないため、計算を行う前に計算の基本を十分に理解する必要があります。完璧な教育言語を使用すると、生徒は髪の毛を全部抜かずに実験することができます。したがって、実際には高レベルの抽象化は良いことです。


「ターリングターピット」という用語を紹介してくれてありがとう、私はいつもこの種の単純さを表す用語が必要でした。
ケプラ

生徒は実験できるべきであることに同意しますが、「何かをする」前に理解を必要とすることは、教えることの全ポイントのように思えます。
ベンザド

@benzado、私は教えのポイントが理解を与えることであることに同意します。しかし、ほとんどの人は、基本的な概念から始めて、頭を動かして、中間の概念を教えなければなりません。したがって、少し理解している人が少しだけプログラムを作成できる言語が必要です。ほとんどのプログラミングコースがチューリングマシンまたはミンスキーレジスタマシンを教えることから始められない理由があります。
ピーターテイラー

1
そうです、「少しする」という意味が違うと思います。「ビデオゲームの作り方を見せて」という条件をなだめたい場合は、いくつかのことを行うことができますが、彼らは進歩を遂げることができず、イライラするため、ポイントを獲得します。 「退屈な部分」に戻って、前進するための理解を得ることができます。この時点で、彼らはすでに悪い方法でイライラしており、あきらめるかもしれません。一方、「退屈な部分」を最初に行い、上方に構築することは、継続的な進歩を意味します。しかし、明らかに、半無限のテープから始めるわけではありません。
ベンズアド

2

学習する言語で最も重要な機能は次のとおりです。

  • 最小驚きの原理(PASCAL)

  • 可読性(Ada)

私の意見では、コードを読むことはコードを書くことよりもさらに重要であるため、2番目の方が最初の方よりも優先されます。

繰り返しになりますが、私はC#、Java、Objective-C、およびJavascriptを生活用に作成していますが、これらはすべてひどい癖があります:D

それでも、最初に1つの言語を選択する必要がある場合は、C#を使用します。比較的読みやすく、それ自体に重大な驚きはほとんどありません(ほとんどの場合、MSツール/フレームワークに隠されています...)、読むべき大量のコードとドキュメントがあり、どちらも学習に不可欠です。


読みやすさのためだけであり、adaの静的な型付けと安全のためではない場合、PythonとVisual Basic(そう、クールな子供向けの方法ではない)は、同様の整然とした構文、imhoを持っています。
ケプラ

はい、同意しますが、「Adaでコンパイルする場合は実行する必要があります」。しかし、アリアンVが言うことができるように、論理エラーを防止しません:D
Kheldar

私は静的型付けが初心者に役立つかどうかを考えてきました。より多くのサポートを提供します(トレーニングホイールなど)が、これは良いことと悪いことの両方として見ることができます。学生から型システムへの責任を押しのけます。
エイバー

@ Kheldar、Ariane Vの障害の原因となったような管理f *** upsを妨げるプログラミング言語はありません。これで宿題をする必要があります。
ジョンR.ストローム

@ JohnR.Strohmはまさに私のポイントでした。言語ではなく、エンジニアリングフロー(管理など)に欠陥がある場合があります。私の意見では、あなたはあまり積極的にコメントを述べなかったかもしれません。
ヘルダー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.