Відповідь на це питання залежить від того, що саме ви хочете дізнатись.
Пітон і Рубін
Часто пропонуються мови високого рівня, такі як Python та Ruby, оскільки вони мають високий рівень, а синтаксис цілком читабельний. Однак усі ці мови мають абстракції для загальних структур даних. Ніщо не заважає вам застосовувати власні версії як навчальну вправу, але ви можете виявити, що ви будуєте структури даних високого рівня поверх інших структур даних високого рівня, що не обов'язково корисно.
Крім того, Ruby та Python - це динамічно набрані мови. Це може бути добре, але це також може заплутати новачка, і може бути складніше (спочатку) ловити помилки, оскільки вони, як правило, не виявляються до часу виконання.
C.
С - в іншій крайності. Добре, якщо ви хочете дізнатися дійсно низькорівневі подробиці, наприклад, як управляється пам’яттю, але управління пам’яттю раптом є важливою проблемою, як, наприклад, правильне використання malloc () / free (). Це може відволікати увагу. Крім того, C не є об'єктно-орієнтованим. Це не погано, але просто варто зазначити.
C ++
Згадано C ++. Як я вже сказав у коментарі, я вважаю, що це жахливий вибір. С ++ дуже жахливо ускладнений навіть у простому використанні і має смішну кількість "прийомів". Крім того, C ++ не має загального базового класу. Це важливо, оскільки структури даних, такі як хеш-таблиці, покладаються на те, що існує загальний базовий клас. Ви можете реалізувати версію для номінального базового класу, але вона трохи менш корисна.
Java
Також згадано про Java. Багато людей люблять ненавидіти Java, і це правда, що мова надзвичайно багатослівна і не має деяких сучасних мовних функцій (наприклад, закриття), але нічого з цього насправді не має значення. Java має статичний тип і має збирання сміття. Це означає, що компілятор Java буде виявляти багато помилок, яких динамічно набрані мови не будуть (до часу виконання), і не буде мати справу з помилками сегментації (що не означає, що ви не можете просочити пам'ять у Java; очевидно, що можете). Я думаю, що Java - чудовий вибір.
C #
Мова C # схожа на більш сучасну версію Java. Як і Java, це керована (зібране сміття) проміжна компільована мова, яка працює на віртуальній машині. Будь-яка інша мова, перерахована тут, крім C / C ++, також працює на віртуальній машині, але Python, Ruby тощо обробляються безпосередньо, а не компілюються в байт-код.
В основному C # має ті самі плюси і мінуси, що і Java.
Хаскелл (і т.д.)
Нарешті, у вас є функціональні мови: Haskell, OCaml, Scheme / Lisp, Clojure, F # тощо. Вони думають про всі проблеми по-різному, і їх варто в якийсь момент вивчити, але знову ж справа зводиться до того, що ви хочете вивчити: функціональне програмування чи структури даних? Я б дотримувався вивчення однієї речі за раз, а не плутав питання. Якщо ви в якийсь момент вивчите функціональну мову (що я б рекомендував), Haskell - це безпечний і прекрасний вибір.
Моя порада
Виберіть Java або C #. В обох є безкоштовні чудові середовища розробки (Eclipse, Netbeans та IntelliJ Community Edition для Java, Visual Studio Express для C #, версія для спільноти Visual Studio), які роблять написання та запуск коду швидким. Якщо ви не використовуєте жодної власної структури даних, яка є більш складною, ніж масив, і будь-який об'єкт, який ви самі пишете, ви дізнаєтеся в основному те саме, що і в C / C ++, але без необхідності фактичного управління пам'яттю.
Дозвольте пояснити: розширювану хеш-таблицю потрібно змінити, якщо додати достатню кількість елементів. У будь-якій реалізації це означатиме щось на зразок подвоєння розміру резервної структури даних (як правило, масиву) та копіювання в існуючі елементи. Реалізація в основному однакова у всіх імперативних мовах, але в C / C ++ вам доводиться стикатися з помилками сегментації, коли ви не розподіляєте або не виділяєте щось правильно.
Python або Ruby (насправді не важливо, який саме) буде моїм наступним вибором (і дуже близьким до двох інших) лише тому, що спочатку динамічне введення тексту може бути проблематичним.