Чтение исходного кода вслух
Увидев этот вопрос, я задумался о различных проблемах, с которыми сталкиваются слепые программисты, и о том, как некоторые из них применимы даже к зрячим программистам. В частности, проблема чтения исходного кода вслух заставляет меня задуматься. Я программировал большую часть своей жизни, и я часто преподаю одноклассникам по программированию, чаще всего на C++ или Java.
Однозначно усердно пытаться устно передать основной синтаксис выражения C++. Говорящий должен дать либо идиоматический перевод на английский язык, либо полную спецификацию кода в устной форме, используя явные, но медленные термины, такие как "открывающая скобка", "побитовая и" и так далее. Ни одно из этих решений не является оптимальным.
С одной стороны, идиоматический перевод полезен только для программиста, который может отменить перевод обратно в соответствующий программный код - что обычно не происходит при обучении студента. В свою очередь, образование (или просто повышение квалификации по проекту) является наиболее распространенной ситуацией, когда источник читается вслух, а вероятность ошибки очень мала.
С другой стороны, буквальная спецификация усугубляется медленно. Чтобы сказать "фунт, включить, левую угловую скобку, iostream, правую угловую скобку, новую строку", требуется гораздо больше времени, чем просто набрать #include <iostream>
, Действительно, большинство опытных программистов на C++ воспринимают это просто как "include iostream", но опять же, неопытных программистов предостаточно, и иногда необходимы буквальные спецификации.
Так что у меня была идея для потенциального решения этой проблемы.
В C++ существует конечный набор ключевых слов -63 - и операторов -54, которые исключают именованные операторы и рассматривают составные операторы присваивания и префиксы в сравнении с постинфиксным автоинкрементом и декрементом как отдельные. Существует только несколько типов литералов, одинаковое количество группирующих символов и точка с запятой. Если я не ошибаюсь, вот и все.
Так не будет ли тогда возможным просто приписать краткое, уникальное произношение каждому из этих различных понятий (включая одно для пробела, где это требуется) и перейти оттуда? Языки программирования гораздо более регулярны, чем естественные языки, поэтому произношение можно стандартизировать. Носители любого языка смогут устно передавать код C++, и благодаря регулярности и постоянству языка программное обеспечение преобразования речи в текст может быть оптимизировано для приема речи C++ с высокой степенью точности.
Итак, мой вопрос двоякий: во-первых, возможно ли мое решение; и во-вторых, есть ли у кого-нибудь еще потенциальные решения? Я намерен взять предложения и использовать их для подготовки формального документа с примером реализации моего решения.
3 ответа
Вместо того, чтобы создавать новые "слова" для их описания, для таких вещей, как "включить", вы можете просто поставить префикс "ключевое слово" при произнесении этого вслух. Вы можете использовать слова / фразы, обычно известные, чтобы произносить и другие части. Как и любому новому программисту, вы все равно должны буквально описывать все, поэтому я не думаю, что это требует особого внимания. Я думаю, что создание новых слов является более сложным методом...
Так, например:
#include <iostream>;
int main()
{
if (1 < 2)
return 1;
else
return 0;
}
Может быть прочитано как:
(ключевое слово) включает в себя iostream new-line (ключевое слово) int main no params начальный блок, если число 1 (оператор) меньше, чем число 2 new-line (ключевое слово) возвращает номер 1 new-line (ключевое слово) иначе new-line (ключевое слово) возвращает конечный блок номер 0
Обрабатывайте слова в () как необязательные описательные слова, которые, скорее всего, будут использоваться в более сложном коде. Вы можете использовать слово "буквальный", если хотите, чтобы они действительно написали описательное слово. Например
(ключевое слово), если буквальное число (оператор) меньше, чем буквальное ключевое слово
становится
if (number < keyword)
Другим словам также могут быть даны определенные значения, такие как "разделенная линия", когда вы хотите, чтобы они продолжались на следующей строке, не закрывая в настоящее время открытые скобки, и т. Д.
Я лично считаю этот метод довольно простым в использовании и легким в обучении. YMMV, как всегда.
Конечно, это не решает проблему интернационализации, но в худшем случае приведет к использованию "новых слов" в неанглийских языках, что не хуже, чем предлагаемое вами решение.
Как слепой разработчик, программирующий с 13 лет, я нашел этот вопрос действительно интересным. Во-первых, как уже упоминалось другими людьми, изучение нового языка для понимания кода не является практическим решением, так как, вероятно, потребуется больше времени для изучения устных высказываний, чем для изучения реального языка программирования.
Читая вопрос / ответы, мне пришло в голову еще два момента:
- Во-первых, вы будете удивлены, насколько важно "время мышления". Ранее я программировал на C/C++/Java и теперь использую C# в качестве основного языка и считаю себя очень конкурентоспособным. Но когда я сделал несколько проектов на Python, я обнаружил, что сокращение знаков препинания отнимает у меня "время на обдумывание" - подсознательно я использовал пунктуацию, чтобы переварить то, что я только что услышал, - удивительно... Однако ситуация такова немного по-другому, когда дело доходит до идентификаторов, так как они не очень хорошо известны слушателю - мне лично трудно слушать код с переменными аббревиатур (RGXRatio, RGVRatio), так как у меня нет времени, чтобы понять, что это значит, С другой стороны, венгерская нотация и начальные подчеркивания затрудняют прослушивание кода, поскольку длина переменных (с точки зрения времени, необходимого для разговора) намного длиннее, чем более важные операции, выполняемые с этими переменными.
- Еще одна вещь, которую следует учитывать, это то, что длина аудиопотока является конечным результатом, но не основной причиной. Причина, по которой звук такой длинный, заключается в том, что аудио - это одномерный носитель, а чтение текста - это двумерный носитель с возможностью прыгать и пропускать ненужный / знакомый текст. Это не сработало бы для личной лекции, но что, если бы были команды клавиатуры для управления речью. В текстовых документах моя программа чтения с экрана позволяет мне перейти к следующей строке, но что, если это было адаптировано к семантике языка программирования. некоторые исследования, такие как T V Raman в Google, включают использование разных голосов для подсветки синтаксиса и звуковые подсказки для обозначения метаданных, таких как заглавные буквы.
Я знаю оригинальный вопрос, конкретно относящийся к лекции, данной классу, но если вам, как и мне, придется прослушивать целые файлы исходного кода, я также обнаружил, что структура кода имеет огромное значение. Я лично читаю код как историю - слева направо, сверху вниз. поэтому очень трудно отследить незнакомый код, когда он написан снизу вверх.
Так не будет ли тогда возможным просто приписать краткое, уникальное произношение каждому из этих различных понятий (включая одно для пробела, где это требуется) и перейти оттуда? Языки программирования гораздо более регулярны, чем естественные языки, поэтому произношение можно стандартизировать.
Возможно, но вы потеряли из виду свою цель. Предполагалось, что слушающий еще не знает языка. Если он это делает, мы можем просто сказать "включить iostream", когда мы имеем в виду #include <iostream>
или "вектор int", когда мы имеем в виду std::vector<int>
,
Вы исходили из того, что слушающий недостаточно знаком с языком, чтобы понимать то, что вы читаете вслух, если вы не прочитали в точности то , что он говорит.
Теперь, изобретение нового языка только для описания примитивов, встречающихся в вашем исходном коде, не решает проблему. Вместо этого вам все равно придется считывать каждый синтаксический токен (с более простыми, более "стандартизированными" произношениями, да, но они все равно должны быть прочитаны вслух), и слушающий вас все равно не поймет вас, потому что если они не Если вы недостаточно хорошо знаете C++, чтобы понимать "включите iostream", они тоже не поймут ваше стандартизированное произношение. И если вы собираетесь научить их своему произношению, зачем беспокоиться, если бы вы могли просто научить их понимать синтаксис C++ напрямую?
Существует также корневая проблема, связанная с тем, что код C++ состоит из множества синтаксических токенов. Возьмем такую простую строку:
std::vector<int> v;
Я считаю 9 жетонов. Ни один из них не может быть опущен. Если человек, который слушает, недостаточно хорошо понимает код и синтаксис, чтобы понять высокоуровневое описание, такое как "объявить вектор из int с именем v", то вам придется прочитать все 9 токенов в некоторой форме. Даже если вы придумали более простые имена, чем "оператор разрешения пространства имен" и "меньше, чем знак", вам все равно придется перечислить 9 имен токенов. Что очень много работы.
Короче говоря, нет, я не думаю, что это сработает. Во-первых, он все еще слишком громоздок, а во-вторых, он предполагает наличие предшествующих знаний со стороны слушающего человека, когда мотивировкой для этого было то, что слушающий был студентом без предшествующего знания, которое позволило понять описание высокого уровня. кода.